From 8bfaa2fc4f28944f8aae3422de17d8b1b8a85bc9 Mon Sep 17 00:00:00 2001 From: Tyler Gu Date: Wed, 22 Jun 2022 21:28:03 -0500 Subject: [PATCH] Use config files instead of args --- acto.py | 118 +- checker.py | 18 +- common.py | 35 +- data/cass-operator/config.json | 16 + .../config.json | 16 + data/rabbitmq-operator/context.json | 1 - data/rabbitmq-operator/operator_test.yaml | 4746 +++++++++++++++++ data/rabbitmq-operator/port.json | 16 + data/xtradb-operator/candidates.yaml | 5 - data/xtradb-operator/cr.yaml | 78 - .../xtradb-operator/.helmignore | 22 - .../xtradb-operator/Chart.yaml | 12 - .../xtradb-operator/LICENSE.txt | 13 - .../xtradb-operator/xtradb-operator/README.md | 53 - .../xtradb-operator/crds/crd-others.yaml | 155 - .../xtradb-operator/crds/crd.yaml | 452 -- .../xtradb-operator/templates/NOTES.txt | 5 - .../xtradb-operator/templates/_helpers.tpl | 56 - .../xtradb-operator/templates/deployment.yaml | 91 - .../xtradb-operator/templates/namespace.yaml | 6 - .../templates/role-binding.yaml | 37 - .../xtradb-operator/templates/role.yaml | 114 - .../xtradb-operator/values.yaml | 46 - data/zookeeper-operator/config.json | 16 + ssa/Makefile | 2 +- ssa/__init__.py | 0 ssa/analysis.py | 23 +- ssa/go.sum | 4 - ssa/{analysis.h => libanalysis.h} | 0 .../backwardPropogation.go | 0 ssa/{analysis => passes}/functions.go | 0 ssa/{analysis => passes}/pass.go | 0 ssa/{analysis => passes}/taintAnalysis.go | 0 ssa/{analysis => passes}/types.go | 0 ssa/ssa.go | 2 +- ssa/test.go | 97 - 36 files changed, 4935 insertions(+), 1320 deletions(-) create mode 100644 data/cass-operator/config.json create mode 100644 data/percona-server-mongodb-operator/config.json delete mode 100644 data/rabbitmq-operator/context.json create mode 100644 data/rabbitmq-operator/operator_test.yaml create mode 100644 data/rabbitmq-operator/port.json delete mode 100644 data/xtradb-operator/candidates.yaml delete mode 100644 data/xtradb-operator/cr.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/.helmignore delete mode 100644 data/xtradb-operator/xtradb-operator/Chart.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/LICENSE.txt delete mode 100644 data/xtradb-operator/xtradb-operator/README.md delete mode 100644 data/xtradb-operator/xtradb-operator/crds/crd-others.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/crds/crd.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/templates/NOTES.txt delete mode 100644 data/xtradb-operator/xtradb-operator/templates/_helpers.tpl delete mode 100644 data/xtradb-operator/xtradb-operator/templates/deployment.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/templates/namespace.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/templates/role-binding.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/templates/role.yaml delete mode 100644 data/xtradb-operator/xtradb-operator/values.yaml create mode 100644 data/zookeeper-operator/config.json create mode 100644 ssa/__init__.py rename ssa/{analysis.h => libanalysis.h} (100%) rename ssa/{analysis => passes}/backwardPropogation.go (100%) rename ssa/{analysis => passes}/functions.go (100%) rename ssa/{analysis => passes}/pass.go (100%) rename ssa/{analysis => passes}/taintAnalysis.go (100%) rename ssa/{analysis => passes}/types.go (100%) delete mode 100644 ssa/test.go diff --git a/acto.py b/acto.py index 3c03ebb707..81bbe490e3 100644 --- a/acto.py +++ b/acto.py @@ -2,6 +2,7 @@ import os import sys import threading +from types import SimpleNamespace import kubernetes import yaml import time @@ -12,6 +13,7 @@ import logging import importlib import traceback +import tempfile from common import * from exception import UnknownDeployMethodError @@ -22,6 +24,7 @@ from runner import Runner from checker import Checker from snapshot import EmptySnapshot +from ssa.analysis import analyze CONST = CONST() random.seed(0) @@ -216,7 +219,7 @@ def run_trial(self, trial_dir: str, num_mutation: int = 10) -> Tuple[ErrorResult time.sleep(20) # retry retry = True - generation -= 1 # should not increment generation since we are feeding the same test case + generation -= 1 # should not increment generation since we are feeding the same test case continue if isinstance(result, InvalidInputResult): if setup: @@ -249,31 +252,61 @@ def run_trial(self, trial_dir: str, num_mutation: int = 10) -> Tuple[ErrorResult class Acto: def __init__(self, - seed_file, - deploy: Deploy, - workdir_path, - crd_name, - preload_images_, - custom_fields_src, - helper_crd: str, + workdir_path: str, + operator_config: OperatorConfig, + preload_images_: list, context_file: str, - analysis_result: str, + helper_crd: str, num_workers: int, dryrun: bool, mount: list = None) -> None: try: - with open(seed_file, 'r') as cr_file: + with open(operator_config.seed_custom_resource, 'r') as cr_file: self.seed = yaml.load(cr_file, Loader=yaml.FullLoader) except: logging.error('Failed to read seed yaml, aborting') quit() + + if operator_config.deploy.method == 'HELM': + deploy = Deploy(DeployMethod.HELM, operator_config.deploy.file, + operator_config.deploy.init).new() + elif operator_config.deploy.method == 'YAML': + deploy = Deploy(DeployMethod.YAML, operator_config.deploy.file, + operator_config.deploy.init).new() + elif operator_config.deploy.method == 'KUSTOMIZE': + deploy = Deploy(DeployMethod.KUSTOMIZE, operator_config.deploy.file, + operator_config.deploy.init).new() + else: + raise UnknownDeployMethodError() + self.deploy = deploy - self.crd_name = crd_name + self.operator_config = operator_config + self.crd_name = operator_config.crd_name self.workdir_path = workdir_path self.num_workers = num_workers self.dryrun = dryrun self.snapshots = [] + self.__learn(context_file=context_file, helper_crd=helper_crd) + + # Add additional preload images from arguments + if preload_images_ != None: + self.context['preload_images'].update(preload_images_) + + # Apply custom fields + self.input_model = InputModel(self.context['crd']['body'], num_workers, mount) + self.input_model.initialize(self.seed) + if operator_config.custom_fields != None: + module = importlib.import_module(operator_config.custom_fields) + for custom_field in module.custom_fields: + self.input_model.apply_custom_field(custom_field) + + # Generate test cases + self.test_plan = self.input_model.generate_test_plan() + with open(os.path.join(self.workdir_path, 'test_plan.json'), 'w') as plan_file: + json.dump(self.test_plan, plan_file, cls=ActoEncoder, indent=6) + + def __learn(self, context_file, helper_crd): if os.path.exists(context_file): with open(context_file, 'r') as context_fin: self.context = json.load(context_fin) @@ -290,35 +323,21 @@ def __init__(self, break apiclient = kubernetes_client('learn') runner = Runner(self.context, 'learn', 'learn') - runner.run_without_collect(seed_file) + runner.run_without_collect(self.operator_config.seed_custom_resource) update_preload_images(self.context) process_crd(self.context, apiclient, 'learn', self.crd_name, helper_crd) kind_delete_cluster('learn') + + with tempfile.TemporaryDirectory() as project_src: + subprocess.run(['git', 'clone', self.operator_config.github_link, project_src]) + subprocess.run(['git', '-C', project_src, 'checkout', self.operator_config.commit]) + self.context['analysis_result'] = analyze(project_src, + self.operator_config.seedType.type, + self.operator_config.seedType.package) with open(context_file, 'w') as context_fout: json.dump(self.context, context_fout, cls=ActoEncoder) - # Add additional preload images from arguments - if preload_images_ != None: - self.context['preload_images'].update(preload_images_) - - if analysis_result != None: - with open(analysis_result, 'r') as analysis_file: - self.context['analysis_result'] = json.load(analysis_file) - - # Apply custom fields - self.input_model = InputModel(self.context['crd']['body'], num_workers, mount) - self.input_model.initialize(self.seed) - if custom_fields_src != None: - module = importlib.import_module(custom_fields_src) - for custom_field in module.custom_fields: - self.input_model.apply_custom_field(custom_field) - - # Generate test cases - self.test_plan = self.input_model.generate_test_plan() - with open(os.path.join(self.workdir_path, 'test_plan.json'), 'w') as plan_file: - json.dump(self.test_plan, plan_file, cls=ActoEncoder, indent=6) - def run(self): threads = [] for i in range(self.num_workers): @@ -372,7 +391,7 @@ def thread_excepthook(args): parser = argparse.ArgumentParser( description='Automatic, Continuous Testing for k8s/openshift Operators') - parser.add_argument('--seed', '-s', dest='seed', required=True, help="seed CR file") + parser.add_argument('--config', '-c', dest='config', help='Operator port config path') deploy_method = parser.add_mutually_exclusive_group(required=True) deploy_method.add_argument('--operator', '-o', @@ -388,10 +407,6 @@ def thread_excepthook(args): dest='kustomize', required=False, help='Path of folder with kustomize') - parser.add_argument('--init', - dest='init', - required=False, - help='Path of init yaml file (deploy before operator)') parser.add_argument('--duration', '-d', dest='duration', @@ -401,19 +416,10 @@ def thread_excepthook(args): dest='preload_images', nargs='*', help='Docker images to preload into Kind cluster') - parser.add_argument('--crd-name', - dest='crd_name', - help='Name of CRD to use, required if there are multiple CRDs') # Temporary solution before integrating controller-gen parser.add_argument('--helper-crd', dest='helper_crd', help='generated CRD file that helps with the input generation') - parser.add_argument('--custom-fields', - dest='custom_fields', - help='Python source file containing a list of custom fields') - parser.add_argument('--analysis-result', - dest='analysis_result', - help='JSON file resulted from the code analysis') parser.add_argument('--context', dest='context', help='Cached context data') parser.add_argument('--num-workers', dest='num_workers', @@ -428,6 +434,7 @@ def thread_excepthook(args): args = parser.parse_args() os.makedirs(workdir_path, exist_ok=True) + # Setting up log infra logging.basicConfig( filename=os.path.join(workdir_path, 'test.log'), level=logging.DEBUG, @@ -442,7 +449,10 @@ def thread_excepthook(args): sys.excepthook = handle_excepthook threading.excepthook = thread_excepthook + with open(args.config, 'r') as config_file: + config = json.load(config_file, object_hook=lambda d: SimpleNamespace(**d)) logging.info('Acto started with [%s]' % sys.argv) + logging.info('Operator config: %s', config) # Preload frequently used images to amid ImagePullBackOff if args.preload_images: @@ -452,20 +462,12 @@ def thread_excepthook(args): if args.duration != None: signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(int(args.duration) * 60 * 60) - if args.operator_chart: - deploy = Deploy(DeployMethod.HELM, args.operator_chart, args.init).new() - elif args.operator: - deploy = Deploy(DeployMethod.YAML, args.operator, args.init).new() - elif args.kustomize: - deploy = Deploy(DeployMethod.KUSTOMIZE, args.kustomize, args.init).new() - else: - raise UnknownDeployMethodError() if args.context == None: - context_cache = os.path.join(os.path.dirname(args.seed), 'context.json') + context_cache = os.path.join(os.path.dirname(config.seed_custom_resource), 'context.json') else: context_cache = args.context - acto = Acto(args.seed, deploy, workdir_path, args.crd_name, args.preload_images, - args.custom_fields, args.helper_crd, context_cache, args.analysis_result, args.num_workers, args.dryrun) + acto = Acto(workdir_path, config, args.preload_images, context_cache, args.helper_crd, + args.num_workers, args.dryrun) acto.run() \ No newline at end of file diff --git a/checker.py b/checker.py index fcb3bc6897..1102d08f49 100644 --- a/checker.py +++ b/checker.py @@ -5,8 +5,6 @@ import re import copy -from numpy import require - from common import * from compare import CompareMethods from snapshot import EmptySnapshot, Snapshot @@ -58,7 +56,8 @@ def check_input(self, snapshot: Snapshot) -> RunResult: if stderr.find('connection refused') != -1: return ConnectionRefusedResult() - elif stdout.find('error') != -1 or stderr.find('error') != -1 or stderr.find('invalid') != -1: + elif stdout.find('error') != -1 or stderr.find('error') != -1 or stderr.find( + 'invalid') != -1: logging.info('Invalid input, reject mutation') logging.info('STDOUT: ' + stdout) logging.info('STDERR: ' + stderr) @@ -267,8 +266,7 @@ def get_deltas(self, snapshot: Snapshot, prev_snapshot: Snapshot): import traceback import argparse - parser = argparse.ArgumentParser( - description='Standalone checker for Acto') + parser = argparse.ArgumentParser(description='Standalone checker for Acto') parser.add_argument('--context', dest='context', required=True) parser.add_argument('--analysis-file', dest='analysis_file', required=False) @@ -302,7 +300,7 @@ def handle_excepthook(type, message, stack): sys.excepthook = handle_excepthook - trial_dirs = glob.glob(args.testrun_dir+'/*') + trial_dirs = glob.glob(args.testrun_dir + '/*') with open(args.context, 'r') as context_fin: context = json.load(context_fin) context['preload_images'] = set(context['preload_images']) @@ -311,9 +309,7 @@ def handle_excepthook(type, message, stack): with open(args.analysis_file, 'r') as analysis_file: context['analysis_result'] = json.load(analysis_file) else: - context['analysis_result'] = { - 'paths': [] - } + context['analysis_result'] = {'paths': []} for path in context['analysis_result']['paths']: path.pop(0) @@ -350,7 +346,9 @@ def handle_excepthook(type, message, stack): operator_log = operator_log.read().splitlines() snapshot = Snapshot(input, cli_result, system_state, operator_log) - result = checker.check(snapshot=snapshot, prev_snapshot=snapshots[-1], generation=generation) + result = checker.check(snapshot=snapshot, + prev_snapshot=snapshots[-1], + generation=generation) snapshots.append(snapshot) if isinstance(result, ConnectionRefusedResult): diff --git a/common.py b/common.py index 22a360150d..e68c794202 100644 --- a/common.py +++ b/common.py @@ -14,6 +14,37 @@ from test_case import TestCase +class DeployConfig: + + def __init__(self, method: str, file: str, init: str) -> None: + self.method = method + self.file = file + self.init = init + + +class SeedType: + + def __init__(self, type: str, package: str) -> None: + self.type = type + self.package = package + + +class OperatorConfig: + + def __init__(self, github_link: str, commit: str, deploy: DeployConfig, crd_name: str, + custom_fields: str, context: str, seed_custom_resource: str, source_path: str, + seedType: SeedType) -> None: + self.github_link = github_link + self.commit = commit + self.deploy = deploy + self.crd_name = crd_name + self.custom_fields = custom_fields + self.context = context + self.seed_custom_resource = seed_custom_resource + self.source_path = source_path + self.seedType = seedType + + class Diff: def __init__(self, prev, curr, path) -> None: @@ -178,8 +209,7 @@ def random_string(n: int): return (''.join(random.choice(letters) for i in range(10))) -def save_result(trial_dir: str, trial_err: ErrorResult, num_tests: int, - trial_elapsed): +def save_result(trial_dir: str, trial_err: ErrorResult, num_tests: int, trial_elapsed): result_dict = {} result_dict['trial_num'] = trial_dir result_dict['duration'] = trial_elapsed @@ -233,6 +263,7 @@ def default(self, obj): r"failed to run smartUpdate", r"dial: ping mongo", r"pod is not running", + r"Secret (.)* not found", ] INVALID_INPUT_LOG_REGEX = [ diff --git a/data/cass-operator/config.json b/data/cass-operator/config.json new file mode 100644 index 0000000000..b1285a202d --- /dev/null +++ b/data/cass-operator/config.json @@ -0,0 +1,16 @@ +{ + "github_link": "https://github.com/k8ssandra/cass-operator.git", + "commit": "241e71cdd32bd9f8a7e5c00d5427cdcaf9f55497", + "deploy": { + "method": "KUSTOMIZE", + "file": "github.com/k8ssandra/cass-operator/config/deployments/cluster?ref=v1.10.3", + "init": "data/cass-operator/init.yaml" + }, + "crd_name": "cassandradatacenters.cassandra.datastax.com", + "custom_fields": "data.cass-operator.prune", + "seed_custom_resource": "data/cass-operator/cr.yaml", + "seedType": { + "type": "CassandraDatacenter", + "package": "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1" + } +} \ No newline at end of file diff --git a/data/percona-server-mongodb-operator/config.json b/data/percona-server-mongodb-operator/config.json new file mode 100644 index 0000000000..fd1de91834 --- /dev/null +++ b/data/percona-server-mongodb-operator/config.json @@ -0,0 +1,16 @@ +{ + "github_link": "https://github.com/percona/percona-server-mongodb-operator.git", + "commit": "54950f7e56cde893c4b36a061c6335598b84873d", + "deploy": { + "method": "YAML", + "file": "data/percona-server-mongodb-operator/cr.yaml", + "init": null + }, + "crd_name": "perconaservermongodbs.psmdb.percona.com", + "custom_fields": "data.percona-server-mongodb-operator.prune", + "seed_custom_resource": "data/percona-server-mongodb-operator/cr.yaml", + "seedType": { + "type": "PerconaServerMongoDB", + "package": "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" + } +} \ No newline at end of file diff --git a/data/rabbitmq-operator/context.json b/data/rabbitmq-operator/context.json deleted file mode 100644 index 04272df5c1..0000000000 --- a/data/rabbitmq-operator/context.json +++ /dev/null @@ -1 +0,0 @@ -{"namespace": "rabbitmq-system", "current_dir_path": "testrun-2022-04-27-12-46/learn", "crd": {"group": "rabbitmq.com", "plural": "rabbitmqclusters", "version": "v1beta1", "body": {"apiVersion": "apiextensions.k8s.io/v1", "kind": "CustomResourceDefinition", "metadata": {"annotations": {"controller-gen.kubebuilder.io/version": "v0.6.2", "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apiextensions.k8s.io/v1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{\"controller-gen.kubebuilder.io/version\":\"v0.6.2\"},\"labels\":{\"app.kubernetes.io/component\":\"rabbitmq-operator\",\"app.kubernetes.io/name\":\"rabbitmq-cluster-operator\",\"app.kubernetes.io/part-of\":\"rabbitmq\"},\"name\":\"rabbitmqclusters.rabbitmq.com\"},\"spec\":{\"group\":\"rabbitmq.com\",\"names\":{\"categories\":[\"all\"],\"kind\":\"RabbitmqCluster\",\"listKind\":\"RabbitmqClusterList\",\"plural\":\"rabbitmqclusters\",\"shortNames\":[\"rmq\"],\"singular\":\"rabbitmqcluster\"},\"scope\":\"Namespaced\",\"versions\":[{\"additionalPrinterColumns\":[{\"jsonPath\":\".status.conditions[?(@.type == 'AllReplicasReady')].status\",\"name\":\"AllReplicasReady\",\"type\":\"string\"},{\"jsonPath\":\".status.conditions[?(@.type == 'ReconcileSuccess')].status\",\"name\":\"ReconcileSuccess\",\"type\":\"string\"},{\"jsonPath\":\".metadata.creationTimestamp\",\"name\":\"Age\",\"type\":\"date\"}],\"name\":\"v1beta1\",\"schema\":{\"openAPIV3Schema\":{\"description\":\"RabbitmqCluster is the Schema for the RabbitmqCluster API. Each instance of this object corresponds to a single RabbitMQ cluster.\",\"properties\":{\"apiVersion\":{\"description\":\"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\",\"type\":\"string\"},\"kind\":{\"description\":\"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\",\"type\":\"string\"},\"metadata\":{\"type\":\"object\"},\"spec\":{\"description\":\"Spec is the desired state of the RabbitmqCluster Custom Resource.\",\"properties\":{\"affinity\":{\"description\":\"Affinity scheduling rules to be applied on created Pods.\",\"properties\":{\"nodeAffinity\":{\"description\":\"Describes node affinity scheduling rules for the pod.\",\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \\\"weight\\\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.\",\"items\":{\"description\":\"An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).\",\"properties\":{\"preference\":{\"description\":\"A node selector term, associated with the corresponding weight.\",\"properties\":{\"matchExpressions\":{\"description\":\"A list of node selector requirements by node's labels.\",\"items\":{\"description\":\"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"The label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\",\"type\":\"string\"},\"values\":{\"description\":\"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchFields\":{\"description\":\"A list of node selector requirements by node's fields.\",\"items\":{\"description\":\"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"The label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\",\"type\":\"string\"},\"values\":{\"description\":\"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"weight\":{\"description\":\"Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.\",\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"preference\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.\",\"properties\":{\"nodeSelectorTerms\":{\"description\":\"Required. A list of node selector terms. The terms are ORed.\",\"items\":{\"description\":\"A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.\",\"properties\":{\"matchExpressions\":{\"description\":\"A list of node selector requirements by node's labels.\",\"items\":{\"description\":\"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"The label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\",\"type\":\"string\"},\"values\":{\"description\":\"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchFields\":{\"description\":\"A list of node selector requirements by node's fields.\",\"items\":{\"description\":\"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"The label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.\",\"type\":\"string\"},\"values\":{\"description\":\"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"nodeSelectorTerms\"],\"type\":\"object\"}},\"type\":\"object\"},\"podAffinity\":{\"description\":\"Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).\",\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \\\"weight\\\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.\",\"items\":{\"description\":\"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)\",\"properties\":{\"podAffinityTerm\":{\"description\":\"Required. A pod affinity term, associated with the corresponding weight.\",\"properties\":{\"labelSelector\":{\"description\":\"A label query over a set of resources, in this case pods.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"description\":\"A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \\\"this pod's namespace\\\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"description\":\"namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \\\"this pod's namespace\\\"\",\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"description\":\"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.\",\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"weight\":{\"description\":\"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.\",\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"podAffinityTerm\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.\",\"items\":{\"description\":\"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \\u003ctopologyKey\\u003e matches that of any node on which a pod of the set of pods is running\",\"properties\":{\"labelSelector\":{\"description\":\"A label query over a set of resources, in this case pods.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"description\":\"A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \\\"this pod's namespace\\\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"description\":\"namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \\\"this pod's namespace\\\"\",\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"description\":\"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.\",\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"podAntiAffinity\":{\"description\":\"Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).\",\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \\\"weight\\\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.\",\"items\":{\"description\":\"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)\",\"properties\":{\"podAffinityTerm\":{\"description\":\"Required. A pod affinity term, associated with the corresponding weight.\",\"properties\":{\"labelSelector\":{\"description\":\"A label query over a set of resources, in this case pods.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"description\":\"A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \\\"this pod's namespace\\\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"description\":\"namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \\\"this pod's namespace\\\"\",\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"description\":\"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.\",\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"weight\":{\"description\":\"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.\",\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"podAffinityTerm\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"description\":\"If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.\",\"items\":{\"description\":\"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \\u003ctopologyKey\\u003e matches that of any node on which a pod of the set of pods is running\",\"properties\":{\"labelSelector\":{\"description\":\"A label query over a set of resources, in this case pods.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"description\":\"A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \\\"this pod's namespace\\\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.\",\"properties\":{\"matchExpressions\":{\"description\":\"matchExpressions is a list of label selector requirements. The requirements are ANDed.\",\"items\":{\"description\":\"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.\",\"properties\":{\"key\":{\"description\":\"key is the label key that the selector applies to.\",\"type\":\"string\"},\"operator\":{\"description\":\"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.\",\"type\":\"string\"},\"values\":{\"description\":\"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \\\"key\\\", the operator is \\\"In\\\", and the values array contains only \\\"value\\\". The requirements are ANDed.\",\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"description\":\"namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \\\"this pod's namespace\\\"\",\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"description\":\"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.\",\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"}},\"type\":\"object\"},\"image\":{\"description\":\"Image is the name of the RabbitMQ docker image to use for RabbitMQ nodes in the RabbitmqCluster. Must be provided together with ImagePullSecrets in order to use an image in a private registry.\",\"type\":\"string\"},\"imagePullSecrets\":{\"description\":\"List of Secret resource containing access credentials to the registry for the RabbitMQ image. Required if the docker registry is private.\",\"items\":{\"description\":\"LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.\",\"properties\":{\"name\":{\"description\":\"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?\",\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"},\"override\":{\"properties\":{\"service\":{\"properties\":{\"metadata\":{\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"labels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"spec\":{\"properties\":{\"allocateLoadBalancerNodePorts\":{\"type\":\"boolean\"},\"clusterIP\":{\"type\":\"string\"},\"clusterIPs\":{\"items\":{\"type\":\"string\"},\"type\":\"array\",\"x-kubernetes-list-type\":\"atomic\"},\"externalIPs\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"externalName\":{\"type\":\"string\"},\"externalTrafficPolicy\":{\"type\":\"string\"},\"healthCheckNodePort\":{\"format\":\"int32\",\"type\":\"integer\"},\"internalTrafficPolicy\":{\"type\":\"string\"},\"ipFamilies\":{\"items\":{\"type\":\"string\"},\"type\":\"array\",\"x-kubernetes-list-type\":\"atomic\"},\"ipFamilyPolicy\":{\"type\":\"string\"},\"loadBalancerClass\":{\"type\":\"string\"},\"loadBalancerIP\":{\"type\":\"string\"},\"loadBalancerSourceRanges\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"ports\":{\"items\":{\"properties\":{\"appProtocol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"nodePort\":{\"format\":\"int32\",\"type\":\"integer\"},\"port\":{\"format\":\"int32\",\"type\":\"integer\"},\"protocol\":{\"default\":\"TCP\",\"type\":\"string\"},\"targetPort\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"type\":\"array\",\"x-kubernetes-list-map-keys\":[\"port\",\"protocol\"],\"x-kubernetes-list-type\":\"map\"},\"publishNotReadyAddresses\":{\"type\":\"boolean\"},\"selector\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"sessionAffinity\":{\"type\":\"string\"},\"sessionAffinityConfig\":{\"properties\":{\"clientIP\":{\"properties\":{\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"}},\"type\":\"object\"},\"topologyKeys\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"type\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"statefulSet\":{\"properties\":{\"metadata\":{\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"labels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"spec\":{\"properties\":{\"podManagementPolicy\":{\"type\":\"string\"},\"replicas\":{\"format\":\"int32\",\"type\":\"integer\"},\"selector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"serviceName\":{\"type\":\"string\"},\"template\":{\"properties\":{\"metadata\":{\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"labels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"namespace\":{\"type\":\"string\"}},\"type\":\"object\"},\"spec\":{\"properties\":{\"activeDeadlineSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"affinity\":{\"properties\":{\"nodeAffinity\":{\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"items\":{\"properties\":{\"preference\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchFields\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"weight\":{\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"preference\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"properties\":{\"nodeSelectorTerms\":{\"items\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchFields\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"nodeSelectorTerms\"],\"type\":\"object\"}},\"type\":\"object\"},\"podAffinity\":{\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"items\":{\"properties\":{\"podAffinityTerm\":{\"properties\":{\"labelSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"weight\":{\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"podAffinityTerm\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"items\":{\"properties\":{\"labelSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"podAntiAffinity\":{\"properties\":{\"preferredDuringSchedulingIgnoredDuringExecution\":{\"items\":{\"properties\":{\"podAffinityTerm\":{\"properties\":{\"labelSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"weight\":{\"format\":\"int32\",\"type\":\"integer\"}},\"required\":[\"podAffinityTerm\",\"weight\"],\"type\":\"object\"},\"type\":\"array\"},\"requiredDuringSchedulingIgnoredDuringExecution\":{\"items\":{\"properties\":{\"labelSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaceSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"namespaces\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"topologyKey\":{\"type\":\"string\"}},\"required\":[\"topologyKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"}},\"type\":\"object\"},\"automountServiceAccountToken\":{\"type\":\"boolean\"},\"containers\":{\"items\":{\"properties\":{\"args\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"env\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"valueFrom\":{\"properties\":{\"configMapKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"},\"fieldRef\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"fieldPath\":{\"type\":\"string\"}},\"required\":[\"fieldPath\"],\"type\":\"object\"},\"resourceFieldRef\":{\"properties\":{\"containerName\":{\"type\":\"string\"},\"divisor\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"resource\":{\"type\":\"string\"}},\"required\":[\"resource\"],\"type\":\"object\"},\"secretKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"}},\"type\":\"object\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"envFrom\":{\"items\":{\"properties\":{\"configMapRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"prefix\":{\"type\":\"string\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"}},\"type\":\"object\"},\"type\":\"array\"},\"image\":{\"type\":\"string\"},\"imagePullPolicy\":{\"type\":\"string\"},\"lifecycle\":{\"properties\":{\"postStart\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"},\"preStop\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"livenessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"ports\":{\"items\":{\"properties\":{\"containerPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"hostIP\":{\"type\":\"string\"},\"hostPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"protocol\":{\"default\":\"TCP\",\"type\":\"string\"}},\"required\":[\"containerPort\"],\"type\":\"object\"},\"type\":\"array\",\"x-kubernetes-list-map-keys\":[\"containerPort\",\"protocol\"],\"x-kubernetes-list-type\":\"map\"},\"readinessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"resources\":{\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"}},\"type\":\"object\"},\"securityContext\":{\"properties\":{\"allowPrivilegeEscalation\":{\"type\":\"boolean\"},\"capabilities\":{\"properties\":{\"add\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"drop\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"privileged\":{\"type\":\"boolean\"},\"procMount\":{\"type\":\"string\"},\"readOnlyRootFilesystem\":{\"type\":\"boolean\"},\"runAsGroup\":{\"format\":\"int64\",\"type\":\"integer\"},\"runAsNonRoot\":{\"type\":\"boolean\"},\"runAsUser\":{\"format\":\"int64\",\"type\":\"integer\"},\"seLinuxOptions\":{\"properties\":{\"level\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}},\"type\":\"object\"},\"seccompProfile\":{\"properties\":{\"localhostProfile\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"windowsOptions\":{\"properties\":{\"gmsaCredentialSpec\":{\"type\":\"string\"},\"gmsaCredentialSpecName\":{\"type\":\"string\"},\"runAsUserName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"startupProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"stdin\":{\"type\":\"boolean\"},\"stdinOnce\":{\"type\":\"boolean\"},\"terminationMessagePath\":{\"type\":\"string\"},\"terminationMessagePolicy\":{\"type\":\"string\"},\"tty\":{\"type\":\"boolean\"},\"volumeDevices\":{\"items\":{\"properties\":{\"devicePath\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"devicePath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"volumeMounts\":{\"items\":{\"properties\":{\"mountPath\":{\"type\":\"string\"},\"mountPropagation\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"subPath\":{\"type\":\"string\"},\"subPathExpr\":{\"type\":\"string\"}},\"required\":[\"mountPath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"workingDir\":{\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"dnsConfig\":{\"properties\":{\"nameservers\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"options\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"},\"searches\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"dnsPolicy\":{\"type\":\"string\"},\"enableServiceLinks\":{\"type\":\"boolean\"},\"ephemeralContainers\":{\"items\":{\"properties\":{\"args\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"env\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"valueFrom\":{\"properties\":{\"configMapKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"},\"fieldRef\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"fieldPath\":{\"type\":\"string\"}},\"required\":[\"fieldPath\"],\"type\":\"object\"},\"resourceFieldRef\":{\"properties\":{\"containerName\":{\"type\":\"string\"},\"divisor\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"resource\":{\"type\":\"string\"}},\"required\":[\"resource\"],\"type\":\"object\"},\"secretKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"}},\"type\":\"object\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"envFrom\":{\"items\":{\"properties\":{\"configMapRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"prefix\":{\"type\":\"string\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"}},\"type\":\"object\"},\"type\":\"array\"},\"image\":{\"type\":\"string\"},\"imagePullPolicy\":{\"type\":\"string\"},\"lifecycle\":{\"properties\":{\"postStart\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"},\"preStop\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"livenessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"ports\":{\"items\":{\"properties\":{\"containerPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"hostIP\":{\"type\":\"string\"},\"hostPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"protocol\":{\"default\":\"TCP\",\"type\":\"string\"}},\"required\":[\"containerPort\"],\"type\":\"object\"},\"type\":\"array\"},\"readinessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"resources\":{\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"}},\"type\":\"object\"},\"securityContext\":{\"properties\":{\"allowPrivilegeEscalation\":{\"type\":\"boolean\"},\"capabilities\":{\"properties\":{\"add\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"drop\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"privileged\":{\"type\":\"boolean\"},\"procMount\":{\"type\":\"string\"},\"readOnlyRootFilesystem\":{\"type\":\"boolean\"},\"runAsGroup\":{\"format\":\"int64\",\"type\":\"integer\"},\"runAsNonRoot\":{\"type\":\"boolean\"},\"runAsUser\":{\"format\":\"int64\",\"type\":\"integer\"},\"seLinuxOptions\":{\"properties\":{\"level\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}},\"type\":\"object\"},\"seccompProfile\":{\"properties\":{\"localhostProfile\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"windowsOptions\":{\"properties\":{\"gmsaCredentialSpec\":{\"type\":\"string\"},\"gmsaCredentialSpecName\":{\"type\":\"string\"},\"runAsUserName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"startupProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"stdin\":{\"type\":\"boolean\"},\"stdinOnce\":{\"type\":\"boolean\"},\"targetContainerName\":{\"type\":\"string\"},\"terminationMessagePath\":{\"type\":\"string\"},\"terminationMessagePolicy\":{\"type\":\"string\"},\"tty\":{\"type\":\"boolean\"},\"volumeDevices\":{\"items\":{\"properties\":{\"devicePath\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"devicePath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"volumeMounts\":{\"items\":{\"properties\":{\"mountPath\":{\"type\":\"string\"},\"mountPropagation\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"subPath\":{\"type\":\"string\"},\"subPathExpr\":{\"type\":\"string\"}},\"required\":[\"mountPath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"workingDir\":{\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"hostAliases\":{\"items\":{\"properties\":{\"hostnames\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"ip\":{\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"},\"hostIPC\":{\"type\":\"boolean\"},\"hostNetwork\":{\"type\":\"boolean\"},\"hostPID\":{\"type\":\"boolean\"},\"hostname\":{\"type\":\"string\"},\"imagePullSecrets\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"},\"initContainers\":{\"items\":{\"properties\":{\"args\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"env\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"valueFrom\":{\"properties\":{\"configMapKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"},\"fieldRef\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"fieldPath\":{\"type\":\"string\"}},\"required\":[\"fieldPath\"],\"type\":\"object\"},\"resourceFieldRef\":{\"properties\":{\"containerName\":{\"type\":\"string\"},\"divisor\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"resource\":{\"type\":\"string\"}},\"required\":[\"resource\"],\"type\":\"object\"},\"secretKeyRef\":{\"properties\":{\"key\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"required\":[\"key\"],\"type\":\"object\"}},\"type\":\"object\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"envFrom\":{\"items\":{\"properties\":{\"configMapRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"prefix\":{\"type\":\"string\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"}},\"type\":\"object\"},\"type\":\"array\"},\"image\":{\"type\":\"string\"},\"imagePullPolicy\":{\"type\":\"string\"},\"lifecycle\":{\"properties\":{\"postStart\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"},\"preStop\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"livenessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"ports\":{\"items\":{\"properties\":{\"containerPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"hostIP\":{\"type\":\"string\"},\"hostPort\":{\"format\":\"int32\",\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"protocol\":{\"default\":\"TCP\",\"type\":\"string\"}},\"required\":[\"containerPort\"],\"type\":\"object\"},\"type\":\"array\",\"x-kubernetes-list-map-keys\":[\"containerPort\",\"protocol\"],\"x-kubernetes-list-type\":\"map\"},\"readinessProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"resources\":{\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"}},\"type\":\"object\"},\"securityContext\":{\"properties\":{\"allowPrivilegeEscalation\":{\"type\":\"boolean\"},\"capabilities\":{\"properties\":{\"add\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"drop\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"privileged\":{\"type\":\"boolean\"},\"procMount\":{\"type\":\"string\"},\"readOnlyRootFilesystem\":{\"type\":\"boolean\"},\"runAsGroup\":{\"format\":\"int64\",\"type\":\"integer\"},\"runAsNonRoot\":{\"type\":\"boolean\"},\"runAsUser\":{\"format\":\"int64\",\"type\":\"integer\"},\"seLinuxOptions\":{\"properties\":{\"level\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}},\"type\":\"object\"},\"seccompProfile\":{\"properties\":{\"localhostProfile\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"windowsOptions\":{\"properties\":{\"gmsaCredentialSpec\":{\"type\":\"string\"},\"gmsaCredentialSpecName\":{\"type\":\"string\"},\"runAsUserName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"startupProbe\":{\"properties\":{\"exec\":{\"properties\":{\"command\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"failureThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"httpGet\":{\"properties\":{\"host\":{\"type\":\"string\"},\"httpHeaders\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true},\"scheme\":{\"type\":\"string\"}},\"required\":[\"port\"],\"type\":\"object\"},\"initialDelaySeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"periodSeconds\":{\"format\":\"int32\",\"type\":\"integer\"},\"successThreshold\":{\"format\":\"int32\",\"type\":\"integer\"},\"tcpSocket\":{\"properties\":{\"host\":{\"type\":\"string\"},\"port\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"x-kubernetes-int-or-string\":true}},\"required\":[\"port\"],\"type\":\"object\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"timeoutSeconds\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"stdin\":{\"type\":\"boolean\"},\"stdinOnce\":{\"type\":\"boolean\"},\"terminationMessagePath\":{\"type\":\"string\"},\"terminationMessagePolicy\":{\"type\":\"string\"},\"tty\":{\"type\":\"boolean\"},\"volumeDevices\":{\"items\":{\"properties\":{\"devicePath\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"devicePath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"volumeMounts\":{\"items\":{\"properties\":{\"mountPath\":{\"type\":\"string\"},\"mountPropagation\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"subPath\":{\"type\":\"string\"},\"subPathExpr\":{\"type\":\"string\"}},\"required\":[\"mountPath\",\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"workingDir\":{\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"},\"nodeName\":{\"type\":\"string\"},\"nodeSelector\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"overhead\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"preemptionPolicy\":{\"type\":\"string\"},\"priority\":{\"format\":\"int32\",\"type\":\"integer\"},\"priorityClassName\":{\"type\":\"string\"},\"readinessGates\":{\"items\":{\"properties\":{\"conditionType\":{\"type\":\"string\"}},\"required\":[\"conditionType\"],\"type\":\"object\"},\"type\":\"array\"},\"restartPolicy\":{\"type\":\"string\"},\"runtimeClassName\":{\"type\":\"string\"},\"schedulerName\":{\"type\":\"string\"},\"securityContext\":{\"properties\":{\"fsGroup\":{\"format\":\"int64\",\"type\":\"integer\"},\"fsGroupChangePolicy\":{\"type\":\"string\"},\"runAsGroup\":{\"format\":\"int64\",\"type\":\"integer\"},\"runAsNonRoot\":{\"type\":\"boolean\"},\"runAsUser\":{\"format\":\"int64\",\"type\":\"integer\"},\"seLinuxOptions\":{\"properties\":{\"level\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"}},\"type\":\"object\"},\"seccompProfile\":{\"properties\":{\"localhostProfile\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"type\"],\"type\":\"object\"},\"supplementalGroups\":{\"items\":{\"format\":\"int64\",\"type\":\"integer\"},\"type\":\"array\"},\"sysctls\":{\"items\":{\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}},\"required\":[\"name\",\"value\"],\"type\":\"object\"},\"type\":\"array\"},\"windowsOptions\":{\"properties\":{\"gmsaCredentialSpec\":{\"type\":\"string\"},\"gmsaCredentialSpecName\":{\"type\":\"string\"},\"runAsUserName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"serviceAccount\":{\"type\":\"string\"},\"serviceAccountName\":{\"type\":\"string\"},\"setHostnameAsFQDN\":{\"type\":\"boolean\"},\"shareProcessNamespace\":{\"type\":\"boolean\"},\"subdomain\":{\"type\":\"string\"},\"terminationGracePeriodSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"tolerations\":{\"items\":{\"properties\":{\"effect\":{\"type\":\"string\"},\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"tolerationSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"value\":{\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"},\"topologySpreadConstraints\":{\"items\":{\"properties\":{\"labelSelector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"maxSkew\":{\"format\":\"int32\",\"type\":\"integer\"},\"topologyKey\":{\"type\":\"string\"},\"whenUnsatisfiable\":{\"type\":\"string\"}},\"required\":[\"maxSkew\",\"topologyKey\",\"whenUnsatisfiable\"],\"type\":\"object\"},\"type\":\"array\",\"x-kubernetes-list-map-keys\":[\"topologyKey\",\"whenUnsatisfiable\"],\"x-kubernetes-list-type\":\"map\"},\"volumes\":{\"items\":{\"properties\":{\"awsElasticBlockStore\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"partition\":{\"format\":\"int32\",\"type\":\"integer\"},\"readOnly\":{\"type\":\"boolean\"},\"volumeID\":{\"type\":\"string\"}},\"required\":[\"volumeID\"],\"type\":\"object\"},\"azureDisk\":{\"properties\":{\"cachingMode\":{\"type\":\"string\"},\"diskName\":{\"type\":\"string\"},\"diskURI\":{\"type\":\"string\"},\"fsType\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"}},\"required\":[\"diskName\",\"diskURI\"],\"type\":\"object\"},\"azureFile\":{\"properties\":{\"readOnly\":{\"type\":\"boolean\"},\"secretName\":{\"type\":\"string\"},\"shareName\":{\"type\":\"string\"}},\"required\":[\"secretName\",\"shareName\"],\"type\":\"object\"},\"cephfs\":{\"properties\":{\"monitors\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"path\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"secretFile\":{\"type\":\"string\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"user\":{\"type\":\"string\"}},\"required\":[\"monitors\"],\"type\":\"object\"},\"cinder\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"volumeID\":{\"type\":\"string\"}},\"required\":[\"volumeID\"],\"type\":\"object\"},\"configMap\":{\"properties\":{\"defaultMode\":{\"format\":\"int32\",\"type\":\"integer\"},\"items\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"}},\"required\":[\"key\",\"path\"],\"type\":\"object\"},\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"csi\":{\"properties\":{\"driver\":{\"type\":\"string\"},\"fsType\":{\"type\":\"string\"},\"nodePublishSecretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"readOnly\":{\"type\":\"boolean\"},\"volumeAttributes\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"required\":[\"driver\"],\"type\":\"object\"},\"downwardAPI\":{\"properties\":{\"defaultMode\":{\"format\":\"int32\",\"type\":\"integer\"},\"items\":{\"items\":{\"properties\":{\"fieldRef\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"fieldPath\":{\"type\":\"string\"}},\"required\":[\"fieldPath\"],\"type\":\"object\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"},\"resourceFieldRef\":{\"properties\":{\"containerName\":{\"type\":\"string\"},\"divisor\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"resource\":{\"type\":\"string\"}},\"required\":[\"resource\"],\"type\":\"object\"}},\"required\":[\"path\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"emptyDir\":{\"properties\":{\"medium\":{\"type\":\"string\"},\"sizeLimit\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true}},\"type\":\"object\"},\"ephemeral\":{\"properties\":{\"volumeClaimTemplate\":{\"properties\":{\"metadata\":{\"type\":\"object\"},\"spec\":{\"properties\":{\"accessModes\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"dataSource\":{\"properties\":{\"apiGroup\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"kind\",\"name\"],\"type\":\"object\"},\"resources\":{\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"}},\"type\":\"object\"},\"selector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"storageClassName\":{\"type\":\"string\"},\"volumeMode\":{\"type\":\"string\"},\"volumeName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"required\":[\"spec\"],\"type\":\"object\"}},\"type\":\"object\"},\"fc\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"lun\":{\"format\":\"int32\",\"type\":\"integer\"},\"readOnly\":{\"type\":\"boolean\"},\"targetWWNs\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"wwids\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"flexVolume\":{\"properties\":{\"driver\":{\"type\":\"string\"},\"fsType\":{\"type\":\"string\"},\"options\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"}},\"required\":[\"driver\"],\"type\":\"object\"},\"flocker\":{\"properties\":{\"datasetName\":{\"type\":\"string\"},\"datasetUUID\":{\"type\":\"string\"}},\"type\":\"object\"},\"gcePersistentDisk\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"partition\":{\"format\":\"int32\",\"type\":\"integer\"},\"pdName\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"}},\"required\":[\"pdName\"],\"type\":\"object\"},\"gitRepo\":{\"properties\":{\"directory\":{\"type\":\"string\"},\"repository\":{\"type\":\"string\"},\"revision\":{\"type\":\"string\"}},\"required\":[\"repository\"],\"type\":\"object\"},\"glusterfs\":{\"properties\":{\"endpoints\":{\"type\":\"string\"},\"path\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"}},\"required\":[\"endpoints\",\"path\"],\"type\":\"object\"},\"hostPath\":{\"properties\":{\"path\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"},\"iscsi\":{\"properties\":{\"chapAuthDiscovery\":{\"type\":\"boolean\"},\"chapAuthSession\":{\"type\":\"boolean\"},\"fsType\":{\"type\":\"string\"},\"initiatorName\":{\"type\":\"string\"},\"iqn\":{\"type\":\"string\"},\"iscsiInterface\":{\"type\":\"string\"},\"lun\":{\"format\":\"int32\",\"type\":\"integer\"},\"portals\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"targetPortal\":{\"type\":\"string\"}},\"required\":[\"iqn\",\"lun\",\"targetPortal\"],\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"nfs\":{\"properties\":{\"path\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"server\":{\"type\":\"string\"}},\"required\":[\"path\",\"server\"],\"type\":\"object\"},\"persistentVolumeClaim\":{\"properties\":{\"claimName\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"}},\"required\":[\"claimName\"],\"type\":\"object\"},\"photonPersistentDisk\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"pdID\":{\"type\":\"string\"}},\"required\":[\"pdID\"],\"type\":\"object\"},\"portworxVolume\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"volumeID\":{\"type\":\"string\"}},\"required\":[\"volumeID\"],\"type\":\"object\"},\"projected\":{\"properties\":{\"defaultMode\":{\"format\":\"int32\",\"type\":\"integer\"},\"sources\":{\"items\":{\"properties\":{\"configMap\":{\"properties\":{\"items\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"}},\"required\":[\"key\",\"path\"],\"type\":\"object\"},\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"downwardAPI\":{\"properties\":{\"items\":{\"items\":{\"properties\":{\"fieldRef\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"fieldPath\":{\"type\":\"string\"}},\"required\":[\"fieldPath\"],\"type\":\"object\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"},\"resourceFieldRef\":{\"properties\":{\"containerName\":{\"type\":\"string\"},\"divisor\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"resource\":{\"type\":\"string\"}},\"required\":[\"resource\"],\"type\":\"object\"}},\"required\":[\"path\"],\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"secret\":{\"properties\":{\"items\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"}},\"required\":[\"key\",\"path\"],\"type\":\"object\"},\"type\":\"array\"},\"name\":{\"type\":\"string\"},\"optional\":{\"type\":\"boolean\"}},\"type\":\"object\"},\"serviceAccountToken\":{\"properties\":{\"audience\":{\"type\":\"string\"},\"expirationSeconds\":{\"format\":\"int64\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"}},\"required\":[\"path\"],\"type\":\"object\"}},\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"quobyte\":{\"properties\":{\"group\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"registry\":{\"type\":\"string\"},\"tenant\":{\"type\":\"string\"},\"user\":{\"type\":\"string\"},\"volume\":{\"type\":\"string\"}},\"required\":[\"registry\",\"volume\"],\"type\":\"object\"},\"rbd\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"keyring\":{\"type\":\"string\"},\"monitors\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"pool\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"user\":{\"type\":\"string\"}},\"required\":[\"image\",\"monitors\"],\"type\":\"object\"},\"scaleIO\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"gateway\":{\"type\":\"string\"},\"protectionDomain\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"sslEnabled\":{\"type\":\"boolean\"},\"storageMode\":{\"type\":\"string\"},\"storagePool\":{\"type\":\"string\"},\"system\":{\"type\":\"string\"},\"volumeName\":{\"type\":\"string\"}},\"required\":[\"gateway\",\"secretRef\",\"system\"],\"type\":\"object\"},\"secret\":{\"properties\":{\"defaultMode\":{\"format\":\"int32\",\"type\":\"integer\"},\"items\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"mode\":{\"format\":\"int32\",\"type\":\"integer\"},\"path\":{\"type\":\"string\"}},\"required\":[\"key\",\"path\"],\"type\":\"object\"},\"type\":\"array\"},\"optional\":{\"type\":\"boolean\"},\"secretName\":{\"type\":\"string\"}},\"type\":\"object\"},\"storageos\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"readOnly\":{\"type\":\"boolean\"},\"secretRef\":{\"properties\":{\"name\":{\"type\":\"string\"}},\"type\":\"object\"},\"volumeName\":{\"type\":\"string\"},\"volumeNamespace\":{\"type\":\"string\"}},\"type\":\"object\"},\"vsphereVolume\":{\"properties\":{\"fsType\":{\"type\":\"string\"},\"storagePolicyID\":{\"type\":\"string\"},\"storagePolicyName\":{\"type\":\"string\"},\"volumePath\":{\"type\":\"string\"}},\"required\":[\"volumePath\"],\"type\":\"object\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"containers\"],\"type\":\"object\"}},\"type\":\"object\"},\"updateStrategy\":{\"properties\":{\"rollingUpdate\":{\"properties\":{\"partition\":{\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"type\":{\"type\":\"string\"}},\"type\":\"object\"},\"volumeClaimTemplates\":{\"items\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"metadata\":{\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"labels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"},\"name\":{\"type\":\"string\"},\"namespace\":{\"type\":\"string\"}},\"type\":\"object\"},\"spec\":{\"properties\":{\"accessModes\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"},\"dataSource\":{\"properties\":{\"apiGroup\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"}},\"required\":[\"kind\",\"name\"],\"type\":\"object\"},\"resources\":{\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"type\":\"object\"}},\"type\":\"object\"},\"selector\":{\"properties\":{\"matchExpressions\":{\"items\":{\"properties\":{\"key\":{\"type\":\"string\"},\"operator\":{\"type\":\"string\"},\"values\":{\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"key\",\"operator\"],\"type\":\"object\"},\"type\":\"array\"},\"matchLabels\":{\"additionalProperties\":{\"type\":\"string\"},\"type\":\"object\"}},\"type\":\"object\"},\"storageClassName\":{\"type\":\"string\"},\"volumeMode\":{\"type\":\"string\"},\"volumeName\":{\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"persistence\":{\"default\":{\"storage\":\"10Gi\"},\"description\":\"The desired persistent storage configuration for each Pod in the cluster.\",\"properties\":{\"storage\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"default\":\"10Gi\",\"description\":\"The requested size of the persistent volume attached to each Pod in the RabbitmqCluster. The format of this field matches that defined by kubernetes/apimachinery. See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.\",\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"storageClassName\":{\"description\":\"The name of the StorageClass to claim a PersistentVolume from.\",\"type\":\"string\"}},\"type\":\"object\"},\"rabbitmq\":{\"description\":\"Configuration options for RabbitMQ Pods created in the cluster.\",\"properties\":{\"additionalConfig\":{\"description\":\"Modify to add to the rabbitmq.conf file in addition to default configurations set by the operator. Modifying this property on an existing RabbitmqCluster will trigger a StatefulSet rolling restart and will cause rabbitmq downtime. For more information on this config, see https://www.rabbitmq.com/configure.html#config-file\",\"maxLength\":2000,\"type\":\"string\"},\"additionalPlugins\":{\"description\":\"List of plugins to enable in addition to essential plugins: rabbitmq_management, rabbitmq_prometheus, and rabbitmq_peer_discovery_k8s.\",\"items\":{\"description\":\"A Plugin to enable on the RabbitmqCluster.\",\"maxLength\":100,\"pattern\":\"^\\\\w+$\",\"type\":\"string\"},\"maxItems\":100,\"type\":\"array\"},\"advancedConfig\":{\"description\":\"Specify any rabbitmq advanced.config configurations to apply to the cluster. For more information on advanced config, see https://www.rabbitmq.com/configure.html#advanced-config-file\",\"maxLength\":100000,\"type\":\"string\"},\"envConfig\":{\"description\":\"Modify to add to the rabbitmq-env.conf file. Modifying this property on an existing RabbitmqCluster will trigger a StatefulSet rolling restart and will cause rabbitmq downtime. For more information on env config, see https://www.rabbitmq.com/man/rabbitmq-env.conf.5.html\",\"maxLength\":100000,\"type\":\"string\"}},\"type\":\"object\"},\"replicas\":{\"default\":1,\"description\":\"Replicas is the number of nodes in the RabbitMQ cluster. Each node is deployed as a Replica in a StatefulSet. Only 1, 3, 5 replicas clusters are tested. This value should be an odd number to ensure the resultant cluster can establish exactly one quorum of nodes in the event of a fragmenting network partition.\",\"format\":\"int32\",\"minimum\":0,\"type\":\"integer\"},\"resources\":{\"default\":{\"limits\":{\"cpu\":\"2000m\",\"memory\":\"2Gi\"},\"requests\":{\"cpu\":\"1000m\",\"memory\":\"2Gi\"}},\"description\":\"The desired compute resource requirements of Pods in the cluster.\",\"properties\":{\"limits\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"description\":\"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\",\"type\":\"object\"},\"requests\":{\"additionalProperties\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"string\"}],\"pattern\":\"^(\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\\\+|-)?(([0-9]+(\\\\.[0-9]*)?)|(\\\\.[0-9]+))))?$\",\"x-kubernetes-int-or-string\":true},\"description\":\"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\",\"type\":\"object\"}},\"type\":\"object\"},\"secretBackend\":{\"description\":\"Secret backend configuration for the RabbitmqCluster. Enables to fetch default user credentials and certificates from K8s external secret stores.\",\"properties\":{\"vault\":{\"description\":\"VaultSpec will add Vault annotations (see https://www.vaultproject.io/docs/platform/k8s/injector/annotations) to RabbitMQ Pods. It requires a Vault Agent Sidecar Injector (https://www.vaultproject.io/docs/platform/k8s/injector) to be installed in the K8s cluster. The injector is a K8s Mutation Webhook Controller that alters RabbitMQ Pod specifications (based on the added Vault annotations) to include Vault Agent containers that render Vault secrets to the volume.\",\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"Vault annotations that override the Vault annotations set by the cluster-operator. For a list of valid Vault annotations, see https://www.vaultproject.io/docs/platform/k8s/injector/annotations\",\"type\":\"object\"},\"defaultUserPath\":{\"description\":\"Path in Vault to access a KV (Key-Value) secret with the fields username and password for the default user. For example \\\"secret/data/rabbitmq/config\\\".\",\"type\":\"string\"},\"defaultUserUpdaterImage\":{\"description\":\"Sidecar container that updates the default user's password in RabbitMQ when it changes in Vault. Additionally, it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by rabbitmqadmin CLI). Set to empty string to disable the sidecar container.\",\"type\":\"string\"},\"role\":{\"description\":\"Role in Vault. If vault.defaultUserPath is set, this role must have capability to read the pre-created default user credential in Vault. If vault.tls is set, this role must have capability to create and update certificates in the Vault PKI engine for the domains \\\"\\u003cnamespace\\u003e\\\" and \\\"\\u003cnamespace\\u003e.svc\\\".\",\"type\":\"string\"},\"tls\":{\"properties\":{\"altNames\":{\"description\":\"Specifies the requested Subject Alternative Names (SANs), in a comma-delimited list. These will be appended to the SANs added by the cluster-operator. The cluster-operator will add SANs: \\\"\\u003cRabbitmqCluster name\\u003e-server-\\u003cindex\\u003e.\\u003cRabbitmqCluster name\\u003e-nodes.\\u003cnamespace\\u003e\\\" for each pod, e.g. \\\"myrabbit-server-0.myrabbit-nodes.default\\\".\",\"type\":\"string\"},\"commonName\":{\"description\":\"Specifies the requested certificate Common Name (CN). Defaults to \\u003cserviceName\\u003e.\\u003cnamespace\\u003e.svc if not provided.\",\"type\":\"string\"},\"ipSans\":{\"description\":\"Specifies the requested IP Subject Alternative Names, in a comma-delimited list.\",\"type\":\"string\"},\"pkiIssuerPath\":{\"description\":\"Path in Vault PKI engine. For example \\\"pki/issue/hashicorp-com\\\". required\",\"type\":\"string\"}},\"type\":\"object\"}},\"type\":\"object\"}},\"type\":\"object\"},\"service\":{\"default\":{\"type\":\"ClusterIP\"},\"description\":\"The desired state of the Kubernetes Service to create for the cluster.\",\"properties\":{\"annotations\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"Annotations to add to the Service.\",\"type\":\"object\"},\"type\":{\"default\":\"ClusterIP\",\"description\":\"Type of Service to create for the cluster. Must be one of: ClusterIP, LoadBalancer, NodePort. For more info see https://pkg.go.dev/k8s.io/api/core/v1#ServiceType\",\"enum\":[\"ClusterIP\",\"LoadBalancer\",\"NodePort\"],\"type\":\"string\"}},\"type\":\"object\"},\"skipPostDeploySteps\":{\"description\":\"If unset, or set to false, the cluster will run `rabbitmq-queues rebalance all` whenever the cluster is updated. Set to true to prevent the operator rebalancing queue leaders after a cluster update. Has no effect if the cluster only consists of one node. For more information, see https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance\",\"type\":\"boolean\"},\"terminationGracePeriodSeconds\":{\"default\":604800,\"description\":\"TerminationGracePeriodSeconds is the timeout that each rabbitmqcluster pod will have to terminate gracefully. It defaults to 604800 seconds ( a week long) to ensure that the container preStop lifecycle hook can finish running. For more information, see: https://github.com/rabbitmq/cluster-operator/blob/main/docs/design/20200520-graceful-pod-termination.md\",\"format\":\"int64\",\"minimum\":0,\"type\":\"integer\"},\"tls\":{\"description\":\"TLS-related configuration for the RabbitMQ cluster.\",\"properties\":{\"caSecretName\":{\"description\":\"Name of a Secret in the same Namespace as the RabbitmqCluster, containing the Certificate Authority's public certificate for TLS. The Secret must store this as ca.crt. This Secret can be created by running `kubectl create secret generic ca-secret --from-file=ca.crt=path/to/ca.cert` Used for mTLS, and TLS for rabbitmq_web_stomp and rabbitmq_web_mqtt.\",\"type\":\"string\"},\"disableNonTLSListeners\":{\"description\":\"When set to true, the RabbitmqCluster disables non-TLS listeners for RabbitMQ, management plugin and for any enabled plugins in the following list: stomp, mqtt, web_stomp, web_mqtt. Only TLS-enabled clients will be able to connect.\",\"type\":\"boolean\"},\"secretName\":{\"description\":\"Name of a Secret in the same Namespace as the RabbitmqCluster, containing the server's private key \\u0026 public certificate for TLS. The Secret must store these as tls.key and tls.crt, respectively. This Secret can be created by running `kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key`\",\"type\":\"string\"}},\"type\":\"object\"},\"tolerations\":{\"description\":\"Tolerations is the list of Toleration resources attached to each Pod in the RabbitmqCluster.\",\"items\":{\"description\":\"The pod this Toleration is attached to tolerates any taint that matches the triple \\u003ckey,value,effect\\u003e using the matching operator \\u003coperator\\u003e.\",\"properties\":{\"effect\":{\"description\":\"Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.\",\"type\":\"string\"},\"key\":{\"description\":\"Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.\",\"type\":\"string\"},\"operator\":{\"description\":\"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.\",\"type\":\"string\"},\"tolerationSeconds\":{\"description\":\"TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.\",\"format\":\"int64\",\"type\":\"integer\"},\"value\":{\"description\":\"Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.\",\"type\":\"string\"}},\"type\":\"object\"},\"type\":\"array\"}},\"type\":\"object\"},\"status\":{\"description\":\"Status presents the observed state of RabbitmqCluster\",\"properties\":{\"binding\":{\"description\":\"Binding exposes a secret containing the binding information for this RabbitmqCluster. It implements the service binding Provisioned Service duck type. See: https://github.com/servicebinding/spec#provisioned-service\",\"properties\":{\"name\":{\"description\":\"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?\",\"type\":\"string\"}},\"type\":\"object\"},\"conditions\":{\"description\":\"Set of Conditions describing the current state of the RabbitmqCluster\",\"items\":{\"properties\":{\"lastTransitionTime\":{\"description\":\"The last time this Condition type changed.\",\"format\":\"date-time\",\"type\":\"string\"},\"message\":{\"description\":\"Full text reason for current status of the condition.\",\"type\":\"string\"},\"reason\":{\"description\":\"One word, camel-case reason for current status of the condition.\",\"type\":\"string\"},\"status\":{\"description\":\"True, False, or Unknown\",\"type\":\"string\"},\"type\":{\"description\":\"Type indicates the scope of RabbitmqCluster status addressed by the condition.\",\"type\":\"string\"}},\"required\":[\"status\",\"type\"],\"type\":\"object\"},\"type\":\"array\"},\"defaultUser\":{\"description\":\"Identifying information on internal resources\",\"properties\":{\"secretReference\":{\"description\":\"Reference to the Kubernetes Secret containing the credentials of the default user.\",\"properties\":{\"keys\":{\"additionalProperties\":{\"type\":\"string\"},\"description\":\"Key-value pairs in the Secret corresponding to `username`, `password`, `host`, and `port`\",\"type\":\"object\"},\"name\":{\"description\":\"Name of the Secret containing the default user credentials\",\"type\":\"string\"},\"namespace\":{\"description\":\"Namespace of the Secret containing the default user credentials\",\"type\":\"string\"}},\"required\":[\"keys\",\"name\",\"namespace\"],\"type\":\"object\"},\"serviceReference\":{\"description\":\"Reference to the Kubernetes Service serving the cluster.\",\"properties\":{\"name\":{\"description\":\"Name of the Service serving the cluster\",\"type\":\"string\"},\"namespace\":{\"description\":\"Namespace of the Service serving the cluster\",\"type\":\"string\"}},\"required\":[\"name\",\"namespace\"],\"type\":\"object\"}},\"type\":\"object\"},\"observedGeneration\":{\"description\":\"observedGeneration is the most recent successful generation observed for this RabbitmqCluster. It corresponds to the RabbitmqCluster's generation, which is updated on mutation by the API Server.\",\"format\":\"int64\",\"type\":\"integer\"}},\"required\":[\"conditions\"],\"type\":\"object\"}},\"type\":\"object\"}},\"served\":true,\"storage\":true,\"subresources\":{\"status\":{}}}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":[],\"storedVersions\":[]}}\n"}, "creationTimestamp": "2022-04-27T17:47:59Z", "generation": 1, "labels": {"app.kubernetes.io/component": "rabbitmq-operator", "app.kubernetes.io/name": "rabbitmq-cluster-operator", "app.kubernetes.io/part-of": "rabbitmq"}, "name": "rabbitmqclusters.rabbitmq.com", "resourceVersion": "625", "uid": "d90e1267-abc1-4b7f-946c-e2ddde926960"}, "spec": {"conversion": {"strategy": "None"}, "group": "rabbitmq.com", "names": {"categories": ["all"], "kind": "RabbitmqCluster", "listKind": "RabbitmqClusterList", "plural": "rabbitmqclusters", "shortNames": ["rmq"], "singular": "rabbitmqcluster"}, "scope": "Namespaced", "versions": [{"additionalPrinterColumns": [{"jsonPath": ".status.conditions[?(@.type == 'AllReplicasReady')].status", "name": "AllReplicasReady", "type": "string"}, {"jsonPath": ".status.conditions[?(@.type == 'ReconcileSuccess')].status", "name": "ReconcileSuccess", "type": "string"}, {"jsonPath": ".metadata.creationTimestamp", "name": "Age", "type": "date"}], "name": "v1beta1", "schema": {"openAPIV3Schema": {"description": "RabbitmqCluster is the Schema for the RabbitmqCluster API. Each instance of this object corresponds to a single RabbitMQ cluster.", "properties": {"apiVersion": {"description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", "type": "string"}, "kind": {"description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", "type": "string"}, "metadata": {"type": "object"}, "spec": {"description": "Spec is the desired state of the RabbitmqCluster Custom Resource.", "properties": {"affinity": {"description": "Affinity scheduling rules to be applied on created Pods.", "properties": {"nodeAffinity": {"description": "Describes node affinity scheduling rules for the pod.", "properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"description": "The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.", "items": {"description": "An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).", "properties": {"preference": {"description": "A node selector term, associated with the corresponding weight.", "properties": {"matchExpressions": {"description": "A list of node selector requirements by node's labels.", "items": {"description": "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "The label key that the selector applies to.", "type": "string"}, "operator": {"description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", "type": "string"}, "values": {"description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchFields": {"description": "A list of node selector requirements by node's fields.", "items": {"description": "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "The label key that the selector applies to.", "type": "string"}, "operator": {"description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", "type": "string"}, "values": {"description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}}, "type": "object"}, "weight": {"description": "Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.", "format": "int32", "type": "integer"}}, "required": ["preference", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.", "properties": {"nodeSelectorTerms": {"description": "Required. A list of node selector terms. The terms are ORed.", "items": {"description": "A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.", "properties": {"matchExpressions": {"description": "A list of node selector requirements by node's labels.", "items": {"description": "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "The label key that the selector applies to.", "type": "string"}, "operator": {"description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", "type": "string"}, "values": {"description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchFields": {"description": "A list of node selector requirements by node's fields.", "items": {"description": "A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "The label key that the selector applies to.", "type": "string"}, "operator": {"description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", "type": "string"}, "values": {"description": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}}, "type": "object"}, "type": "array"}}, "required": ["nodeSelectorTerms"], "type": "object"}}, "type": "object"}, "podAffinity": {"description": "Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).", "properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"description": "The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", "items": {"description": "The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)", "properties": {"podAffinityTerm": {"description": "Required. A pod affinity term, associated with the corresponding weight.", "properties": {"labelSelector": {"description": "A label query over a set of resources, in this case pods.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaceSelector": {"description": "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaces": {"description": "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", "items": {"type": "string"}, "type": "array"}, "topologyKey": {"description": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", "type": "string"}}, "required": ["topologyKey"], "type": "object"}, "weight": {"description": "weight associated with matching the corresponding podAffinityTerm, in the range 1-100.", "format": "int32", "type": "integer"}}, "required": ["podAffinityTerm", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"description": "If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "items": {"description": "Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running", "properties": {"labelSelector": {"description": "A label query over a set of resources, in this case pods.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaceSelector": {"description": "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaces": {"description": "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", "items": {"type": "string"}, "type": "array"}, "topologyKey": {"description": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", "type": "string"}}, "required": ["topologyKey"], "type": "object"}, "type": "array"}}, "type": "object"}, "podAntiAffinity": {"description": "Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).", "properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"description": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", "items": {"description": "The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)", "properties": {"podAffinityTerm": {"description": "Required. A pod affinity term, associated with the corresponding weight.", "properties": {"labelSelector": {"description": "A label query over a set of resources, in this case pods.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaceSelector": {"description": "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaces": {"description": "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", "items": {"type": "string"}, "type": "array"}, "topologyKey": {"description": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", "type": "string"}}, "required": ["topologyKey"], "type": "object"}, "weight": {"description": "weight associated with matching the corresponding podAffinityTerm, in the range 1-100.", "format": "int32", "type": "integer"}}, "required": ["podAffinityTerm", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"description": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", "items": {"description": "Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running", "properties": {"labelSelector": {"description": "A label query over a set of resources, in this case pods.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaceSelector": {"description": "A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means \"this pod's namespace\". An empty selector ({}) matches all namespaces. This field is alpha-level and is only honored when PodAffinityNamespaceSelector feature is enabled.", "properties": {"matchExpressions": {"description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.", "items": {"description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.", "properties": {"key": {"description": "key is the label key that the selector applies to.", "type": "string"}, "operator": {"description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.", "type": "string"}, "values": {"description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", "items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.", "type": "object"}}, "type": "object"}, "namespaces": {"description": "namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means \"this pod's namespace\"", "items": {"type": "string"}, "type": "array"}, "topologyKey": {"description": "This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.", "type": "string"}}, "required": ["topologyKey"], "type": "object"}, "type": "array"}}, "type": "object"}}, "type": "object"}, "image": {"description": "Image is the name of the RabbitMQ docker image to use for RabbitMQ nodes in the RabbitmqCluster. Must be provided together with ImagePullSecrets in order to use an image in a private registry.", "type": "string"}, "imagePullSecrets": {"description": "List of Secret resource containing access credentials to the registry for the RabbitMQ image. Required if the docker registry is private.", "items": {"description": "LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.", "properties": {"name": {"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", "type": "string"}}, "type": "object"}, "type": "array"}, "override": {"properties": {"service": {"properties": {"metadata": {"properties": {"annotations": {"additionalProperties": {"type": "string"}, "type": "object"}, "labels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "spec": {"properties": {"allocateLoadBalancerNodePorts": {"type": "boolean"}, "clusterIP": {"type": "string"}, "clusterIPs": {"items": {"type": "string"}, "type": "array", "x-kubernetes-list-type": "atomic"}, "externalIPs": {"items": {"type": "string"}, "type": "array"}, "externalName": {"type": "string"}, "externalTrafficPolicy": {"type": "string"}, "healthCheckNodePort": {"format": "int32", "type": "integer"}, "internalTrafficPolicy": {"type": "string"}, "ipFamilies": {"items": {"type": "string"}, "type": "array", "x-kubernetes-list-type": "atomic"}, "ipFamilyPolicy": {"type": "string"}, "loadBalancerClass": {"type": "string"}, "loadBalancerIP": {"type": "string"}, "loadBalancerSourceRanges": {"items": {"type": "string"}, "type": "array"}, "ports": {"items": {"properties": {"appProtocol": {"type": "string"}, "name": {"type": "string"}, "nodePort": {"format": "int32", "type": "integer"}, "port": {"format": "int32", "type": "integer"}, "protocol": {"default": "TCP", "type": "string"}, "targetPort": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "type": "array", "x-kubernetes-list-map-keys": ["port", "protocol"], "x-kubernetes-list-type": "map"}, "publishNotReadyAddresses": {"type": "boolean"}, "selector": {"additionalProperties": {"type": "string"}, "type": "object"}, "sessionAffinity": {"type": "string"}, "sessionAffinityConfig": {"properties": {"clientIP": {"properties": {"timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}}, "type": "object"}, "topologyKeys": {"items": {"type": "string"}, "type": "array"}, "type": {"type": "string"}}, "type": "object"}}, "type": "object"}, "statefulSet": {"properties": {"metadata": {"properties": {"annotations": {"additionalProperties": {"type": "string"}, "type": "object"}, "labels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "spec": {"properties": {"podManagementPolicy": {"type": "string"}, "replicas": {"format": "int32", "type": "integer"}, "selector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "serviceName": {"type": "string"}, "template": {"properties": {"metadata": {"properties": {"annotations": {"additionalProperties": {"type": "string"}, "type": "object"}, "labels": {"additionalProperties": {"type": "string"}, "type": "object"}, "name": {"type": "string"}, "namespace": {"type": "string"}}, "type": "object"}, "spec": {"properties": {"activeDeadlineSeconds": {"format": "int64", "type": "integer"}, "affinity": {"properties": {"nodeAffinity": {"properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"items": {"properties": {"preference": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchFields": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}}, "type": "object"}, "weight": {"format": "int32", "type": "integer"}}, "required": ["preference", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"properties": {"nodeSelectorTerms": {"items": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchFields": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}}, "type": "object"}, "type": "array"}}, "required": ["nodeSelectorTerms"], "type": "object"}}, "type": "object"}, "podAffinity": {"properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"items": {"properties": {"podAffinityTerm": {"properties": {"labelSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaceSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaces": {"items": {"type": "string"}, "type": "array"}, "topologyKey": {"type": "string"}}, "required": ["topologyKey"], "type": "object"}, "weight": {"format": "int32", "type": "integer"}}, "required": ["podAffinityTerm", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"items": {"properties": {"labelSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaceSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaces": {"items": {"type": "string"}, "type": "array"}, "topologyKey": {"type": "string"}}, "required": ["topologyKey"], "type": "object"}, "type": "array"}}, "type": "object"}, "podAntiAffinity": {"properties": {"preferredDuringSchedulingIgnoredDuringExecution": {"items": {"properties": {"podAffinityTerm": {"properties": {"labelSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaceSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaces": {"items": {"type": "string"}, "type": "array"}, "topologyKey": {"type": "string"}}, "required": ["topologyKey"], "type": "object"}, "weight": {"format": "int32", "type": "integer"}}, "required": ["podAffinityTerm", "weight"], "type": "object"}, "type": "array"}, "requiredDuringSchedulingIgnoredDuringExecution": {"items": {"properties": {"labelSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaceSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "namespaces": {"items": {"type": "string"}, "type": "array"}, "topologyKey": {"type": "string"}}, "required": ["topologyKey"], "type": "object"}, "type": "array"}}, "type": "object"}}, "type": "object"}, "automountServiceAccountToken": {"type": "boolean"}, "containers": {"items": {"properties": {"args": {"items": {"type": "string"}, "type": "array"}, "command": {"items": {"type": "string"}, "type": "array"}, "env": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}, "valueFrom": {"properties": {"configMapKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}, "fieldRef": {"properties": {"apiVersion": {"type": "string"}, "fieldPath": {"type": "string"}}, "required": ["fieldPath"], "type": "object"}, "resourceFieldRef": {"properties": {"containerName": {"type": "string"}, "divisor": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "resource": {"type": "string"}}, "required": ["resource"], "type": "object"}, "secretKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}}, "type": "object"}}, "required": ["name"], "type": "object"}, "type": "array"}, "envFrom": {"items": {"properties": {"configMapRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "prefix": {"type": "string"}, "secretRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}}, "type": "object"}, "type": "array"}, "image": {"type": "string"}, "imagePullPolicy": {"type": "string"}, "lifecycle": {"properties": {"postStart": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}, "preStop": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}}, "type": "object"}, "livenessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "name": {"type": "string"}, "ports": {"items": {"properties": {"containerPort": {"format": "int32", "type": "integer"}, "hostIP": {"type": "string"}, "hostPort": {"format": "int32", "type": "integer"}, "name": {"type": "string"}, "protocol": {"default": "TCP", "type": "string"}}, "required": ["containerPort"], "type": "object"}, "type": "array", "x-kubernetes-list-map-keys": ["containerPort", "protocol"], "x-kubernetes-list-type": "map"}, "readinessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "resources": {"properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}}, "type": "object"}, "securityContext": {"properties": {"allowPrivilegeEscalation": {"type": "boolean"}, "capabilities": {"properties": {"add": {"items": {"type": "string"}, "type": "array"}, "drop": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "privileged": {"type": "boolean"}, "procMount": {"type": "string"}, "readOnlyRootFilesystem": {"type": "boolean"}, "runAsGroup": {"format": "int64", "type": "integer"}, "runAsNonRoot": {"type": "boolean"}, "runAsUser": {"format": "int64", "type": "integer"}, "seLinuxOptions": {"properties": {"level": {"type": "string"}, "role": {"type": "string"}, "type": {"type": "string"}, "user": {"type": "string"}}, "type": "object"}, "seccompProfile": {"properties": {"localhostProfile": {"type": "string"}, "type": {"type": "string"}}, "required": ["type"], "type": "object"}, "windowsOptions": {"properties": {"gmsaCredentialSpec": {"type": "string"}, "gmsaCredentialSpecName": {"type": "string"}, "runAsUserName": {"type": "string"}}, "type": "object"}}, "type": "object"}, "startupProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "stdin": {"type": "boolean"}, "stdinOnce": {"type": "boolean"}, "terminationMessagePath": {"type": "string"}, "terminationMessagePolicy": {"type": "string"}, "tty": {"type": "boolean"}, "volumeDevices": {"items": {"properties": {"devicePath": {"type": "string"}, "name": {"type": "string"}}, "required": ["devicePath", "name"], "type": "object"}, "type": "array"}, "volumeMounts": {"items": {"properties": {"mountPath": {"type": "string"}, "mountPropagation": {"type": "string"}, "name": {"type": "string"}, "readOnly": {"type": "boolean"}, "subPath": {"type": "string"}, "subPathExpr": {"type": "string"}}, "required": ["mountPath", "name"], "type": "object"}, "type": "array"}, "workingDir": {"type": "string"}}, "required": ["name"], "type": "object"}, "type": "array"}, "dnsConfig": {"properties": {"nameservers": {"items": {"type": "string"}, "type": "array"}, "options": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "type": "object"}, "type": "array"}, "searches": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "dnsPolicy": {"type": "string"}, "enableServiceLinks": {"type": "boolean"}, "ephemeralContainers": {"items": {"properties": {"args": {"items": {"type": "string"}, "type": "array"}, "command": {"items": {"type": "string"}, "type": "array"}, "env": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}, "valueFrom": {"properties": {"configMapKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}, "fieldRef": {"properties": {"apiVersion": {"type": "string"}, "fieldPath": {"type": "string"}}, "required": ["fieldPath"], "type": "object"}, "resourceFieldRef": {"properties": {"containerName": {"type": "string"}, "divisor": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "resource": {"type": "string"}}, "required": ["resource"], "type": "object"}, "secretKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}}, "type": "object"}}, "required": ["name"], "type": "object"}, "type": "array"}, "envFrom": {"items": {"properties": {"configMapRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "prefix": {"type": "string"}, "secretRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}}, "type": "object"}, "type": "array"}, "image": {"type": "string"}, "imagePullPolicy": {"type": "string"}, "lifecycle": {"properties": {"postStart": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}, "preStop": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}}, "type": "object"}, "livenessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "name": {"type": "string"}, "ports": {"items": {"properties": {"containerPort": {"format": "int32", "type": "integer"}, "hostIP": {"type": "string"}, "hostPort": {"format": "int32", "type": "integer"}, "name": {"type": "string"}, "protocol": {"default": "TCP", "type": "string"}}, "required": ["containerPort"], "type": "object"}, "type": "array"}, "readinessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "resources": {"properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}}, "type": "object"}, "securityContext": {"properties": {"allowPrivilegeEscalation": {"type": "boolean"}, "capabilities": {"properties": {"add": {"items": {"type": "string"}, "type": "array"}, "drop": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "privileged": {"type": "boolean"}, "procMount": {"type": "string"}, "readOnlyRootFilesystem": {"type": "boolean"}, "runAsGroup": {"format": "int64", "type": "integer"}, "runAsNonRoot": {"type": "boolean"}, "runAsUser": {"format": "int64", "type": "integer"}, "seLinuxOptions": {"properties": {"level": {"type": "string"}, "role": {"type": "string"}, "type": {"type": "string"}, "user": {"type": "string"}}, "type": "object"}, "seccompProfile": {"properties": {"localhostProfile": {"type": "string"}, "type": {"type": "string"}}, "required": ["type"], "type": "object"}, "windowsOptions": {"properties": {"gmsaCredentialSpec": {"type": "string"}, "gmsaCredentialSpecName": {"type": "string"}, "runAsUserName": {"type": "string"}}, "type": "object"}}, "type": "object"}, "startupProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "stdin": {"type": "boolean"}, "stdinOnce": {"type": "boolean"}, "targetContainerName": {"type": "string"}, "terminationMessagePath": {"type": "string"}, "terminationMessagePolicy": {"type": "string"}, "tty": {"type": "boolean"}, "volumeDevices": {"items": {"properties": {"devicePath": {"type": "string"}, "name": {"type": "string"}}, "required": ["devicePath", "name"], "type": "object"}, "type": "array"}, "volumeMounts": {"items": {"properties": {"mountPath": {"type": "string"}, "mountPropagation": {"type": "string"}, "name": {"type": "string"}, "readOnly": {"type": "boolean"}, "subPath": {"type": "string"}, "subPathExpr": {"type": "string"}}, "required": ["mountPath", "name"], "type": "object"}, "type": "array"}, "workingDir": {"type": "string"}}, "required": ["name"], "type": "object"}, "type": "array"}, "hostAliases": {"items": {"properties": {"hostnames": {"items": {"type": "string"}, "type": "array"}, "ip": {"type": "string"}}, "type": "object"}, "type": "array"}, "hostIPC": {"type": "boolean"}, "hostNetwork": {"type": "boolean"}, "hostPID": {"type": "boolean"}, "hostname": {"type": "string"}, "imagePullSecrets": {"items": {"properties": {"name": {"type": "string"}}, "type": "object"}, "type": "array"}, "initContainers": {"items": {"properties": {"args": {"items": {"type": "string"}, "type": "array"}, "command": {"items": {"type": "string"}, "type": "array"}, "env": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}, "valueFrom": {"properties": {"configMapKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}, "fieldRef": {"properties": {"apiVersion": {"type": "string"}, "fieldPath": {"type": "string"}}, "required": ["fieldPath"], "type": "object"}, "resourceFieldRef": {"properties": {"containerName": {"type": "string"}, "divisor": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "resource": {"type": "string"}}, "required": ["resource"], "type": "object"}, "secretKeyRef": {"properties": {"key": {"type": "string"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "required": ["key"], "type": "object"}}, "type": "object"}}, "required": ["name"], "type": "object"}, "type": "array"}, "envFrom": {"items": {"properties": {"configMapRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "prefix": {"type": "string"}, "secretRef": {"properties": {"name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}}, "type": "object"}, "type": "array"}, "image": {"type": "string"}, "imagePullPolicy": {"type": "string"}, "lifecycle": {"properties": {"postStart": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}, "preStop": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}}, "type": "object"}}, "type": "object"}, "livenessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "name": {"type": "string"}, "ports": {"items": {"properties": {"containerPort": {"format": "int32", "type": "integer"}, "hostIP": {"type": "string"}, "hostPort": {"format": "int32", "type": "integer"}, "name": {"type": "string"}, "protocol": {"default": "TCP", "type": "string"}}, "required": ["containerPort"], "type": "object"}, "type": "array", "x-kubernetes-list-map-keys": ["containerPort", "protocol"], "x-kubernetes-list-type": "map"}, "readinessProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "resources": {"properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}}, "type": "object"}, "securityContext": {"properties": {"allowPrivilegeEscalation": {"type": "boolean"}, "capabilities": {"properties": {"add": {"items": {"type": "string"}, "type": "array"}, "drop": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "privileged": {"type": "boolean"}, "procMount": {"type": "string"}, "readOnlyRootFilesystem": {"type": "boolean"}, "runAsGroup": {"format": "int64", "type": "integer"}, "runAsNonRoot": {"type": "boolean"}, "runAsUser": {"format": "int64", "type": "integer"}, "seLinuxOptions": {"properties": {"level": {"type": "string"}, "role": {"type": "string"}, "type": {"type": "string"}, "user": {"type": "string"}}, "type": "object"}, "seccompProfile": {"properties": {"localhostProfile": {"type": "string"}, "type": {"type": "string"}}, "required": ["type"], "type": "object"}, "windowsOptions": {"properties": {"gmsaCredentialSpec": {"type": "string"}, "gmsaCredentialSpecName": {"type": "string"}, "runAsUserName": {"type": "string"}}, "type": "object"}}, "type": "object"}, "startupProbe": {"properties": {"exec": {"properties": {"command": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "failureThreshold": {"format": "int32", "type": "integer"}, "httpGet": {"properties": {"host": {"type": "string"}, "httpHeaders": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "path": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}, "scheme": {"type": "string"}}, "required": ["port"], "type": "object"}, "initialDelaySeconds": {"format": "int32", "type": "integer"}, "periodSeconds": {"format": "int32", "type": "integer"}, "successThreshold": {"format": "int32", "type": "integer"}, "tcpSocket": {"properties": {"host": {"type": "string"}, "port": {"anyOf": [{"type": "integer"}, {"type": "string"}], "x-kubernetes-int-or-string": true}}, "required": ["port"], "type": "object"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "timeoutSeconds": {"format": "int32", "type": "integer"}}, "type": "object"}, "stdin": {"type": "boolean"}, "stdinOnce": {"type": "boolean"}, "terminationMessagePath": {"type": "string"}, "terminationMessagePolicy": {"type": "string"}, "tty": {"type": "boolean"}, "volumeDevices": {"items": {"properties": {"devicePath": {"type": "string"}, "name": {"type": "string"}}, "required": ["devicePath", "name"], "type": "object"}, "type": "array"}, "volumeMounts": {"items": {"properties": {"mountPath": {"type": "string"}, "mountPropagation": {"type": "string"}, "name": {"type": "string"}, "readOnly": {"type": "boolean"}, "subPath": {"type": "string"}, "subPathExpr": {"type": "string"}}, "required": ["mountPath", "name"], "type": "object"}, "type": "array"}, "workingDir": {"type": "string"}}, "required": ["name"], "type": "object"}, "type": "array"}, "nodeName": {"type": "string"}, "nodeSelector": {"additionalProperties": {"type": "string"}, "type": "object"}, "overhead": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "preemptionPolicy": {"type": "string"}, "priority": {"format": "int32", "type": "integer"}, "priorityClassName": {"type": "string"}, "readinessGates": {"items": {"properties": {"conditionType": {"type": "string"}}, "required": ["conditionType"], "type": "object"}, "type": "array"}, "restartPolicy": {"type": "string"}, "runtimeClassName": {"type": "string"}, "schedulerName": {"type": "string"}, "securityContext": {"properties": {"fsGroup": {"format": "int64", "type": "integer"}, "fsGroupChangePolicy": {"type": "string"}, "runAsGroup": {"format": "int64", "type": "integer"}, "runAsNonRoot": {"type": "boolean"}, "runAsUser": {"format": "int64", "type": "integer"}, "seLinuxOptions": {"properties": {"level": {"type": "string"}, "role": {"type": "string"}, "type": {"type": "string"}, "user": {"type": "string"}}, "type": "object"}, "seccompProfile": {"properties": {"localhostProfile": {"type": "string"}, "type": {"type": "string"}}, "required": ["type"], "type": "object"}, "supplementalGroups": {"items": {"format": "int64", "type": "integer"}, "type": "array"}, "sysctls": {"items": {"properties": {"name": {"type": "string"}, "value": {"type": "string"}}, "required": ["name", "value"], "type": "object"}, "type": "array"}, "windowsOptions": {"properties": {"gmsaCredentialSpec": {"type": "string"}, "gmsaCredentialSpecName": {"type": "string"}, "runAsUserName": {"type": "string"}}, "type": "object"}}, "type": "object"}, "serviceAccount": {"type": "string"}, "serviceAccountName": {"type": "string"}, "setHostnameAsFQDN": {"type": "boolean"}, "shareProcessNamespace": {"type": "boolean"}, "subdomain": {"type": "string"}, "terminationGracePeriodSeconds": {"format": "int64", "type": "integer"}, "tolerations": {"items": {"properties": {"effect": {"type": "string"}, "key": {"type": "string"}, "operator": {"type": "string"}, "tolerationSeconds": {"format": "int64", "type": "integer"}, "value": {"type": "string"}}, "type": "object"}, "type": "array"}, "topologySpreadConstraints": {"items": {"properties": {"labelSelector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "maxSkew": {"format": "int32", "type": "integer"}, "topologyKey": {"type": "string"}, "whenUnsatisfiable": {"type": "string"}}, "required": ["maxSkew", "topologyKey", "whenUnsatisfiable"], "type": "object"}, "type": "array", "x-kubernetes-list-map-keys": ["topologyKey", "whenUnsatisfiable"], "x-kubernetes-list-type": "map"}, "volumes": {"items": {"properties": {"awsElasticBlockStore": {"properties": {"fsType": {"type": "string"}, "partition": {"format": "int32", "type": "integer"}, "readOnly": {"type": "boolean"}, "volumeID": {"type": "string"}}, "required": ["volumeID"], "type": "object"}, "azureDisk": {"properties": {"cachingMode": {"type": "string"}, "diskName": {"type": "string"}, "diskURI": {"type": "string"}, "fsType": {"type": "string"}, "kind": {"type": "string"}, "readOnly": {"type": "boolean"}}, "required": ["diskName", "diskURI"], "type": "object"}, "azureFile": {"properties": {"readOnly": {"type": "boolean"}, "secretName": {"type": "string"}, "shareName": {"type": "string"}}, "required": ["secretName", "shareName"], "type": "object"}, "cephfs": {"properties": {"monitors": {"items": {"type": "string"}, "type": "array"}, "path": {"type": "string"}, "readOnly": {"type": "boolean"}, "secretFile": {"type": "string"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "user": {"type": "string"}}, "required": ["monitors"], "type": "object"}, "cinder": {"properties": {"fsType": {"type": "string"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "volumeID": {"type": "string"}}, "required": ["volumeID"], "type": "object"}, "configMap": {"properties": {"defaultMode": {"format": "int32", "type": "integer"}, "items": {"items": {"properties": {"key": {"type": "string"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}}, "required": ["key", "path"], "type": "object"}, "type": "array"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "csi": {"properties": {"driver": {"type": "string"}, "fsType": {"type": "string"}, "nodePublishSecretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "readOnly": {"type": "boolean"}, "volumeAttributes": {"additionalProperties": {"type": "string"}, "type": "object"}}, "required": ["driver"], "type": "object"}, "downwardAPI": {"properties": {"defaultMode": {"format": "int32", "type": "integer"}, "items": {"items": {"properties": {"fieldRef": {"properties": {"apiVersion": {"type": "string"}, "fieldPath": {"type": "string"}}, "required": ["fieldPath"], "type": "object"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}, "resourceFieldRef": {"properties": {"containerName": {"type": "string"}, "divisor": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "resource": {"type": "string"}}, "required": ["resource"], "type": "object"}}, "required": ["path"], "type": "object"}, "type": "array"}}, "type": "object"}, "emptyDir": {"properties": {"medium": {"type": "string"}, "sizeLimit": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}}, "type": "object"}, "ephemeral": {"properties": {"volumeClaimTemplate": {"properties": {"metadata": {"type": "object"}, "spec": {"properties": {"accessModes": {"items": {"type": "string"}, "type": "array"}, "dataSource": {"properties": {"apiGroup": {"type": "string"}, "kind": {"type": "string"}, "name": {"type": "string"}}, "required": ["kind", "name"], "type": "object"}, "resources": {"properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}}, "type": "object"}, "selector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "storageClassName": {"type": "string"}, "volumeMode": {"type": "string"}, "volumeName": {"type": "string"}}, "type": "object"}}, "required": ["spec"], "type": "object"}}, "type": "object"}, "fc": {"properties": {"fsType": {"type": "string"}, "lun": {"format": "int32", "type": "integer"}, "readOnly": {"type": "boolean"}, "targetWWNs": {"items": {"type": "string"}, "type": "array"}, "wwids": {"items": {"type": "string"}, "type": "array"}}, "type": "object"}, "flexVolume": {"properties": {"driver": {"type": "string"}, "fsType": {"type": "string"}, "options": {"additionalProperties": {"type": "string"}, "type": "object"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}}, "required": ["driver"], "type": "object"}, "flocker": {"properties": {"datasetName": {"type": "string"}, "datasetUUID": {"type": "string"}}, "type": "object"}, "gcePersistentDisk": {"properties": {"fsType": {"type": "string"}, "partition": {"format": "int32", "type": "integer"}, "pdName": {"type": "string"}, "readOnly": {"type": "boolean"}}, "required": ["pdName"], "type": "object"}, "gitRepo": {"properties": {"directory": {"type": "string"}, "repository": {"type": "string"}, "revision": {"type": "string"}}, "required": ["repository"], "type": "object"}, "glusterfs": {"properties": {"endpoints": {"type": "string"}, "path": {"type": "string"}, "readOnly": {"type": "boolean"}}, "required": ["endpoints", "path"], "type": "object"}, "hostPath": {"properties": {"path": {"type": "string"}, "type": {"type": "string"}}, "required": ["path"], "type": "object"}, "iscsi": {"properties": {"chapAuthDiscovery": {"type": "boolean"}, "chapAuthSession": {"type": "boolean"}, "fsType": {"type": "string"}, "initiatorName": {"type": "string"}, "iqn": {"type": "string"}, "iscsiInterface": {"type": "string"}, "lun": {"format": "int32", "type": "integer"}, "portals": {"items": {"type": "string"}, "type": "array"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "targetPortal": {"type": "string"}}, "required": ["iqn", "lun", "targetPortal"], "type": "object"}, "name": {"type": "string"}, "nfs": {"properties": {"path": {"type": "string"}, "readOnly": {"type": "boolean"}, "server": {"type": "string"}}, "required": ["path", "server"], "type": "object"}, "persistentVolumeClaim": {"properties": {"claimName": {"type": "string"}, "readOnly": {"type": "boolean"}}, "required": ["claimName"], "type": "object"}, "photonPersistentDisk": {"properties": {"fsType": {"type": "string"}, "pdID": {"type": "string"}}, "required": ["pdID"], "type": "object"}, "portworxVolume": {"properties": {"fsType": {"type": "string"}, "readOnly": {"type": "boolean"}, "volumeID": {"type": "string"}}, "required": ["volumeID"], "type": "object"}, "projected": {"properties": {"defaultMode": {"format": "int32", "type": "integer"}, "sources": {"items": {"properties": {"configMap": {"properties": {"items": {"items": {"properties": {"key": {"type": "string"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}}, "required": ["key", "path"], "type": "object"}, "type": "array"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "downwardAPI": {"properties": {"items": {"items": {"properties": {"fieldRef": {"properties": {"apiVersion": {"type": "string"}, "fieldPath": {"type": "string"}}, "required": ["fieldPath"], "type": "object"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}, "resourceFieldRef": {"properties": {"containerName": {"type": "string"}, "divisor": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "resource": {"type": "string"}}, "required": ["resource"], "type": "object"}}, "required": ["path"], "type": "object"}, "type": "array"}}, "type": "object"}, "secret": {"properties": {"items": {"items": {"properties": {"key": {"type": "string"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}}, "required": ["key", "path"], "type": "object"}, "type": "array"}, "name": {"type": "string"}, "optional": {"type": "boolean"}}, "type": "object"}, "serviceAccountToken": {"properties": {"audience": {"type": "string"}, "expirationSeconds": {"format": "int64", "type": "integer"}, "path": {"type": "string"}}, "required": ["path"], "type": "object"}}, "type": "object"}, "type": "array"}}, "type": "object"}, "quobyte": {"properties": {"group": {"type": "string"}, "readOnly": {"type": "boolean"}, "registry": {"type": "string"}, "tenant": {"type": "string"}, "user": {"type": "string"}, "volume": {"type": "string"}}, "required": ["registry", "volume"], "type": "object"}, "rbd": {"properties": {"fsType": {"type": "string"}, "image": {"type": "string"}, "keyring": {"type": "string"}, "monitors": {"items": {"type": "string"}, "type": "array"}, "pool": {"type": "string"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "user": {"type": "string"}}, "required": ["image", "monitors"], "type": "object"}, "scaleIO": {"properties": {"fsType": {"type": "string"}, "gateway": {"type": "string"}, "protectionDomain": {"type": "string"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "sslEnabled": {"type": "boolean"}, "storageMode": {"type": "string"}, "storagePool": {"type": "string"}, "system": {"type": "string"}, "volumeName": {"type": "string"}}, "required": ["gateway", "secretRef", "system"], "type": "object"}, "secret": {"properties": {"defaultMode": {"format": "int32", "type": "integer"}, "items": {"items": {"properties": {"key": {"type": "string"}, "mode": {"format": "int32", "type": "integer"}, "path": {"type": "string"}}, "required": ["key", "path"], "type": "object"}, "type": "array"}, "optional": {"type": "boolean"}, "secretName": {"type": "string"}}, "type": "object"}, "storageos": {"properties": {"fsType": {"type": "string"}, "readOnly": {"type": "boolean"}, "secretRef": {"properties": {"name": {"type": "string"}}, "type": "object"}, "volumeName": {"type": "string"}, "volumeNamespace": {"type": "string"}}, "type": "object"}, "vsphereVolume": {"properties": {"fsType": {"type": "string"}, "storagePolicyID": {"type": "string"}, "storagePolicyName": {"type": "string"}, "volumePath": {"type": "string"}}, "required": ["volumePath"], "type": "object"}}, "required": ["name"], "type": "object"}, "type": "array"}}, "required": ["containers"], "type": "object"}}, "type": "object"}, "updateStrategy": {"properties": {"rollingUpdate": {"properties": {"partition": {"format": "int32", "type": "integer"}}, "type": "object"}, "type": {"type": "string"}}, "type": "object"}, "volumeClaimTemplates": {"items": {"properties": {"apiVersion": {"type": "string"}, "kind": {"type": "string"}, "metadata": {"properties": {"annotations": {"additionalProperties": {"type": "string"}, "type": "object"}, "labels": {"additionalProperties": {"type": "string"}, "type": "object"}, "name": {"type": "string"}, "namespace": {"type": "string"}}, "type": "object"}, "spec": {"properties": {"accessModes": {"items": {"type": "string"}, "type": "array"}, "dataSource": {"properties": {"apiGroup": {"type": "string"}, "kind": {"type": "string"}, "name": {"type": "string"}}, "required": ["kind", "name"], "type": "object"}, "resources": {"properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "type": "object"}}, "type": "object"}, "selector": {"properties": {"matchExpressions": {"items": {"properties": {"key": {"type": "string"}, "operator": {"type": "string"}, "values": {"items": {"type": "string"}, "type": "array"}}, "required": ["key", "operator"], "type": "object"}, "type": "array"}, "matchLabels": {"additionalProperties": {"type": "string"}, "type": "object"}}, "type": "object"}, "storageClassName": {"type": "string"}, "volumeMode": {"type": "string"}, "volumeName": {"type": "string"}}, "type": "object"}}, "type": "object"}, "type": "array"}}, "type": "object"}}, "type": "object"}}, "type": "object"}, "persistence": {"default": {"storage": "10Gi"}, "description": "The desired persistent storage configuration for each Pod in the cluster.", "properties": {"storage": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": "10Gi", "description": "The requested size of the persistent volume attached to each Pod in the RabbitmqCluster. The format of this field matches that defined by kubernetes/apimachinery. See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.", "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "storageClassName": {"description": "The name of the StorageClass to claim a PersistentVolume from.", "type": "string"}}, "type": "object"}, "rabbitmq": {"description": "Configuration options for RabbitMQ Pods created in the cluster.", "properties": {"additionalConfig": {"description": "Modify to add to the rabbitmq.conf file in addition to default configurations set by the operator. Modifying this property on an existing RabbitmqCluster will trigger a StatefulSet rolling restart and will cause rabbitmq downtime. For more information on this config, see https://www.rabbitmq.com/configure.html#config-file", "maxLength": 2000, "type": "string"}, "additionalPlugins": {"description": "List of plugins to enable in addition to essential plugins: rabbitmq_management, rabbitmq_prometheus, and rabbitmq_peer_discovery_k8s.", "items": {"description": "A Plugin to enable on the RabbitmqCluster.", "maxLength": 100, "pattern": "^\\w+$", "type": "string"}, "maxItems": 100, "type": "array"}, "advancedConfig": {"description": "Specify any rabbitmq advanced.config configurations to apply to the cluster. For more information on advanced config, see https://www.rabbitmq.com/configure.html#advanced-config-file", "maxLength": 100000, "type": "string"}, "envConfig": {"description": "Modify to add to the rabbitmq-env.conf file. Modifying this property on an existing RabbitmqCluster will trigger a StatefulSet rolling restart and will cause rabbitmq downtime. For more information on env config, see https://www.rabbitmq.com/man/rabbitmq-env.conf.5.html", "maxLength": 100000, "type": "string"}}, "type": "object"}, "replicas": {"default": 1, "description": "Replicas is the number of nodes in the RabbitMQ cluster. Each node is deployed as a Replica in a StatefulSet. Only 1, 3, 5 replicas clusters are tested. This value should be an odd number to ensure the resultant cluster can establish exactly one quorum of nodes in the event of a fragmenting network partition.", "format": "int32", "minimum": 0, "type": "integer"}, "resources": {"default": {"limits": {"cpu": "2000m", "memory": "2Gi"}, "requests": {"cpu": "1000m", "memory": "2Gi"}}, "description": "The desired compute resource requirements of Pods in the cluster.", "properties": {"limits": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "description": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "type": "object"}, "requests": {"additionalProperties": {"anyOf": [{"type": "integer"}, {"type": "string"}], "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$", "x-kubernetes-int-or-string": true}, "description": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "type": "object"}}, "type": "object"}, "secretBackend": {"description": "Secret backend configuration for the RabbitmqCluster. Enables to fetch default user credentials and certificates from K8s external secret stores.", "properties": {"vault": {"description": "VaultSpec will add Vault annotations (see https://www.vaultproject.io/docs/platform/k8s/injector/annotations) to RabbitMQ Pods. It requires a Vault Agent Sidecar Injector (https://www.vaultproject.io/docs/platform/k8s/injector) to be installed in the K8s cluster. The injector is a K8s Mutation Webhook Controller that alters RabbitMQ Pod specifications (based on the added Vault annotations) to include Vault Agent containers that render Vault secrets to the volume.", "properties": {"annotations": {"additionalProperties": {"type": "string"}, "description": "Vault annotations that override the Vault annotations set by the cluster-operator. For a list of valid Vault annotations, see https://www.vaultproject.io/docs/platform/k8s/injector/annotations", "type": "object"}, "defaultUserPath": {"description": "Path in Vault to access a KV (Key-Value) secret with the fields username and password for the default user. For example \"secret/data/rabbitmq/config\".", "type": "string"}, "defaultUserUpdaterImage": {"description": "Sidecar container that updates the default user's password in RabbitMQ when it changes in Vault. Additionally, it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by rabbitmqadmin CLI). Set to empty string to disable the sidecar container.", "type": "string"}, "role": {"description": "Role in Vault. If vault.defaultUserPath is set, this role must have capability to read the pre-created default user credential in Vault. If vault.tls is set, this role must have capability to create and update certificates in the Vault PKI engine for the domains \"\" and \".svc\".", "type": "string"}, "tls": {"properties": {"altNames": {"description": "Specifies the requested Subject Alternative Names (SANs), in a comma-delimited list. These will be appended to the SANs added by the cluster-operator. The cluster-operator will add SANs: \"-server-.-nodes.\" for each pod, e.g. \"myrabbit-server-0.myrabbit-nodes.default\".", "type": "string"}, "commonName": {"description": "Specifies the requested certificate Common Name (CN). Defaults to ..svc if not provided.", "type": "string"}, "ipSans": {"description": "Specifies the requested IP Subject Alternative Names, in a comma-delimited list.", "type": "string"}, "pkiIssuerPath": {"description": "Path in Vault PKI engine. For example \"pki/issue/hashicorp-com\". required", "type": "string"}}, "type": "object"}}, "type": "object"}}, "type": "object"}, "service": {"default": {"type": "ClusterIP"}, "description": "The desired state of the Kubernetes Service to create for the cluster.", "properties": {"annotations": {"additionalProperties": {"type": "string"}, "description": "Annotations to add to the Service.", "type": "object"}, "type": {"default": "ClusterIP", "description": "Type of Service to create for the cluster. Must be one of: ClusterIP, LoadBalancer, NodePort. For more info see https://pkg.go.dev/k8s.io/api/core/v1#ServiceType", "enum": ["ClusterIP", "LoadBalancer", "NodePort"], "type": "string"}}, "type": "object"}, "skipPostDeploySteps": {"description": "If unset, or set to false, the cluster will run `rabbitmq-queues rebalance all` whenever the cluster is updated. Set to true to prevent the operator rebalancing queue leaders after a cluster update. Has no effect if the cluster only consists of one node. For more information, see https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance", "type": "boolean"}, "terminationGracePeriodSeconds": {"default": 604800, "description": "TerminationGracePeriodSeconds is the timeout that each rabbitmqcluster pod will have to terminate gracefully. It defaults to 604800 seconds ( a week long) to ensure that the container preStop lifecycle hook can finish running. For more information, see: https://github.com/rabbitmq/cluster-operator/blob/main/docs/design/20200520-graceful-pod-termination.md", "format": "int64", "minimum": 0, "type": "integer"}, "tls": {"description": "TLS-related configuration for the RabbitMQ cluster.", "properties": {"caSecretName": {"description": "Name of a Secret in the same Namespace as the RabbitmqCluster, containing the Certificate Authority's public certificate for TLS. The Secret must store this as ca.crt. This Secret can be created by running `kubectl create secret generic ca-secret --from-file=ca.crt=path/to/ca.cert` Used for mTLS, and TLS for rabbitmq_web_stomp and rabbitmq_web_mqtt.", "type": "string"}, "disableNonTLSListeners": {"description": "When set to true, the RabbitmqCluster disables non-TLS listeners for RabbitMQ, management plugin and for any enabled plugins in the following list: stomp, mqtt, web_stomp, web_mqtt. Only TLS-enabled clients will be able to connect.", "type": "boolean"}, "secretName": {"description": "Name of a Secret in the same Namespace as the RabbitmqCluster, containing the server's private key & public certificate for TLS. The Secret must store these as tls.key and tls.crt, respectively. This Secret can be created by running `kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key`", "type": "string"}}, "type": "object"}, "tolerations": {"description": "Tolerations is the list of Toleration resources attached to each Pod in the RabbitmqCluster.", "items": {"description": "The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator .", "properties": {"effect": {"description": "Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.", "type": "string"}, "key": {"description": "Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.", "type": "string"}, "operator": {"description": "Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.", "type": "string"}, "tolerationSeconds": {"description": "TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.", "format": "int64", "type": "integer"}, "value": {"description": "Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.", "type": "string"}}, "type": "object"}, "type": "array"}}, "type": "object"}, "status": {"description": "Status presents the observed state of RabbitmqCluster", "properties": {"binding": {"description": "Binding exposes a secret containing the binding information for this RabbitmqCluster. It implements the service binding Provisioned Service duck type. See: https://github.com/servicebinding/spec#provisioned-service", "properties": {"name": {"description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?", "type": "string"}}, "type": "object"}, "conditions": {"description": "Set of Conditions describing the current state of the RabbitmqCluster", "items": {"properties": {"lastTransitionTime": {"description": "The last time this Condition type changed.", "format": "date-time", "type": "string"}, "message": {"description": "Full text reason for current status of the condition.", "type": "string"}, "reason": {"description": "One word, camel-case reason for current status of the condition.", "type": "string"}, "status": {"description": "True, False, or Unknown", "type": "string"}, "type": {"description": "Type indicates the scope of RabbitmqCluster status addressed by the condition.", "type": "string"}}, "required": ["status", "type"], "type": "object"}, "type": "array"}, "defaultUser": {"description": "Identifying information on internal resources", "properties": {"secretReference": {"description": "Reference to the Kubernetes Secret containing the credentials of the default user.", "properties": {"keys": {"additionalProperties": {"type": "string"}, "description": "Key-value pairs in the Secret corresponding to `username`, `password`, `host`, and `port`", "type": "object"}, "name": {"description": "Name of the Secret containing the default user credentials", "type": "string"}, "namespace": {"description": "Namespace of the Secret containing the default user credentials", "type": "string"}}, "required": ["keys", "name", "namespace"], "type": "object"}, "serviceReference": {"description": "Reference to the Kubernetes Service serving the cluster.", "properties": {"name": {"description": "Name of the Service serving the cluster", "type": "string"}, "namespace": {"description": "Namespace of the Service serving the cluster", "type": "string"}}, "required": ["name", "namespace"], "type": "object"}}, "type": "object"}, "observedGeneration": {"description": "observedGeneration is the most recent successful generation observed for this RabbitmqCluster. It corresponds to the RabbitmqCluster's generation, which is updated on mutation by the API Server.", "format": "int64", "type": "integer"}}, "required": ["conditions"], "type": "object"}}, "type": "object"}}, "served": true, "storage": true, "subresources": {"status": {}}}]}, "status": {"acceptedNames": {"categories": ["all"], "kind": "RabbitmqCluster", "listKind": "RabbitmqClusterList", "plural": "rabbitmqclusters", "shortNames": ["rmq"], "singular": "rabbitmqcluster"}, "conditions": [{"lastTransitionTime": "2022-04-27T17:47:59Z", "message": "no conflicts found", "reason": "NoConflicts", "status": "True", "type": "NamesAccepted"}, {"lastTransitionTime": "2022-04-27T17:47:59Z", "message": "the initial names have been accepted", "reason": "InitialNamesAccepted", "status": "True", "type": "Established"}], "storedVersions": ["v1beta1"]}}}, "preload_images": ["docker.io/rabbitmqoperator/cluster-operator:1.10.0", "k8s.gcr.io/build-image/debian-base:buster-v1.7.2", "k8s.gcr.io/etcd:3.4.13-0", "docker.io/rancher/local-path-provisioner:v0.0.14", "k8s.gcr.io/kube-proxy:v1.20.15", "k8s.gcr.io/kube-scheduler:v1.20.15", "k8s.gcr.io/kube-controller-manager:v1.20.15", "k8s.gcr.io/pause:3.6", "docker.io/kindest/kindnetd:v20211122-a2c10462", "k8s.gcr.io/coredns:1.7.0", "docker.io/library/rabbitmq:3.8.21-management", "k8s.gcr.io/kube-apiserver:v1.20.15"]} \ No newline at end of file diff --git a/data/rabbitmq-operator/operator_test.yaml b/data/rabbitmq-operator/operator_test.yaml new file mode 100644 index 0000000000..b407685c6f --- /dev/null +++ b/data/rabbitmq-operator/operator_test.yaml @@ -0,0 +1,4746 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-system + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-system +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.6.2 + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmqclusters.rabbitmq.com +spec: + group: rabbitmq.com + names: + categories: + - all + kind: RabbitmqCluster + listKind: RabbitmqClusterList + plural: rabbitmqclusters + shortNames: + - rmq + singular: rabbitmqcluster + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.conditions[?(@.type == 'AllReplicasReady')].status + name: AllReplicasReady + type: string + - jsonPath: .status.conditions[?(@.type == 'ReconcileSuccess')].status + name: ReconcileSuccess + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: RabbitmqCluster is the Schema for the RabbitmqCluster API. Each + instance of this object corresponds to a single RabbitMQ cluster. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Spec is the desired state of the RabbitmqCluster Custom Resource. + properties: + affinity: + description: Affinity scheduling rules to be applied on created Pods. + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. The node that is most preferred + is the one with the greatest sum of weights, i.e. for each + node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements of + this field and adding "weight" to the sum if the node matches + the corresponding matchExpressions; the node(s) with the + highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects (i.e. + is also a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. If the operator is Gt or + Lt, the values array must have a single + element, which will be interpreted as an + integer. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. If the operator is Gt or + Lt, the values array must have a single + element, which will be interpreted as an + integer. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. If the affinity requirements specified + by this field cease to be met at some point during pod execution + (e.g. due to an update), the system may or may not try to + eventually evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. If the operator is Gt or + Lt, the values array must have a single + element, which will be interpreted as an + integer. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. If the operator is Gt or + Lt, the values array must have a single + element, which will be interpreted as an + integer. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + type: array + required: + - nodeSelectorTerms + type: object + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. The node that is most preferred + is the one with the greatest sum of weights, i.e. for each + node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling affinity expressions, + etc.), compute a sum by iterating through the elements of + this field and adding "weight" to the sum if the node has + pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + null selector and null or empty namespaces list + means "this pod's namespace". An empty selector + ({}) matches all namespaces. This field is alpha-level + and is only honored when PodAffinityNamespaceSelector + feature is enabled. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces list + and null namespaceSelector means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. If the affinity requirements specified + by this field cease to be met at some point during pod execution + (e.g. due to a pod label update), the system may or may + not try to eventually evict the pod from its node. When + there are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all terms + must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which a pod of the set of + pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". The + requirements are ANDed. + type: object + type: object + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. null selector + and null or empty namespaces list means "this pod's + namespace". An empty selector ({}) matches all namespaces. + This field is alpha-level and is only honored when + PodAffinityNamespaceSelector feature is enabled. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". The + requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. null or + empty namespaces list and null namespaceSelector means + "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose value + of the label with key topologyKey matches that of + any node on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the anti-affinity expressions specified + by this field, but it may choose a node that violates one + or more of the expressions. The node that is most preferred + is the one with the greatest sum of weights, i.e. for each + node that meets all of the scheduling requirements (resource + request, requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements of + this field and adding "weight" to the sum if the node has + pods which matches the corresponding podAffinityTerm; the + node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + null selector and null or empty namespaces list + means "this pod's namespace". An empty selector + ({}) matches all namespaces. This field is alpha-level + and is only honored when PodAffinityNamespaceSelector + feature is enabled. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only "value". + The requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces list + and null namespaceSelector means "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose value of the label with key topologyKey + matches that of any node on which any of the selected + pods is running. Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. If the anti-affinity requirements + specified by this field cease to be met at some point during + pod execution (e.g. due to a pod label update), the system + may or may not try to eventually evict the pod from its + node. When there are multiple elements, the lists of nodes + corresponding to each podAffinityTerm are intersected, i.e. + all terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-located is defined as running + on a node whose value of the label with key + matches that of any node on which a pod of the set of + pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". The + requirements are ANDed. + type: object + type: object + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. null selector + and null or empty namespaces list means "this pod's + namespace". An empty selector ({}) matches all namespaces. + This field is alpha-level and is only honored when + PodAffinityNamespaceSelector feature is enabled. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is "In", + and the values array contains only "value". The + requirements are ANDed. + type: object + type: object + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. null or + empty namespaces list and null namespaceSelector means + "this pod's namespace" + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose value + of the label with key topologyKey matches that of + any node on which any of the selected pods is running. + Empty topologyKey is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + image: + description: Image is the name of the RabbitMQ docker image to use + for RabbitMQ nodes in the RabbitmqCluster. Must be provided together + with ImagePullSecrets in order to use an image in a private registry. + type: string + imagePullSecrets: + description: List of Secret resource containing access credentials + to the registry for the RabbitMQ image. Required if the docker registry + is private. + items: + description: LocalObjectReference contains enough information to + let you locate the referenced object inside the same namespace. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + type: array + override: + properties: + service: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + allocateLoadBalancerNodePorts: + type: boolean + clusterIP: + type: string + clusterIPs: + items: + type: string + type: array + x-kubernetes-list-type: atomic + externalIPs: + items: + type: string + type: array + externalName: + type: string + externalTrafficPolicy: + type: string + healthCheckNodePort: + format: int32 + type: integer + internalTrafficPolicy: + type: string + ipFamilies: + items: + type: string + type: array + x-kubernetes-list-type: atomic + ipFamilyPolicy: + type: string + loadBalancerClass: + type: string + loadBalancerIP: + type: string + loadBalancerSourceRanges: + items: + type: string + type: array + ports: + items: + properties: + appProtocol: + type: string + name: + type: string + nodePort: + format: int32 + type: integer + port: + format: int32 + type: integer + protocol: + default: TCP + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: array + x-kubernetes-list-map-keys: + - port + - protocol + x-kubernetes-list-type: map + publishNotReadyAddresses: + type: boolean + selector: + additionalProperties: + type: string + type: object + sessionAffinity: + type: string + sessionAffinityConfig: + properties: + clientIP: + properties: + timeoutSeconds: + format: int32 + type: integer + type: object + type: object + topologyKeys: + items: + type: string + type: array + type: + type: string + type: object + type: object + statefulSet: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + spec: + properties: + podManagementPolicy: + type: string + replicas: + format: int32 + type: integer + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + serviceName: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + type: array + required: + - nodeSelectorTerms + type: object + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + namespaces: + items: + type: string + type: array + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + searches: + items: + type: string + type: array + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + ip: + type: string + type: object + type: array + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostname: + type: string + imagePullSecrets: + items: + properties: + name: + type: string + type: object + type: array + initContainers: + items: + properties: + args: + items: + type: string + type: array + command: + items: + type: string + type: array + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + secretKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + required: + - name + type: object + type: array + envFrom: + items: + properties: + configMapRef: + properties: + name: + type: string + optional: + type: boolean + type: object + prefix: + type: string + secretRef: + properties: + name: + type: string + optional: + type: boolean + type: object + type: object + type: array + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + capabilities: + properties: + add: + items: + type: string + type: array + drop: + items: + type: string + type: array + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + type: integer + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + type: string + required: + - name + type: object + type: array + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + securityContext: + properties: + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + maxSkew: + format: int32 + type: integer + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + items: + properties: + awsElasticBlockStore: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + azureDisk: + properties: + cachingMode: + type: string + diskName: + type: string + diskURI: + type: string + fsType: + type: string + kind: + type: string + readOnly: + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + properties: + readOnly: + type: boolean + secretName: + type: string + shareName: + type: string + required: + - secretName + - shareName + type: object + cephfs: + properties: + monitors: + items: + type: string + type: array + path: + type: string + readOnly: + type: boolean + secretFile: + type: string + secretRef: + properties: + name: + type: string + type: object + user: + type: string + required: + - monitors + type: object + cinder: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + volumeID: + type: string + required: + - volumeID + type: object + configMap: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + name: + type: string + optional: + type: boolean + type: object + csi: + properties: + driver: + type: string + fsType: + type: string + nodePublishSecretRef: + properties: + name: + type: string + type: object + readOnly: + type: boolean + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + type: object + downwardAPI: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + required: + - path + type: object + type: array + type: object + emptyDir: + properties: + medium: + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + properties: + volumeClaimTemplate: + properties: + metadata: + type: object + spec: + properties: + accessModes: + items: + type: string + type: array + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + storageClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + required: + - spec + type: object + type: object + fc: + properties: + fsType: + type: string + lun: + format: int32 + type: integer + readOnly: + type: boolean + targetWWNs: + items: + type: string + type: array + wwids: + items: + type: string + type: array + type: object + flexVolume: + properties: + driver: + type: string + fsType: + type: string + options: + additionalProperties: + type: string + type: object + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + required: + - driver + type: object + flocker: + properties: + datasetName: + type: string + datasetUUID: + type: string + type: object + gcePersistentDisk: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + pdName: + type: string + readOnly: + type: boolean + required: + - pdName + type: object + gitRepo: + properties: + directory: + type: string + repository: + type: string + revision: + type: string + required: + - repository + type: object + glusterfs: + properties: + endpoints: + type: string + path: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + type: object + hostPath: + properties: + path: + type: string + type: + type: string + required: + - path + type: object + iscsi: + properties: + chapAuthDiscovery: + type: boolean + chapAuthSession: + type: boolean + fsType: + type: string + initiatorName: + type: string + iqn: + type: string + iscsiInterface: + type: string + lun: + format: int32 + type: integer + portals: + items: + type: string + type: array + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + type: string + nfs: + properties: + path: + type: string + readOnly: + type: boolean + server: + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + properties: + fsType: + type: string + pdID: + type: string + required: + - pdID + type: object + portworxVolume: + properties: + fsType: + type: string + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + projected: + properties: + defaultMode: + format: int32 + type: integer + sources: + items: + properties: + configMap: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + name: + type: string + optional: + type: boolean + type: object + downwardAPI: + properties: + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + required: + - path + type: object + type: array + type: object + secret: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + name: + type: string + optional: + type: boolean + type: object + serviceAccountToken: + properties: + audience: + type: string + expirationSeconds: + format: int64 + type: integer + path: + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + properties: + group: + type: string + readOnly: + type: boolean + registry: + type: string + tenant: + type: string + user: + type: string + volume: + type: string + required: + - registry + - volume + type: object + rbd: + properties: + fsType: + type: string + image: + type: string + keyring: + type: string + monitors: + items: + type: string + type: array + pool: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + user: + type: string + required: + - image + - monitors + type: object + scaleIO: + properties: + fsType: + type: string + gateway: + type: string + protectionDomain: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + sslEnabled: + type: boolean + storageMode: + type: string + storagePool: + type: string + system: + type: string + volumeName: + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + optional: + type: boolean + secretName: + type: string + type: object + storageos: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + type: string + type: object + volumeName: + type: string + volumeNamespace: + type: string + type: object + vsphereVolume: + properties: + fsType: + type: string + storagePolicyID: + type: string + storagePolicyName: + type: string + volumePath: + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + required: + - containers + type: object + type: object + updateStrategy: + properties: + rollingUpdate: + properties: + partition: + format: int32 + type: integer + type: object + type: + type: string + type: object + volumeClaimTemplates: + items: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + accessModes: + items: + type: string + type: array + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + type: object + type: object + storageClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + type: object + type: array + type: object + type: object + type: object + persistence: + default: + storage: 10Gi + description: The desired persistent storage configuration for each + Pod in the cluster. + properties: + storage: + anyOf: + - type: integer + - type: string + default: 10Gi + description: The requested size of the persistent volume attached + to each Pod in the RabbitmqCluster. The format of this field + matches that defined by kubernetes/apimachinery. See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity + for more info on the format of this field. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + storageClassName: + description: The name of the StorageClass to claim a PersistentVolume + from. + type: string + type: object + rabbitmq: + description: Configuration options for RabbitMQ Pods created in the + cluster. + properties: + additionalConfig: + description: Modify to add to the rabbitmq.conf file in addition + to default configurations set by the operator. Modifying this + property on an existing RabbitmqCluster will trigger a StatefulSet + rolling restart and will cause rabbitmq downtime. For more information + on this config, see https://www.rabbitmq.com/configure.html#config-file + maxLength: 2000 + type: string + additionalPlugins: + description: 'List of plugins to enable in addition to essential + plugins: rabbitmq_management, rabbitmq_prometheus, and rabbitmq_peer_discovery_k8s.' + items: + description: A Plugin to enable on the RabbitmqCluster. + maxLength: 100 + pattern: ^\w+$ + type: string + maxItems: 100 + type: array + advancedConfig: + description: Specify any rabbitmq advanced.config configurations + to apply to the cluster. For more information on advanced config, + see https://www.rabbitmq.com/configure.html#advanced-config-file + maxLength: 100000 + type: string + envConfig: + description: Modify to add to the rabbitmq-env.conf file. Modifying + this property on an existing RabbitmqCluster will trigger a + StatefulSet rolling restart and will cause rabbitmq downtime. + For more information on env config, see https://www.rabbitmq.com/man/rabbitmq-env.conf.5.html + maxLength: 100000 + type: string + type: object + replicas: + default: 1 + description: Replicas is the number of nodes in the RabbitMQ cluster. + Each node is deployed as a Replica in a StatefulSet. Only 1, 3, + 5 replicas clusters are tested. This value should be an odd number + to ensure the resultant cluster can establish exactly one quorum + of nodes in the event of a fragmenting network partition. + format: int32 + minimum: 0 + type: integer + resources: + default: + limits: + cpu: 2000m + memory: 2Gi + requests: + cpu: 1000m + memory: 2Gi + description: The desired compute resource requirements of Pods in + the cluster. + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute resources + allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Requests describes the minimum amount of compute + resources required. If Requests is omitted for a container, + it defaults to Limits if that is explicitly specified, otherwise + to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + type: object + secretBackend: + description: Secret backend configuration for the RabbitmqCluster. + Enables to fetch default user credentials and certificates from + K8s external secret stores. + properties: + vault: + description: VaultSpec will add Vault annotations (see https://www.vaultproject.io/docs/platform/k8s/injector/annotations) + to RabbitMQ Pods. It requires a Vault Agent Sidecar Injector + (https://www.vaultproject.io/docs/platform/k8s/injector) to + be installed in the K8s cluster. The injector is a K8s Mutation + Webhook Controller that alters RabbitMQ Pod specifications (based + on the added Vault annotations) to include Vault Agent containers + that render Vault secrets to the volume. + properties: + annotations: + additionalProperties: + type: string + description: Vault annotations that override the Vault annotations + set by the cluster-operator. For a list of valid Vault annotations, + see https://www.vaultproject.io/docs/platform/k8s/injector/annotations + type: object + defaultUserPath: + description: Path in Vault to access a KV (Key-Value) secret + with the fields username and password for the default user. + For example "secret/data/rabbitmq/config". + type: string + defaultUserUpdaterImage: + description: Sidecar container that updates the default user's + password in RabbitMQ when it changes in Vault. Additionally, + it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by + rabbitmqadmin CLI). Set to empty string to disable the sidecar + container. + type: string + role: + description: Role in Vault. If vault.defaultUserPath is set, + this role must have capability to read the pre-created default + user credential in Vault. If vault.tls is set, this role + must have capability to create and update certificates in + the Vault PKI engine for the domains "" and ".svc". + type: string + tls: + properties: + altNames: + description: 'Specifies the requested Subject Alternative + Names (SANs), in a comma-delimited list. These will + be appended to the SANs added by the cluster-operator. + The cluster-operator will add SANs: "-server-.-nodes." + for each pod, e.g. "myrabbit-server-0.myrabbit-nodes.default".' + type: string + commonName: + description: Specifies the requested certificate Common + Name (CN). Defaults to ..svc + if not provided. + type: string + ipSans: + description: Specifies the requested IP Subject Alternative + Names, in a comma-delimited list. + type: string + pkiIssuerPath: + description: Path in Vault PKI engine. For example "pki/issue/hashicorp-com". + required + type: string + type: object + type: object + type: object + service: + default: + type: ClusterIP + description: The desired state of the Kubernetes Service to create + for the cluster. + properties: + annotations: + additionalProperties: + type: string + description: Annotations to add to the Service. + type: object + type: + default: ClusterIP + description: 'Type of Service to create for the cluster. Must + be one of: ClusterIP, LoadBalancer, NodePort. For more info + see https://pkg.go.dev/k8s.io/api/core/v1#ServiceType' + enum: + - ClusterIP + - LoadBalancer + - NodePort + type: string + type: object + skipPostDeploySteps: + description: If unset, or set to false, the cluster will run `rabbitmq-queues + rebalance all` whenever the cluster is updated. Set to true to prevent + the operator rebalancing queue leaders after a cluster update. Has + no effect if the cluster only consists of one node. For more information, + see https://www.rabbitmq.com/rabbitmq-queues.8.html#rebalance + type: boolean + terminationGracePeriodSeconds: + default: 604800 + description: 'TerminationGracePeriodSeconds is the timeout that each + rabbitmqcluster pod will have to terminate gracefully. It defaults + to 604800 seconds ( a week long) to ensure that the container preStop + lifecycle hook can finish running. For more information, see: https://github.com/rabbitmq/cluster-operator/blob/main/docs/design/20200520-graceful-pod-termination.md' + format: int64 + minimum: 0 + type: integer + tls: + description: TLS-related configuration for the RabbitMQ cluster. + properties: + caSecretName: + description: Name of a Secret in the same Namespace as the RabbitmqCluster, + containing the Certificate Authority's public certificate for + TLS. The Secret must store this as ca.crt. This Secret can be + created by running `kubectl create secret generic ca-secret + --from-file=ca.crt=path/to/ca.cert` Used for mTLS, and TLS for + rabbitmq_web_stomp and rabbitmq_web_mqtt. + type: string + disableNonTLSListeners: + description: 'When set to true, the RabbitmqCluster disables non-TLS + listeners for RabbitMQ, management plugin and for any enabled + plugins in the following list: stomp, mqtt, web_stomp, web_mqtt. + Only TLS-enabled clients will be able to connect.' + type: boolean + secretName: + description: Name of a Secret in the same Namespace as the RabbitmqCluster, + containing the server's private key & public certificate for + TLS. The Secret must store these as tls.key and tls.crt, respectively. + This Secret can be created by running `kubectl create secret + tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key` + type: string + type: object + tolerations: + description: Tolerations is the list of Toleration resources attached + to each Pod in the RabbitmqCluster. + items: + description: The pod this Toleration is attached to tolerates any + taint that matches the triple using the matching + operator . + properties: + effect: + description: Effect indicates the taint effect to match. Empty + means match all taint effects. When specified, allowed values + are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match all + values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the + value. Valid operators are Exists and Equal. Defaults to Equal. + Exists is equivalent to wildcard for value, so that a pod + can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time + the toleration (which must be of effect NoExecute, otherwise + this field is ignored) tolerates the taint. By default, it + is not set, which means tolerate the taint forever (do not + evict). Zero and negative values will be treated as 0 (evict + immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + type: object + status: + description: Status presents the observed state of RabbitmqCluster + properties: + binding: + description: 'Binding exposes a secret containing the binding information + for this RabbitmqCluster. It implements the service binding Provisioned + Service duck type. See: https://github.com/servicebinding/spec#provisioned-service' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + conditions: + description: Set of Conditions describing the current state of the + RabbitmqCluster + items: + properties: + lastTransitionTime: + description: The last time this Condition type changed. + format: date-time + type: string + message: + description: Full text reason for current status of the condition. + type: string + reason: + description: One word, camel-case reason for current status + of the condition. + type: string + status: + description: True, False, or Unknown + type: string + type: + description: Type indicates the scope of RabbitmqCluster status + addressed by the condition. + type: string + required: + - status + - type + type: object + type: array + defaultUser: + description: Identifying information on internal resources + properties: + secretReference: + description: Reference to the Kubernetes Secret containing the + credentials of the default user. + properties: + keys: + additionalProperties: + type: string + description: Key-value pairs in the Secret corresponding to + `username`, `password`, `host`, and `port` + type: object + name: + description: Name of the Secret containing the default user + credentials + type: string + namespace: + description: Namespace of the Secret containing the default + user credentials + type: string + required: + - keys + - name + - namespace + type: object + serviceReference: + description: Reference to the Kubernetes Service serving the cluster. + properties: + name: + description: Name of the Service serving the cluster + type: string + namespace: + description: Namespace of the Service serving the cluster + type: string + required: + - name + - namespace + type: object + type: object + observedGeneration: + description: observedGeneration is the most recent successful generation + observed for this RabbitmqCluster. It corresponds to the RabbitmqCluster's + generation, which is updated on mutation by the API Server. + format: int64 + type: integer + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: rabbitmq-cluster-operator + namespace: rabbitmq-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-cluster-leader-election-role + namespace: rabbitmq-system +rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-cluster-operator-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - endpoints + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - patch +- apiGroups: + - "" + resources: + - persistentvolumeclaims + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - pods + verbs: + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - pods/exec + verbs: + - create +- apiGroups: + - "" + resources: + - secrets + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - "" + resources: + - services + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - apps + resources: + - statefulsets + verbs: + - create + - delete + - get + - list + - update + - watch +- apiGroups: + - rabbitmq.com + resources: + - rabbitmqclusters + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - rabbitmq.com + resources: + - rabbitmqclusters/finalizers + verbs: + - update +- apiGroups: + - rabbitmq.com + resources: + - rabbitmqclusters/status + verbs: + - get + - update +- apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + verbs: + - create + - get + - list + - update + - watch +- apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + verbs: + - create + - get + - list + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-cluster-leader-election-rolebinding + namespace: rabbitmq-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: rabbitmq-cluster-leader-election-role +subjects: +- kind: ServiceAccount + name: rabbitmq-cluster-operator + namespace: rabbitmq-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-cluster-operator-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: rabbitmq-cluster-operator-role +subjects: +- kind: ServiceAccount + name: rabbitmq-cluster-operator + namespace: rabbitmq-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + name: rabbitmq-cluster-operator + namespace: rabbitmq-system +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: rabbitmq-cluster-operator + template: + metadata: + labels: + app.kubernetes.io/component: rabbitmq-operator + app.kubernetes.io/name: rabbitmq-cluster-operator + app.kubernetes.io/part-of: rabbitmq + spec: + securityContext: + runAsUser: 0 + fsGroup: 2000 + containers: + - command: + - /manager + env: + - name: OPERATOR_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: tylergu1998/rabbitmq-operator:test + imagePullPolicy: IfNotPresent + name: operator + volumeMounts: + - mountPath: /tmp/profile + name: profile-dir + ports: + - containerPort: 9782 + name: metrics + protocol: TCP + resources: + limits: + cpu: 200m + memory: 500Mi + requests: + cpu: 200m + memory: 500Mi + volumes: + - name: profile-dir + hostPath: + # directory location on host + path: /tmp/profile + # this field is optional + type: Directory + serviceAccountName: rabbitmq-cluster-operator + terminationGracePeriodSeconds: 10 diff --git a/data/rabbitmq-operator/port.json b/data/rabbitmq-operator/port.json new file mode 100644 index 0000000000..38745abb25 --- /dev/null +++ b/data/rabbitmq-operator/port.json @@ -0,0 +1,16 @@ +{ + "github_link": "https://github.com/rabbitmq/cluster-operator.git", + "commit": "f2ab5cecca7fa4bbba62ba084bfa4ae1b25d15ff", + "deploy": { + "method": "YAML", + "file": "data/rabbitmq-operator/operator.yaml", + "init": null + }, + "crd_name": null, + "custom_fields": "data.rabbitmq-operator.prune", + "seed_custom_resource": "data/rabbitmq-operator/cr.yaml", + "seedType": { + "type": "RabbitmqCluster", + "package": "github.com/rabbitmq/cluster-operator/api/v1beta1" + } +} \ No newline at end of file diff --git a/data/xtradb-operator/candidates.yaml b/data/xtradb-operator/candidates.yaml deleted file mode 100644 index 295448ca28..0000000000 --- a/data/xtradb-operator/candidates.yaml +++ /dev/null @@ -1,5 +0,0 @@ -spec: - allowUnsafeConfigurations: - candidates: - - true - - false \ No newline at end of file diff --git a/data/xtradb-operator/cr.yaml b/data/xtradb-operator/cr.yaml deleted file mode 100644 index 05157ff937..0000000000 --- a/data/xtradb-operator/cr.yaml +++ /dev/null @@ -1,78 +0,0 @@ -apiVersion: pxc.percona.com/v1-7-0 -kind: PerconaXtraDBCluster -metadata: - name: xtradb-cluster - finalizers: - - delete-pxc-pods-in-order - - delete-proxysql-pvc - - delete-pxc-pvc -spec: - crVersion: 1.7.0 - secretsName: xtradb-cluster-secrets - vaultSecretName: keyring-secret-vault - sslSecretName: xtradb-cluster-ssl - sslInternalSecretName: xtradb-cluster-ssl-internal - logCollectorSecretName: xtradb-log-collector-secrets - allowUnsafeConfigurations: false - updateStrategy: RollingUpdate - upgradeOptions: - versionServiceEndpoint: https://check.percona.com - apply: recommended - schedule: "0 4 * * *" - pxc: - size: 3 - image: percona/percona-xtradb-cluster:8.0.21-12.1 - autoRecovery: true - resources: - requests: - memory: 1G - cpu: 600m - affinity: - antiAffinityTopologyKey: "kubernetes.io/hostname" - podDisruptionBudget: - maxUnavailable: 1 - volumeSpec: - persistentVolumeClaim: - resources: - requests: - storage: 6Gi - gracePeriod: 600 - haproxy: - enabled: false - size: 3 - image: percona/percona-xtradb-cluster-operator:1.7.0-haproxy - resources: - requests: - memory: 1G - cpu: 600m - affinity: - antiAffinityTopologyKey: "kubernetes.io/hostname" - podDisruptionBudget: - maxUnavailable: 1 - gracePeriod: 30 - proxysql: - enabled: false - size: 3 - image: percona/percona-xtradb-cluster-operator:1.7.0-proxysql - resources: - requests: - memory: 1G - cpu: 600m - affinity: - antiAffinityTopologyKey: "kubernetes.io/hostname" - volumeSpec: - persistentVolumeClaim: - resources: - requests: - storage: 2Gi - podDisruptionBudget: - maxUnavailable: 1 - gracePeriod: 30 - logcollector: - enabled: false - image: percona/percona-xtradb-cluster-operator:1.7.0-logcollector - pmm: - enabled: false - image: percona/pmm-client:2.12.0 - serverHost: monitoring-service - serverUser: pmm \ No newline at end of file diff --git a/data/xtradb-operator/xtradb-operator/.helmignore b/data/xtradb-operator/xtradb-operator/.helmignore deleted file mode 100644 index 50af031725..0000000000 --- a/data/xtradb-operator/xtradb-operator/.helmignore +++ /dev/null @@ -1,22 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/data/xtradb-operator/xtradb-operator/Chart.yaml b/data/xtradb-operator/xtradb-operator/Chart.yaml deleted file mode 100644 index 5f412fffff..0000000000 --- a/data/xtradb-operator/xtradb-operator/Chart.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v2 -appVersion: 1.10.0 -description: A Helm chart for Deploying the Percona XtraDB Cluster Operator Kubernetes -name: pxc-operator -home: https://www.percona.com/doc/kubernetes-operator-for-pxc/kubernetes.html -version: 1.10.0 -maintainers: - - name: cap1984 - email: ivan.pylypenko@percona.com - - name: tplavcic - email: tomislav.plavcic@percona.com -icon: https://artifacthub.io/image/0b8875cd-6661-4269-9cf6-0fd92d59017b@1x diff --git a/data/xtradb-operator/xtradb-operator/LICENSE.txt b/data/xtradb-operator/xtradb-operator/LICENSE.txt deleted file mode 100644 index 6a31453af0..0000000000 --- a/data/xtradb-operator/xtradb-operator/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2019 Paul Czarkowski - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/data/xtradb-operator/xtradb-operator/README.md b/data/xtradb-operator/xtradb-operator/README.md deleted file mode 100644 index 567dd63c88..0000000000 --- a/data/xtradb-operator/xtradb-operator/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Percona Distribution For MySQL Operator - -[Percona XtraDB Cluster (PXC)](https://www.percona.com/doc/percona-xtradb-cluster/LATEST/index.html) is a database clustering solution for MySQL. Percona Distribution for MySQL Operator allows users to deploy and manage Percona XtraDB Clusters on Kubernetes. - -Useful links -* [Operator Github repository](https://github.com/percona/percona-xtradb-cluster-operator) -* [Operator Documentation](https://www.percona.com/doc/kubernetes-operator-for-pxc/index.html) - -## Pre-requisites -* Kubernetes 1.17+ -* Helm v3 - -# Installation - -This chart will deploy the Operator Pod for the further Percona XtraDB Cluster creation in Kubernetes. - -## Installing the Chart -To install the chart with the `pxc` release name using a dedicated namespace (recommended): - -```sh -helm repo add percona https://percona.github.io/percona-helm-charts/ -helm install my-operator percona/pxc-operator --version 1.10.0 --namespace my-namespace -``` - -The chart can be customized using the following configurable parameters: - -| Parameter | Description | Default | -| ------------------------------- | ------------------------------------------------------------------------| -------------------------------------------------| -| `image` | PXC Operator Container image full path | `percona/percona-xtradb-cluster-operator:1.10.0` | -| `imagePullPolicy` | PXC Operator Container pull policy | `Always` | -| `imagePullSecrets` | PXC Operator Pod pull secret | `[]` | -| `replicaCount` | PXC Operator Pod quantity | `1` | -| `tolerations` | List of node taints to tolerate | `[]` | -| `resources` | Resource requests and limits | `{}` | -| `nodeSelector` | Labels for Pod assignment | `{}` | - -Specify parameters using `--set key=value[,key=value]` argument to `helm install` - -Alternatively a YAML file that specifies the values for the parameters can be provided like this: - -```sh -helm install pxc-operator -f values.yaml percona/pxc-operator -``` - -## Deploy the database - -To deploy Percona XtraDB Cluster run the following command: - -```sh -helm install my-db percona/pxc-db -``` - -See more about Percona XtraDB Cluster in its chart [here](https://github.com/percona/percona-helm-charts/blob/main/charts/pxc-db) or in the [Helm chart installation guide](https://www.percona.com/doc/kubernetes-operator-for-pxc/helm.html). diff --git a/data/xtradb-operator/xtradb-operator/crds/crd-others.yaml b/data/xtradb-operator/xtradb-operator/crds/crd-others.yaml deleted file mode 100644 index e9ba3d3c45..0000000000 --- a/data/xtradb-operator/xtradb-operator/crds/crd-others.yaml +++ /dev/null @@ -1,155 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: perconaxtradbclusterbackups.pxc.percona.com -spec: - group: pxc.percona.com - names: - kind: PerconaXtraDBClusterBackup - listKind: PerconaXtraDBClusterBackupList - plural: perconaxtradbclusterbackups - singular: perconaxtradbclusterbackup - shortNames: - - pxc-backup - - pxc-backups - scope: Namespaced - versions: - - name: v1 - storage: true - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Cluster - type: string - description: Cluster name - jsonPath: .spec.pxcCluster - - name: Storage - type: string - description: Storage name from pxc spec - jsonPath: .status.storageName - - name: Destination - type: string - description: Backup destination - jsonPath: .status.destination - - name: Status - type: string - description: Job status - jsonPath: .status.state - - name: Completed - description: Completed time - type: date - jsonPath: .status.completed - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: perconaxtradbclusterrestores.pxc.percona.com -spec: - group: pxc.percona.com - names: - kind: PerconaXtraDBClusterRestore - listKind: PerconaXtraDBClusterRestoreList - plural: perconaxtradbclusterrestores - singular: perconaxtradbclusterrestore - shortNames: - - pxc-restore - - pxc-restores - scope: Namespaced - versions: - - name: v1 - storage: true - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Cluster - type: string - description: Cluster name - jsonPath: .spec.pxcCluster - - name: Status - type: string - description: Job status - jsonPath: .status.state - - name: Completed - description: Completed time - type: date - jsonPath: .status.completed - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: perconaxtradbbackups.pxc.percona.com -spec: - group: pxc.percona.com - names: - kind: PerconaXtraDBBackup - listKind: PerconaXtraDBBackupList - plural: perconaxtradbbackups - singular: perconaxtradbbackup - shortNames: [] - scope: Namespaced - versions: - - name: v1alpha1 - storage: true - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Cluster - type: string - description: Cluster name - jsonPath: .spec.pxcCluster - - name: Storage - type: string - description: Storage name from pxc spec - jsonPath: .status.storageName - - name: Destination - type: string - description: Backup destination - jsonPath: .status.destination - - name: Status - type: string - description: Job status - jsonPath: .status.state - - name: Completed - description: Completed time - type: date - jsonPath: .status.completed - - name: Age - type: date - jsonPath: .metadata.creationTimestamp diff --git a/data/xtradb-operator/xtradb-operator/crds/crd.yaml b/data/xtradb-operator/xtradb-operator/crds/crd.yaml deleted file mode 100644 index 2d21bb7f72..0000000000 --- a/data/xtradb-operator/xtradb-operator/crds/crd.yaml +++ /dev/null @@ -1,452 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: perconaxtradbclusters.pxc.percona.com -spec: - group: pxc.percona.com - names: - kind: PerconaXtraDBCluster - listKind: PerconaXtraDBClusterList - plural: perconaxtradbclusters - singular: perconaxtradbcluster - shortNames: - - pxc - - pxcs - scope: Namespaced - versions: - - name: v1alpha1 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - scale: - specReplicasPath: .spec.pxc.size - statusReplicasPath: .status.pxc.ready - labelSelectorPath: .status.pxc.labelSelectorPath - - name: v1-1-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-2-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-3-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-4-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-5-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-6-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-7-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - - name: v1-8-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - scale: - specReplicasPath: .spec.pxc.size - statusReplicasPath: .status.pxc.ready - labelSelectorPath: .status.pxc.labelSelectorPath - - name: v1-9-0 - storage: false - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - scale: - specReplicasPath: .spec.pxc.size - statusReplicasPath: .status.pxc.ready - labelSelectorPath: .status.pxc.labelSelectorPath - - name: v1-10-0 - storage: true - served: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - x-kubernetes-preserve-unknown-fields: true - status: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - name: Endpoint - type: string - jsonPath: .status.host - - name: Status - type: string - jsonPath: .status.state - - name: PXC - type: string - description: Ready pxc nodes - jsonPath: .status.pxc.ready - - name: proxysql - type: string - description: Ready proxysql nodes - jsonPath: .status.proxysql.ready - - name: haproxy - type: string - description: Ready haproxy nodes - jsonPath: .status.haproxy.ready - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - subresources: - status: {} - scale: - specReplicasPath: .spec.pxc.size - statusReplicasPath: .status.pxc.ready - labelSelectorPath: .status.pxc.labelSelectorPath diff --git a/data/xtradb-operator/xtradb-operator/templates/NOTES.txt b/data/xtradb-operator/xtradb-operator/templates/NOTES.txt deleted file mode 100644 index a105dda8e9..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/NOTES.txt +++ /dev/null @@ -1,5 +0,0 @@ -1. pxc-operator deployed. - If you would like to deploy an pxc-cluster set cluster.enabled to true in values.yaml - Check the pxc-operator logs - export POD=$(kubectl get pods -l app.kubernetes.io/name={{ template "pxc-operator.name" . }} --namespace {{ .Release.Namespace }} --output name) - kubectl logs $POD --namespace={{ .Release.Namespace }} \ No newline at end of file diff --git a/data/xtradb-operator/xtradb-operator/templates/_helpers.tpl b/data/xtradb-operator/xtradb-operator/templates/_helpers.tpl deleted file mode 100644 index 2c3d515468..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/_helpers.tpl +++ /dev/null @@ -1,56 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "pxc-operator.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "pxc-operator.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "pxc-operator.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "pxc-operator.labels" -}} -app.kubernetes.io/name: {{ include "pxc-operator.name" . }} -helm.sh/chart: {{ include "pxc-operator.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end -}} - -{{/* -Functions returns image URI according to parameters set -*/}} -{{- define "pxc-operator.image" -}} -{{- if .Values.image }} -{{- .Values.image }} -{{- else }} -{{- printf "%s:%s" .Values.operatorImageRepository .Chart.AppVersion }} -{{- end }} -{{- end -}} \ No newline at end of file diff --git a/data/xtradb-operator/xtradb-operator/templates/deployment.yaml b/data/xtradb-operator/xtradb-operator/templates/deployment.yaml deleted file mode 100644 index 7943e6d7f0..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/deployment.yaml +++ /dev/null @@ -1,91 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "pxc-operator.fullname" . }} - labels: -{{ include "pxc-operator.labels" . | indent 4 }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app.kubernetes.io/component: operator - app.kubernetes.io/name: {{ include "pxc-operator.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/part-of: {{ include "pxc-operator.name" . }} - strategy: - rollingUpdate: - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app.kubernetes.io/component: operator - app.kubernetes.io/name: {{ include "pxc-operator.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/part-of: {{ include "pxc-operator.name" . }} - acto/tag: operator-pod - spec: - serviceAccountName: {{ include "pxc-operator.fullname" . }} - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - terminationGracePeriodSeconds: 600 - containers: - - name: {{ .Chart.Name }} - image: {{ include "pxc-operator.image" . }} - imagePullPolicy: {{ .Values.imagePullPolicy }} - ports: - - containerPort: 8080 - name: metrics - protocol: TCP - command: - - percona-xtradb-cluster-operator - env: - - name: WATCH_NAMESPACE - {{- if .Values.watchAllNamespaces }} - value: "" - {{- else }} - value: {{ default .Release.Namespace .Values.watchNamespace }} - {{- end }} - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: OPERATOR_NAME - value: {{ include "pxc-operator.fullname" . }} - livenessProbe: - failureThreshold: 3 - httpGet: - path: /metrics - port: metrics - scheme: HTTP - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} -{{- if .Values.watchAllNamespaces }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ include "pxc-operator.name" . }} - labels: - name: {{ include "pxc-operator.name" . }} -spec: - ports: - - port: 443 - targetPort: 9443 - selector: - app.kubernetes.io/name: {{ include "pxc-operator.name" . }} -{{- end }} diff --git a/data/xtradb-operator/xtradb-operator/templates/namespace.yaml b/data/xtradb-operator/xtradb-operator/templates/namespace.yaml deleted file mode 100644 index 5de1cbc3fb..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/namespace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -{{ if .Values.watchNamespace }} -apiVersion: v1 -kind: Namespace -metadata: - name: {{ .Values.watchNamespace }} -{{ end }} \ No newline at end of file diff --git a/data/xtradb-operator/xtradb-operator/templates/role-binding.yaml b/data/xtradb-operator/xtradb-operator/templates/role-binding.yaml deleted file mode 100644 index 43ed7ca84a..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/role-binding.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "pxc-operator.fullname" . }} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: percona-xtradb-cluster-operator ---- -{{- if or .Values.watchNamespace .Values.watchAllNamespaces }} -kind: ClusterRoleBinding -{{- else }} -kind: RoleBinding -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ include "pxc-operator.fullname" . }} - {{- if .Values.watchNamespace }} - namespace: {{ .Values.watchNamespace }} - {{- end }} - labels: -{{ include "pxc-operator.labels" . | indent 4 }} -subjects: -- kind: ServiceAccount - name: {{ include "pxc-operator.fullname" . }} - {{- if or .Values.watchNamespace .Values.watchAllNamespaces }} - namespace: {{ .Release.Namespace }} - {{- end }} -roleRef: - {{- if or .Values.watchNamespace .Values.watchAllNamespaces }} - kind: ClusterRole - {{- else }} - kind: Role - {{- end }} - name: {{ include "pxc-operator.fullname" . }} - apiGroup: rbac.authorization.k8s.io diff --git a/data/xtradb-operator/xtradb-operator/templates/role.yaml b/data/xtradb-operator/xtradb-operator/templates/role.yaml deleted file mode 100644 index 525f0681a0..0000000000 --- a/data/xtradb-operator/xtradb-operator/templates/role.yaml +++ /dev/null @@ -1,114 +0,0 @@ -{{- if or .Values.watchNamespace .Values.watchAllNamespaces }} -kind: ClusterRole -{{- else }} -kind: Role -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ include "pxc-operator.fullname" . }} - labels: -{{ include "pxc-operator.labels" . | indent 4 }} -rules: -- apiGroups: - - pxc.percona.com - resources: - - perconaxtradbclusters - - perconaxtradbclusters/status - - perconaxtradbclusterbackups - - perconaxtradbclusterbackups/status - - perconaxtradbclusterrestores - - perconaxtradbclusterrestores/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -{{- if or .Values.watchNamespace .Values.watchAllNamespaces }} -- apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -{{- end }} -- apiGroups: - - "" - resources: - - pods - - pods/exec - - pods/log - - configmaps - - services - - persistentvolumeclaims - - secrets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - apps - resources: - - deployments - - replicasets - - statefulsets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - batch - resources: - - jobs - - cronjobs - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - certmanager.k8s.io - - cert-manager.io - resources: - - issuers - - certificates - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - deletecollection diff --git a/data/xtradb-operator/xtradb-operator/values.yaml b/data/xtradb-operator/xtradb-operator/values.yaml deleted file mode 100644 index c243c19483..0000000000 --- a/data/xtradb-operator/xtradb-operator/values.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Default values for pxc-operator. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -operatorImageRepository: percona/percona-xtradb-cluster-operator -imagePullPolicy: IfNotPresent -image: "" - -# set if you want to specify a namespace to watch -# defaults to `.Release.namespace` if left blank -# watchNamespace: - -# set if operator should be deployed in cluster wide mode. defaults to false -watchAllNamespaces: false - -# set if you want to use a different operator name -# defaults to `percona-xtradb-cluster-operator` -# operatorName: - -# set to false if you don't want the helm chart to -# automatically create the CRD. -createCRD: true - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -resources: - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you don't want to specify resources, comment the following - # lines and add the curly braces after 'resources:'. - limits: - cpu: 200m - memory: 500Mi - requests: - cpu: 100m - memory: 20Mi - -nodeSelector: {} - -tolerations: [] - -affinity: {} diff --git a/data/zookeeper-operator/config.json b/data/zookeeper-operator/config.json new file mode 100644 index 0000000000..fecc96c194 --- /dev/null +++ b/data/zookeeper-operator/config.json @@ -0,0 +1,16 @@ +{ + "github_link": "https://github.com/pravega/zookeeper-operator.git", + "commit": "daac1bdeaace91e4c6e7b712afe7415b2c24df44", + "deploy": { + "method": "HELM", + "file": "data/zookeeper-operator/zookeeper-operator", + "init": null + }, + "crd_name": "zookeeperclusters.zookeeper.pravega.io", + "custom_fields": "data.zookeeper-operator.prune", + "seed_custom_resource": "data/zookeeper-operator/cr.yaml", + "seedType": { + "type": "ZookeeperCluster", + "package": "github.com/pravega/zookeeper-operator/api/v1beta1" + } +} \ No newline at end of file diff --git a/ssa/Makefile b/ssa/Makefile index cf7a83de3d..19bdcc7e47 100644 --- a/ssa/Makefile +++ b/ssa/Makefile @@ -1,7 +1,7 @@ .PHONY: analysis analysis: - go build -buildmode=c-shared -o analysis.so ssa.go + go build -buildmode=c-shared -o libanalysis.so ssa.go clean: rm ./analysis.so \ No newline at end of file diff --git a/ssa/__init__.py b/ssa/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ssa/analysis.py b/ssa/analysis.py index 530d51db72..b6336a0f6d 100644 --- a/ssa/analysis.py +++ b/ssa/analysis.py @@ -2,14 +2,35 @@ import json def analyze(project_path: str, seed_type: str, seed_pkg: str) -> dict: - analysis_lib = ctypes.cdll.LoadLibrary('ssa/analysis.so') + analysis_lib = ctypes.cdll.LoadLibrary('ssa/libanalysis.so') analyze_func = analysis_lib.Analyze analyze_func.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p] analyze_func.restype = ctypes.c_void_p analysis_result = analyze_func(project_path.encode("utf-8"), seed_type.encode("utf-8"), seed_pkg.encode("utf-8")) analysis_result_bytes = ctypes.string_at(analysis_result) + taint_analysis_result = json.loads(analysis_result_bytes) + all_fields = taint_analysis_result['usedPaths'] + tainted_fields = taint_analysis_result['taintedPaths'] + + for tainted_field in tainted_fields: + all_fields.remove(tainted_field) + for field in all_fields: + if is_subfield(tainted_field, field): + all_fields.remove(field) return json.loads(analysis_result_bytes) + +def is_subfield(path: list, subpath: list) -> bool: + '''Checks if subpath is a subfield of path + ''' + if len(path) > len(subpath): + return False + for i in range(len(path)): + if path[i] != subpath[i]: + return False + return True + + if __name__ == '__main__': print(analyze('/home/tyler/redis-operator/cmd/redisoperator', 'RedisFailover', 'github.com/spotahome/redis-operator/api/redisfailover/v1')) \ No newline at end of file diff --git a/ssa/go.sum b/ssa/go.sum index 8806b60308..e5cb294cff 100644 --- a/ssa/go.sum +++ b/ssa/go.sum @@ -1,12 +1,8 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= diff --git a/ssa/analysis.h b/ssa/libanalysis.h similarity index 100% rename from ssa/analysis.h rename to ssa/libanalysis.h diff --git a/ssa/analysis/backwardPropogation.go b/ssa/passes/backwardPropogation.go similarity index 100% rename from ssa/analysis/backwardPropogation.go rename to ssa/passes/backwardPropogation.go diff --git a/ssa/analysis/functions.go b/ssa/passes/functions.go similarity index 100% rename from ssa/analysis/functions.go rename to ssa/passes/functions.go diff --git a/ssa/analysis/pass.go b/ssa/passes/pass.go similarity index 100% rename from ssa/analysis/pass.go rename to ssa/passes/pass.go diff --git a/ssa/analysis/taintAnalysis.go b/ssa/passes/taintAnalysis.go similarity index 100% rename from ssa/analysis/taintAnalysis.go rename to ssa/passes/taintAnalysis.go diff --git a/ssa/analysis/types.go b/ssa/passes/types.go similarity index 100% rename from ssa/analysis/types.go rename to ssa/passes/types.go diff --git a/ssa/ssa.go b/ssa/ssa.go index 4fe9240ceb..cd4f41f5b8 100644 --- a/ssa/ssa.go +++ b/ssa/ssa.go @@ -12,7 +12,7 @@ import ( "io/ioutil" - "github.com/xlab-uiuc/acto/ssa/analysis" + analysis "github.com/xlab-uiuc/acto/ssa/passes" "github.com/xlab-uiuc/acto/ssa/util" "golang.org/x/tools/go/packages" "golang.org/x/tools/go/ssa/ssautil" diff --git a/ssa/test.go b/ssa/test.go deleted file mode 100644 index 62474b760d..0000000000 --- a/ssa/test.go +++ /dev/null @@ -1,97 +0,0 @@ -package main - -import ( - "fmt" - "go/types" - "log" - "sort" - - "github.com/xlab-uiuc/acto/ssa/util" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/go/ssa" - "golang.org/x/tools/go/ssa/ssautil" -) - -func Main() { - // Load, parse, and type-check the initial packages. - cfg := &packages.Config{Mode: packages.LoadSyntax} - initial, err := packages.Load(cfg, "golang.org/x/tools/go/ssa") - if err != nil { - log.Fatal(err) - } - - // Stop if any package had errors. - // This step is optional; without it, the next step - // will create SSA for only a subset of packages. - if packages.PrintErrors(initial) > 0 { - log.Fatalf("packages contain errors") - } - - // Create SSA packages for all well-typed packages. - prog, pkgs := ssautil.Packages(initial, ssa.PrintPackages) - - // Build SSA code for the well-typed initial packages. - for _, p := range pkgs { - if p != nil { - p.Build() - } - } - - ret := []*ssa.Type{} - for _, pkg := range prog.AllPackages() { - if pkg.Pkg.Name() == "ssa" { - for _, m := range pkg.Members { - switch typedMember := m.(type) { - case *ssa.Type: - ret = append(ret, typedMember) - } - } - } - } - - instInter := util.FindSeedType(prog, "Instruction") - valueInter := util.FindSeedType(prog, "Value") - fmt.Println(valueInter) - fmt.Println(ret) - - instImplementation := []string{} - valueImplementation := []string{} - for _, typ := range ret { - - switch named := typ.Type().(type) { - case *types.Named: - fmt.Println(named.String()) - if types.Implements(named, instInter.Type().Underlying().(*types.Interface)) { - instImplementation = append(instImplementation, named.Obj().Name()) - } else if types.Implements(types.NewPointer(named), instInter.Type().Underlying().(*types.Interface)) { - instImplementation = append(instImplementation, named.Obj().Name()) - } - - if types.Implements(named, valueInter.Type().Underlying().(*types.Interface)) { - valueImplementation = append(valueImplementation, named.Obj().Name()) - } else if types.Implements(types.NewPointer(named), valueInter.Type().Underlying().(*types.Interface)) { - valueImplementation = append(valueImplementation, named.Obj().Name()) - } - default: - // fmt.Printf("Type %T\n", named) - } - } - - sort.Strings(valueImplementation) - for _, impl := range valueImplementation { - fmt.Println(impl) - } -} - -func Implements(t *types.Named, itfc *types.Interface) bool { - for i := 0; i < itfc.NumMethods(); i++ { - method := itfc.Method(i) - // fmt.Println(method.Name()) - obj, _, _ := types.LookupFieldOrMethod(t, true, t.Obj().Pkg(), method.Name()) - if obj == nil { - fmt.Printf("%s does not implement because Method %s not implemented\n", t.Obj().Name(), method.Name()) - return false - } - } - return true -}