From 81169ce26d59f320f157b63625053d39a8650b3d Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Mon, 10 Oct 2022 14:18:36 -0500 Subject: [PATCH 01/24] Added schemas for domain v9 and cluster v1 --- .../oracle/weblogic/deploy/wko/cluster-crd-schema-v1.json | 1 + .../oracle/weblogic/deploy/wko/domain-crd-schema-v8.json | 2 +- .../oracle/weblogic/deploy/wko/domain-crd-schema-v9.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 core/src/main/resources/oracle/weblogic/deploy/wko/cluster-crd-schema-v1.json create mode 100644 core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v9.json diff --git a/core/src/main/resources/oracle/weblogic/deploy/wko/cluster-crd-schema-v1.json b/core/src/main/resources/oracle/weblogic/deploy/wko/cluster-crd-schema-v1.json new file mode 100644 index 000000000..3fdefd0e1 --- /dev/null +++ b/core/src/main/resources/oracle/weblogic/deploy/wko/cluster-crd-schema-v1.json @@ -0,0 +1 @@ +{"openAPIV3Schema":{"properties":{"apiVersion":{"type":"string"},"kind":{"enum":["Deployment"],"type":"string"},"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array","x-kubernetes-patch-strategy":"merge"},"generateName":{"type":"string"},"generation":{"format":"int64","type":"integer"},"initializers":{"properties":{"pending":{"items":{"properties":{"name":{"type":"string"}},"required":["name"]},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy":"merge"},"result":{"properties":{"apiVersion":{"type":"string"},"code":{"format":"int32","type":"integer"},"details":{"properties":{"causes":{"items":{"properties":{"field":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}}},"type":"array"},"group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"retryAfterSeconds":{"format":"int32","type":"integer"},"uid":{"type":"string"}}},"kind":{"enum":["Status"],"type":"string"},"message":{"type":"string"},"metadata":{"properties":{"continue":{"type":"string"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"}}},"reason":{"type":"string"},"status":{"type":"string"}},"x-kubernetes-group-version-kind":[{"group":"","kind":"Status","version":"v1"}]}},"required":["pending"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array","x-kubernetes-patch-merge-key":"uid","x-kubernetes-patch-strategy":"merge"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"}}},"spec":{"properties":{"clusterName":{"type":"string"},"clusterService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"sessionAffinity":{"default":"None","enum":["ClientIP","None"],"type":"string"}},"type":"object"},"maxConcurrentShutdown":{"minimum":0,"type":"integer"},"maxConcurrentStartup":{"minimum":0,"type":"integer"},"maxUnavailable":{"minimum":1,"type":"integer"},"replicas":{"minimum":0,"type":"integer"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"affinity":{"properties":{"nodeAffinity":{"properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"items":{"properties":{"preference":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"}},"type":"object"},"weight":{"type":"integer"}},"required":["preference","weight"],"type":"object"},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"properties":{"nodeSelectorTerms":{"items":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"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":{"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":{"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"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"containerSecurityContext":{"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"maxPendingWaitTimeSeconds":{"type":"integer"},"maxReadyWaitTimeSeconds":{"type":"integer"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"integer"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"supplementalGroups":{"items":{"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"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"enum":["ContainersReady","Initialized","PodScheduled","Ready"],"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"enum":["Always","Never","OnFailure"],"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"default":false,"type":"boolean"},"shutdownType":{"default":"Graceful","enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"default":30,"type":"integer"},"waitForAllSessions":{"default":false,"type":"boolean"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"enum":["NoExecute","NoSchedule","PreferNoSchedule"],"type":"string"},"key":{"type":"string"},"operator":{"enum":["Equal","Exists"],"type":"string"},"tolerationSeconds":{"type":"integer"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"integer"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"subresource":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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"},"dataSourceRef":{"properties":{"apiGroup":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"required":["kind","name"],"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"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":{"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":{"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":{"type":"integer"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["Never","IfNeeded"],"type":"string"}},"type":"object"},"status":{"properties":{"clusterName":{"type":"string"},"conditions":{"items":{"properties":{"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"status":{"type":"string"},"type":{"enum":["Available","Completed"],"type":"string"}},"type":"object"},"type":"array"},"labelSelector":{"type":"string"},"maximumReplicas":{"minimum":0,"type":"integer"},"minimumReplicas":{"minimum":0,"type":"integer"},"observedGeneration":{"type":"integer"},"readyReplicas":{"minimum":0,"type":"integer"},"replicas":{"minimum":0,"type":"integer"},"replicasGoal":{"minimum":0,"type":"integer"}},"type":"object"}},"type":"object"}} diff --git a/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v8.json b/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v8.json index bdf63c709..e92650e9b 100644 --- a/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v8.json +++ b/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v8.json @@ -1 +1 @@ -{"openAPIV3Schema":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array","x-kubernetes-patch-strategy":"merge"},"generateName":{"type":"string"},"generation":{"format":"int64","type":"integer"},"initializers":{"properties":{"pending":{"items":{"properties":{"name":{"type":"string"}},"required":["name"]},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy":"merge"},"result":{"properties":{"apiVersion":{"type":"string"},"code":{"format":"int32","type":"integer"},"details":{"properties":{"causes":{"items":{"properties":{"field":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}}},"type":"array"},"group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"retryAfterSeconds":{"format":"int32","type":"integer"},"uid":{"type":"string"}}},"kind":{"type":"string"},"message":{"type":"string"},"metadata":{"properties":{"continue":{"type":"string"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"}}},"reason":{"type":"string"},"status":{"type":"string"}},"x-kubernetes-group-version-kind":[{"group":"","kind":"Status","version":"v1"}]}},"required":["pending"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array","x-kubernetes-patch-merge-key":"uid","x-kubernetes-patch-strategy":"merge"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"}}},"spec":{"properties":{"adminServer":{"properties":{"adminChannelPortForwardingEnabled":{"type":"boolean"},"adminService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"channels":{"items":{"properties":{"channelName":{"type":"string"},"nodePort":{"type":"number"}},"required":["channelName"],"type":"object"},"type":"array"},"labels":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["ALWAYS","NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"type":"object"},"allowReplicasBelowMinDynClusterSize":{"type":"boolean"},"auxiliaryImageVolumes":{"items":{"properties":{"medium":{"type":"string"},"mountPath":{"type":"string"},"name":{"type":"string"},"sizeLimit":{"type":"string"}},"type":"object"},"type":"array"},"clusters":{"items":{"properties":{"allowReplicasBelowMinDynClusterSize":{"type":"boolean"},"clusterName":{"type":"string"},"clusterService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"sessionAffinity":{"enum":["ClientIP","None"],"type":"string"}},"type":"object"},"maxConcurrentShutdown":{"minimum":0,"type":"number"},"maxConcurrentStartup":{"minimum":0,"type":"number"},"maxUnavailable":{"minimum":1,"type":"number"},"replicas":{"minimum":0,"type":"number"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"required":["clusterName"],"type":"object"},"type":"array"},"configOverrideSecrets":{"items":{"type":"string"},"type":"array"},"configOverrides":{"type":"string"},"configuration":{"properties":{"introspectorJobActiveDeadlineSeconds":{"type":"number"},"istio":{"properties":{"enabled":{"type":"boolean"},"localhostBindingsEnabled":{"type":"boolean"},"readinessPort":{"type":"number"},"replicationChannelPort":{"type":"number"}},"type":"object"},"model":{"properties":{"configMap":{"type":"string"},"domainType":{"enum":["WLS","RestrictedJRF","JRF"],"type":"string"},"modelHome":{"type":"string"},"onlineUpdate":{"properties":{"enabled":{"type":"boolean"},"onNonDynamicChanges":{"enum":["CommitUpdateAndRoll","CommitUpdateOnly"],"type":"string"},"wdtTimeouts":{"properties":{"activateTimeoutMillis":{"type":"number"},"connectTimeoutMillis":{"type":"number"},"deployTimeoutMillis":{"type":"number"},"redeployTimeoutMillis":{"type":"number"},"setServerGroupsTimeoutMillis":{"type":"number"},"startApplicationTimeoutMillis":{"type":"number"},"stopApplicationTimeoutMillis":{"type":"number"},"undeployTimeoutMillis":{"type":"number"}},"type":"object"}},"type":"object"},"runtimeEncryptionSecret":{"type":"string"},"wdtInstallHome":{"type":"string"}},"type":"object"},"opss":{"properties":{"walletFileSecret":{"type":"string"},"walletPasswordSecret":{"type":"string"}},"type":"object"},"overrideDistributionStrategy":{"enum":["DYNAMIC","ON_RESTART"],"type":"string"},"overridesConfigMap":{"type":"string"},"secrets":{"items":{"type":"string"},"type":"array"}},"type":"object"},"dataHome":{"type":"string"},"domainHome":{"type":"string"},"domainHomeInImage":{"type":"boolean"},"domainHomeSourceType":{"enum":["Image","PersistentVolume","FromModel"],"type":"string"},"domainUID":{"pattern":"^[a-z0-9-.]{1,45}$","type":"string"},"httpAccessLogInLogHome":{"type":"boolean"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"imagePullSecrets":{"items":{"properties":{"name":{"type":"string"}},"type":"object"},"type":"array"},"includeServerOutInPodLog":{"type":"boolean"},"introspectVersion":{"type":"string"},"livenessProbeCustomScript":{"type":"string"},"logHome":{"type":"string"},"logHomeEnabled":{"type":"boolean"},"managedServers":{"items":{"properties":{"restartVersion":{"type":"string"},"serverName":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["ALWAYS","NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"required":["serverName"],"type":"object"},"type":"array"},"maxClusterConcurrentShutdown":{"minimum":0,"type":"number"},"maxClusterConcurrentStartup":{"minimum":0,"type":"number"},"monitoringExporter":{"properties":{"configuration":{"type":"object","x-kubernetes-preserve-unknown-fields":true},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"port":{"type":"number"}},"type":"object"},"replicas":{"minimum":0,"type":"number"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["NEVER","IF_NEEDED","ADMIN_ONLY"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"},"webLogicCredentialsSecret":{"properties":{"name":{"type":"string"},"namespace":{"type":"string"}},"type":"object"}},"type":"object"},"status":{"properties":{"clusters":{"items":{"properties":{"clusterName":{"type":"string"},"maximumReplicas":{"minimum":0,"type":"number"},"minimumReplicas":{"minimum":0,"type":"number"},"readyReplicas":{"minimum":0,"type":"number"},"replicas":{"minimum":0,"type":"number"},"replicasGoal":{"minimum":0,"type":"number"}},"type":"object"},"type":"array"},"conditions":{"items":{"properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"type":"string"},"type":{"enum":["Progressing","Available","ConfigChangesPendingRestart","Failed"],"type":"string"}},"type":"object"},"type":"array"},"introspectJobFailureCount":{"minimum":0,"type":"number"},"lastIntrospectJobProcessedUid":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"replicas":{"minimum":0,"type":"number"},"servers":{"items":{"properties":{"clusterName":{"type":"string"},"desiredState":{"type":"string"},"health":{"properties":{"activationTime":{"format":"date-time","type":"string"},"overallHealth":{"type":"string"},"subsystems":{"items":{"properties":{"health":{"type":"string"},"subsystemName":{"type":"string"},"symptoms":{"items":{"type":"string"},"type":"array"}},"type":"object"},"type":"array"}},"type":"object"},"nodeName":{"type":"string"},"serverName":{"type":"string"},"state":{"type":"string"}},"type":"object"},"type":"array"},"startTime":{"format":"date-time","type":"string"}},"type":"object"}},"type":"object"}} +{"openAPIV3Schema":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array","x-kubernetes-patch-strategy":"merge"},"generateName":{"type":"string"},"generation":{"format":"int64","type":"integer"},"initializers":{"properties":{"pending":{"items":{"properties":{"name":{"type":"string"}},"required":["name"]},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy":"merge"},"result":{"properties":{"apiVersion":{"type":"string"},"code":{"format":"int32","type":"integer"},"details":{"properties":{"causes":{"items":{"properties":{"field":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}}},"type":"array"},"group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"retryAfterSeconds":{"format":"int32","type":"integer"},"uid":{"type":"string"}}},"kind":{"type":"string"},"message":{"type":"string"},"metadata":{"properties":{"continue":{"type":"string"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"}}},"reason":{"type":"string"},"status":{"type":"string"}},"x-kubernetes-group-version-kind":[{"group":"","kind":"Status","version":"v1"}]}},"required":["pending"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array","x-kubernetes-patch-merge-key":"uid","x-kubernetes-patch-strategy":"merge"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"}}},"spec":{"properties":{"adminServer":{"properties":{"adminChannelPortForwardingEnabled":{"type":"boolean"},"adminService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"channels":{"items":{"properties":{"channelName":{"type":"string"},"nodePort":{"type":"number"}},"required":["channelName"],"type":"object"},"type":"array"},"labels":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["ALWAYS","NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"type":"object"},"allowReplicasBelowMinDynClusterSize":{"type":"boolean"},"auxiliaryImageVolumes":{"items":{"properties":{"medium":{"type":"string"},"mountPath":{"type":"string"},"name":{"type":"string"},"sizeLimit":{"type":"string"}},"type":"object"},"type":"array"},"clusters":{"items":{"properties":{"allowReplicasBelowMinDynClusterSize":{"type":"boolean"},"clusterName":{"type":"string"},"clusterService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"sessionAffinity":{"enum":["ClientIP","None"],"type":"string"}},"type":"object"},"maxConcurrentShutdown":{"minimum":0.0,"type":"number"},"maxConcurrentStartup":{"minimum":0.0,"type":"number"},"maxUnavailable":{"minimum":1.0,"type":"number"},"replicas":{"minimum":0.0,"type":"number"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"required":["clusterName"],"type":"object"},"type":"array"},"configOverrideSecrets":{"items":{"type":"string"},"type":"array"},"configOverrides":{"type":"string"},"configuration":{"properties":{"introspectorJobActiveDeadlineSeconds":{"type":"number"},"istio":{"properties":{"enabled":{"type":"boolean"},"localhostBindingsEnabled":{"type":"boolean"},"readinessPort":{"type":"number"},"replicationChannelPort":{"type":"number"}},"type":"object"},"model":{"properties":{"configMap":{"type":"string"},"domainType":{"enum":["WLS","RestrictedJRF","JRF"],"type":"string"},"modelHome":{"type":"string"},"onlineUpdate":{"properties":{"enabled":{"type":"boolean"},"onNonDynamicChanges":{"enum":["CommitUpdateAndRoll","CommitUpdateOnly"],"type":"string"},"wdtTimeouts":{"properties":{"activateTimeoutMillis":{"type":"number"},"connectTimeoutMillis":{"type":"number"},"deployTimeoutMillis":{"type":"number"},"redeployTimeoutMillis":{"type":"number"},"setServerGroupsTimeoutMillis":{"type":"number"},"startApplicationTimeoutMillis":{"type":"number"},"stopApplicationTimeoutMillis":{"type":"number"},"undeployTimeoutMillis":{"type":"number"}},"type":"object"}},"type":"object"},"runtimeEncryptionSecret":{"type":"string"},"wdtInstallHome":{"type":"string"}},"type":"object"},"opss":{"properties":{"walletFileSecret":{"type":"string"},"walletPasswordSecret":{"type":"string"}},"type":"object"},"overrideDistributionStrategy":{"enum":["DYNAMIC","ON_RESTART"],"type":"string"},"overridesConfigMap":{"type":"string"},"secrets":{"items":{"type":"string"},"type":"array"}},"type":"object"},"dataHome":{"type":"string"},"domainHome":{"type":"string"},"domainHomeInImage":{"type":"boolean"},"domainHomeSourceType":{"enum":["Image","PersistentVolume","FromModel"],"type":"string"},"domainUID":{"pattern":"^[a-z0-9-.]{1,45}$","type":"string"},"httpAccessLogInLogHome":{"type":"boolean"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"imagePullSecrets":{"items":{"properties":{"name":{"type":"string"}},"type":"object"},"type":"array"},"includeServerOutInPodLog":{"type":"boolean"},"introspectVersion":{"type":"string"},"livenessProbeCustomScript":{"type":"string"},"logHome":{"type":"string"},"logHomeEnabled":{"type":"boolean"},"managedServers":{"items":{"properties":{"restartVersion":{"type":"string"},"serverName":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["ALWAYS","NEVER","IF_NEEDED"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"}},"required":["serverName"],"type":"object"},"type":"array"},"maxClusterConcurrentShutdown":{"minimum":0.0,"type":"number"},"maxClusterConcurrentStartup":{"minimum":0.0,"type":"number"},"monitoringExporter":{"properties":{"configuration":{"type":"object","x-kubernetes-preserve-unknown-fields":true},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"port":{"type":"number"}},"type":"object"},"replicas":{"minimum":0.0,"type":"number"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"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":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"weight":{"type":"number"}},"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"},"namespaces":{"items":{"type":"string"},"type":"array"},"topologyKey":{"type":"string"}},"required":["topologyKey"],"type":"object"},"type":"array"}},"type":"object"}},"type":"object"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"auxiliaryImages":{"items":{"properties":{"command":{"type":"string"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","Never","IfNotPresent"],"type":"string"},"volume":{"type":"string"}},"type":"object"},"type":"array"},"containerSecurityContext":{"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"number"},"hostIP":{"type":"string"},"hostPort":{"type":"number"},"name":{"type":"string"},"protocol":{"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"type":"number"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"number"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"timeoutSeconds":{"type":"number"}},"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"number"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"number"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"number"},"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":{"type":"number"},"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"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"minimum":1.0,"type":"number"},"initialDelaySeconds":{"type":"number"},"periodSeconds":{"type":"number"},"successThreshold":{"minimum":1.0,"type":"number"},"timeoutSeconds":{"type":"number"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"type":"boolean"},"shutdownType":{"enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"type":"number"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"tolerationSeconds":{"type":"number"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"readOnly":{"type":"boolean"},"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"number"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"number"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"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":{"type":"number"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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":{"type":"number"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"number"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"path":{"type":"string"}},"required":["key","path"],"type":"object"},"type":"array"},"name":{"type":"string"},"optional":{"type":"boolean"}},"type":"object"},"serviceAccountToken":{"properties":{"audience":{"type":"string"},"expirationSeconds":{"type":"number"},"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":{"type":"number"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"type":"number"},"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"enum":["NEVER","IF_NEEDED","ADMIN_ONLY"],"type":"string"},"serverStartState":{"enum":["RUNNING","ADMIN"],"type":"string"},"webLogicCredentialsSecret":{"properties":{"name":{"type":"string"},"namespace":{"type":"string"}},"type":"object"}},"type":"object"},"status":{"properties":{"clusters":{"items":{"properties":{"clusterName":{"type":"string"},"maximumReplicas":{"minimum":0.0,"type":"number"},"minimumReplicas":{"minimum":0.0,"type":"number"},"readyReplicas":{"minimum":0.0,"type":"number"},"replicas":{"minimum":0.0,"type":"number"},"replicasGoal":{"minimum":0.0,"type":"number"}},"type":"object"},"type":"array"},"conditions":{"items":{"properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"type":"string"},"type":{"enum":["Progressing","Available","ConfigChangesPendingRestart","Failed"],"type":"string"}},"type":"object"},"type":"array"},"introspectJobFailureCount":{"minimum":0.0,"type":"number"},"lastIntrospectJobProcessedUid":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"replicas":{"minimum":0.0,"type":"number"},"servers":{"items":{"properties":{"clusterName":{"type":"string"},"desiredState":{"type":"string"},"health":{"properties":{"activationTime":{"format":"date-time","type":"string"},"overallHealth":{"type":"string"},"subsystems":{"items":{"properties":{"health":{"type":"string"},"subsystemName":{"type":"string"},"symptoms":{"items":{"type":"string"},"type":"array"}},"type":"object"},"type":"array"}},"type":"object"},"nodeName":{"type":"string"},"serverName":{"type":"string"},"state":{"type":"string"}},"type":"object"},"type":"array"},"startTime":{"format":"date-time","type":"string"}},"type":"object"}},"type":"object"}} diff --git a/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v9.json b/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v9.json new file mode 100644 index 000000000..fc350b2f0 --- /dev/null +++ b/core/src/main/resources/oracle/weblogic/deploy/wko/domain-crd-schema-v9.json @@ -0,0 +1 @@ +{"openAPIV3Schema":{"properties":{"apiVersion":{"type":"string"},"kind":{"enum":["Deployment"],"type":"string"},"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array","x-kubernetes-patch-strategy":"merge"},"generateName":{"type":"string"},"generation":{"format":"int64","type":"integer"},"initializers":{"properties":{"pending":{"items":{"properties":{"name":{"type":"string"}},"required":["name"]},"type":"array","x-kubernetes-patch-merge-key":"name","x-kubernetes-patch-strategy":"merge"},"result":{"properties":{"apiVersion":{"type":"string"},"code":{"format":"int32","type":"integer"},"details":{"properties":{"causes":{"items":{"properties":{"field":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}}},"type":"array"},"group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"retryAfterSeconds":{"format":"int32","type":"integer"},"uid":{"type":"string"}}},"kind":{"enum":["Status"],"type":"string"},"message":{"type":"string"},"metadata":{"properties":{"continue":{"type":"string"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"}}},"reason":{"type":"string"},"status":{"type":"string"}},"x-kubernetes-group-version-kind":[{"group":"","kind":"Status","version":"v1"}]}},"required":["pending"]},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array","x-kubernetes-patch-merge-key":"uid","x-kubernetes-patch-strategy":"merge"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"type":"string"}}},"spec":{"properties":{"adminServer":{"properties":{"adminChannelPortForwardingEnabled":{"default":true,"type":"boolean"},"adminService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"channels":{"items":{"properties":{"channelName":{"type":"string"},"nodePort":{"type":"integer"}},"type":"object"},"type":"array"},"labels":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"affinity":{"properties":{"nodeAffinity":{"properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"items":{"properties":{"preference":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"}},"type":"object"},"weight":{"type":"integer"}},"required":["preference","weight"],"type":"object"},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"properties":{"nodeSelectorTerms":{"items":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"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":{"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":{"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"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"containerSecurityContext":{"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"maxPendingWaitTimeSeconds":{"type":"integer"},"maxReadyWaitTimeSeconds":{"type":"integer"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"integer"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"supplementalGroups":{"items":{"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"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"enum":["ContainersReady","Initialized","PodScheduled","Ready"],"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"enum":["Always","Never","OnFailure"],"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"default":false,"type":"boolean"},"shutdownType":{"default":"Graceful","enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"default":30,"type":"integer"},"waitForAllSessions":{"default":false,"type":"boolean"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"enum":["NoExecute","NoSchedule","PreferNoSchedule"],"type":"string"},"key":{"type":"string"},"operator":{"enum":["Equal","Exists"],"type":"string"},"tolerationSeconds":{"type":"integer"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"integer"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"subresource":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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"},"dataSourceRef":{"properties":{"apiGroup":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"required":["kind","name"],"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"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":{"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":{"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":{"type":"integer"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"default":"IfNeeded","enum":["Always","Never","IfNeeded"],"type":"string"}},"type":"object"},"clusters":{"items":{"properties":{"name":{"type":"string"}},"type":"object"},"type":"array"},"configuration":{"properties":{"introspectorJobActiveDeadlineSeconds":{"default":120,"type":"integer"},"model":{"properties":{"auxiliaryImageVolumeMedium":{"type":"string"},"auxiliaryImageVolumeMountPath":{"type":"string"},"auxiliaryImageVolumeSizeLimit":{"type":"string"},"auxiliaryImages":{"items":{"properties":{"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","IfNotPresent","Never"],"type":"string"},"sourceModelHome":{"type":"string"},"sourceWDTInstallHome":{"type":"string"}},"type":"object"},"type":"array"},"configMap":{"type":"string"},"domainType":{"default":"WLS","enum":["WLS","RestrictedJRF","JRF"],"type":"string"},"modelHome":{"type":"string"},"onlineUpdate":{"properties":{"enabled":{"default":false,"type":"boolean"},"onNonDynamicChanges":{"default":"CommitUpdateOnly","enum":["CommitUpdateAndRoll","CommitUpdateOnly"],"type":"string"},"wdtTimeouts":{"properties":{"activateTimeoutMillis":{"default":180000,"type":"integer"},"connectTimeoutMillis":{"default":120000,"type":"integer"},"deployTimeoutMillis":{"default":180000,"type":"integer"},"redeployTimeoutMillis":{"default":180000,"type":"integer"},"setServerGroupsTimeoutMillis":{"default":180000,"type":"integer"},"startApplicationTimeoutMillis":{"default":180000,"type":"integer"},"stopApplicationTimeoutMillis":{"default":180000,"type":"integer"},"undeployTimeoutMillis":{"default":180000,"type":"integer"}},"type":"object"}},"type":"object"},"runtimeEncryptionSecret":{"type":"string"},"wdtInstallHome":{"type":"string"}},"type":"object"},"opss":{"properties":{"walletFileSecret":{"type":"string"},"walletPasswordSecret":{"type":"string"}},"type":"object"},"overrideDistributionStrategy":{"default":"Dynamic","enum":["Dynamic","OnRestart"],"type":"string"},"overridesConfigMap":{"type":"string"},"secrets":{"items":{"type":"string"},"type":"array"}},"type":"object"},"dataHome":{"type":"string"},"domainHome":{"type":"string"},"domainHomeSourceType":{"enum":["Image","PersistentVolume","FromModel"],"type":"string"},"domainUID":{"pattern":"^[a-z0-9-.]{1,45}$","type":"string"},"failureRetryIntervalSeconds":{"default":120,"minimum":0,"type":"integer"},"failureRetryLimitMinutes":{"default":1440,"minimum":0,"type":"integer"},"fluentdSpecification":{"properties":{"elasticSearchCredentials":{"type":"string"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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"},"fluentdConfiguration":{"type":"string"},"image":{"default":"fluent/fluentd-kubernetes-daemonset:v1.14.5-debian-elasticsearch7-1.1","type":"string"},"imagePullPolicy":{"enum":["Always","IfNotPresent","Never"],"type":"string"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"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"},"watchIntrospectorLogs":{"type":"boolean"}},"type":"object"},"httpAccessLogInLogHome":{"default":true,"type":"boolean"},"image":{"type":"string"},"imagePullPolicy":{"enum":["Always","IfNotPresent","Never"],"type":"string"},"imagePullSecrets":{"items":{"properties":{"name":{"type":"string"}},"type":"object"},"type":"array"},"includeServerOutInPodLog":{"default":true,"type":"boolean"},"introspectVersion":{"type":"string"},"livenessProbeCustomScript":{"type":"string"},"logHome":{"type":"string"},"logHomeEnabled":{"type":"boolean"},"logHomeLayout":{"default":"ByServers","enum":["Flat","ByServers"],"type":"string"},"managedServers":{"items":{"properties":{"restartVersion":{"type":"string"},"serverName":{"type":"string"},"serverPod":{"properties":{"affinity":{"properties":{"nodeAffinity":{"properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"items":{"properties":{"preference":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"}},"type":"object"},"weight":{"type":"integer"}},"required":["preference","weight"],"type":"object"},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"properties":{"nodeSelectorTerms":{"items":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"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":{"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":{"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"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"containerSecurityContext":{"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"maxPendingWaitTimeSeconds":{"type":"integer"},"maxReadyWaitTimeSeconds":{"type":"integer"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"integer"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"supplementalGroups":{"items":{"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"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"enum":["ContainersReady","Initialized","PodScheduled","Ready"],"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"enum":["Always","Never","OnFailure"],"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"default":false,"type":"boolean"},"shutdownType":{"default":"Graceful","enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"default":30,"type":"integer"},"waitForAllSessions":{"default":false,"type":"boolean"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"enum":["NoExecute","NoSchedule","PreferNoSchedule"],"type":"string"},"key":{"type":"string"},"operator":{"enum":["Equal","Exists"],"type":"string"},"tolerationSeconds":{"type":"integer"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"integer"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"subresource":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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"},"dataSourceRef":{"properties":{"apiGroup":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"required":["kind","name"],"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"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":{"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":{"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":{"type":"integer"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"default":"IfNeeded","enum":["Always","Never","IfNeeded"],"type":"string"}},"type":"object"},"type":"array"},"maxClusterConcurrentShutdown":{"default":1,"minimum":0,"type":"integer"},"maxClusterConcurrentStartup":{"default":0,"minimum":0,"type":"integer"},"monitoringExporter":{"properties":{"configuration":{"type":"object","x-kubernetes-preserve-unknown-fields":true},"image":{"default":"ghcr.io/oracle/weblogic-monitoring-exporter:2.0.7","type":"string"},"imagePullPolicy":{"enum":["Always","IfNotPresent","Never"],"type":"string"},"port":{"default":8080,"type":"integer"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"}},"type":"object"},"replicas":{"default":1,"minimum":0,"type":"integer"},"restartVersion":{"type":"string"},"serverPod":{"properties":{"affinity":{"properties":{"nodeAffinity":{"properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"items":{"properties":{"preference":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"}},"type":"object"},"weight":{"type":"integer"}},"required":["preference","weight"],"type":"object"},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"properties":{"nodeSelectorTerms":{"items":{"properties":{"matchExpressions":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"type":"string"},"values":{"items":{"type":"string"},"type":"array"}},"required":["key","operator"],"type":"object"},"type":"array"},"matchFields":{"items":{"properties":{"key":{"type":"string"},"operator":{"enum":["DoesNotExist","Exists","Gt","In","Lt","NotIn"],"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":{"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":{"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"},"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"containerSecurityContext":{"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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"},"hostAliases":{"items":{"properties":{"hostnames":{"items":{"type":"string"},"type":"array"},"ip":{"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":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"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":{"enum":["Always","IfNotPresent","Never"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"}},"type":"object"}},"type":"object"},"livenessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"name":{"type":"string"},"ports":{"items":{"properties":{"containerPort":{"type":"integer"},"hostIP":{"type":"string"},"hostPort":{"type":"integer"},"name":{"type":"string"},"protocol":{"enum":["SCTP","TCP","UDP"],"type":"string"}},"required":["containerPort"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"windowsOptions":{"properties":{"gmsaCredentialSpec":{"type":"string"},"gmsaCredentialSpecName":{"type":"string"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"startupProbe":{"properties":{"exec":{"properties":{"command":{"items":{"type":"string"},"type":"array"}},"type":"object"},"failureThreshold":{"type":"integer"},"grpc":{"properties":{"port":{"type":"integer"},"service":{"type":"string"}},"required":["port"],"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":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"},"scheme":{"enum":["HTTP","HTTPS"],"type":"string"}},"required":["port"],"type":"object"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"tcpSocket":{"properties":{"host":{"type":"string"},"port":{"properties":{"intValue":{"type":"integer"},"isInt":{"type":"boolean"},"strValue":{"type":"string"}},"required":["isInt"],"type":"object"}},"required":["port"],"type":"object"},"terminationGracePeriodSeconds":{"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"stdin":{"type":"boolean"},"stdinOnce":{"type":"boolean"},"terminationMessagePath":{"type":"string"},"terminationMessagePolicy":{"enum":["FallbackToLogsOnError","File"],"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"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"livenessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"maxPendingWaitTimeSeconds":{"type":"integer"},"maxReadyWaitTimeSeconds":{"type":"integer"},"nodeName":{"type":"string"},"nodeSelector":{"additionalProperties":{"type":"string"},"type":"object"},"podSecurityContext":{"properties":{"fsGroup":{"type":"integer"},"fsGroupChangePolicy":{"type":"string"},"runAsGroup":{"type":"integer"},"runAsNonRoot":{"type":"boolean"},"runAsUser":{"type":"integer"},"seLinuxOptions":{"properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"type":"object"},"seccompProfile":{"properties":{"localhostProfile":{"type":"string"},"type":{"enum":["Localhost","RuntimeDefault","Unconfined"],"type":"string"}},"required":["type"],"type":"object"},"supplementalGroups":{"items":{"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"},"hostProcess":{"type":"boolean"},"runAsUserName":{"type":"string"}},"type":"object"}},"type":"object"},"priorityClassName":{"type":"string"},"readinessGates":{"items":{"properties":{"conditionType":{"enum":["ContainersReady","Initialized","PodScheduled","Ready"],"type":"string"}},"required":["conditionType"],"type":"object"},"type":"array"},"readinessProbe":{"properties":{"failureThreshold":{"default":1,"minimum":1,"type":"integer"},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"default":1,"minimum":1,"type":"integer"},"timeoutSeconds":{"type":"integer"}},"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"restartPolicy":{"enum":["Always","Never","OnFailure"],"type":"string"},"runtimeClassName":{"type":"string"},"schedulerName":{"type":"string"},"serviceAccountName":{"type":"string"},"shutdown":{"properties":{"ignoreSessions":{"default":false,"type":"boolean"},"shutdownType":{"default":"Graceful","enum":["Graceful","Forced"],"type":"string"},"timeoutSeconds":{"default":30,"type":"integer"},"waitForAllSessions":{"default":false,"type":"boolean"}},"type":"object"},"tolerations":{"items":{"properties":{"effect":{"enum":["NoExecute","NoSchedule","PreferNoSchedule"],"type":"string"},"key":{"type":"string"},"operator":{"enum":["Equal","Exists"],"type":"string"},"tolerationSeconds":{"type":"integer"},"value":{"type":"string"}},"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"},"volumes":{"items":{"properties":{"awsElasticBlockStore":{"properties":{"fsType":{"type":"string"},"partition":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"items":{"items":{"properties":{"fieldRef":{"properties":{"apiVersion":{"type":"string"},"fieldPath":{"type":"string"}},"required":["fieldPath"],"type":"object"},"mode":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"emptyDir":{"properties":{"medium":{"type":"string"},"sizeLimit":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"}},"type":"object"},"ephemeral":{"properties":{"volumeClaimTemplate":{"properties":{"metadata":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"clusterName":{"type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"items":{"type":"string"},"type":"array"},"generateName":{"type":"string"},"generation":{"type":"integer"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"managedFields":{"items":{"properties":{"apiVersion":{"type":"string"},"fieldsType":{"type":"string"},"fieldsV1":{"type":"object"},"manager":{"type":"string"},"operation":{"type":"string"},"subresource":{"type":"string"},"time":{"format":"date-time","type":"string"}},"type":"object"},"type":"array"},"name":{"type":"string"},"namespace":{"type":"string"},"ownerReferences":{"items":{"properties":{"apiVersion":{"type":"string"},"blockOwnerDeletion":{"type":"boolean"},"controller":{"type":"boolean"},"kind":{"type":"string"},"name":{"type":"string"},"uid":{"type":"string"}},"required":["apiVersion","kind","name","uid"],"type":"object"},"type":"array"},"resourceVersion":{"type":"string"},"selfLink":{"type":"string"},"uid":{"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"},"dataSourceRef":{"properties":{"apiGroup":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"required":["kind","name"],"type":"object"},"resources":{"properties":{"limits":{"additionalProperties":{"type":"string"},"type":"object"},"requests":{"additionalProperties":{"type":"string"},"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":{"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":{"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":{"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":{"type":"integer"},"sources":{"items":{"properties":{"configMap":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"type":"integer"},"path":{"type":"string"},"resourceFieldRef":{"properties":{"containerName":{"type":"string"},"divisor":{"properties":{"format":{"enum":["DECIMAL_EXPONENT","DECIMAL_SI","BINARY_SI"],"type":"string"},"number":{"type":"integer"}},"type":"object"},"resource":{"type":"string"}},"required":["resource"],"type":"object"}},"required":["path"],"type":"object"},"type":"array"}},"type":"object"},"secret":{"properties":{"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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":{"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":{"type":"integer"},"items":{"items":{"properties":{"key":{"type":"string"},"mode":{"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"}},"type":"object"},"serverService":{"properties":{"annotations":{"additionalProperties":{"type":"string"},"type":"object"},"labels":{"additionalProperties":{"type":"string"},"type":"object"},"precreateService":{"type":"boolean"}},"type":"object"},"serverStartPolicy":{"default":"IfNeeded","enum":["Never","IfNeeded","AdminOnly"],"type":"string"},"webLogicCredentialsSecret":{"properties":{"name":{"type":"string"}},"type":"object"}},"type":"object"},"status":{"properties":{"clusters":{"items":{"properties":{"clusterName":{"type":"string"},"conditions":{"items":{"properties":{"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"status":{"type":"string"},"type":{"enum":["Available","Completed"],"type":"string"}},"type":"object"},"type":"array"},"labelSelector":{"type":"string"},"maximumReplicas":{"minimum":0,"type":"integer"},"minimumReplicas":{"minimum":0,"type":"integer"},"observedGeneration":{"type":"integer"},"readyReplicas":{"minimum":0,"type":"integer"},"replicas":{"minimum":0,"type":"integer"},"replicasGoal":{"minimum":0,"type":"integer"}},"type":"object"},"type":"array"},"conditions":{"items":{"properties":{"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"reason":{"enum":["DomainInvalid","Introspection","Kubernetes","ServerPod","ReplicasTooHigh","TopologyMismatch","Internal","Aborted"],"type":"string"},"severity":{"enum":["Fatal","Severe","Warning"],"type":"string"},"status":{"type":"string"},"type":{"enum":["Failed","Available","Completed","ConfigChangesPendingRestart","Rolling"],"type":"string"}},"required":["type","status"],"type":"object"},"type":"array"},"failedIntrospectionUid":{"type":"string"},"initialFailureTime":{"format":"date-time","type":"string"},"introspectJobFailureCount":{"minimum":0,"type":"integer"},"lastFailureTime":{"format":"date-time","type":"string"},"message":{"type":"string"},"observedGeneration":{"type":"integer"},"reason":{"type":"string"},"replicas":{"minimum":0,"type":"integer"},"servers":{"items":{"properties":{"clusterName":{"type":"string"},"health":{"properties":{"activationTime":{"format":"date-time","type":"string"},"overallHealth":{"type":"string"},"subsystems":{"items":{"properties":{"health":{"type":"string"},"subsystemName":{"type":"string"},"symptoms":{"items":{"type":"string"},"type":"array"}},"type":"object"},"type":"array"}},"type":"object"},"nodeName":{"type":"string"},"podPhase":{"enum":["Failed","Pending","Running","Succeeded","Unknown"],"type":"string"},"podReady":{"type":"string"},"serverName":{"type":"string"},"state":{"type":"string"},"stateGoal":{"type":"string"}},"type":"object"},"type":"array"},"startTime":{"format":"date-time","type":"string"}},"type":"object"}},"type":"object"}} From 763bd2ab4397281a931ab22ece42b31b95fdc286 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Mon, 10 Oct 2022 17:50:11 -0500 Subject: [PATCH 02/24] Read schema versions corresponding to WKO version --- .../tool/extract/wko_schema_helper.py | 62 ++++++++++++++++--- .../modelhelp/model_kubernetes_printer.py | 2 +- .../tool/util/targets/output_file_helper.py | 2 +- .../tool/validate/kubernetes_validator.py | 3 +- .../deploy/messages/wlsdeploy_rb.properties | 1 + .../tool/extract/kubernetes_schema_test.py | 54 ++++++++++++---- 6 files changed, 99 insertions(+), 25 deletions(-) diff --git a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py index b0c62c246..981918af6 100644 --- a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py @@ -10,9 +10,11 @@ from wlsdeploy.logging import platform_logger from wlsdeploy.util import dictionary_utils -DOMAIN_RESOURCE_SCHEMA_ROOT = "openAPIV3Schema" -DOMAIN_RESOURCE_SCHEMA_FILE = 'domain-crd-schema-v8.json' -DOMAIN_RESOURCE_SCHEMA_PATH = 'oracle/weblogic/deploy/wko/' + DOMAIN_RESOURCE_SCHEMA_FILE +CLUSTER_RESOURCE_SCHEMA_NAME = 'cluster-crd-schema' +DOMAIN_RESOURCE_SCHEMA_NAME = 'domain-crd-schema' +RESOURCE_SCHEMA_EXTENSION = '.json' +RESOURCE_SCHEMA_PATH = 'oracle/weblogic/deploy/wko' +RESOURCE_SCHEMA_ROOT = "openAPIV3Schema" SIMPLE_TYPES = [ 'integer', @@ -39,28 +41,70 @@ 'spec/managedServers': 'serverName' } +WKO_VERSION_3 = 'v3' +WKO_VERSION_4 = 'v4' + +DOMAIN_VERSION_MAP = { + WKO_VERSION_3: 'v8', + WKO_VERSION_4: 'v9' +} + +CLUSTER_VERSION_MAP = { + WKO_VERSION_4: 'v1' +} + _logger = platform_logger.PlatformLogger('wlsdeploy.deploy') _class_name = 'wko_schema_helper' -def get_domain_resource_schema(exception_type=ExceptionType.DEPLOY): +def get_domain_resource_schema(wko_version, exception_type=ExceptionType.DEPLOY): """ Read the WKO domain resource schema from its resource path. """ - _method_name = 'get_domain_resource_schema' + schema_version = _get_schema_version(DOMAIN_VERSION_MAP, wko_version, DOMAIN_RESOURCE_SCHEMA_NAME, exception_type) + return _get_resource_schema(DOMAIN_RESOURCE_SCHEMA_NAME, schema_version, exception_type) + + +def get_cluster_resource_schema(wko_version, exception_type=ExceptionType.DEPLOY): + """ + Read the WKO cluster resource schema from its resource path. + """ + schema_version = _get_schema_version(CLUSTER_VERSION_MAP, wko_version, CLUSTER_RESOURCE_SCHEMA_NAME, exception_type) + return _get_resource_schema(CLUSTER_RESOURCE_SCHEMA_NAME, schema_version, exception_type) + + +def _get_schema_version(version_map, wko_version, type_name, exception_type): + _method_name = '_get_schema_version' + + schema_version = dictionary_utils.get_element(version_map, wko_version) + if not schema_version: + ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10011', type_name, wko_version, + ', '.join(version_map.keys())) + _logger.throwing(ex, class_name=_class_name, method_name=_method_name) + raise ex + return schema_version; + + +def _get_resource_schema(resource_name, schema_version, exception_type=ExceptionType.DEPLOY): + """ + Read the specified resource schema from its resource path. + """ + _method_name = '_get_resource_schema' template_stream = None try: - template_stream = FileUtils.getResourceAsStream(DOMAIN_RESOURCE_SCHEMA_PATH) + resource_full_name = resource_name + '-' + schema_version + RESOURCE_SCHEMA_EXTENSION + resource_path = RESOURCE_SCHEMA_PATH + '/' + resource_full_name + template_stream = FileUtils.getResourceAsStream(resource_path) if template_stream is None: - ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', DOMAIN_RESOURCE_SCHEMA_PATH) + ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) _logger.throwing(ex, class_name=_class_name, method_name=_method_name) raise ex - full_schema = JsonStreamToPython(DOMAIN_RESOURCE_SCHEMA_FILE, template_stream, True).parse() + full_schema = JsonStreamToPython(resource_name, template_stream, True).parse() # remove the root element, since it has a version-specific name - schema = full_schema[DOMAIN_RESOURCE_SCHEMA_ROOT] + schema = full_schema[RESOURCE_SCHEMA_ROOT] finally: if template_stream: diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index b7a3f1928..a4ceb4330 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -18,7 +18,7 @@ class ModelKubernetesPrinter(object): _logger = PlatformLogger('wlsdeploy.modelhelp') def __init__(self): - self._schema = wko_schema_helper.get_domain_resource_schema() + self._schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3) def print_model_sample(self, model_path_tokens, control_option): """ diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index abb9a711b..b8b98b8f8 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -81,7 +81,7 @@ def _update_documents(documents, kubernetes_content, output_file_path): _method_name = '_update_documents' found = False - schema = wko_schema_helper.get_domain_resource_schema(ExceptionType.DEPLOY) + schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3, ExceptionType.DEPLOY) # update section(s) based on their kind, etc. for document in documents: diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index 892454891..f242a3787 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -30,7 +30,8 @@ def validate_model(self, model_dict): if not kubernetes_section: return - schema = wko_schema_helper.get_domain_resource_schema(exception_type=ExceptionType.VALIDATE) + schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3, + ExceptionType.VALIDATE) model_path = KUBERNETES + ":" self.validate_folder(kubernetes_section, schema, None, model_path) diff --git a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties index f8f7e4942..dcb696259 100644 --- a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties +++ b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties @@ -1201,6 +1201,7 @@ WLSDPLY-09701=In online WLST, unable to target resources from extension template ############################################################################### # wlsdeploy/tool/extract/wko_schema_helper.py WLSDPLY-10010=Failed to load WKO domain resource schema {0} +WLSDPLY-10011=No {0} schema for WKO version {1}, available for version {2} # extract_resource.py WLSDPLY-10040=The {0} argument has been deprecated, use {1} to specify output directory diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py index 29772bf70..41b73e482 100644 --- a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py +++ b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2020, 2021, Oracle and/or its affiliates. +Copyright (c) 2020, 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import os @@ -13,24 +13,50 @@ class KubernetesSchemaTest(unittest.TestCase): _model_dir = '../../unit-tests/wko' - _model_path = _model_dir + '/model.yaml' - def setUp(self): - self.schema_map = wko_schema_helper.get_domain_resource_schema() + def testKubernetesSchema(self): + # create a model with every element. + # verify that there are no unknown types or structures. + try: + version = wko_schema_helper.WKO_VERSION_3 + schema_map = wko_schema_helper.get_domain_resource_schema(version) - if not os.path.exists(self._model_dir): - os.makedirs(self._model_dir) - file_path = self._model_dir + "/model.yaml" - self.out_file = open(file_path, "w") + if not os.path.exists(self._model_dir): + os.makedirs(self._model_dir) + file_path = self._model_dir + "/model.yaml" + self.out_file = open(file_path, "w") - def tearDown(self): - self.out_file.close() + self._write_line(KUBERNETES + ": # " + version) + self._write_folder(schema_map, False, "", " ") - def testKubernetesSchema(self): + self.out_file.close() + except Exception, e: + self.fail(e.message) + + def testKubernetes4Schemas(self): # create a model with every element. # verify that there are no unknown types or structures. - self._write_line(KUBERNETES + ":") - self._write_folder(self.schema_map, False, "", " ") + try: + version = wko_schema_helper.WKO_VERSION_4 + domain_map = wko_schema_helper.get_domain_resource_schema(version) + cluster_map = wko_schema_helper.get_cluster_resource_schema(version) + + if not os.path.exists(self._model_dir): + os.makedirs(self._model_dir) + file_path = self._model_dir + "/model-v4.yaml" + self.out_file = open(file_path, "w") + + self._write_line(KUBERNETES + ": # " + version) + + self._write_line(" domain:") + self._write_folder(domain_map, False, "", " ") + + self._write_line(" cluster:") + self._write_folder(cluster_map, False, "", " ") + + self.out_file.close() + except Exception, e: + self.fail(e.message) def _write_folder(self, folder, in_array, path, indent): # for an object in an array, the first field is prefixed with a hyphen @@ -107,6 +133,8 @@ def _write_line(self, text): def _get_sample_value(simple_type): if simple_type == 'boolean': return 'true' + elif simple_type == 'integer': + return '345' elif simple_type == 'number': return '123' else: From d40da4522eb9050774e3797f4ba8dda527cfaff8 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Tue, 11 Oct 2022 13:28:48 -0500 Subject: [PATCH 03/24] Avoid logging parsed JSON and YAML --- core/src/main/python/wlsdeploy/json/json_translator.py | 2 +- core/src/main/python/wlsdeploy/yaml/yaml_translator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/python/wlsdeploy/json/json_translator.py b/core/src/main/python/wlsdeploy/json/json_translator.py index 678959621..ea9780339 100644 --- a/core/src/main/python/wlsdeploy/json/json_translator.py +++ b/core/src/main/python/wlsdeploy/json/json_translator.py @@ -87,7 +87,7 @@ def parse(self): self._logger.entering(class_name=self._class_name, method_name=_method_name) # throws JsonException with details, nothing we can really add here... result_dict = self._translator.parse() - self._logger.exiting(class_name=self._class_name, method_name=_method_name, result=result_dict) + self._logger.exiting(class_name=self._class_name, method_name=_method_name) return result_dict diff --git a/core/src/main/python/wlsdeploy/yaml/yaml_translator.py b/core/src/main/python/wlsdeploy/yaml/yaml_translator.py index e85a8b89d..8056c60e9 100644 --- a/core/src/main/python/wlsdeploy/yaml/yaml_translator.py +++ b/core/src/main/python/wlsdeploy/yaml/yaml_translator.py @@ -111,7 +111,7 @@ def parse(self): self._logger.entering(class_name=self._class_name, method_name=_method_name) # throws YamlException with details, nothing we can really add here... result_dict = self._translator.parse() - self._logger.exiting(class_name=self._class_name, method_name=_method_name, result=result_dict) + self._logger.exiting(class_name=self._class_name, method_name=_method_name) return result_dict From 402cfeddc32b53a8b0e22cc89b0edae6f16f3c14 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Tue, 11 Oct 2022 16:38:54 -0500 Subject: [PATCH 04/24] Add WKO v4 schema support for modelHelp; use revised interface in unit tests --- core/src/main/python/model_help.py | 13 ++-- .../tool/extract/wko_schema_helper.py | 70 +++++++++---------- .../tool/modelhelp/model_help_printer.py | 6 +- .../modelhelp/model_kubernetes_printer.py | 66 ++++++++++++++--- .../tool/util/targets/output_file_helper.py | 2 +- .../tool/validate/kubernetes_validator.py | 3 +- .../wlsdeploy/util/target_configuration.py | 19 +++++ core/src/main/targetconfigs/wko4/target.json | 17 +++++ .../tool/extract/kubernetes_schema_test.py | 48 +++++-------- .../tool/modelhelp/model_help_printer_test.py | 4 +- installer/src/main/bin/modelHelp.cmd | 5 +- installer/src/main/bin/modelHelp.sh | 6 +- 12 files changed, 172 insertions(+), 87 deletions(-) create mode 100644 core/src/main/targetconfigs/wko4/target.json diff --git a/core/src/main/python/model_help.py b/core/src/main/python/model_help.py index 7ddcebfa5..f1bc6de8e 100644 --- a/core/src/main/python/model_help.py +++ b/core/src/main/python/model_help.py @@ -33,7 +33,8 @@ CommandLineArgUtil.ATTRIBUTES_ONLY_SWITCH, CommandLineArgUtil.FOLDERS_ONLY_SWITCH, CommandLineArgUtil.RECURSIVE_SWITCH, - CommandLineArgUtil.INTERACTIVE_MODE_SWITCH + CommandLineArgUtil.INTERACTIVE_MODE_SWITCH, + CommandLineArgUtil.TARGET_SWITCH ] __output_types = [ @@ -222,7 +223,7 @@ def interactive_help_prompt(model_path, input_file): sys.stdout.flush() if not input_file: - command_str = raw_input("") # get command from stdin + command_str = raw_input("") # get command from stdin else: # get command from file instead of stdin (undocumented feature) @@ -243,7 +244,7 @@ def interactive_help_print_path(printer, model_path, history): """ Prints help for the given model_path, or an error message. Also updates the help history on success. - :param model_path: the model path + :param model_path: the model path :param history: history of successful model paths :param printer: a model help printer """ @@ -364,7 +365,7 @@ def interactive_help_main_loop(aliases, model_path, printer): if command_str == 'exit': break - # the "process command" prints the help (or error) for the command_str + # the "process command" prints the help (or error) for the command_str # plus appends a new path to the history if the str specifies a successful directory change interactive_help_process_command(aliases, printer, history[-1], command_str, history) @@ -376,7 +377,7 @@ def interactive_help_main_loop(aliases, model_path, printer): __logger.exiting(class_name=_class_name, method_name=_method_name) - + def print_help(model_path, model_context): """ Prints the folders and/or attributes for the specified given model_path, @@ -401,7 +402,7 @@ def print_help(model_path, model_context): control_option = ControlOptions.FOLDERS_ONLY aliases = Aliases(model_context) - printer = ModelHelpPrinter(aliases, __logger) + printer = ModelHelpPrinter(model_context, aliases, __logger) if model_context.get_interactive_mode_option(): interactive_help_main_loop(aliases, model_path, printer) diff --git a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py index 981918af6..f0a080e4e 100644 --- a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py @@ -44,57 +44,57 @@ WKO_VERSION_3 = 'v3' WKO_VERSION_4 = 'v4' -DOMAIN_VERSION_MAP = { - WKO_VERSION_3: 'v8', - WKO_VERSION_4: 'v9' +VERSION_FOLDER_INFOS = { + WKO_VERSION_3: { + "": { + 'schema_name': DOMAIN_RESOURCE_SCHEMA_NAME + '-v8' + } + }, + WKO_VERSION_4: { + "domain": { + 'schema_name': DOMAIN_RESOURCE_SCHEMA_NAME + '-v9' + }, + "clusters": { + 'schema_name': CLUSTER_RESOURCE_SCHEMA_NAME + '-v1', + 'is_array': True + } + } } -CLUSTER_VERSION_MAP = { - WKO_VERSION_4: 'v1' -} _logger = platform_logger.PlatformLogger('wlsdeploy.deploy') _class_name = 'wko_schema_helper' -def get_domain_resource_schema(wko_version, exception_type=ExceptionType.DEPLOY): - """ - Read the WKO domain resource schema from its resource path. - """ - schema_version = _get_schema_version(DOMAIN_VERSION_MAP, wko_version, DOMAIN_RESOURCE_SCHEMA_NAME, exception_type) - return _get_resource_schema(DOMAIN_RESOURCE_SCHEMA_NAME, schema_version, exception_type) - +def get_valid_wko_versions(): + return VERSION_FOLDER_INFOS.keys() -def get_cluster_resource_schema(wko_version, exception_type=ExceptionType.DEPLOY): - """ - Read the WKO cluster resource schema from its resource path. - """ - schema_version = _get_schema_version(CLUSTER_VERSION_MAP, wko_version, CLUSTER_RESOURCE_SCHEMA_NAME, exception_type) - return _get_resource_schema(CLUSTER_RESOURCE_SCHEMA_NAME, schema_version, exception_type) +# get information about the model folders directly under kubernetes, +# such as domain and clusters. these are not part of the schemas. +def get_folder_infos(wko_version, exception_type=ExceptionType.DEPLOY): + folder_infos = VERSION_FOLDER_INFOS[wko_version] + for folder_info in folder_infos.values(): + folder_schema = dictionary_utils.get_element(folder_info, 'schema') + if not folder_schema: + folder_schema = _get_schema(folder_info['schema_name'], exception_type) + folder_info['schema'] = folder_schema + return folder_infos -def _get_schema_version(version_map, wko_version, type_name, exception_type): - _method_name = '_get_schema_version' - schema_version = dictionary_utils.get_element(version_map, wko_version) - if not schema_version: - ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10011', type_name, wko_version, - ', '.join(version_map.keys())) - _logger.throwing(ex, class_name=_class_name, method_name=_method_name) - raise ex - return schema_version; +# used by test only, should be obsolete +def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): + folder_infos = get_folder_infos(WKO_VERSION_3, exception_type) + return folder_infos['']['schema'] -def _get_resource_schema(resource_name, schema_version, exception_type=ExceptionType.DEPLOY): - """ - Read the specified resource schema from its resource path. - """ - _method_name = '_get_resource_schema' +def _get_schema(schema_name, exception_type): + _method_name = '_get_schema' template_stream = None try: - resource_full_name = resource_name + '-' + schema_version + RESOURCE_SCHEMA_EXTENSION - resource_path = RESOURCE_SCHEMA_PATH + '/' + resource_full_name + resource_name = schema_name + RESOURCE_SCHEMA_EXTENSION + resource_path = RESOURCE_SCHEMA_PATH + '/' + resource_name template_stream = FileUtils.getResourceAsStream(resource_path) if template_stream is None: ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_help_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_help_printer.py index 3e1269176..453c4bc12 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_help_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_help_printer.py @@ -24,13 +24,15 @@ class ModelHelpPrinter(object): Class for printing the recognized model metadata to STDOUT. """ - def __init__(self, aliases, logger): + def __init__(self, model_context, aliases, logger): """ + :param model_context: The model context :param aliases: A reference to an Aliases class instance :param logger: A reference to the platform logger to write to, if a log entry needs to be made """ self._logger = logger self._aliases = aliases + self._model_context = model_context def print_model_help(self, model_path, control_option): """ @@ -66,7 +68,7 @@ def print_model_help(self, model_path, control_option): print(_format_message('WLSDPLY-10105', model_path)) if model_path_tokens[0] == KUBERNETES: - sample_printer = ModelKubernetesPrinter() + sample_printer = ModelKubernetesPrinter(self._model_context) sample_printer.print_model_sample(model_path_tokens, control_option) else: sample_printer = ModelSamplePrinter(self._aliases, self._logger) diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index a4ceb4330..f541afb2a 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -7,6 +7,7 @@ from wlsdeploy.tool.extract import wko_schema_helper from wlsdeploy.tool.modelhelp import model_help_utils from wlsdeploy.tool.modelhelp.model_help_utils import ControlOptions +from wlsdeploy.util import dictionary_utils from wlsdeploy.util.exit_code import ExitCode @@ -17,8 +18,9 @@ class ModelKubernetesPrinter(object): _class_name = "ModelKubernetesPrinter" _logger = PlatformLogger('wlsdeploy.modelhelp') - def __init__(self): - self._schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3) + def __init__(self, model_context): + wko_version = model_context.get_target_configuration().get_target_version() + self._wko_model_folders = wko_schema_helper.get_folder_infos(wko_version) def print_model_sample(self, model_path_tokens, control_option): """ @@ -44,11 +46,35 @@ def _print_model_section_sample(self, section_name, control_option): path = section_name + ":" _print_indent(path, 0) - if model_help_utils.show_attributes(control_option): - self._print_attributes_sample(self._schema, 1, False) + # examine model folders directly under kubernetes - if model_help_utils.show_folders(control_option): - self._print_subfolders_sample(self._schema, control_option, 1, path, False) + folder_keys = self._wko_model_folders.keys() + folder_keys.sort() + for folder_key in folder_keys: + folder_path = path + show_children = True + indent = 1 + + if len(folder_key): + if control_option != ControlOptions.RECURSIVE: + print("") + + _print_indent(folder_key + ':', indent) + show_children = control_option == ControlOptions.RECURSIVE + folder_path = path + '/' + folder_key + indent = indent + 1 + + if show_children: + folder_info = self._wko_model_folders[folder_key] + in_array = dictionary_utils.get_element(folder_info, 'is_array') + + if model_help_utils.show_attributes(control_option): + in_array = self._print_attributes_sample(folder_info['schema'], indent, in_array) + + if model_help_utils.show_folders(control_option): + self._print_subfolders_sample(folder_info['schema'], control_option, indent, folder_path, in_array) + else: + _print_indent("# see " + folder_path, indent) def _print_model_folder_sample(self, section_name, model_path_tokens, control_option): """ @@ -70,8 +96,32 @@ def _print_model_folder_sample(self, section_name, model_path_tokens, control_op in_object_array = False model_path = section_name + ":" - current_folder = self._schema - for token in model_path_tokens[1:]: + token_index = 1 + + # resolve model folders directly under kubernetes + + folder_info = dictionary_utils.get_element(self._wko_model_folders, '') + first_token = model_path_tokens[token_index] + if not folder_info: + folder_info = dictionary_utils.get_element(self._wko_model_folders, first_token) + _print_indent(first_token + ":", indent, in_object_array) + model_path += '/' + first_token + token_index += 1 + indent += 1 + + if not folder_info: + ex = exception_helper.create_cla_exception(ExitCode.ARG_VALIDATION_ERROR, + "WLSDPLY-10111", model_path, first_token, + ', '.join(self._wko_model_folders.keys())) + self._logger.throwing(ex, class_name=self._class_name, method_name=_method_name) + raise ex + + schema = folder_info['schema'] + + # process elements inside kubernetes sub-folders + + current_folder = schema + for token in model_path_tokens[token_index:]: properties = _get_properties(current_folder) valid_subfolder_keys = _get_folder_names(properties) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index b8b98b8f8..79d88f0a5 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -81,7 +81,7 @@ def _update_documents(documents, kubernetes_content, output_file_path): _method_name = '_update_documents' found = False - schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3, ExceptionType.DEPLOY) + schema = wko_schema_helper.get_default_domain_resource_schema(ExceptionType.DEPLOY) # update section(s) based on their kind, etc. for document in documents: diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index f242a3787..120cc5909 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -30,8 +30,7 @@ def validate_model(self, model_dict): if not kubernetes_section: return - schema = wko_schema_helper.get_domain_resource_schema(wko_schema_helper.WKO_VERSION_3, - ExceptionType.VALIDATE) + schema = wko_schema_helper.get_default_domain_resource_schema(ExceptionType.VALIDATE) model_path = KUBERNETES + ":" self.validate_folder(kubernetes_section, schema, None, model_path) diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index 6ed06a48d..b674632a8 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -6,6 +6,7 @@ from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.util import dictionary_utils from wlsdeploy.util.validate_configuration import VALIDATION_METHODS +from wlsdeploy.tool.extract import wko_schema_helper # types for credential method CREDENTIALS_METHOD = "credentials_method" @@ -29,6 +30,10 @@ # Determines if replica count is applied at the cluster level SET_CLUSTER_REPLICAS = "set_cluster_replicas" +# Determines the version of the target application. +TARGET_VERSION = 'target_version' +DEFAULT_TARGET_VERSION = 'v3' # default for WKO and VZ + # put secret tokens in the model, and build a script to create the secrets. SECRETS_METHOD = 'secrets' @@ -208,6 +213,16 @@ def sets_cluster_replicas(self): result = dictionary_utils.get_element(self.config_dictionary, SET_CLUSTER_REPLICAS) return result or False + def get_target_version(self): + """ + Return the version of the application being targeted. + :return: the application version + """ + result = dictionary_utils.get_element(self.config_dictionary, TARGET_VERSION) + if result is not None: + return result + return DEFAULT_TARGET_VERSION + def validate_configuration(self, exit_code, target_configuration_file): validation_method = self.get_validation_method() self._validate_enumerated_field(VALIDATION_METHOD, validation_method, VALIDATION_METHODS, exit_code, @@ -217,6 +232,10 @@ def validate_configuration(self, exit_code, target_configuration_file): self._validate_enumerated_field(CREDENTIALS_METHOD, credentials_method, CREDENTIALS_METHODS, exit_code, target_configuration_file) + target_version = self.get_target_version() + self._validate_enumerated_field(TARGET_VERSION, target_version, wko_schema_helper.get_valid_wko_versions(), + exit_code, target_configuration_file) + source_type = self._get_domain_home_source_type() self._validate_enumerated_field(DOMAIN_HOME_SOURCE_TYPE, source_type, SOURCE_TYPE_NAMES.keys(), exit_code, target_configuration_file) diff --git a/core/src/main/targetconfigs/wko4/target.json b/core/src/main/targetconfigs/wko4/target.json new file mode 100644 index 000000000..674b70810 --- /dev/null +++ b/core/src/main/targetconfigs/wko4/target.json @@ -0,0 +1,17 @@ +{ + "model_filters" : { + "discover": [ + { "id": "wko_filter" } + ] + }, + "variable_injectors" : {"PORT": {},"HOST": {},"URL": {}}, + "validation_method" : "lax", + "domain_home_source_type" : "mii", + "credentials_method" : "secrets", + "credentials_output_method" : "script", + "exclude_domain_bin_contents": true, + "target_version" : "v4", + "wls_credentials_name" : "__weblogic-credentials__", + "additional_secrets": "runtime-encryption-secret", + "additional_output" : "wko-domain.yaml" +} diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py index 41b73e482..e16f6e5bd 100644 --- a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py +++ b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py @@ -9,54 +9,44 @@ from wlsdeploy.aliases.model_constants import KUBERNETES from wlsdeploy.tool.extract import wko_schema_helper +from wlsdeploy.util import dictionary_utils class KubernetesSchemaTest(unittest.TestCase): _model_dir = '../../unit-tests/wko' def testKubernetesSchema(self): - # create a model with every element. - # verify that there are no unknown types or structures. - try: - version = wko_schema_helper.WKO_VERSION_3 - schema_map = wko_schema_helper.get_domain_resource_schema(version) - - if not os.path.exists(self._model_dir): - os.makedirs(self._model_dir) - file_path = self._model_dir + "/model.yaml" - self.out_file = open(file_path, "w") - - self._write_line(KUBERNETES + ": # " + version) - self._write_folder(schema_map, False, "", " ") - - self.out_file.close() - except Exception, e: - self.fail(e.message) + self._testSchemas(wko_schema_helper.WKO_VERSION_3, "model.yaml") def testKubernetes4Schemas(self): + self._testSchemas(wko_schema_helper.WKO_VERSION_4, "model-v4.yaml") + + def _testSchemas(self, wko_version, file_name): # create a model with every element. # verify that there are no unknown types or structures. try: - version = wko_schema_helper.WKO_VERSION_4 - domain_map = wko_schema_helper.get_domain_resource_schema(version) - cluster_map = wko_schema_helper.get_cluster_resource_schema(version) - if not os.path.exists(self._model_dir): os.makedirs(self._model_dir) - file_path = self._model_dir + "/model-v4.yaml" + file_path = self._model_dir + "/" + file_name self.out_file = open(file_path, "w") - self._write_line(KUBERNETES + ": # " + version) - - self._write_line(" domain:") - self._write_folder(domain_map, False, "", " ") + self._write_line(KUBERNETES + ": # " + wko_version) - self._write_line(" cluster:") - self._write_folder(cluster_map, False, "", " ") + folder_infos = wko_schema_helper.get_folder_infos(wko_version) + folder_keys = folder_infos.keys() + folder_keys.sort() + for folder_key in folder_keys: + indent = " " + if len(folder_key): + self._write_line(indent + folder_key + ":") + indent = indent + " " + folder_info = folder_infos[folder_key] + is_array = dictionary_utils.get_element(folder_info, 'is_array') + self._write_folder(folder_info['schema'], is_array, "", indent) self.out_file.close() except Exception, e: - self.fail(e.message) + self.fail(str(e)) def _write_folder(self, folder, in_array, path, indent): # for an object in an array, the first field is prefixed with a hyphen diff --git a/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py b/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py index db5172a66..a1ea9c86c 100644 --- a/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py +++ b/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2020, Oracle Corporation and/or its affiliates. +Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import unittest @@ -86,7 +86,7 @@ def _get_model_help(self, path, control_option): model_context = ModelContext(self._program_name, { }) aliases = Aliases(model_context, WlstModes.OFFLINE, self.wls_version) - printer = ModelHelpPrinter(aliases, self._logger) + printer = ModelHelpPrinter(model_context, aliases, self._logger) printer.print_model_help(path, control_option) sys.stdout.flush() diff --git a/installer/src/main/bin/modelHelp.cmd b/installer/src/main/bin/modelHelp.cmd index ac726d6aa..e2574126a 100644 --- a/installer/src/main/bin/modelHelp.cmd +++ b/installer/src/main/bin/modelHelp.cmd @@ -2,7 +2,7 @@ @rem ************************************************************************** @rem modelHelp.cmd @rem -@rem Copyright (c) 2020, Oracle Corporation and/or its affiliates. All rights reserved. +@rem Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. @rem Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. @rem @rem NAME @@ -77,6 +77,9 @@ ECHO oracle_home - an existing Oracle Home directory. ECHO This is required unless the ORACLE_HOME environment ECHO variable is set. ECHO. +ECHO target - target platform (wko, etc.). +ECHO this determines the structure of the kubernetes section. +ECHO. ECHO model_path - the path to the model element to be examined. ECHO the format is [^:][/^]... ECHO. diff --git a/installer/src/main/bin/modelHelp.sh b/installer/src/main/bin/modelHelp.sh index 295fca3d6..18d53afff 100644 --- a/installer/src/main/bin/modelHelp.sh +++ b/installer/src/main/bin/modelHelp.sh @@ -2,7 +2,7 @@ # ***************************************************************************** # modelHelp.sh # -# Copyright (c) 2020, Oracle Corporation and/or its affiliates. All rights reserved. +# Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # NAME @@ -34,6 +34,7 @@ usage() { echo "" echo "Usage: $1 [-help]" echo " [-oracle_home ]" + echo " [-target ]" echo " [-attributes_only | -folders_only | -recursive | -interactive]" echo " " echo "" @@ -42,6 +43,9 @@ usage() { echo " This is required unless the ORACLE_HOME environment" echo " variable is set." echo "" + echo " target - target platform (wko, etc.)." + echo " this determines the structure of the kubernetes section." + echo "" echo " model_path - the path to the model element to be examined." echo " the format is [
:][/]..." echo "" From 67684519380e25208eb93208a6511e214974644d Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 12 Oct 2022 10:45:25 -0500 Subject: [PATCH 05/24] Pass exception to logger to display formatted stack trace in log --- core/src/main/python/wlsdeploy/util/tool_main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/python/wlsdeploy/util/tool_main.py b/core/src/main/python/wlsdeploy/util/tool_main.py index 80ee504ec..e177e5ad0 100644 --- a/core/src/main/python/wlsdeploy/util/tool_main.py +++ b/core/src/main/python/wlsdeploy/util/tool_main.py @@ -97,10 +97,11 @@ def __handle_unexpected_exception(ex, model_context, class_name, method_name, lo if hasattr(ex, 'stackTrace'): # this works best for java exceptions, and gets the full stacktrace all the way back to weblogic.WLST - logger.fine('WLSDPLY-20036', program_name, ex.stackTrace, class_name=class_name, method_name=method_name) + logger.fine('WLSDPLY-20036', program_name, ex.stackTrace, class_name=class_name, method_name=method_name, + error=ex) else: # this is for Python exceptions # Note: since this is Python 2, it seems we can only get the traceback object via sys.exc_info, # and of course only while in the except block handling code logger.fine('WLSDPLY-20036', program_name, traceback.format_exception(type(ex), ex, sys.exc_info()[2]), - class_name=class_name, method_name=method_name) + class_name=class_name, method_name=method_name, error=ex) From 38c73bcf9f5671c3edc8a6d9114a6b993259a41d Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 12 Oct 2022 17:05:20 -0500 Subject: [PATCH 06/24] Add WKO v4 support to validateModel; refined wko_schema_helper API --- core/src/main/python/validate.py | 1 + .../modelhelp/model_kubernetes_printer.py | 55 ++++---- .../tool/util/targets/output_file_helper.py | 2 +- .../wlsdeploy/tool/util/wko/__init__.py | 4 + .../tool/util/wko/wko_document_folder.py | 29 ++++ .../wko}/wko_schema_helper.py | 125 ++++++++++++------ .../tool/validate/kubernetes_validator.py | 33 ++++- .../wlsdeploy/util/target_configuration.py | 2 +- .../tool/extract/kubernetes_schema_test.py | 25 ++-- 9 files changed, 184 insertions(+), 92 deletions(-) create mode 100644 core/src/main/python/wlsdeploy/tool/util/wko/__init__.py create mode 100644 core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py rename core/src/main/python/wlsdeploy/tool/{extract => util/wko}/wko_schema_helper.py (66%) diff --git a/core/src/main/python/validate.py b/core/src/main/python/validate.py index ef232afc4..1cd4f7051 100644 --- a/core/src/main/python/validate.py +++ b/core/src/main/python/validate.py @@ -51,6 +51,7 @@ CommandLineArgUtil.MODEL_FILE_SWITCH, CommandLineArgUtil.ARCHIVE_FILE_SWITCH, CommandLineArgUtil.VARIABLE_FILE_SWITCH, + CommandLineArgUtil.TARGET_SWITCH, CommandLineArgUtil.TARGET_VERSION_SWITCH, CommandLineArgUtil.TARGET_MODE_SWITCH, CommandLineArgUtil.VALIDATION_METHOD diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index f541afb2a..b80b8a424 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -4,10 +4,9 @@ """ from wlsdeploy.exception import exception_helper from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.extract import wko_schema_helper +from wlsdeploy.tool.util.wko import wko_schema_helper from wlsdeploy.tool.modelhelp import model_help_utils from wlsdeploy.tool.modelhelp.model_help_utils import ControlOptions -from wlsdeploy.util import dictionary_utils from wlsdeploy.util.exit_code import ExitCode @@ -19,8 +18,8 @@ class ModelKubernetesPrinter(object): _logger = PlatformLogger('wlsdeploy.modelhelp') def __init__(self, model_context): - wko_version = model_context.get_target_configuration().get_target_version() - self._wko_model_folders = wko_schema_helper.get_folder_infos(wko_version) + self._wko_version = model_context.get_target_configuration().get_target_version() + self._document_folders = wko_schema_helper.get_document_folders(self._wko_version) def print_model_sample(self, model_path_tokens, control_option): """ @@ -48,31 +47,30 @@ def _print_model_section_sample(self, section_name, control_option): # examine model folders directly under kubernetes - folder_keys = self._wko_model_folders.keys() - folder_keys.sort() - for folder_key in folder_keys: + for document_folder in self._document_folders: folder_path = path show_children = True indent = 1 - if len(folder_key): + if document_folder.has_model_key(): if control_option != ControlOptions.RECURSIVE: print("") - _print_indent(folder_key + ':', indent) + model_key = document_folder.get_model_key() + _print_indent(model_key + ':', indent) show_children = control_option == ControlOptions.RECURSIVE - folder_path = path + '/' + folder_key + folder_path = path + '/' + model_key indent = indent + 1 if show_children: - folder_info = self._wko_model_folders[folder_key] - in_array = dictionary_utils.get_element(folder_info, 'is_array') + schema = document_folder.get_schema() + in_array = document_folder.is_array() if model_help_utils.show_attributes(control_option): - in_array = self._print_attributes_sample(folder_info['schema'], indent, in_array) + in_array = self._print_attributes_sample(schema, indent, in_array) if model_help_utils.show_folders(control_option): - self._print_subfolders_sample(folder_info['schema'], control_option, indent, folder_path, in_array) + self._print_subfolders_sample(schema, control_option, indent, folder_path, in_array) else: _print_indent("# see " + folder_path, indent) @@ -100,23 +98,24 @@ def _print_model_folder_sample(self, section_name, model_path_tokens, control_op # resolve model folders directly under kubernetes - folder_info = dictionary_utils.get_element(self._wko_model_folders, '') - first_token = model_path_tokens[token_index] - if not folder_info: - folder_info = dictionary_utils.get_element(self._wko_model_folders, first_token) - _print_indent(first_token + ":", indent, in_object_array) - model_path += '/' + first_token + doc_folder = wko_schema_helper.get_keyless_document_folder(self._wko_version) + if not doc_folder: + first_token = model_path_tokens[token_index] + doc_folder = wko_schema_helper.get_document_folder(self._wko_version, first_token) + if not doc_folder: + ex = exception_helper.create_cla_exception( + ExitCode.ARG_VALIDATION_ERROR, "WLSDPLY-10111", model_path, first_token, + ', '.join(wko_schema_helper.get_document_folder_keys(self._wko_version))) + self._logger.throwing(ex, class_name=self._class_name, method_name=_method_name) + raise ex + + model_key = doc_folder.get_model_key() + _print_indent(model_key + ":", indent, in_object_array) + model_path += '/' + model_key token_index += 1 indent += 1 - if not folder_info: - ex = exception_helper.create_cla_exception(ExitCode.ARG_VALIDATION_ERROR, - "WLSDPLY-10111", model_path, first_token, - ', '.join(self._wko_model_folders.keys())) - self._logger.throwing(ex, class_name=self._class_name, method_name=_method_name) - raise ex - - schema = folder_info['schema'] + schema = doc_folder.get_schema() # process elements inside kubernetes sub-folders diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index 79d88f0a5..9bb5c74aa 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -16,7 +16,7 @@ from wlsdeploy.exception import exception_helper from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.extract import wko_schema_helper +from wlsdeploy.tool.util.wko import wko_schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.yaml.yaml_translator import PythonToYaml from wlsdeploy.yaml.yaml_translator import YamlToPython diff --git a/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py b/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py new file mode 100644 index 000000000..3885c439b --- /dev/null +++ b/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py @@ -0,0 +1,4 @@ +""" +Copyright (c) 2022, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +""" diff --git a/core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py b/core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py new file mode 100644 index 000000000..fb0c7142f --- /dev/null +++ b/core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py @@ -0,0 +1,29 @@ +""" +Copyright (c) 2022, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +""" +from wlsdeploy.tool.util.wko import wko_schema_helper + + +class WkoDocumentFolder: + """ + A model folder that corresponds to a schema for a CRD document. + """ + _class_name = "WkoDocumentFolder" + + def __init__(self, model_key, schema, is_array): + self._model_key = model_key + self._schema = schema + self._is_array = is_array + + def get_model_key(self): + return self._model_key + + def is_array(self): + return self._is_array + + def get_schema(self): + return self._schema + + def has_model_key(self): + return self._model_key != wko_schema_helper.NO_DOC_FOLDER_KEY diff --git a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py similarity index 66% rename from core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py rename to core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py index f0a080e4e..289e7dcc1 100644 --- a/core/src/main/python/wlsdeploy/tool/extract/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py @@ -8,13 +8,14 @@ from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.json.json_translator import JsonStreamToPython from wlsdeploy.logging import platform_logger +from wlsdeploy.tool.util.wko.wko_document_folder import WkoDocumentFolder from wlsdeploy.util import dictionary_utils -CLUSTER_RESOURCE_SCHEMA_NAME = 'cluster-crd-schema' -DOMAIN_RESOURCE_SCHEMA_NAME = 'domain-crd-schema' -RESOURCE_SCHEMA_EXTENSION = '.json' -RESOURCE_SCHEMA_PATH = 'oracle/weblogic/deploy/wko' -RESOURCE_SCHEMA_ROOT = "openAPIV3Schema" +CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' +DOMAIN_SCHEMA_NAME = 'domain-crd-schema' +SCHEMA_RESOURCE_EXTENSION = '.json' +SCHEMA_RESOURCE_PATH = 'oracle/weblogic/deploy/wko' +SCHEMA_ROOT_KEY = "openAPIV3Schema" SIMPLE_TYPES = [ 'integer', @@ -44,18 +45,22 @@ WKO_VERSION_3 = 'v3' WKO_VERSION_4 = 'v4' +NO_DOC_FOLDER_KEY = "__NO_KEY__" + +# the folder name "" indicates there is no extra folder level +# in the model between kubernetes and the schema data VERSION_FOLDER_INFOS = { WKO_VERSION_3: { - "": { - 'schema_name': DOMAIN_RESOURCE_SCHEMA_NAME + '-v8' + NO_DOC_FOLDER_KEY: { + 'schema_name': DOMAIN_SCHEMA_NAME + '-v8' } }, WKO_VERSION_4: { "domain": { - 'schema_name': DOMAIN_RESOURCE_SCHEMA_NAME + '-v9' + 'schema_name': DOMAIN_SCHEMA_NAME + '-v9' }, "clusters": { - 'schema_name': CLUSTER_RESOURCE_SCHEMA_NAME + '-v1', + 'schema_name': CLUSTER_SCHEMA_NAME + '-v1', 'is_array': True } } @@ -70,47 +75,40 @@ def get_valid_wko_versions(): return VERSION_FOLDER_INFOS.keys() -# get information about the model folders directly under kubernetes, -# such as domain and clusters. these are not part of the schemas. -def get_folder_infos(wko_version, exception_type=ExceptionType.DEPLOY): +# get document folder information for model folders directly under kubernetes, +# such as domain and clusters. these are not part of the schema definitions. +def get_document_folders(wko_version, exception_type=ExceptionType.DEPLOY): folder_infos = VERSION_FOLDER_INFOS[wko_version] - for folder_info in folder_infos.values(): - folder_schema = dictionary_utils.get_element(folder_info, 'schema') - if not folder_schema: - folder_schema = _get_schema(folder_info['schema_name'], exception_type) - folder_info['schema'] = folder_schema - return folder_infos - - -# used by test only, should be obsolete -def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): - folder_infos = get_folder_infos(WKO_VERSION_3, exception_type) - return folder_infos['']['schema'] - + folder_keys = folder_infos.keys() + folder_keys.sort() + folders = [] + for folder_key in folder_keys: + # lazy-load the folder information when requested + doc_folder = _get_document_folder(folder_infos, folder_key, exception_type) + folders.append(doc_folder) + return folders + + +# return the document folder for the specified wko_version and model key. +def get_document_folder(wko_version, model_key, exception_type=ExceptionType.DEPLOY): + folder_infos = VERSION_FOLDER_INFOS[wko_version] + return _get_document_folder(folder_infos, model_key, exception_type) -def _get_schema(schema_name, exception_type): - _method_name = '_get_schema' - template_stream = None - try: - resource_name = schema_name + RESOURCE_SCHEMA_EXTENSION - resource_path = RESOURCE_SCHEMA_PATH + '/' + resource_name - template_stream = FileUtils.getResourceAsStream(resource_path) - if template_stream is None: - ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) - _logger.throwing(ex, class_name=_class_name, method_name=_method_name) - raise ex +# return the keyless document folder for the specified wko_version, if available. +def get_keyless_document_folder(wko_version, exception_type=ExceptionType.DEPLOY): + return get_document_folder(wko_version, NO_DOC_FOLDER_KEY, exception_type) - full_schema = JsonStreamToPython(resource_name, template_stream, True).parse() - # remove the root element, since it has a version-specific name - schema = full_schema[RESOURCE_SCHEMA_ROOT] +def get_document_folder_keys(wko_version): + folder_infos = VERSION_FOLDER_INFOS[wko_version] + return folder_infos.keys() - finally: - if template_stream: - template_stream.close() - return schema +# deprecated, should be obsolete after WKO v4 changes +def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): + doc_folder = get_document_folder(WKO_VERSION_3, NO_DOC_FOLDER_KEY, exception_type) + return doc_folder.get_schema() def is_single_object(schema_map): @@ -228,3 +226,44 @@ def append_path(path, element): if path: return path + "/" + element return element + + +def _get_schema(schema_name, exception_type): + _method_name = '_get_schema' + + template_stream = None + try: + resource_name = schema_name + SCHEMA_RESOURCE_EXTENSION + resource_path = SCHEMA_RESOURCE_PATH + '/' + resource_name + template_stream = FileUtils.getResourceAsStream(resource_path) + if template_stream is None: + ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) + _logger.throwing(ex, class_name=_class_name, method_name=_method_name) + raise ex + + full_schema = JsonStreamToPython(resource_name, template_stream, True).parse() + + # remove the root element, since it has a version-specific name + schema = full_schema[SCHEMA_ROOT_KEY] + + finally: + if template_stream: + template_stream.close() + + return schema + + +# return the document folder object for folder_info. +# lazy load the document folder and its schema. +def _get_document_folder(folder_infos, folder_key, exception_type): + folder_info = dictionary_utils.get_element(folder_infos, folder_key) + if not folder_info: + return None + + doc_folder = dictionary_utils.get_element(folder_info, 'doc_folder') + if not doc_folder: + schema = _get_schema(folder_info['schema_name'], exception_type) + is_array = dictionary_utils.get_element(folder_info, 'is_array') + doc_folder = WkoDocumentFolder(folder_key, schema, is_array) + folder_info['doc_folder'] = doc_folder + return doc_folder diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index 120cc5909..3e464eb8f 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -6,7 +6,7 @@ from wlsdeploy.aliases.model_constants import KUBERNETES from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.extract import wko_schema_helper +from wlsdeploy.tool.util.wko import wko_schema_helper from wlsdeploy.util import dictionary_utils @@ -26,14 +26,39 @@ def validate_model(self, model_dict): :param model_dict: A Python dictionary of the model to be validated :raises ValidationException: if problems occur during validation """ + _method_name = 'validate_model' + kubernetes_section = dictionary_utils.get_dictionary_element(model_dict, KUBERNETES) if not kubernetes_section: return - schema = wko_schema_helper.get_default_domain_resource_schema(ExceptionType.VALIDATE) - model_path = KUBERNETES + ":" - self.validate_folder(kubernetes_section, schema, None, model_path) + + wko_version = self._model_context.get_target_configuration().get_target_version() + + keyless_doc_folder = wko_schema_helper.get_keyless_document_folder(wko_version, ExceptionType.VALIDATE) + if keyless_doc_folder: + # this WKO version does not require kubernetes sub-folders, continue with that schema + schema = keyless_doc_folder.get_schema() + self.validate_folder(kubernetes_section, schema, None, model_path) + else: + # this WKO version requires kubernetes sub-folders, validate and process each folder + for key in kubernetes_section: + doc_folder = wko_schema_helper.get_document_folder(wko_version, key, ExceptionType.VALIDATE) + if not doc_folder: + valid_keys = wko_schema_helper.get_document_folder_keys(wko_version) + self._logger.severe("WLSDPLY-05026", key, len(valid_keys), model_path, + '%s' % ', '.join(valid_keys), + class_name=self._class_name, method_name=_method_name) + continue + + model_content = kubernetes_section[key] + model_path += '/' + key + schema = doc_folder.get_schema() + if doc_folder.is_array(): + self._validate_object_array(model_content, schema, None, model_path) + else: + self.validate_folder(model_content, schema, None, model_path) def validate_folder(self, model_folder, schema_folder, schema_path, model_path): """ diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index b674632a8..f1f28094c 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -6,7 +6,7 @@ from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.util import dictionary_utils from wlsdeploy.util.validate_configuration import VALIDATION_METHODS -from wlsdeploy.tool.extract import wko_schema_helper +from wlsdeploy.tool.util.wko import wko_schema_helper # types for credential method CREDENTIALS_METHOD = "credentials_method" diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py index e16f6e5bd..7b0907449 100644 --- a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py +++ b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py @@ -8,41 +8,36 @@ from oracle.weblogic.deploy.util import PyOrderedDict from wlsdeploy.aliases.model_constants import KUBERNETES -from wlsdeploy.tool.extract import wko_schema_helper -from wlsdeploy.util import dictionary_utils +from wlsdeploy.tool.util.wko import wko_schema_helper class KubernetesSchemaTest(unittest.TestCase): _model_dir = '../../unit-tests/wko' def testKubernetesSchema(self): - self._testSchemas(wko_schema_helper.WKO_VERSION_3, "model.yaml") + self._testSchemas(wko_schema_helper.WKO_VERSION_3) def testKubernetes4Schemas(self): - self._testSchemas(wko_schema_helper.WKO_VERSION_4, "model-v4.yaml") + self._testSchemas(wko_schema_helper.WKO_VERSION_4) - def _testSchemas(self, wko_version, file_name): + def _testSchemas(self, wko_version): # create a model with every element. # verify that there are no unknown types or structures. try: if not os.path.exists(self._model_dir): os.makedirs(self._model_dir) - file_path = self._model_dir + "/" + file_name + file_path = self._model_dir + "/model-" + wko_version + ".yaml" self.out_file = open(file_path, "w") self._write_line(KUBERNETES + ": # " + wko_version) - folder_infos = wko_schema_helper.get_folder_infos(wko_version) - folder_keys = folder_infos.keys() - folder_keys.sort() - for folder_key in folder_keys: + doc_folders = wko_schema_helper.get_document_folders(wko_version) + for doc_folder in doc_folders: indent = " " - if len(folder_key): - self._write_line(indent + folder_key + ":") + if doc_folder.has_model_key(): + self._write_line(indent + doc_folder.get_model_key() + ":") indent = indent + " " - folder_info = folder_infos[folder_key] - is_array = dictionary_utils.get_element(folder_info, 'is_array') - self._write_folder(folder_info['schema'], is_array, "", indent) + self._write_folder(doc_folder.get_schema(), doc_folder.is_array(), "", indent) self.out_file.close() except Exception, e: From 9426e86a14d7a8b24a3d9767fe63555320e62f5e Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 12 Oct 2022 17:09:46 -0500 Subject: [PATCH 07/24] Moved wko_schema_helper API code --- .../wlsdeploy/tool/modelhelp/model_kubernetes_printer.py | 2 +- .../python/wlsdeploy/tool/util/targets/output_file_helper.py | 2 +- .../tool/util/{wko => targets}/wko_document_folder.py | 2 +- .../wlsdeploy/tool/util/{wko => targets}/wko_schema_helper.py | 2 +- core/src/main/python/wlsdeploy/tool/util/wko/__init__.py | 4 ---- .../python/wlsdeploy/tool/validate/kubernetes_validator.py | 2 +- core/src/main/python/wlsdeploy/util/target_configuration.py | 2 +- .../python/wlsdeploy/tool/extract/kubernetes_schema_test.py | 2 +- 8 files changed, 7 insertions(+), 11 deletions(-) rename core/src/main/python/wlsdeploy/tool/util/{wko => targets}/wko_document_folder.py (92%) rename core/src/main/python/wlsdeploy/tool/util/{wko => targets}/wko_schema_helper.py (99%) delete mode 100644 core/src/main/python/wlsdeploy/tool/util/wko/__init__.py diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index b80b8a424..3b0886b52 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -4,7 +4,7 @@ """ from wlsdeploy.exception import exception_helper from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper from wlsdeploy.tool.modelhelp import model_help_utils from wlsdeploy.tool.modelhelp.model_help_utils import ControlOptions from wlsdeploy.util.exit_code import ExitCode diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index 9bb5c74aa..cfbd6fa31 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -16,7 +16,7 @@ from wlsdeploy.exception import exception_helper from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.yaml.yaml_translator import PythonToYaml from wlsdeploy.yaml.yaml_translator import YamlToPython diff --git a/core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py b/core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py similarity index 92% rename from core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py rename to core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py index fb0c7142f..e2fc4d8b3 100644 --- a/core/src/main/python/wlsdeploy/tool/util/wko/wko_document_folder.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py @@ -2,7 +2,7 @@ Copyright (c) 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper class WkoDocumentFolder: diff --git a/core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py similarity index 99% rename from core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py rename to core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py index 289e7dcc1..c7d6fe1b0 100644 --- a/core/src/main/python/wlsdeploy/tool/util/wko/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py @@ -8,7 +8,7 @@ from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.json.json_translator import JsonStreamToPython from wlsdeploy.logging import platform_logger -from wlsdeploy.tool.util.wko.wko_document_folder import WkoDocumentFolder +from wlsdeploy.tool.util.targets.wko_document_folder import WkoDocumentFolder from wlsdeploy.util import dictionary_utils CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' diff --git a/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py b/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py deleted file mode 100644 index 3885c439b..000000000 --- a/core/src/main/python/wlsdeploy/tool/util/wko/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Copyright (c) 2022, Oracle and/or its affiliates. -Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -""" diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index 3e464eb8f..25e36577b 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -6,7 +6,7 @@ from wlsdeploy.aliases.model_constants import KUBERNETES from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper from wlsdeploy.util import dictionary_utils diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index f1f28094c..2aea05554 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -6,7 +6,7 @@ from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.util import dictionary_utils from wlsdeploy.util.validate_configuration import VALIDATION_METHODS -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper # types for credential method CREDENTIALS_METHOD = "credentials_method" diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py index 7b0907449..ba0b1eee9 100644 --- a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py +++ b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py @@ -8,7 +8,7 @@ from oracle.weblogic.deploy.util import PyOrderedDict from wlsdeploy.aliases.model_constants import KUBERNETES -from wlsdeploy.tool.util.wko import wko_schema_helper +from wlsdeploy.tool.util.targets import wko_schema_helper class KubernetesSchemaTest(unittest.TestCase): From 1080085ffa3777cc8f289b83394f6593da6f61e0 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Thu, 13 Oct 2022 17:55:43 -0500 Subject: [PATCH 08/24] Use alternate template to generate CRD file for WKO v4 --- .../modelhelp/model_kubernetes_printer.py | 2 +- .../util/targets/additional_output_helper.py | 54 +++++---- ..._document_folder.py => document_folder.py} | 2 +- .../tool/util/targets/file_template_helper.py | 14 ++- .../tool/util/targets/output_file_helper.py | 24 ++-- .../tool/util/targets/wko_schema_helper.py | 4 +- .../tool/validate/kubernetes_validator.py | 2 +- .../wlsdeploy/util/target_configuration.py | 20 ++-- .../templates/wko-domain-v4.yaml | 111 ++++++++++++++++++ core/src/main/targetconfigs/wko4/target.json | 2 +- .../util/filters/output_file_helper_test.py | 4 +- 11 files changed, 185 insertions(+), 54 deletions(-) rename core/src/main/python/wlsdeploy/tool/util/targets/{wko_document_folder.py => document_folder.py} (96%) create mode 100644 core/src/main/targetconfigs/templates/wko-domain-v4.yaml diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index 3b0886b52..d76296978 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -18,7 +18,7 @@ class ModelKubernetesPrinter(object): _logger = PlatformLogger('wlsdeploy.modelhelp') def __init__(self, model_context): - self._wko_version = model_context.get_target_configuration().get_target_version() + self._wko_version = model_context.get_target_configuration().get_product_version() self._document_folders = wko_schema_helper.get_document_folders(self._wko_version) def print_model_sample(self, model_path_tokens, control_option): diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py index d242592a7..05bf425f8 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py @@ -21,6 +21,7 @@ from wlsdeploy.tool.util import k8s_helper from wlsdeploy.tool.util.targets import file_template_helper from wlsdeploy.tool.util.targets import output_file_helper +from wlsdeploy.tool.util.targets import wko_schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.util import path_utils from wlsdeploy.util import target_configuration_helper @@ -35,6 +36,7 @@ APPLICATION_NAME = 'applicationName' APPLICATION_PREFIX = 'applicationPrefix' CLUSTER_NAME = 'clusterName' +CLUSTER_UID = 'clusterUid' CLUSTERS = 'clusters' DATASOURCE_CREDENTIALS = 'datasourceCredentials' DATASOURCE_PREFIX = 'datasourcePrefix' @@ -68,6 +70,7 @@ def create_additional_output(model, model_context, aliases, credential_injector, :param credential_injector: used to identify secrets :param exception_type: the type of exception to throw if needed """ + target_configuration = model_context.get_target_configuration() # -output_dir argument was previously verified output_dir = model_context.get_output_dir() @@ -76,61 +79,67 @@ def create_additional_output(model, model_context, aliases, credential_injector, template_hash = _build_template_hash(model, model_context, aliases, credential_injector) template_names = model_context.get_target_configuration().get_additional_output_types() for index, template_name in enumerate(template_names): - # special processing for deprecated -domain_resource_file argument - # used only by extractDomainResource - if _create_named_file(index, template_name, template_hash, model, model_context, exception_type): - continue + source_file_name = _get_template_source_name(template_name, target_configuration) + + # special processing for deprecated -domain_resource_file argument of extractDomainResource + extract_output_file = _get_extract_output_file(template_name, index, model_context) + if extract_output_file: + output_file = extract_output_file + else: + output_file = File(os.path.join(output_dir, template_name)) - _create_file(template_name, template_hash, output_dir, exception_type) - output_file_helper.update_from_model(output_dir, template_name, model) + _create_file(source_file_name, template_hash, output_file, exception_type) + output_file_helper.update_from_model(output_file, model) # *** DELETE METHOD WHEN deprecated -domain_resource_file IS REMOVED *** -def _create_named_file(index, template_name, template_hash, model, model_context, exception_type): +def _get_extract_output_file(template_name, index, model_context): """ Special processing for deprecated -domain_resource_file argument used by extractDomainResource. Use the directory of -domain_resource_file for all templates, and the name of -domain_resource_file for the first (usually only) template. """ - _method_name = '_create_named_file' + _method_name = '_get_extract_output_file' resource_file = model_context.get_domain_resource_file() if resource_file: - template_subdir = "targets/templates/" + template_name - template_path = path_utils.find_config_path(template_subdir) - output_dir, output_name = os.path.split(resource_file) if index > 0: output_name = template_name - - output_file = File(os.path.join(output_dir, output_name)) - __logger.info('WLSDPLY-01662', output_file, class_name=__class_name, method_name=_method_name) - file_template_helper.create_file_from_file(template_path, template_hash, output_file, exception_type) - output_file_helper.update_from_model(output_dir, output_name, model) - return True - return False + return File(os.path.join(output_dir, output_name)) + return None -def _create_file(template_name, template_hash, output_dir, exception_type): +def _create_file(template_name, template_hash, output_file, exception_type): """ Read the template from the resource stream, perform any substitutions, and write it to a file with the same name in the output directory. - :param template_name: the name of the template file, and the output file + :param template_name: the name of the template file :param template_hash: a dictionary of substitution values - :param output_dir: the directory to write the output file + :param output_file: the CRD java.io.File to be created :param exception_type: the type of exception to throw if needed """ _method_name = '_create_file' template_subdir = "targets/templates/" + template_name template_path = path_utils.find_config_path(template_subdir) - output_file = File(output_dir, template_name) __logger.info('WLSDPLY-01662', output_file, class_name=__class_name, method_name=_method_name) file_template_helper.create_file_from_file(template_path, template_hash, output_file, exception_type) +def _get_template_source_name(template_name, target_configuration): + product_version = target_configuration.get_product_version() + + # for backward compatibility with WKO v3 + if product_version == wko_schema_helper.WKO_VERSION_3: + return template_name + + prefix, suffix = os.path.splitext(template_name) + return prefix + "-" + product_version + suffix + + def _build_template_hash(model, model_context, aliases, credential_injector): """ Create a dictionary of substitution values to apply to the templates. @@ -192,6 +201,7 @@ def _build_template_hash(model, model_context, aliases, credential_injector): for cluster_name in cluster_list: cluster_hash = dict() cluster_hash[CLUSTER_NAME] = cluster_name + cluster_hash[CLUSTER_UID] = k8s_helper.get_dns_name(cluster_name) cluster_values = dictionary_utils.get_dictionary_element(cluster_list, cluster_name) server_count = k8s_helper.get_server_count(cluster_name, cluster_values, model.get_model()) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py b/core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py similarity index 96% rename from core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py rename to core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py index e2fc4d8b3..1db4626d2 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/wko_document_folder.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py @@ -5,7 +5,7 @@ from wlsdeploy.tool.util.targets import wko_schema_helper -class WkoDocumentFolder: +class DocumentFolder: """ A model folder that corresponds to a schema for a CRD document. """ diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/file_template_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/file_template_helper.py index 42e24eaf3..19e64e085 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/file_template_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/file_template_helper.py @@ -30,7 +30,7 @@ def create_file_from_resource(resource_path, template_hash, output_file, excepti and write it to the output file. :param resource_path: the resource path of the source template :param template_hash: a dictionary of substitution values - :param output_file: the file to write + :param output_file: the java.io.File to write :param exception_type: the type of exception to throw if needed """ _method_name = 'create_file_from_resource' @@ -50,7 +50,7 @@ def append_file_from_resource(resource_path, template_hash, output_file, excepti and write it to the output file. :param resource_path: the resource path of the source template :param template_hash: a dictionary of substitution values - :param output_file: the file to write + :param output_file: the java.io.File to write :param exception_type: the type of exception to throw if needed """ _method_name = 'append_file_from_resource' @@ -70,7 +70,7 @@ def create_file_from_file(file_path, template_hash, output_file, exception_type) and write it to the output file. :param file_path: the absolute file path of the source template :param template_hash: a dictionary of substitution values - :param output_file: the file to write + :param output_file: the java.io.File to write :param exception_type: the type of exception to throw if needed """ _method_name = 'create_file_from_file' @@ -86,6 +86,14 @@ def create_file_from_file(file_path, template_hash, output_file, exception_type) def _create_file_from_stream(template_stream, template_hash, output_file, write_access='w'): + """ + Read the template from the template file, perform any substitutions, + and write it to the output file. + :param template_stream: the stream to read the source template + :param template_hash: a dictionary of substitution values + :param output_file: the java.io.File to write + :param write_access: write access for the resulting file + """ template_reader = BufferedReader(InputStreamReader(template_stream)) file_writer = open(output_file.getPath(), write_access) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index cfbd6fa31..734bb13ca 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -28,6 +28,7 @@ SPEC = 'spec' WKO_DOMAIN_KIND = 'Domain' +CLUSTER_NAME = 'clusterName' CLUSTERS = 'clusters' DOMAIN_HOME = 'domainHome' IMAGE_PULL_SECRETS = 'imagePullSecrets' @@ -40,12 +41,11 @@ WORKLOAD = 'workload' -def update_from_model(output_dir, output_file_name, model): +def update_from_model(crd_file, model): """ Update the output content with information from the kubernetes section of the model. Output files are (currently) always Kubernetes resource files. - :param output_dir: the directory of the output file to update - :param output_file_name: the name of the output file + :param crd_file: the CRD java.io.File to be updated :param model: the model to use for update """ _method_name = 'update_from_model' @@ -55,24 +55,23 @@ def update_from_model(output_dir, output_file_name, model): # failures will be logged as severe, but not cause tool failure. # this will allow the unaltered output file to be examined for problems. - output_file = File(output_dir, output_file_name) - __logger.info('WLSDPLY-01675', output_file, KUBERNETES, class_name=__class_name, method_name=_method_name) + __logger.info('WLSDPLY-01675', crd_file, KUBERNETES, class_name=__class_name, method_name=_method_name) try: - reader = YamlToPython(output_file.getPath(), True) + reader = YamlToPython(crd_file.getPath(), True) documents = reader.parse_documents() except YamlException, ex: - __logger.severe('WLSDPLY-01673', output_file, str(ex), error=ex, class_name=__class_name, + __logger.severe('WLSDPLY-01673', crd_file, str(ex), error=ex, class_name=__class_name, method_name=_method_name) return - _update_documents(documents, kubernetes_content, output_file.getPath()) + _update_documents(documents, kubernetes_content, crd_file.getPath()) try: writer = PythonToYaml(documents) - writer.write_to_yaml_file(output_file.getPath()) + writer.write_to_yaml_file(crd_file.getPath()) except YamlException, ex: - __logger.severe('WLSDPLY-01674', output_file, str(ex), error=ex, class_name=__class_name, + __logger.severe('WLSDPLY-01674', crd_file, str(ex), error=ex, class_name=__class_name, method_name=_method_name) return @@ -271,8 +270,9 @@ def _add_comments(wko_dictionary): clusters = dictionary_utils.get_dictionary_element(spec, CLUSTERS) for cluster in clusters: - cluster_replicas = dictionary_utils.get_element(cluster, REPLICAS) - if cluster_replicas is None and len(cluster): + cluster_keys = cluster.keys() + # check for clusterName to avoid commenting WKO V4 + if CLUSTER_NAME in cluster_keys and REPLICAS not in cluster_keys: last_key = cluster.keys()[-1] message = exception_helper.get_message('WLSDPLY-01680') cluster.addComment(last_key, REPLICAS + ': 99 # ' + message) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py index c7d6fe1b0..be96ac1d1 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py @@ -8,7 +8,7 @@ from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.json.json_translator import JsonStreamToPython from wlsdeploy.logging import platform_logger -from wlsdeploy.tool.util.targets.wko_document_folder import WkoDocumentFolder +from wlsdeploy.tool.util.targets.document_folder import DocumentFolder from wlsdeploy.util import dictionary_utils CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' @@ -264,6 +264,6 @@ def _get_document_folder(folder_infos, folder_key, exception_type): if not doc_folder: schema = _get_schema(folder_info['schema_name'], exception_type) is_array = dictionary_utils.get_element(folder_info, 'is_array') - doc_folder = WkoDocumentFolder(folder_key, schema, is_array) + doc_folder = DocumentFolder(folder_key, schema, is_array) folder_info['doc_folder'] = doc_folder return doc_folder diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index 25e36577b..9b76d09bf 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -34,7 +34,7 @@ def validate_model(self, model_dict): model_path = KUBERNETES + ":" - wko_version = self._model_context.get_target_configuration().get_target_version() + wko_version = self._model_context.get_target_configuration().get_product_version() keyless_doc_folder = wko_schema_helper.get_keyless_document_folder(wko_version, ExceptionType.VALIDATE) if keyless_doc_folder: diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index 2aea05554..b7c0c1fb9 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -30,9 +30,9 @@ # Determines if replica count is applied at the cluster level SET_CLUSTER_REPLICAS = "set_cluster_replicas" -# Determines the version of the target application. -TARGET_VERSION = 'target_version' -DEFAULT_TARGET_VERSION = 'v3' # default for WKO and VZ +# Determines the version of the target product. +PRODUCT_VERSION = 'product_version' +DEFAULT_PRODUCT_VERSION = 'v3' # default for WKO and WKO in VZ # put secret tokens in the model, and build a script to create the secrets. SECRETS_METHOD = 'secrets' @@ -213,15 +213,15 @@ def sets_cluster_replicas(self): result = dictionary_utils.get_element(self.config_dictionary, SET_CLUSTER_REPLICAS) return result or False - def get_target_version(self): + def get_product_version(self): """ - Return the version of the application being targeted. - :return: the application version + Return the version of the product being targeted, such as WKO or VZ. + :return: the product version """ - result = dictionary_utils.get_element(self.config_dictionary, TARGET_VERSION) + result = dictionary_utils.get_element(self.config_dictionary, PRODUCT_VERSION) if result is not None: return result - return DEFAULT_TARGET_VERSION + return DEFAULT_PRODUCT_VERSION def validate_configuration(self, exit_code, target_configuration_file): validation_method = self.get_validation_method() @@ -232,8 +232,8 @@ def validate_configuration(self, exit_code, target_configuration_file): self._validate_enumerated_field(CREDENTIALS_METHOD, credentials_method, CREDENTIALS_METHODS, exit_code, target_configuration_file) - target_version = self.get_target_version() - self._validate_enumerated_field(TARGET_VERSION, target_version, wko_schema_helper.get_valid_wko_versions(), + product_version = self.get_product_version() + self._validate_enumerated_field(PRODUCT_VERSION, product_version, wko_schema_helper.get_valid_wko_versions(), exit_code, target_configuration_file) source_type = self._get_domain_home_source_type() diff --git a/core/src/main/targetconfigs/templates/wko-domain-v4.yaml b/core/src/main/targetconfigs/templates/wko-domain-v4.yaml new file mode 100644 index 000000000..486346113 --- /dev/null +++ b/core/src/main/targetconfigs/templates/wko-domain-v4.yaml @@ -0,0 +1,111 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: "weblogic.oracle/v8-zz" +kind: Domain +metadata: + name: {{{domainUid}}} + namespace: {{{namespace}}} + labels: + weblogic.domainUID: {{{domainUid}}} +spec: + # The WebLogic Domain Home + domainHome: '{{{domainHome}}}' + + # The domain home source type + # Set to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: {{{domainHomeSourceType}}} + + # The WebLogic Server Docker image that the Operator uses to start the domain + image: '{{{imageName}}}' + + # Identify which Secret contains the credentials for pulling an image + imagePullSecrets: [] + + # Identify which Secret contains the WebLogic Admin credentials + webLogicCredentialsSecret: + name: {{{webLogicCredentialsSecret}}} + + serverPod: + # an (optional) list of environment variable to be set on the servers + env: + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms64m -Xmx256m " +{{#usePersistentVolume}} + + # volume information for persistent volume + volumes: + - name: weblogic-domain-storage-volume + persistentVolumeClaim: + claimName: '--FIX ME--' + volumeMounts: + - mountPath: /shared + name: weblogic-domain-storage-volume +{{/usePersistentVolume}} +{{#hasClusters}} + + clusters: +{{/hasClusters}} +{{#clusters}} + - name: {{{domainUid}}}-{{{clusterUid}}} +{{#setClusterReplicas}} + + # The number of cluster member Managed Server instances to start for this WebLogic cluster + replicas: {{{replicas}}} +{{/setClusterReplicas}} +{{/clusters}} + + configuration: + introspectorJobActiveDeadlineSeconds: 900 +{{#hasModel}} + model: + domainType: {{{domainType}}} + + # WebLogic Image Tool provides modelHome + modelHome: '{{{modelHome}}}' +{{#runtimeEncryptionSecret}} + + # encryption for the WDT model and the SystemSerializedIni.data file. + # used only for model-in-image deployment, can be removed for other types. + runtimeEncryptionSecret: {{{runtimeEncryptionSecret}}} +{{/runtimeEncryptionSecret}} +{{/hasModel}} +{{#hasAdditionalSecrets}} + + # Secrets that are referenced by model yaml macros + # (the model yaml in the optional configMap or in the image) + secrets: +{{/hasAdditionalSecrets}} +{{#additionalSecrets}} + - {{{additionalSecretName}}} +{{/additionalSecrets}} + +{{#clusters}} +--- +apiVersion: "weblogic.oracle/v8-TODO" +kind: Cluster?TODO +metadata: + name: {{{domainUid}}} + namespace: {{{namespace}}} + labels: + weblogic.domainUID: {{{domainUid}}} +spec: + clusterName: {{{domainUid}}}-{{{clusterUid}}} + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + {{/clusters}} diff --git a/core/src/main/targetconfigs/wko4/target.json b/core/src/main/targetconfigs/wko4/target.json index 674b70810..a5fb315f5 100644 --- a/core/src/main/targetconfigs/wko4/target.json +++ b/core/src/main/targetconfigs/wko4/target.json @@ -10,7 +10,7 @@ "credentials_method" : "secrets", "credentials_output_method" : "script", "exclude_domain_bin_contents": true, - "target_version" : "v4", + "product_version" : "v4", "wls_credentials_name" : "__weblogic-credentials__", "additional_secrets": "runtime-encryption-secret", "additional_output" : "wko-domain.yaml" diff --git a/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py b/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py index 6f5e93558..488bbedd5 100644 --- a/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py +++ b/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py @@ -6,6 +6,8 @@ import shutil from base_test import BaseTestCase +from java.io import File + from wlsdeploy.tool.util.targets import output_file_helper from wlsdeploy.util.model import Model from wlsdeploy.yaml.yaml_translator import YamlToPython @@ -38,7 +40,7 @@ def testOutputFileHelper(self): output_file = os.path.join(self.OUTPUT_DIR, file_name) shutil.copyfile(source_file, output_file) - output_file_helper.update_from_model(self.OUTPUT_DIR, file_name, model) + output_file_helper.update_from_model(File(output_file), model) # re-read the output file reader = YamlToPython(output_file, True) From 34d9d2eab6c6c775417b8c65c74b8918a5e8ae99 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Tue, 18 Oct 2022 10:23:09 -0500 Subject: [PATCH 09/24] Refactored CRD folder API; renamed wko_schema_helper --- .../modelhelp/model_kubernetes_printer.py | 60 ++++----- .../util/targets/additional_output_helper.py | 4 +- ...document_folder.py => model_crd_folder.py} | 10 +- .../tool/util/targets/model_crd_helper.py | 116 ++++++++++++++++ .../tool/util/targets/output_file_helper.py | 41 +++--- ...{wko_schema_helper.py => schema_helper.py} | 126 ++++-------------- .../tool/validate/kubernetes_validator.py | 46 +++---- .../wlsdeploy/util/target_configuration.py | 7 +- .../deploy/messages/wlsdeploy_rb.properties | 2 +- .../tool/extract/kubernetes_schema_test.py | 46 ++++--- 10 files changed, 248 insertions(+), 210 deletions(-) rename core/src/main/python/wlsdeploy/tool/util/targets/{document_folder.py => model_crd_folder.py} (67%) create mode 100644 core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py rename core/src/main/python/wlsdeploy/tool/util/targets/{wko_schema_helper.py => schema_helper.py} (60%) diff --git a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py index d76296978..f14021db7 100644 --- a/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py +++ b/core/src/main/python/wlsdeploy/tool/modelhelp/model_kubernetes_printer.py @@ -4,7 +4,8 @@ """ from wlsdeploy.exception import exception_helper from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.targets import wko_schema_helper +from wlsdeploy.tool.util.targets import model_crd_helper +from wlsdeploy.tool.util.targets import schema_helper from wlsdeploy.tool.modelhelp import model_help_utils from wlsdeploy.tool.modelhelp.model_help_utils import ControlOptions from wlsdeploy.util.exit_code import ExitCode @@ -18,8 +19,7 @@ class ModelKubernetesPrinter(object): _logger = PlatformLogger('wlsdeploy.modelhelp') def __init__(self, model_context): - self._wko_version = model_context.get_target_configuration().get_product_version() - self._document_folders = wko_schema_helper.get_document_folders(self._wko_version) + self._crd_helper = model_crd_helper.get_helper(model_context) def print_model_sample(self, model_path_tokens, control_option): """ @@ -47,24 +47,24 @@ def _print_model_section_sample(self, section_name, control_option): # examine model folders directly under kubernetes - for document_folder in self._document_folders: + for crd_folder in self._crd_helper.get_crd_folders(): folder_path = path show_children = True indent = 1 - if document_folder.has_model_key(): + if crd_folder.has_model_key(): if control_option != ControlOptions.RECURSIVE: print("") - model_key = document_folder.get_model_key() + model_key = crd_folder.get_model_key() _print_indent(model_key + ':', indent) show_children = control_option == ControlOptions.RECURSIVE folder_path = path + '/' + model_key indent = indent + 1 if show_children: - schema = document_folder.get_schema() - in_array = document_folder.is_array() + schema = crd_folder.get_schema() + in_array = crd_folder.is_array() if model_help_utils.show_attributes(control_option): in_array = self._print_attributes_sample(schema, indent, in_array) @@ -98,24 +98,24 @@ def _print_model_folder_sample(self, section_name, model_path_tokens, control_op # resolve model folders directly under kubernetes - doc_folder = wko_schema_helper.get_keyless_document_folder(self._wko_version) - if not doc_folder: + crd_folder = self._crd_helper.get_keyless_crd_folder() + if not crd_folder: first_token = model_path_tokens[token_index] - doc_folder = wko_schema_helper.get_document_folder(self._wko_version, first_token) - if not doc_folder: + crd_folder = self._crd_helper.get_crd_folder(first_token) + if not crd_folder: ex = exception_helper.create_cla_exception( ExitCode.ARG_VALIDATION_ERROR, "WLSDPLY-10111", model_path, first_token, - ', '.join(wko_schema_helper.get_document_folder_keys(self._wko_version))) + ', '.join(self._crd_helper.get_crd_folder_keys())) self._logger.throwing(ex, class_name=self._class_name, method_name=_method_name) raise ex - model_key = doc_folder.get_model_key() + model_key = crd_folder.get_model_key() _print_indent(model_key + ":", indent, in_object_array) model_path += '/' + model_key token_index += 1 indent += 1 - schema = doc_folder.get_schema() + schema = crd_folder.get_schema() # process elements inside kubernetes sub-folders @@ -137,7 +137,7 @@ def _print_model_folder_sample(self, section_name, model_path_tokens, control_op indent += 1 # apply to the next folder in the path - in_object_array = wko_schema_helper.is_object_array(current_folder) + in_object_array = schema_helper.is_object_array(current_folder) model_path = model_path + "/" + token # list the attributes and folders, as specified @@ -166,11 +166,11 @@ def _print_subfolders_sample(self, schema_folder, control_option, indent_level, property_map = folder_info[key] if property_map is not None: - if wko_schema_helper.is_single_object(property_map): + if schema_helper.is_single_object(property_map): folder_map[key] = property_map - elif wko_schema_helper.is_object_array(property_map): - folder_map[key] = wko_schema_helper.get_array_item_info(property_map) + elif schema_helper.is_object_array(property_map): + folder_map[key] = schema_helper.get_array_item_info(property_map) object_array_keys.append(key) folder_keys = list(folder_map.keys()) @@ -212,17 +212,17 @@ def _print_attributes_sample(self, schema_folder, indent_level, in_object_array) for key in properties: property_map = properties[key] if property_map is not None: - if wko_schema_helper.is_simple_map(property_map): + if schema_helper.is_simple_map(property_map): # map of key / value pairs attribute_map[key] = 'properties' - elif wko_schema_helper.is_simple_array(property_map): + elif schema_helper.is_simple_array(property_map): # array of simple type - attribute_map[key] = 'list of ' + wko_schema_helper.get_array_element_type(property_map) + attribute_map[key] = 'list of ' + schema_helper.get_array_element_type(property_map) - elif not wko_schema_helper.is_object_type(property_map): - type_text = wko_schema_helper.get_type(property_map) - enum_values = wko_schema_helper.get_enum_values(property_map) + elif not schema_helper.is_object_type(property_map): + type_text = schema_helper.get_type(property_map) + enum_values = schema_helper.get_enum_values(property_map) if enum_values: type_text += ' (' + ', '.join(enum_values) + ')' attribute_map[key] = type_text @@ -249,11 +249,11 @@ def _print_attributes_sample(self, schema_folder, indent_level, in_object_array) def _get_properties(schema_folder): # in array elements, the properties are under "items" - if wko_schema_helper.is_object_array(schema_folder): - item_info = wko_schema_helper.get_array_item_info(schema_folder) - return wko_schema_helper.get_properties(item_info) + if schema_helper.is_object_array(schema_folder): + item_info = schema_helper.get_array_item_info(schema_folder) + return schema_helper.get_properties(item_info) else: - return wko_schema_helper.get_properties(schema_folder) + return schema_helper.get_properties(schema_folder) def _get_folder_names(schema_properties): @@ -266,7 +266,7 @@ def _get_folder_names(schema_properties): for key in schema_properties: property_map = schema_properties[key] if property_map is not None: - if wko_schema_helper.is_object_type(property_map): + if schema_helper.is_object_type(property_map): folder_names.append(key) return folder_names diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py index 05bf425f8..1e0dd0b7a 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py @@ -20,8 +20,8 @@ from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.tool.util import k8s_helper from wlsdeploy.tool.util.targets import file_template_helper +from wlsdeploy.tool.util.targets import model_crd_helper from wlsdeploy.tool.util.targets import output_file_helper -from wlsdeploy.tool.util.targets import wko_schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.util import path_utils from wlsdeploy.util import target_configuration_helper @@ -133,7 +133,7 @@ def _get_template_source_name(template_name, target_configuration): product_version = target_configuration.get_product_version() # for backward compatibility with WKO v3 - if product_version == wko_schema_helper.WKO_VERSION_3: + if product_version == model_crd_helper.WKO_VERSION_3: return template_name prefix, suffix = os.path.splitext(template_name) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py similarity index 67% rename from core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py rename to core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py index 1db4626d2..3499a9c24 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/document_folder.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py @@ -2,14 +2,14 @@ Copyright (c) 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ -from wlsdeploy.tool.util.targets import wko_schema_helper +NO_FOLDER_KEY = "__NO_KEY__" -class DocumentFolder: +class ModelCrdFolder: """ - A model folder that corresponds to a schema for a CRD document. + A model folder that represents the schema for a CRD document. """ - _class_name = "WkoDocumentFolder" + _class_name = "ModelCrdFolder" def __init__(self, model_key, schema, is_array): self._model_key = model_key @@ -26,4 +26,4 @@ def get_schema(self): return self._schema def has_model_key(self): - return self._model_key != wko_schema_helper.NO_DOC_FOLDER_KEY + return self._model_key != NO_FOLDER_KEY diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py new file mode 100644 index 000000000..d6d67e0af --- /dev/null +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py @@ -0,0 +1,116 @@ +""" +Copyright (c) 2022, Oracle and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +""" +from wlsdeploy.exception.expection_types import ExceptionType +from wlsdeploy.logging import platform_logger +from wlsdeploy.tool.util.targets import model_crd_folder +from wlsdeploy.tool.util.targets import schema_helper +from wlsdeploy.tool.util.targets.model_crd_folder import ModelCrdFolder +from wlsdeploy.util import dictionary_utils + +_logger = platform_logger.PlatformLogger('wlsdeploy.deploy') +_class_name = 'model_crd_helper' + +WKO_PRODUCT_KEY = "wko" + +WKO_VERSION_3 = 'v3' +WKO_VERSION_4 = 'v4' + +WKO_VALID_VERSIONS = [ + WKO_VERSION_3, + WKO_VERSION_4 +] + +WKO_CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' +WKO_DOMAIN_SCHEMA_NAME = 'domain-crd-schema' + +UNSUPPORTED_FOLDERS = [ + 'status', + 'metadata/initializers', + 'metadata/ownerReferences' +] + +# some object list members don't use 'name' as a key +OBJECT_NAME_ATTRIBUTES = { + 'spec/adminServer/adminService/channels': 'channelName', + 'spec/clusters': 'clusterName', + 'spec/managedServers': 'serverName' +} + + +class ModelCrdHelper: + """ + Manages the mappings between model folders and CRD schemas, + such as kubernetes/domain and kubernetes/clusters. + This should be instantiated using static methods below, + in order to get the correct configuration for product / version. + """ + _class_name = "ModelCrdHelper" + + def __init__(self, product_name, product_version, exception_type): + self._product = product_name + self._version = product_version + self._exception_type = exception_type + self._crd_folders = [] + self._crd_folder_map = {} + + # get CRD information for model folders directly under kubernetes, + def get_crd_folders(self): + return self._crd_folders + + # return the document folder for the specified and model key. + def get_crd_folder(self, model_key): + return dictionary_utils.get_element(self._crd_folder_map, model_key) + + # return the keyless document folder for the specified wko_version, if available. + def get_keyless_crd_folder(self): + return self.get_crd_folder(model_crd_folder.NO_FOLDER_KEY) + + def get_crd_folder_keys(self): + return self._crd_folder_map.keys() + + def add_crd_folder(self, crd_folder): + self._crd_folders.append(crd_folder) + self._crd_folder_map[crd_folder.get_model_key()] = crd_folder + + +# get a helper for on the version in the model context +def get_helper(model_context, exception_type=ExceptionType.DEPLOY): + # product key could be in target config if more products come along, such as VZ + product_version = model_context.get_target_configuration().get_product_version() + return get_product_helper(WKO_PRODUCT_KEY, product_version, exception_type) + + +# get a helper for the specified product and version +def get_product_helper(product_key, product_version, exception_type=ExceptionType.DEPLOY): + helper = ModelCrdHelper(product_key, product_version, exception_type) + + if product_version == WKO_VERSION_4: + cluster_schema = schema_helper.get_schema(WKO_CLUSTER_SCHEMA_NAME + "-v1", exception_type) + cluster_folder = ModelCrdFolder("clusters", cluster_schema, True) + helper.add_crd_folder(cluster_folder) + + domain_schema = schema_helper.get_schema(WKO_DOMAIN_SCHEMA_NAME + "-v9", exception_type) + domain_folder = ModelCrdFolder("domain", domain_schema, False) + helper.add_crd_folder(domain_folder) + + elif product_version == WKO_VERSION_3: + domain_schema = schema_helper.get_schema(WKO_DOMAIN_SCHEMA_NAME + "-v8", exception_type) + crd_folder = ModelCrdFolder(model_crd_folder.NO_FOLDER_KEY, domain_schema, False) + helper.add_crd_folder(crd_folder) + + return helper + + +# get versions that are valid for the specified product +def get_valid_versions(product_key): + if product_key == WKO_PRODUCT_KEY: + return WKO_VALID_VERSIONS + return [] + + +# deprecated, should be obsolete after WKO v4 changes +def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): + crd_helper = get_product_helper(WKO_PRODUCT_KEY, WKO_VERSION_3, exception_type) + return crd_helper.get_keyless_crd_folder().get_schema() diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py index 734bb13ca..e5b23d325 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py @@ -4,8 +4,6 @@ Methods to update an output file with information from the kubernetes section of the model. """ -from java.io import File - from oracle.weblogic.deploy.util import PyOrderedDict from oracle.weblogic.deploy.util import PyRealBoolean from oracle.weblogic.deploy.yaml import YamlException @@ -16,7 +14,8 @@ from wlsdeploy.exception import exception_helper from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.targets import wko_schema_helper +from wlsdeploy.tool.util.targets import model_crd_helper +from wlsdeploy.tool.util.targets import schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.yaml.yaml_translator import PythonToYaml from wlsdeploy.yaml.yaml_translator import YamlToPython @@ -80,7 +79,7 @@ def _update_documents(documents, kubernetes_content, output_file_path): _method_name = '_update_documents' found = False - schema = wko_schema_helper.get_default_domain_resource_schema(ExceptionType.DEPLOY) + schema = model_crd_helper.get_default_domain_resource_schema(ExceptionType.DEPLOY) # update section(s) based on their kind, etc. for document in documents: @@ -115,7 +114,7 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem :param output_dictionary: the dictionary to be updated :param model_dictionary: the dictionary to update from (type previously validated) :param schema_folder: the schema for this folder - :param schema_path: used for wko_schema_helper lookups and logging + :param schema_path: used for schema_helper lookups and logging :param output_file_path: used for logging """ _method_name = '_update_dictionary' @@ -125,16 +124,16 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem return # no type checking for elements of simple (single type) map - if wko_schema_helper.is_simple_map(schema_folder): + if schema_helper.is_simple_map(schema_folder): for key, value in model_dictionary.items(): output_dictionary[key] = value return - properties = wko_schema_helper.get_properties(schema_folder) + properties = schema_helper.get_properties(schema_folder) for key, value in model_dictionary.items(): property_folder = properties[key] - element_type = wko_schema_helper.get_type(property_folder) + element_type = schema_helper.get_type(property_folder) # deprecated "named object list" format value = _check_named_object_list(value, element_type, property_folder, schema_path, key) @@ -144,7 +143,7 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem if isinstance(value, dict): output_dictionary[key] = dictionary_utils.get_element(output_dictionary, key, PyOrderedDict()) - next_schema_path = wko_schema_helper.append_path(schema_path, key) + next_schema_path = schema_helper.append_path(schema_path, key) _update_dictionary(output_dictionary[key], value, property_folder, next_schema_path, output_file_path) elif isinstance(value, list): if not value: @@ -152,7 +151,7 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem output_dictionary[key] = value else: output_dictionary[key] = dictionary_utils.get_element(output_dictionary, key, []) - next_schema_path = wko_schema_helper.append_path(schema_path, key) + next_schema_path = schema_helper.append_path(schema_path, key) _update_list(output_dictionary[key], value, property_folder, next_schema_path, output_file_path) else: output_dictionary[key] = value @@ -164,7 +163,7 @@ def _update_list(output_list, model_list, schema_folder, schema_path, output_fil :param output_list: the list to be updated :param model_list: the list to update from (type previously validated) :param schema_folder: the schema for members of this list - :param schema_path: used for wko_schema_helper lookups and logging + :param schema_path: used for schema_helper lookups and logging :param output_file_path: used for logging """ _method_name = '_update_list' @@ -177,12 +176,12 @@ def _update_list(output_list, model_list, schema_folder, schema_path, output_fil if isinstance(item, dict): match = _find_object_match(item, output_list, schema_path) if match: - next_schema_folder = wko_schema_helper.get_array_item_info(schema_folder) + next_schema_folder = schema_helper.get_array_item_info(schema_folder) _update_dictionary(match, item, next_schema_folder, schema_path, output_file_path) else: output_list.append(item) elif item not in output_list: - element_type = wko_schema_helper.get_array_element_type(schema_folder) + element_type = schema_helper.get_array_element_type(schema_folder) item = _convert_value(item, element_type) output_list.append(item) @@ -192,10 +191,10 @@ def _find_object_match(item, match_list, schema_path): Find an object in match_list that has a name matching the item. :param item: the item to be matched :param match_list: a list of items - :param schema_path: used for wko_schema_helper key lookup + :param schema_path: used for schema_helper key lookup :return: a matching dictionary object """ - key = wko_schema_helper.get_object_list_key(schema_path) + key = schema_helper.get_object_list_key(schema_path) item_key = item[key] if item_key: for match_item in match_list: @@ -233,16 +232,16 @@ def _check_named_object_list(model_value, type_name, schema_folder, schema_path, :param model_value: the value to be checked :param type_name: the schema type name of the value :param schema_folder: the schema for the value being checked - :param schema_path: used for wko_schema_helper key lookup - :param key: used for wko_schema_helper key lookup + :param schema_path: used for schema_helper key lookup + :param key: used for schema_helper key lookup :return: the converted value """ if type_name == 'array' and isinstance(model_value, dict): object_list = list() - next_schema_path = wko_schema_helper.append_path(schema_path, key) - list_key = wko_schema_helper.get_object_list_key(next_schema_path) - item_info = wko_schema_helper.get_array_item_info(schema_folder) - properties = wko_schema_helper.get_properties(item_info) + next_schema_path = schema_helper.append_path(schema_path, key) + list_key = schema_helper.get_object_list_key(next_schema_path) + item_info = schema_helper.get_array_item_info(schema_folder) + properties = schema_helper.get_properties(item_info) for model_key, model_object in model_value.items(): new_object = model_object.copy() diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py similarity index 60% rename from core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py rename to core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py index be96ac1d1..b01b7555e 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/wko_schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py @@ -8,14 +8,11 @@ from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.json.json_translator import JsonStreamToPython from wlsdeploy.logging import platform_logger -from wlsdeploy.tool.util.targets.document_folder import DocumentFolder from wlsdeploy.util import dictionary_utils -CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' -DOMAIN_SCHEMA_NAME = 'domain-crd-schema' +DOMAIN_RESOURCE_SCHEMA_ROOT = "openAPIV3Schema" SCHEMA_RESOURCE_EXTENSION = '.json' SCHEMA_RESOURCE_PATH = 'oracle/weblogic/deploy/wko' -SCHEMA_ROOT_KEY = "openAPIV3Schema" SIMPLE_TYPES = [ 'integer', @@ -42,73 +39,37 @@ 'spec/managedServers': 'serverName' } -WKO_VERSION_3 = 'v3' -WKO_VERSION_4 = 'v4' - -NO_DOC_FOLDER_KEY = "__NO_KEY__" - -# the folder name "" indicates there is no extra folder level -# in the model between kubernetes and the schema data -VERSION_FOLDER_INFOS = { - WKO_VERSION_3: { - NO_DOC_FOLDER_KEY: { - 'schema_name': DOMAIN_SCHEMA_NAME + '-v8' - } - }, - WKO_VERSION_4: { - "domain": { - 'schema_name': DOMAIN_SCHEMA_NAME + '-v9' - }, - "clusters": { - 'schema_name': CLUSTER_SCHEMA_NAME + '-v1', - 'is_array': True - } - } -} - - _logger = platform_logger.PlatformLogger('wlsdeploy.deploy') -_class_name = 'wko_schema_helper' - - -def get_valid_wko_versions(): - return VERSION_FOLDER_INFOS.keys() - +_class_name = 'schema_helper' -# get document folder information for model folders directly under kubernetes, -# such as domain and clusters. these are not part of the schema definitions. -def get_document_folders(wko_version, exception_type=ExceptionType.DEPLOY): - folder_infos = VERSION_FOLDER_INFOS[wko_version] - folder_keys = folder_infos.keys() - folder_keys.sort() - folders = [] - for folder_key in folder_keys: - # lazy-load the folder information when requested - doc_folder = _get_document_folder(folder_infos, folder_key, exception_type) - folders.append(doc_folder) - return folders +def get_schema(schema_name, exception_type=ExceptionType.DEPLOY): + """ + Read the CRD schema from its resource path. + """ + _method_name = 'get_schema' -# return the document folder for the specified wko_version and model key. -def get_document_folder(wko_version, model_key, exception_type=ExceptionType.DEPLOY): - folder_infos = VERSION_FOLDER_INFOS[wko_version] - return _get_document_folder(folder_infos, model_key, exception_type) - + resource_name = schema_name + SCHEMA_RESOURCE_EXTENSION + resource_path = SCHEMA_RESOURCE_PATH + '/' + resource_name -# return the keyless document folder for the specified wko_version, if available. -def get_keyless_document_folder(wko_version, exception_type=ExceptionType.DEPLOY): - return get_document_folder(wko_version, NO_DOC_FOLDER_KEY, exception_type) + template_stream = None + try: + template_stream = FileUtils.getResourceAsStream(resource_path) + if template_stream is None: + ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) + _logger.throwing(ex, class_name=_class_name, method_name=_method_name) + raise ex + full_schema = JsonStreamToPython(resource_name, template_stream, True).parse() -def get_document_folder_keys(wko_version): - folder_infos = VERSION_FOLDER_INFOS[wko_version] - return folder_infos.keys() + # remove the root element, since it has a version-specific name + schema = full_schema[DOMAIN_RESOURCE_SCHEMA_ROOT] + finally: + if template_stream: + template_stream.close() -# deprecated, should be obsolete after WKO v4 changes -def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): - doc_folder = get_document_folder(WKO_VERSION_3, NO_DOC_FOLDER_KEY, exception_type) - return doc_folder.get_schema() + return schema def is_single_object(schema_map): @@ -226,44 +187,3 @@ def append_path(path, element): if path: return path + "/" + element return element - - -def _get_schema(schema_name, exception_type): - _method_name = '_get_schema' - - template_stream = None - try: - resource_name = schema_name + SCHEMA_RESOURCE_EXTENSION - resource_path = SCHEMA_RESOURCE_PATH + '/' + resource_name - template_stream = FileUtils.getResourceAsStream(resource_path) - if template_stream is None: - ex = exception_helper.create_exception(exception_type, 'WLSDPLY-10010', resource_path) - _logger.throwing(ex, class_name=_class_name, method_name=_method_name) - raise ex - - full_schema = JsonStreamToPython(resource_name, template_stream, True).parse() - - # remove the root element, since it has a version-specific name - schema = full_schema[SCHEMA_ROOT_KEY] - - finally: - if template_stream: - template_stream.close() - - return schema - - -# return the document folder object for folder_info. -# lazy load the document folder and its schema. -def _get_document_folder(folder_infos, folder_key, exception_type): - folder_info = dictionary_utils.get_element(folder_infos, folder_key) - if not folder_info: - return None - - doc_folder = dictionary_utils.get_element(folder_info, 'doc_folder') - if not doc_folder: - schema = _get_schema(folder_info['schema_name'], exception_type) - is_array = dictionary_utils.get_element(folder_info, 'is_array') - doc_folder = DocumentFolder(folder_key, schema, is_array) - folder_info['doc_folder'] = doc_folder - return doc_folder diff --git a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py index 9b76d09bf..ef44be43d 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/kubernetes_validator.py @@ -6,7 +6,8 @@ from wlsdeploy.aliases.model_constants import KUBERNETES from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.targets import wko_schema_helper +from wlsdeploy.tool.util.targets import model_crd_helper +from wlsdeploy.tool.util.targets import schema_helper from wlsdeploy.util import dictionary_utils @@ -19,6 +20,7 @@ class KubernetesValidator(object): def __init__(self, model_context): self._model_context = model_context + self._crd_helper = model_crd_helper.get_helper(model_context, ExceptionType.VALIDATE) def validate_model(self, model_dict): """ @@ -34,19 +36,17 @@ def validate_model(self, model_dict): model_path = KUBERNETES + ":" - wko_version = self._model_context.get_target_configuration().get_product_version() - - keyless_doc_folder = wko_schema_helper.get_keyless_document_folder(wko_version, ExceptionType.VALIDATE) - if keyless_doc_folder: + keyless_crd_folder = self._crd_helper.get_keyless_crd_folder() + if keyless_crd_folder: # this WKO version does not require kubernetes sub-folders, continue with that schema - schema = keyless_doc_folder.get_schema() + schema = keyless_crd_folder.get_schema() self.validate_folder(kubernetes_section, schema, None, model_path) else: # this WKO version requires kubernetes sub-folders, validate and process each folder for key in kubernetes_section: - doc_folder = wko_schema_helper.get_document_folder(wko_version, key, ExceptionType.VALIDATE) - if not doc_folder: - valid_keys = wko_schema_helper.get_document_folder_keys(wko_version) + crd_folder = self._crd_helper.get_crd_folder(key) + if not crd_folder: + valid_keys = self._crd_helper.get_crd_folder_keys() self._logger.severe("WLSDPLY-05026", key, len(valid_keys), model_path, '%s' % ', '.join(valid_keys), class_name=self._class_name, method_name=_method_name) @@ -54,8 +54,8 @@ def validate_model(self, model_dict): model_content = kubernetes_section[key] model_path += '/' + key - schema = doc_folder.get_schema() - if doc_folder.is_array(): + schema = crd_folder.get_schema() + if crd_folder.is_array(): self._validate_object_array(model_content, schema, None, model_path) else: self.validate_folder(model_content, schema, None, model_path) @@ -75,7 +75,7 @@ def validate_folder(self, model_folder, schema_folder, schema_path, model_path): self._logger.severe("WLSDPLY-05038", model_path, class_name=self._class_name, method_name=_method_name) return - schema_properties = wko_schema_helper.get_properties(schema_folder) + schema_properties = schema_helper.get_properties(schema_folder) for key in model_folder: properties = dictionary_utils.get_element(schema_properties, key) @@ -83,37 +83,37 @@ def validate_folder(self, model_folder, schema_folder, schema_path, model_path): if properties is not None: - if wko_schema_helper.is_single_object(properties): + if schema_helper.is_single_object(properties): # single object instance self._log_debug(' ' + key + ': single object') - next_schema_path = wko_schema_helper.append_path(schema_path, key) + next_schema_path = schema_helper.append_path(schema_path, key) next_model_path = model_path + "/" + key if self._check_folder_path(next_schema_path, next_model_path): self.validate_folder(model_value, properties, next_schema_path, next_model_path) - elif wko_schema_helper.is_object_array(properties): + elif schema_helper.is_object_array(properties): self._log_debug(' ' + key + ': object array') - next_schema_path = wko_schema_helper.append_path(schema_path, key) + next_schema_path = schema_helper.append_path(schema_path, key) next_model_path = model_path + "/" + key if self._check_folder_path(next_schema_path, next_model_path): - item_info = wko_schema_helper.get_array_item_info(properties) + item_info = schema_helper.get_array_item_info(properties) self._validate_object_array(model_value, item_info, next_schema_path, next_model_path) - elif wko_schema_helper.is_simple_map(properties): + elif schema_helper.is_simple_map(properties): # map of key / value pairs - element_type = wko_schema_helper.get_map_element_type(properties) + element_type = schema_helper.get_map_element_type(properties) self._log_debug(' ' + key + ': map of ' + element_type) self._validate_simple_map(model_value, key, model_path) - elif wko_schema_helper.is_simple_array(properties): + elif schema_helper.is_simple_array(properties): # array of simple type - element_type = wko_schema_helper.get_array_element_type(properties) + element_type = schema_helper.get_array_element_type(properties) self._log_debug(' ' + key + ': array of ' + element_type) self._validate_simple_array(model_value, key, model_path) else: # simple type - property_type = wko_schema_helper.get_type(properties) + property_type = schema_helper.get_type(properties) self._log_debug(' ' + key + ': ' + property_type) self._validate_simple_type(model_value, property_type, key, model_path) @@ -178,7 +178,7 @@ def _check_folder_path(self, schema_path, model_path): :return: True if the path is supported, False otherwise """ _method_name = '_check_folder_path' - if wko_schema_helper.is_unsupported_folder(schema_path): + if schema_helper.is_unsupported_folder(schema_path): self._logger.warning("WLSDPLY-05090", model_path, class_name=self._class_name, method_name=_method_name) return False return True diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index b7c0c1fb9..f79547b06 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -6,7 +6,7 @@ from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.util import dictionary_utils from wlsdeploy.util.validate_configuration import VALIDATION_METHODS -from wlsdeploy.tool.util.targets import wko_schema_helper +from wlsdeploy.tool.util.targets import model_crd_helper # types for credential method CREDENTIALS_METHOD = "credentials_method" @@ -233,8 +233,9 @@ def validate_configuration(self, exit_code, target_configuration_file): target_configuration_file) product_version = self.get_product_version() - self._validate_enumerated_field(PRODUCT_VERSION, product_version, wko_schema_helper.get_valid_wko_versions(), - exit_code, target_configuration_file) + valid_product_versions = model_crd_helper.get_valid_versions(model_crd_helper.WKO_PRODUCT_KEY) + self._validate_enumerated_field(PRODUCT_VERSION, product_version, valid_product_versions, exit_code, + target_configuration_file) source_type = self._get_domain_home_source_type() self._validate_enumerated_field(DOMAIN_HOME_SOURCE_TYPE, source_type, SOURCE_TYPE_NAMES.keys(), exit_code, diff --git a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties index dcb696259..7ed7ba5b6 100644 --- a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties +++ b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties @@ -1199,7 +1199,7 @@ WLSDPLY-09701=In online WLST, unable to target resources from extension template ############################################################################### # Extract messages (10000 - 10099) # ############################################################################### -# wlsdeploy/tool/extract/wko_schema_helper.py +# wlsdeploy/tool/util/targets/schema_helper.py WLSDPLY-10010=Failed to load WKO domain resource schema {0} WLSDPLY-10011=No {0} schema for WKO version {1}, available for version {2} diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py index ba0b1eee9..16ebe5473 100644 --- a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py +++ b/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py @@ -8,17 +8,18 @@ from oracle.weblogic.deploy.util import PyOrderedDict from wlsdeploy.aliases.model_constants import KUBERNETES -from wlsdeploy.tool.util.targets import wko_schema_helper +from wlsdeploy.tool.util.targets import model_crd_helper +from wlsdeploy.tool.util.targets import schema_helper class KubernetesSchemaTest(unittest.TestCase): _model_dir = '../../unit-tests/wko' def testKubernetesSchema(self): - self._testSchemas(wko_schema_helper.WKO_VERSION_3) + self._testSchemas(model_crd_helper.WKO_VERSION_3) def testKubernetes4Schemas(self): - self._testSchemas(wko_schema_helper.WKO_VERSION_4) + self._testSchemas(model_crd_helper.WKO_VERSION_4) def _testSchemas(self, wko_version): # create a model with every element. @@ -31,13 +32,14 @@ def _testSchemas(self, wko_version): self._write_line(KUBERNETES + ": # " + wko_version) - doc_folders = wko_schema_helper.get_document_folders(wko_version) - for doc_folder in doc_folders: + this_crd_helper = model_crd_helper.get_product_helper(model_crd_helper.WKO_PRODUCT_KEY, wko_version) + crd_folders = this_crd_helper.get_crd_folders() + for crd_folder in crd_folders: indent = " " - if doc_folder.has_model_key(): - self._write_line(indent + doc_folder.get_model_key() + ":") + if crd_folder.has_model_key(): + self._write_line(indent + crd_folder.get_model_key() + ":") indent = indent + " " - self._write_folder(doc_folder.get_schema(), doc_folder.is_array(), "", indent) + self._write_folder(crd_folder.get_schema(), crd_folder.is_array(), "", indent) self.out_file.close() except Exception, e: @@ -49,7 +51,7 @@ def _write_folder(self, folder, in_array, path, indent): if in_array: this_indent = indent[:-2] + "- " - properties = wko_schema_helper.get_properties(folder) + properties = schema_helper.get_properties(folder) property_names = list(properties.keys()) property_names.sort() @@ -57,11 +59,11 @@ def _write_folder(self, folder, in_array, path, indent): object_array_keys = [] for property_name in property_names: property_map = properties[property_name] - property_type = wko_schema_helper.get_type(property_map) + property_type = schema_helper.get_type(property_map) - if wko_schema_helper.is_simple_map(property_map): - additional_type = wko_schema_helper.get_map_element_type(property_map) - if additional_type not in wko_schema_helper.SIMPLE_TYPES: + if schema_helper.is_simple_map(property_map): + additional_type = schema_helper.get_map_element_type(property_map) + if additional_type not in schema_helper.SIMPLE_TYPES: self.fail('Unknown map type ' + additional_type + ' for ' + path + ' ' + property_name) self._write_line(this_indent + property_name + ":") this_indent = plain_indent @@ -69,26 +71,26 @@ def _write_folder(self, folder, in_array, path, indent): self._write_line(nest_indent + "'key-1': " + _get_sample_value(additional_type)) self._write_line(nest_indent + "'key-2': " + _get_sample_value(additional_type)) - elif wko_schema_helper.is_single_object(property_map): + elif schema_helper.is_single_object(property_map): # single object instance sub_folders[property_name] = property_map - elif wko_schema_helper.is_object_array(property_map): - array_items = wko_schema_helper.get_array_item_info(property_map) + elif schema_helper.is_object_array(property_map): + array_items = schema_helper.get_array_item_info(property_map) sub_folders[property_name] = array_items object_array_keys.append(property_name) - elif wko_schema_helper.is_simple_array(property_map): - array_type = wko_schema_helper.get_array_element_type(property_map) + elif schema_helper.is_simple_array(property_map): + array_type = schema_helper.get_array_element_type(property_map) self._write_line(this_indent + property_name + ":") this_indent = plain_indent each_indent = this_indent + "- " self._write_line(each_indent + _get_sample_value(array_type)) self._write_line(each_indent + _get_sample_value(array_type)) - elif wko_schema_helper.is_simple_type(property_map): + elif schema_helper.is_simple_type(property_map): value = _get_sample_value(property_type) - enum_values = wko_schema_helper.get_enum_values(property_map) + enum_values = schema_helper.get_enum_values(property_map) if enum_values: value = "'" + enum_values[0] + "' # " + ', '.join(enum_values) self._write_line(this_indent + str(property_name) + ": " + value) @@ -100,8 +102,8 @@ def _write_folder(self, folder, in_array, path, indent): # process sub-folders after attributes for clarity for property_name in sub_folders: - next_path = wko_schema_helper.append_path(path, property_name) - if wko_schema_helper.is_unsupported_folder(next_path): + next_path = schema_helper.append_path(path, property_name) + if schema_helper.is_unsupported_folder(next_path): self._write_line(indent + "# " + property_name + ": (unsupported folder)") else: self._write_line(this_indent + property_name + ":") From 30316f8148b34497e6edc04e7e18e53ea40f2418 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 13:05:10 -0500 Subject: [PATCH 10/24] Use correct exception type for extractResource --- core/src/main/python/extract_resource.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/python/extract_resource.py b/core/src/main/python/extract_resource.py index 7d8f35808..4fa59949d 100644 --- a/core/src/main/python/extract_resource.py +++ b/core/src/main/python/extract_resource.py @@ -14,6 +14,7 @@ from wlsdeploy.aliases.aliases import Aliases from wlsdeploy.aliases.wlst_modes import WlstModes from wlsdeploy.exception import exception_helper +from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.tool.extract.domain_resource_extractor import DomainResourceExtractor from wlsdeploy.tool.util import model_context_helper @@ -121,7 +122,7 @@ def main(model_context): _exit_code = ExitCode.OK try: - aliases = Aliases(model_context, wlst_mode=__wlst_mode) + aliases = Aliases(model_context, wlst_mode=__wlst_mode, exception_type=ExceptionType.DEPLOY) model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "extract", __wlst_mode) model = Model(model_dictionary) _exit_code = __extract_resource(model, model_context, aliases) From 9060ce3f64dc375b9952b60109e952bd88a5e987 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 13:10:10 -0500 Subject: [PATCH 11/24] Corrections to WKO v4 CRD template --- .../main/targetconfigs/templates/wko-domain-v4.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/targetconfigs/templates/wko-domain-v4.yaml b/core/src/main/targetconfigs/templates/wko-domain-v4.yaml index 486346113..581f70ed5 100644 --- a/core/src/main/targetconfigs/templates/wko-domain-v4.yaml +++ b/core/src/main/targetconfigs/templates/wko-domain-v4.yaml @@ -1,7 +1,7 @@ # Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -apiVersion: "weblogic.oracle/v8-zz" +apiVersion: "weblogic.oracle/v9" kind: Domain metadata: name: {{{domainUid}}} @@ -84,15 +84,15 @@ spec: {{#clusters}} --- -apiVersion: "weblogic.oracle/v8-TODO" -kind: Cluster?TODO +apiVersion: "weblogic.oracle/v1" +kind: Cluster metadata: - name: {{{domainUid}}} + name: {{{domainUid}}}-{{{clusterUid}}} namespace: {{{namespace}}} labels: weblogic.domainUID: {{{domainUid}}} spec: - clusterName: {{{domainUid}}}-{{{clusterUid}}} + clusterName: {{{clusterName}}} serverPod: # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not # already members of the same cluster. From 7eeb08e32a0b9f0fe4dd6af7dcfe7254a43ac4af Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 15:09:33 -0500 Subject: [PATCH 12/24] Rename crd_file_updater and use model CRD helper API; combine target file output; revise unit tests --- core/src/main/python/discover.py | 14 +-- .../tool/extract/domain_resource_extractor.py | 17 +-- .../wlsdeploy/tool/prepare/model_preparer.py | 18 +-- .../util/targets/additional_output_helper.py | 25 +++- ...put_file_helper.py => crd_file_updater.py} | 106 +++++++++++++---- .../tool/util/targets/model_crd_helper.py | 6 - .../util/target_configuration_helper.py | 37 ++++-- .../util/filters/output_file_helper_test.py | 72 ------------ .../util/targets/crd_file_updater_test.py | 111 ++++++++++++++++++ core/src/test/resources/wko/k8s-model-v4.yaml | 27 +++++ .../src/test/resources/wko/wko-domain-v4.yaml | 28 +++++ 11 files changed, 307 insertions(+), 154 deletions(-) rename core/src/main/python/wlsdeploy/tool/util/targets/{output_file_helper.py => crd_file_updater.py} (72%) delete mode 100644 core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py create mode 100644 core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py create mode 100644 core/src/test/resources/wko/k8s-model-v4.yaml create mode 100644 core/src/test/resources/wko/wko-domain-v4.yaml diff --git a/core/src/main/python/discover.py b/core/src/main/python/discover.py index a8f59cdc6..3c937e4fa 100644 --- a/core/src/main/python/discover.py +++ b/core/src/main/python/discover.py @@ -473,18 +473,8 @@ def __check_and_customize_model(model, model_context, aliases, credential_inject credential_cache = credential_injector.get_variable_cache() - # Generate k8s create secret script - if target_configuration.generate_script_for_secrets(): - target_configuration_helper.generate_k8s_script(model_context, credential_cache, model.get_model(), - ExceptionType.DISCOVER) - - if target_configuration.generate_json_for_secrets(): - target_configuration_helper.generate_k8s_json(model_context, credential_cache, model.get_model()) - - # create additional output after filtering, but before variables have been inserted - if model_context.is_targetted_config(): - target_configuration_helper.create_additional_output(model, model_context, aliases, credential_injector, - ExceptionType.DISCOVER) + target_configuration_helper.generate_all_output_files(model, aliases, credential_injector, model_context, + ExceptionType.DISCOVER) # if target handles credential configuration, clear property cache to keep out of variables file. if model_context.get_target_configuration().manages_credentials(): diff --git a/core/src/main/python/wlsdeploy/tool/extract/domain_resource_extractor.py b/core/src/main/python/wlsdeploy/tool/extract/domain_resource_extractor.py index b6b675845..c07d8f36c 100644 --- a/core/src/main/python/wlsdeploy/tool/extract/domain_resource_extractor.py +++ b/core/src/main/python/wlsdeploy/tool/extract/domain_resource_extractor.py @@ -8,9 +8,7 @@ from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.tool.util.credential_injector import CredentialInjector -from wlsdeploy.tool.util.targets.output_file_helper import DOMAIN_HOME -from wlsdeploy.tool.util.targets.output_file_helper import SPEC -from wlsdeploy.util import target_configuration_helper +from wlsdeploy.tool.util.targets import additional_output_helper _secret_pattern = re.compile("^@@SECRET:(.*)@@$") @@ -33,16 +31,13 @@ def extract(self): credential_injector = CredentialInjector(DomainResourceExtractor, model_dict, self._model_context) _add_secrets(model_dict, credential_injector) - # if -domain_home was specified on the command line, it should override any value in the model - domain_home_override = self._model_context.get_domain_home() - if domain_home_override: - kubernetes_dict = self._model.get_model_kubernetes() - spec_dict = get_or_create_dictionary(kubernetes_dict, SPEC) - spec_dict[DOMAIN_HOME] = domain_home_override + # if -domain_home was specified on the extract command line, it should override any value in the model + domain_home = self._model_context.get_domain_home() # create the output files with information from the model - target_configuration_helper.create_additional_output(self._model, self._model_context, self._aliases, - credential_injector, ExceptionType.DEPLOY) + additional_output_helper.create_additional_output( + self._model, self._model_context, self._aliases, credential_injector, ExceptionType.DEPLOY, + domain_home_override=domain_home) def _add_secrets(folder, credential_injector): diff --git a/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py b/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py index e872c125e..83d127ce5 100644 --- a/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py +++ b/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py @@ -365,21 +365,9 @@ def prepare_models(self): # correct any secret values that point to @@PROP values self.fix_property_secrets() - target_config = self.model_context.get_target_configuration() - if target_config.generate_script_for_secrets(): - target_configuration_helper.generate_k8s_script(self.model_context, - self.credential_injector.get_variable_cache(), - full_model_dictionary, ExceptionType.VALIDATE) - - if target_config.generate_json_for_secrets(): - target_configuration_helper.generate_k8s_json(self.model_context, - self.credential_injector.get_variable_cache(), - full_model_dictionary) - - # create any additional outputs from full model dictionary - target_configuration_helper.create_additional_output(Model(full_model_dictionary), self.model_context, - self._aliases, self.credential_injector, - ExceptionType.VALIDATE) + target_configuration_helper.generate_all_output_files(Model(full_model_dictionary), self._aliases, + self.credential_injector, self.model_context, + ExceptionType.VALIDATE) except (ValidateException, VariableException, TranslateException), e: self._logger.severe('WLSDPLY-20009', _program_name, model_file_name, e.getLocalizedMessage(), diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py index 1e0dd0b7a..f17213723 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py @@ -19,9 +19,9 @@ from wlsdeploy.aliases.model_constants import URL from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.tool.util import k8s_helper +from wlsdeploy.tool.util.targets import crd_file_updater from wlsdeploy.tool.util.targets import file_template_helper from wlsdeploy.tool.util.targets import model_crd_helper -from wlsdeploy.tool.util.targets import output_file_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.util import path_utils from wlsdeploy.util import target_configuration_helper @@ -43,6 +43,7 @@ DATASOURCES = 'datasources' DATASOURCE_NAME = 'datasourceName' DATASOURCE_URL = 'url' +DOMAIN_HOME = 'domainHome' DOMAIN_HOME_SOURCE_TYPE = 'domainHomeSourceType' DOMAIN_NAME = 'domainName' DOMAIN_PREFIX = 'domainPrefix' @@ -61,14 +62,22 @@ WEBLOGIC_CREDENTIALS_SECRET = 'webLogicCredentialsSecret' -def create_additional_output(model, model_context, aliases, credential_injector, exception_type): +def create_additional_output(model, model_context, aliases, credential_injector, exception_type, + domain_home_override=None): """ Create and write additional output for the configured target type. + Build a hash map of values to be applied to each template. + For each additional output type: + 1) read the source template + 2) apply the template hash to the template + 3) write the result to the template output file + 4) update the output file with content from the model (crd_file_updater) :param model: Model object, used to derive some values in the output :param model_context: used to determine location and content for the output :param aliases: used to derive secret names :param credential_injector: used to identify secrets :param exception_type: the type of exception to throw if needed + :param domain_home_override: (optionsl) domain home value to use in CRD, or None """ target_configuration = model_context.get_target_configuration() @@ -76,7 +85,7 @@ def create_additional_output(model, model_context, aliases, credential_injector, output_dir = model_context.get_output_dir() # all current output types use this hash, and process a set of template files - template_hash = _build_template_hash(model, model_context, aliases, credential_injector) + template_hash = _build_template_hash(model, model_context, aliases, credential_injector, domain_home_override) template_names = model_context.get_target_configuration().get_additional_output_types() for index, template_name in enumerate(template_names): source_file_name = _get_template_source_name(template_name, target_configuration) @@ -89,7 +98,9 @@ def create_additional_output(model, model_context, aliases, credential_injector, output_file = File(os.path.join(output_dir, template_name)) _create_file(source_file_name, template_hash, output_file, exception_type) - output_file_helper.update_from_model(output_file, model) + + crd_helper = model_crd_helper.get_helper(model_context) + crd_file_updater.update_from_model(output_file, model, crd_helper) # *** DELETE METHOD WHEN deprecated -domain_resource_file IS REMOVED *** @@ -140,13 +151,14 @@ def _get_template_source_name(template_name, target_configuration): return prefix + "-" + product_version + suffix -def _build_template_hash(model, model_context, aliases, credential_injector): +def _build_template_hash(model, model_context, aliases, credential_injector, domain_home_override): """ Create a dictionary of substitution values to apply to the templates. :param model: Model object used to derive values :param model_context: used to determine domain type :param aliases: used to derive folder names :param credential_injector: used to identify secrets + :param domain_home_override: used as domain home if not None :return: the hash dictionary """ template_hash = dict() @@ -159,6 +171,9 @@ def _build_template_hash(model, model_context, aliases, credential_injector): domain_name = DEFAULT_WLS_DOMAIN_NAME template_hash[DOMAIN_NAME] = domain_name + if domain_home_override: + template_hash[DOMAIN_HOME] = domain_home_override + # domain UID, prefix, and namespace must follow DNS-1123 domain_uid = k8s_helper.get_domain_uid(domain_name) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py similarity index 72% rename from core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py rename to core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py index e5b23d325..abd46dc54 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/output_file_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py @@ -12,9 +12,7 @@ from wlsdeploy.aliases.model_constants import KUBERNETES from wlsdeploy.aliases.model_constants import MODEL_LIST_DELIMITER from wlsdeploy.exception import exception_helper -from wlsdeploy.exception.expection_types import ExceptionType from wlsdeploy.logging.platform_logger import PlatformLogger -from wlsdeploy.tool.util.targets import model_crd_helper from wlsdeploy.tool.util.targets import schema_helper from wlsdeploy.util import dictionary_utils from wlsdeploy.yaml.yaml_translator import PythonToYaml @@ -26,6 +24,7 @@ KIND = 'kind' SPEC = 'spec' +WKO_CLUSTER_KIND = 'Cluster' WKO_DOMAIN_KIND = 'Domain' CLUSTER_NAME = 'clusterName' CLUSTERS = 'clusters' @@ -40,12 +39,12 @@ WORKLOAD = 'workload' -def update_from_model(crd_file, model): +def update_from_model(crd_file, model, crd_helper): """ - Update the output content with information from the kubernetes section of the model. - Output files are (currently) always Kubernetes resource files. + Update the CRD file content with information from the kubernetes section of the model. :param crd_file: the CRD java.io.File to be updated :param model: the model to use for update + :param crd_helper: used to get CRD folder information """ _method_name = 'update_from_model' @@ -64,7 +63,7 @@ def update_from_model(crd_file, model): method_name=_method_name) return - _update_documents(documents, kubernetes_content, crd_file.getPath()) + _update_documents(documents, kubernetes_content, crd_helper, crd_file.getPath()) try: writer = PythonToYaml(documents) @@ -75,39 +74,106 @@ def update_from_model(crd_file, model): return -def _update_documents(documents, kubernetes_content, output_file_path): +def _update_documents(crd_documents, model_content, crd_helper, output_file_path): + """ + Update each CRD document from the model, if required. + :param crd_documents: the CRD documents to be updated + :param model_content: the model content to use for update + :param crd_helper: used to get CRD folder information + :param output_file_path: used for logging + """ _method_name = '_update_documents' found = False - schema = model_crd_helper.get_default_domain_resource_schema(ExceptionType.DEPLOY) - # update section(s) based on their kind, etc. - for document in documents: - if isinstance(document, dict): - kind = dictionary_utils.get_element(document, KIND) + for crd_document in crd_documents: + if isinstance(crd_document, dict): + kind = dictionary_utils.get_element(crd_document, KIND) - # is this a standard WKO document? + # is this a WKO domain document? if kind == WKO_DOMAIN_KIND: - _update_dictionary(document, kubernetes_content, schema, None, output_file_path) - _add_comments(document) + _update_crd_domain(crd_document, model_content, crd_helper, output_file_path) + _add_domain_comments(crd_document) + found = True + + # is this a WKO v4 cluster document? + elif kind == WKO_CLUSTER_KIND: + _update_crd_cluster(crd_document, model_content, crd_helper, output_file_path) found = True # is this a Verrazzano WebLogic workload document? elif kind == COMPONENT_KIND: - spec = dictionary_utils.get_dictionary_element(document, SPEC) + spec = dictionary_utils.get_dictionary_element(crd_document, SPEC) workload = dictionary_utils.get_dictionary_element(spec, WORKLOAD) component_kind = dictionary_utils.get_element(workload, KIND) if component_kind == VERRAZZANO_WEBLOGIC_WORKLOAD_KIND: component_spec = _get_or_create_dictionary(workload, SPEC) component_template = _get_or_create_dictionary(component_spec, TEMPLATE) - _update_dictionary(component_template, kubernetes_content, schema, None, output_file_path) - _add_comments(component_template) + _update_crd_domain(component_template, model_content, crd_helper, output_file_path) + _add_domain_comments(component_template) found = True if not found: __logger.warning('WLSDPLY-01676', output_file_path, class_name=__class_name, method_name=_method_name) +def _update_crd_domain(crd_dictionary, model_dictionary, crd_helper, output_file_path): + """ + Update the CRD domain dictionary from the model. + :param crd_dictionary: the CRD dictionary to be updated + :param model_dictionary: the model content to use for update + :param crd_helper: used to get CRD folder information + :param output_file_path: used for logging + """ + keyless_crd_folder = crd_helper.get_keyless_crd_folder() + if keyless_crd_folder: + # this WKO version does not use model CRD sub-folders, use the single schema + schema = keyless_crd_folder.get_schema() + _update_dictionary(crd_dictionary, model_dictionary, schema, None, output_file_path) + else: + # this WKO version uses CRD sub-folders, use the domain folder + folder_key = 'domain' + domain_crd_folder = crd_helper.get_crd_folder(folder_key) + model_content = dictionary_utils.get_element(model_dictionary, folder_key) + if model_content: + schema = domain_crd_folder.get_schema() + _update_dictionary(crd_dictionary, model_content, schema, None, output_file_path) + + +def _update_crd_cluster(crd_dictionary, model_dictionary, crd_helper, output_file_path): + """ + Update the CRD cluster dictionary from the model. + :param crd_dictionary: the CRD dictionary to be updated + :param model_dictionary: the model content to use for update + :param crd_helper: used to get CRD folder information + :param output_file_path: used for logging + """ + _method_name = '_update_crd_cluster' + + folder_key = 'clusters' + model_clusters = dictionary_utils.get_element(model_dictionary, folder_key) + if model_clusters: + crd_name = _get_cluster_name(crd_dictionary) + model_cluster = _find_model_cluster(crd_name, model_clusters) + if model_cluster: + cluster_crd_folder = crd_helper.get_crd_folder(folder_key) + schema = cluster_crd_folder.get_schema() + _update_dictionary(crd_dictionary, model_cluster, schema, None, output_file_path) + + +def _find_model_cluster(crd_name, model_clusters): + for model_cluster in model_clusters: + model_name = _get_cluster_name(model_cluster) + if crd_name == model_name: + return model_cluster + return None + + +def _get_cluster_name(cluster): + spec = dictionary_utils.get_dictionary_element(cluster, SPEC) + return dictionary_utils.get_element(spec, CLUSTER_NAME) + + def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schema_path, output_file_path): """ Update output_dictionary with attributes from model_dictionary. @@ -256,10 +322,10 @@ def _check_named_object_list(model_value, type_name, schema_folder, schema_path, return model_value -def _add_comments(wko_dictionary): +def _add_domain_comments(wko_dictionary): """ Add relevant comments to the output dictionary to provide additional information. - :param wko_dictionary: the top-level WKO dictionary containing metadata, spec, etc. + :param wko_dictionary: the WKO dictionary containing metadata, spec, etc. """ spec = dictionary_utils.get_dictionary_element(wko_dictionary, SPEC) image_pull_secrets = dictionary_utils.get_element(spec, IMAGE_PULL_SECRETS) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py index d6d67e0af..9b645da83 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py @@ -108,9 +108,3 @@ def get_valid_versions(product_key): if product_key == WKO_PRODUCT_KEY: return WKO_VALID_VERSIONS return [] - - -# deprecated, should be obsolete after WKO v4 changes -def get_default_domain_resource_schema(exception_type=ExceptionType.DEPLOY): - crd_helper = get_product_helper(WKO_PRODUCT_KEY, WKO_VERSION_3, exception_type) - return crd_helper.get_keyless_crd_folder().get_schema() diff --git a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py index 9d697207a..e2b246691 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py @@ -94,6 +94,30 @@ def process_target_arguments(argument_map): raise ex +def generate_all_output_files(model, aliases, credential_injector, model_context, exception_type): + """ + :param model: Model object, used to derive some values in the output + :param aliases: used to derive secret names + :param credential_injector: used to identify secrets + :param model_context: used to determine location and content for the output + :param exception_type: the type of exception to throw if needed + """ + target_config = model_context.get_target_configuration() + credential_cache = credential_injector.get_variable_cache() + + # Generate k8s create secret script + if target_config.generate_script_for_secrets(): + generate_k8s_script(model_context, credential_cache, model.get_model(), exception_type) + + if target_config.generate_json_for_secrets(): + generate_k8s_json(model_context, credential_cache, model.get_model()) + + # create additional output after filtering, but before variables have been inserted + if model_context.is_targetted_config(): + additional_output_helper.create_additional_output(model, model_context, aliases, credential_injector, + exception_type) + + def _prepare_k8s_secrets(model_context, token_dictionary, model_dictionary): # determine the domain name and UID @@ -272,19 +296,6 @@ def get_secret_name_for_location(location, domain_uid, aliases): return domain_uid + '-' + secret_name -def create_additional_output(model, model_context, aliases, credential_injector, exception_type): - """ - Create any additional output specified in the target configuration. - :param model: used to create additional content - :param model_context: provides access to the target configuration - :param aliases: used for template fields - :param credential_injector: used to identify secrets - :param exception_type: type of exception to throw - """ - additional_output_helper.create_additional_output(model, model_context, aliases, credential_injector, - exception_type) - - def create_secret_name(variable_name, suffix=None): """ Return the secret name derived from the specified property variable name. diff --git a/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py b/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py deleted file mode 100644 index 488bbedd5..000000000 --- a/core/src/test/python/wlsdeploy/tool/util/filters/output_file_helper_test.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -Copyright (c) 2022, Oracle Corporation and/or its affiliates. -Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. -""" -import os -import shutil - -from base_test import BaseTestCase -from java.io import File - -from wlsdeploy.tool.util.targets import output_file_helper -from wlsdeploy.util.model import Model -from wlsdeploy.yaml.yaml_translator import YamlToPython - - -class OutputFileHelperTest(BaseTestCase): - - def __init__(self, *args): - BaseTestCase.__init__(self, *args) - self.MODELS_DIR = os.path.join(self.TEST_CLASSES_DIR, 'wko') - self.OUTPUT_DIR = os.path.join(self.TEST_OUTPUT_DIR, 'wko') - - def setUp(self): - BaseTestCase.setUp(self) - self._establish_directory(self.OUTPUT_DIR) - - def testOutputFileHelper(self): - """ - Test that kubernetes section of the model is merge into the - domain resource file correctly. - """ - model_file = os.path.join(self.MODELS_DIR, 'k8s-model.yaml') - reader = YamlToPython(model_file, True) - model_dict = reader.parse() - model = Model(model_dict) - - # copy the domain resource file to the target directory - file_name = 'wko-domain.yaml' - source_file = os.path.join(self.MODELS_DIR, file_name) - output_file = os.path.join(self.OUTPUT_DIR, file_name) - shutil.copyfile(source_file, output_file) - - output_file_helper.update_from_model(File(output_file), model) - - # re-read the output file - reader = YamlToPython(output_file, True) - resource = reader.parse() - - # domain home was overridden - domain_home = self._traverse(resource, 'spec', 'domainHome') - self._match_values("Domain home", domain_home, "modelHome") - - # only one cluster was added - cluster_list = self._traverse(resource, 'spec', 'clusters') - self._match_values("Cluster count", len(cluster_list), 3) - self._match_values("Third cluster name", cluster_list[2]['clusterName'], 'cluster3') - - # replica count of the first cluster was overridden - self._match_values("First cluster replicas", cluster_list[0]['replicas'], 999) - - # only one secret was added - secret_list = self._traverse(resource, 'spec', 'configuration', 'secrets') - self._match_values("Cluster count", len(secret_list), 3) - self._match_values("Third secret", secret_list[2], 'secret-three') - - # only one env was added - env_list = self._traverse(resource, 'spec', 'serverPod', 'env') - self._match_values("Env count", len(env_list), 3) - self._match_values("Third env name", env_list[2]['name'], 'FROM_MODEL') - - # value of the first env was overridden - self._match_values("First env value", env_list[0]['value'], '-DfromModel') diff --git a/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py new file mode 100644 index 000000000..31fae65ae --- /dev/null +++ b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py @@ -0,0 +1,111 @@ +""" +Copyright (c) 2022, Oracle Corporation and/or its affiliates. +Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +""" +import os +import shutil + +from base_test import BaseTestCase +from java.io import File + +from wlsdeploy.tool.util.targets import crd_file_updater +from wlsdeploy.tool.util.targets import model_crd_helper +from wlsdeploy.util.model import Model +from wlsdeploy.yaml.yaml_translator import YamlToPython + + +class CrdFileUpdaterTest(BaseTestCase): + + def __init__(self, *args): + BaseTestCase.__init__(self, *args) + self.MODELS_DIR = os.path.join(self.TEST_CLASSES_DIR, 'wko') + self.OUTPUT_DIR = os.path.join(self.TEST_OUTPUT_DIR, 'wko') + + def setUp(self): + BaseTestCase.setUp(self) + self._establish_directory(self.OUTPUT_DIR) + + def test_crd_file_updater(self): + """ + Test that kubernetes section of the model is merged into the + domain resource file correctly. + """ + resource = self._merge_and_read('k8s-model.yaml', 'wko-domain.yaml', model_crd_helper.WKO_VERSION_3) + + # domain home was overridden + domain_home = self._traverse(resource, 'spec', 'domainHome') + self._match_values("Domain home", domain_home, "modelHome") + + # only one cluster was added + cluster_list = self._traverse(resource, 'spec', 'clusters') + self._match_values("Cluster count", len(cluster_list), 3) + self._match_values("Third cluster name", cluster_list[2]['clusterName'], 'cluster3') + + # replica count of the first cluster was overridden + self._match_values("First cluster replicas", cluster_list[0]['replicas'], 999) + + # only one secret was added + secret_list = self._traverse(resource, 'spec', 'configuration', 'secrets') + self._match_values("Cluster count", len(secret_list), 3) + self._match_values("Third secret", secret_list[2], 'secret-three') + + # only one env was added + env_list = self._traverse(resource, 'spec', 'serverPod', 'env') + self._match_values("Env count", len(env_list), 3) + self._match_values("Third env name", env_list[2]['name'], 'FROM_MODEL') + + # value of the first env was overridden + self._match_values("First env value", env_list[0]['value'], '-DfromModel') + + def test_crd_file_updater_v4(self): + """ + Test that kubernetes section of the model is merged into the + domain resource file correctly. + """ + resource = self._merge_and_read('k8s-model-v4.yaml', 'wko-domain-v4.yaml', model_crd_helper.WKO_VERSION_4) + + # domain home was overridden + domain_home = self._traverse(resource, 'spec', 'domainHome') + self._match_values("Domain home", domain_home, "modelHome") + + # only one cluster was added + cluster_list = self._traverse(resource, 'spec', 'clusters') + self._match_values("Cluster count", len(cluster_list), 3) + self._match_values("Third cluster name", cluster_list[2]['clusterName'], 'cluster3') + + # replica count of the first cluster was overridden + self._match_values("First cluster replicas", cluster_list[0]['replicas'], 999) + + # only one secret was added + secret_list = self._traverse(resource, 'spec', 'configuration', 'secrets') + self._match_values("Cluster count", len(secret_list), 3) + self._match_values("Third secret", secret_list[2], 'secret-three') + + # only one env was added + env_list = self._traverse(resource, 'spec', 'serverPod', 'env') + self._match_values("Env count", len(env_list), 3) + self._match_values("Third env name", env_list[2]['name'], 'FROM_MODEL') + + # value of the first env was overridden + self._match_values("First env value", env_list[0]['value'], '-DfromModel') + + def _merge_and_read(self, model_name, crd_name, wko_version): + """ + Merge the specified model to the specified CRD, then read and return the result. + """ + model_file = os.path.join(self.MODELS_DIR, model_name) + reader = YamlToPython(model_file, True) + model_dict = reader.parse() + model = Model(model_dict) + + # copy the domain resource file to the target directory + source_file = os.path.join(self.MODELS_DIR, crd_name) + output_file = os.path.join(self.OUTPUT_DIR, crd_name) + shutil.copyfile(source_file, output_file) + + crd_helper = model_crd_helper.get_product_helper(model_crd_helper.WKO_PRODUCT_KEY, wko_version) + crd_file_updater.update_from_model(File(output_file), model, crd_helper) + + # re-read the output file + reader = YamlToPython(output_file, True) + return reader.parse() diff --git a/core/src/test/resources/wko/k8s-model-v4.yaml b/core/src/test/resources/wko/k8s-model-v4.yaml new file mode 100644 index 000000000..c596dafe4 --- /dev/null +++ b/core/src/test/resources/wko/k8s-model-v4.yaml @@ -0,0 +1,27 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +kubernetes: + domain: + spec: + # override this + domainHome: modelHome + + clusters: + # should merge cluster1 and add cluster3, based on key "clusterName" + - name: cluster1 + - name: cluster3 + + configuration: + # should add only secret-three, since secret-one is already included + secrets: + - secret-one + - secret-three + + serverPod: + env: + # should merge JAVA_OPTIONS and add FROM_MODEL, based on default key "name" + - name: JAVA_OPTIONS + value: '-DfromModel' + - name: FROM_MODEL + value: '-DfromModel' diff --git a/core/src/test/resources/wko/wko-domain-v4.yaml b/core/src/test/resources/wko/wko-domain-v4.yaml new file mode 100644 index 000000000..70b985404 --- /dev/null +++ b/core/src/test/resources/wko/wko-domain-v4.yaml @@ -0,0 +1,28 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: weblogic.oracle/v8 +kind: Domain +metadata: + name: demodomain +spec: + domainHome: --FIX ME-- + + # a list of objects + clusters: + - name: cluster1 + - name: cluster2 + + configuration: + # a simple list + secrets: + - secret-one + - secret-two + + serverPod: + # a list of objects + env: + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: '-Djava.security.egd=file:/dev/./urandom -Xms64m -Xmx256m ' From 4e4adddddff4d695ab4f7c3f0d91e4b4d5fbf7a3 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 16:24:26 -0500 Subject: [PATCH 13/24] Allow different object list keys for different model CRD folders --- .../tool/util/targets/crd_file_updater.py | 35 +++++++----- .../tool/util/targets/model_crd_folder.py | 21 ++++++++ .../tool/util/targets/model_crd_helper.py | 9 +++- .../tool/util/targets/schema_helper.py | 20 ------- .../util/targets/crd_file_updater_test.py | 54 +++++++++---------- core/src/test/resources/wko/k8s-model-v4.yaml | 4 ++ .../src/test/resources/wko/wko-domain-v4.yaml | 21 ++++++++ 7 files changed, 99 insertions(+), 65 deletions(-) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py index abd46dc54..1c8ce69b0 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py @@ -129,7 +129,7 @@ def _update_crd_domain(crd_dictionary, model_dictionary, crd_helper, output_file if keyless_crd_folder: # this WKO version does not use model CRD sub-folders, use the single schema schema = keyless_crd_folder.get_schema() - _update_dictionary(crd_dictionary, model_dictionary, schema, None, output_file_path) + _update_dictionary(crd_dictionary, model_dictionary, schema, None, keyless_crd_folder, output_file_path) else: # this WKO version uses CRD sub-folders, use the domain folder folder_key = 'domain' @@ -137,7 +137,7 @@ def _update_crd_domain(crd_dictionary, model_dictionary, crd_helper, output_file model_content = dictionary_utils.get_element(model_dictionary, folder_key) if model_content: schema = domain_crd_folder.get_schema() - _update_dictionary(crd_dictionary, model_content, schema, None, output_file_path) + _update_dictionary(crd_dictionary, model_content, schema, None, domain_crd_folder, output_file_path) def _update_crd_cluster(crd_dictionary, model_dictionary, crd_helper, output_file_path): @@ -158,7 +158,7 @@ def _update_crd_cluster(crd_dictionary, model_dictionary, crd_helper, output_fil if model_cluster: cluster_crd_folder = crd_helper.get_crd_folder(folder_key) schema = cluster_crd_folder.get_schema() - _update_dictionary(crd_dictionary, model_cluster, schema, None, output_file_path) + _update_dictionary(crd_dictionary, model_cluster, schema, None, cluster_crd_folder, output_file_path) def _find_model_cluster(crd_name, model_clusters): @@ -174,13 +174,15 @@ def _get_cluster_name(cluster): return dictionary_utils.get_element(spec, CLUSTER_NAME) -def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schema_path, output_file_path): +def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schema_path, model_crd_folder, + output_file_path): """ Update output_dictionary with attributes from model_dictionary. :param output_dictionary: the dictionary to be updated :param model_dictionary: the dictionary to update from (type previously validated) :param schema_folder: the schema for this folder :param schema_path: used for schema_helper lookups and logging + :param model_crd_folder: required for object list matching :param output_file_path: used for logging """ _method_name = '_update_dictionary' @@ -202,7 +204,7 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem element_type = schema_helper.get_type(property_folder) # deprecated "named object list" format - value = _check_named_object_list(value, element_type, property_folder, schema_path, key) + value = _check_named_object_list(value, element_type, property_folder, schema_path, key, model_crd_folder) # end deprecated value = _convert_value(value, element_type) @@ -210,7 +212,8 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem if isinstance(value, dict): output_dictionary[key] = dictionary_utils.get_element(output_dictionary, key, PyOrderedDict()) next_schema_path = schema_helper.append_path(schema_path, key) - _update_dictionary(output_dictionary[key], value, property_folder, next_schema_path, output_file_path) + _update_dictionary(output_dictionary[key], value, property_folder, next_schema_path, model_crd_folder, + output_file_path) elif isinstance(value, list): if not value: # if the model has an empty list, override output value @@ -218,18 +221,20 @@ def _update_dictionary(output_dictionary, model_dictionary, schema_folder, schem else: output_dictionary[key] = dictionary_utils.get_element(output_dictionary, key, []) next_schema_path = schema_helper.append_path(schema_path, key) - _update_list(output_dictionary[key], value, property_folder, next_schema_path, output_file_path) + _update_list(output_dictionary[key], value, property_folder, next_schema_path, model_crd_folder, + output_file_path) else: output_dictionary[key] = value -def _update_list(output_list, model_list, schema_folder, schema_path, output_file_path): +def _update_list(output_list, model_list, schema_folder, schema_path, model_crd_folder, output_file_path): """ Update output_list from model_list, overriding or merging existing values :param output_list: the list to be updated :param model_list: the list to update from (type previously validated) :param schema_folder: the schema for members of this list :param schema_path: used for schema_helper lookups and logging + :param model_crd_folder: required for object list matching :param output_file_path: used for logging """ _method_name = '_update_list' @@ -240,10 +245,10 @@ def _update_list(output_list, model_list, schema_folder, schema_path, output_fil for item in model_list: if isinstance(item, dict): - match = _find_object_match(item, output_list, schema_path) + match = _find_object_match(item, output_list, schema_path, model_crd_folder) if match: next_schema_folder = schema_helper.get_array_item_info(schema_folder) - _update_dictionary(match, item, next_schema_folder, schema_path, output_file_path) + _update_dictionary(match, item, next_schema_folder, schema_path, model_crd_folder, output_file_path) else: output_list.append(item) elif item not in output_list: @@ -252,15 +257,16 @@ def _update_list(output_list, model_list, schema_folder, schema_path, output_fil output_list.append(item) -def _find_object_match(item, match_list, schema_path): +def _find_object_match(item, match_list, schema_path, model_crd_folder): """ Find an object in match_list that has a name matching the item. :param item: the item to be matched :param match_list: a list of items :param schema_path: used for schema_helper key lookup + :param model_crd_folder: required for object list matching :return: a matching dictionary object """ - key = schema_helper.get_object_list_key(schema_path) + key = model_crd_folder.get_object_list_key(schema_path) item_key = item[key] if item_key: for match_item in match_list: @@ -292,7 +298,7 @@ def _convert_value(model_value, type_name): # *** DELETE METHOD WHEN deprecated "named object list" IS REMOVED *** -def _check_named_object_list(model_value, type_name, schema_folder, schema_path, key): +def _check_named_object_list(model_value, type_name, schema_folder, schema_path, key, model_crd_folder): """ Convert specified model value to an object list if it uses deprecated "named object list" format. :param model_value: the value to be checked @@ -300,12 +306,13 @@ def _check_named_object_list(model_value, type_name, schema_folder, schema_path, :param schema_folder: the schema for the value being checked :param schema_path: used for schema_helper key lookup :param key: used for schema_helper key lookup + :param model_crd_folder: required for object list matching :return: the converted value """ if type_name == 'array' and isinstance(model_value, dict): object_list = list() next_schema_path = schema_helper.append_path(schema_path, key) - list_key = schema_helper.get_object_list_key(next_schema_path) + list_key = model_crd_folder.get_object_list_key(next_schema_path) item_info = schema_helper.get_array_item_info(schema_folder) properties = schema_helper.get_properties(item_info) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py index 3499a9c24..8a0bb3192 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_folder.py @@ -2,6 +2,8 @@ Copyright (c) 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ +from wlsdeploy.util import dictionary_utils + NO_FOLDER_KEY = "__NO_KEY__" @@ -15,6 +17,7 @@ def __init__(self, model_key, schema, is_array): self._model_key = model_key self._schema = schema self._is_array = is_array + self._object_list_keys = {} def get_model_key(self): return self._model_key @@ -27,3 +30,21 @@ def get_schema(self): def has_model_key(self): return self._model_key != NO_FOLDER_KEY + + # some object list members don't use 'name' as a key. + # we need to know the key in order to merge object lists correctly. + + def add_object_list_key(self, schema_path, key): + self._object_list_keys[schema_path] = key + + def get_object_list_key(self, schema_path): + """ + Return the name of the attribute that acts as a key for objects in an object list. + In most cases, this is 'name', but there are a few exceptions. + :param schema_path: the path to be checked + :return: the object key + """ + mapped_key = dictionary_utils.get_element(self._object_list_keys, schema_path) + if mapped_key is not None: + return mapped_key + return 'name' diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py index 9b645da83..378a049d1 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py @@ -93,12 +93,17 @@ def get_product_helper(product_key, product_version, exception_type=ExceptionTyp domain_schema = schema_helper.get_schema(WKO_DOMAIN_SCHEMA_NAME + "-v9", exception_type) domain_folder = ModelCrdFolder("domain", domain_schema, False) + domain_folder.add_object_list_key('spec/adminServer/adminService/channels', 'channelName') + domain_folder.add_object_list_key('spec/managedServers', 'serverName') helper.add_crd_folder(domain_folder) elif product_version == WKO_VERSION_3: domain_schema = schema_helper.get_schema(WKO_DOMAIN_SCHEMA_NAME + "-v8", exception_type) - crd_folder = ModelCrdFolder(model_crd_folder.NO_FOLDER_KEY, domain_schema, False) - helper.add_crd_folder(crd_folder) + domain_folder = ModelCrdFolder(model_crd_folder.NO_FOLDER_KEY, domain_schema, False) + domain_folder.add_object_list_key('spec/adminServer/adminService/channels', 'channelName') + domain_folder.add_object_list_key('spec/managedServers', 'serverName') + domain_folder.add_object_list_key('spec/clusters', 'clusterName') + helper.add_crd_folder(domain_folder) return helper diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py index b01b7555e..1949b3c68 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/schema_helper.py @@ -32,13 +32,6 @@ 'metadata/ownerReferences' ] -# some object list members don't use 'name' as a key -OBJECT_NAME_ATTRIBUTES = { - 'spec/adminServer/adminService/channels': 'channelName', - 'spec/clusters': 'clusterName', - 'spec/managedServers': 'serverName' -} - _logger = platform_logger.PlatformLogger('wlsdeploy.deploy') _class_name = 'schema_helper' @@ -170,19 +163,6 @@ def is_unsupported_folder(path): return path in UNSUPPORTED_FOLDERS -def get_object_list_key(schema_path): - """ - Return the name of the attribute that acts as a key for objects in an object list. - In most cases, this is 'name', but there are a few exceptions. - :param schema_path: the path to be checked - :return: the object key - """ - mapped_key = dictionary_utils.get_element(OBJECT_NAME_ATTRIBUTES, schema_path) - if mapped_key is not None: - return mapped_key - return 'name' - - def append_path(path, element): if path: return path + "/" + element diff --git a/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py index 31fae65ae..bf36fa4b3 100644 --- a/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py +++ b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py @@ -30,59 +30,55 @@ def test_crd_file_updater(self): Test that kubernetes section of the model is merged into the domain resource file correctly. """ - resource = self._merge_and_read('k8s-model.yaml', 'wko-domain.yaml', model_crd_helper.WKO_VERSION_3) + documents = self._merge_and_read('k8s-model.yaml', 'wko-domain.yaml', model_crd_helper.WKO_VERSION_3) + self._match_values("Document count", len(documents), 1) + domain_resource = documents[0] - # domain home was overridden - domain_home = self._traverse(resource, 'spec', 'domainHome') - self._match_values("Domain home", domain_home, "modelHome") + # check simple fields + self._check_domain_crd(domain_resource) # only one cluster was added - cluster_list = self._traverse(resource, 'spec', 'clusters') + cluster_list = self._traverse(domain_resource, 'spec', 'clusters') self._match_values("Cluster count", len(cluster_list), 3) self._match_values("Third cluster name", cluster_list[2]['clusterName'], 'cluster3') # replica count of the first cluster was overridden self._match_values("First cluster replicas", cluster_list[0]['replicas'], 999) - # only one secret was added - secret_list = self._traverse(resource, 'spec', 'configuration', 'secrets') - self._match_values("Cluster count", len(secret_list), 3) - self._match_values("Third secret", secret_list[2], 'secret-three') - - # only one env was added - env_list = self._traverse(resource, 'spec', 'serverPod', 'env') - self._match_values("Env count", len(env_list), 3) - self._match_values("Third env name", env_list[2]['name'], 'FROM_MODEL') - - # value of the first env was overridden - self._match_values("First env value", env_list[0]['value'], '-DfromModel') - def test_crd_file_updater_v4(self): """ Test that kubernetes section of the model is merged into the domain resource file correctly. """ - resource = self._merge_and_read('k8s-model-v4.yaml', 'wko-domain-v4.yaml', model_crd_helper.WKO_VERSION_4) + documents = self._merge_and_read('k8s-model-v4.yaml', 'wko-domain-v4.yaml', model_crd_helper.WKO_VERSION_4) + self._match_values("Document count", len(documents), 4) + domain_resource = documents[0] - # domain home was overridden - domain_home = self._traverse(resource, 'spec', 'domainHome') - self._match_values("Domain home", domain_home, "modelHome") + # check simple fields + self._check_domain_crd(domain_resource) # only one cluster was added - cluster_list = self._traverse(resource, 'spec', 'clusters') - self._match_values("Cluster count", len(cluster_list), 3) - self._match_values("Third cluster name", cluster_list[2]['clusterName'], 'cluster3') + cluster_list = self._traverse(domain_resource, 'spec', 'clusters') + self._match_values("Domain cluster count", len(cluster_list), 3) + self._match_values("Third domain cluster name", cluster_list[2]['name'], 'cluster3') # replica count of the first cluster was overridden - self._match_values("First cluster replicas", cluster_list[0]['replicas'], 999) + cluster_resource = documents[1] + replica_count = self._traverse(cluster_resource, 'spec', 'replicas') + self._match_values("First cluster replicas", replica_count, 999) + + def _check_domain_crd(self, domain_resource): + # domain home was overridden + domain_home = self._traverse(domain_resource, 'spec', 'domainHome') + self._match_values("Domain home", domain_home, "modelHome") # only one secret was added - secret_list = self._traverse(resource, 'spec', 'configuration', 'secrets') + secret_list = self._traverse(domain_resource, 'spec', 'configuration', 'secrets') self._match_values("Cluster count", len(secret_list), 3) self._match_values("Third secret", secret_list[2], 'secret-three') # only one env was added - env_list = self._traverse(resource, 'spec', 'serverPod', 'env') + env_list = self._traverse(domain_resource, 'spec', 'serverPod', 'env') self._match_values("Env count", len(env_list), 3) self._match_values("Third env name", env_list[2]['name'], 'FROM_MODEL') @@ -108,4 +104,4 @@ def _merge_and_read(self, model_name, crd_name, wko_version): # re-read the output file reader = YamlToPython(output_file, True) - return reader.parse() + return reader.parse_documents() diff --git a/core/src/test/resources/wko/k8s-model-v4.yaml b/core/src/test/resources/wko/k8s-model-v4.yaml index c596dafe4..19d435bc1 100644 --- a/core/src/test/resources/wko/k8s-model-v4.yaml +++ b/core/src/test/resources/wko/k8s-model-v4.yaml @@ -25,3 +25,7 @@ kubernetes: value: '-DfromModel' - name: FROM_MODEL value: '-DfromModel' + clusters: + - spec: + clusterName: cluster1 + replicas: 999 diff --git a/core/src/test/resources/wko/wko-domain-v4.yaml b/core/src/test/resources/wko/wko-domain-v4.yaml index 70b985404..74948690d 100644 --- a/core/src/test/resources/wko/wko-domain-v4.yaml +++ b/core/src/test/resources/wko/wko-domain-v4.yaml @@ -26,3 +26,24 @@ spec: value: "-Dweblogic.StdoutDebugEnabled=false" - name: USER_MEM_ARGS value: '-Djava.security.egd=file:/dev/./urandom -Xms64m -Xmx256m ' +--- +apiVersion: weblogic.oracle/v1 +kind: Cluster +metadata: + name: demodomain-my-cluster +spec: + clusterName: cluster1 +--- +apiVersion: weblogic.oracle/v1 +kind: Cluster +metadata: + name: demodomain-my-cluster +spec: + clusterName: cluster2 +--- +apiVersion: weblogic.oracle/v1 +kind: Cluster +metadata: + name: demodomain-my-cluster +spec: + clusterName: cluster3 From 82628831a2b2ba7b086204e7df668329c2570ddb Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 16:43:41 -0500 Subject: [PATCH 14/24] Corrected usages --- installer/src/main/bin/modelHelp.cmd | 1 + installer/src/main/bin/validateModel.cmd | 4 ++++ installer/src/main/bin/validateModel.sh | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/installer/src/main/bin/modelHelp.cmd b/installer/src/main/bin/modelHelp.cmd index e2574126a..aa42be43f 100644 --- a/installer/src/main/bin/modelHelp.cmd +++ b/installer/src/main/bin/modelHelp.cmd @@ -69,6 +69,7 @@ ECHO. ECHO Usage: %SCRIPT_NAME% ECHO [-help] ECHO [-oracle_home ^] +ECHO [-target ^] ECHO [-attributes_only ^| -folders_only ^| -recursive ^| -interactive] ECHO ^ ECHO. diff --git a/installer/src/main/bin/validateModel.cmd b/installer/src/main/bin/validateModel.cmd index ee17fd427..5e3f3d3f0 100644 --- a/installer/src/main/bin/validateModel.cmd +++ b/installer/src/main/bin/validateModel.cmd @@ -77,6 +77,7 @@ ECHO [-oracle_home ^] ECHO [-model_file ^] ECHO [-variable_file ^] ECHO [-archive_file ^] +ECHO [-target ^] ECHO [-target_version ^] ECHO [-target_mode ^] ECHO [-domain_type ^] @@ -111,6 +112,9 @@ ECHO artifacts provided. This can also be specified a ECHO comma-separated list of archive files. The overlapping contents in ECHO each archive take precedence over previous archives in the list. ECHO. +ECHO target - target platform (wko, etc.). +ECHO this determines the structure of the kubernetes section. +ECHO. ECHO target_version - the target version of WebLogic Server the tool ECHO should use to validate the model content. This ECHO version number can be different than the version diff --git a/installer/src/main/bin/validateModel.sh b/installer/src/main/bin/validateModel.sh index eaef38050..af0578d32 100644 --- a/installer/src/main/bin/validateModel.sh +++ b/installer/src/main/bin/validateModel.sh @@ -34,6 +34,7 @@ usage() { echo " [-model_file ]" echo " [-variable_file ]" echo " [-archive_file ]" + echo " [-target ]" echo " [-target_version ]" echo " [-target_mode ]" echo " [-method ]" @@ -60,6 +61,9 @@ usage() { echo " comma-separated list of archive files. The overlapping contents in" echo " each archive take precedence over previous archives in the list." echo "" + echo " target - target platform (wko, etc.)." + echo " this determines the structure of the kubernetes section." + echo "" echo " target_version - the target version of WebLogic Server the tool" echo " should use to validate the model content. This" echo " version number can be different than the version" From ca1aef99413d2aa9617431667afdb9c2e0f47e54 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Wed, 19 Oct 2022 17:30:08 -0500 Subject: [PATCH 15/24] Code cleanup, corrected copyrights --- .../wlsdeploy/tool/util/targets/model_crd_helper.py | 13 ------------- .../tool/modelhelp/model_help_printer_test.py | 2 +- .../tool/util/targets/crd_file_updater_test.py | 2 +- installer/src/main/bin/modelHelp.cmd | 2 +- installer/src/main/bin/modelHelp.sh | 2 +- 5 files changed, 4 insertions(+), 17 deletions(-) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py index 378a049d1..da5e2220a 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/model_crd_helper.py @@ -25,19 +25,6 @@ WKO_CLUSTER_SCHEMA_NAME = 'cluster-crd-schema' WKO_DOMAIN_SCHEMA_NAME = 'domain-crd-schema' -UNSUPPORTED_FOLDERS = [ - 'status', - 'metadata/initializers', - 'metadata/ownerReferences' -] - -# some object list members don't use 'name' as a key -OBJECT_NAME_ATTRIBUTES = { - 'spec/adminServer/adminService/channels': 'channelName', - 'spec/clusters': 'clusterName', - 'spec/managedServers': 'serverName' -} - class ModelCrdHelper: """ diff --git a/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py b/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py index a1ea9c86c..4259923a9 100644 --- a/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py +++ b/core/src/test/python/wlsdeploy/tool/modelhelp/model_help_printer_test.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. +Copyright (c) 2020, 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import unittest diff --git a/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py index bf36fa4b3..d55f3c09a 100644 --- a/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py +++ b/core/src/test/python/wlsdeploy/tool/util/targets/crd_file_updater_test.py @@ -1,5 +1,5 @@ """ -Copyright (c) 2022, Oracle Corporation and/or its affiliates. +Copyright (c) 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import os diff --git a/installer/src/main/bin/modelHelp.cmd b/installer/src/main/bin/modelHelp.cmd index aa42be43f..3a2933fbe 100644 --- a/installer/src/main/bin/modelHelp.cmd +++ b/installer/src/main/bin/modelHelp.cmd @@ -2,7 +2,7 @@ @rem ************************************************************************** @rem modelHelp.cmd @rem -@rem Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. +@rem Copyright (c) 2020, 2022, Oracle and/or its affiliates. @rem Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. @rem @rem NAME diff --git a/installer/src/main/bin/modelHelp.sh b/installer/src/main/bin/modelHelp.sh index 18d53afff..68574c820 100644 --- a/installer/src/main/bin/modelHelp.sh +++ b/installer/src/main/bin/modelHelp.sh @@ -2,7 +2,7 @@ # ***************************************************************************** # modelHelp.sh # -# Copyright (c) 2020, 2022, Oracle Corporation and/or its affiliates. +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # # NAME From b5da4f760c094c56eca7f1aafd309c8094b69213 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Thu, 20 Oct 2022 10:45:09 -0500 Subject: [PATCH 16/24] Allow createDomain, deployDomain, and updateDomain to skip validation of kubernetes section --- core/src/main/python/create.py | 3 ++- core/src/main/python/deploy.py | 3 ++- core/src/main/python/discover.py | 2 +- core/src/main/python/update.py | 3 ++- core/src/main/python/validate.py | 2 +- .../wlsdeploy/tool/validate/validator.py | 24 ++++++++++++------- .../main/python/wlsdeploy/util/cla_helper.py | 12 ++++++---- core/src/test/python/validation_test.py | 10 ++++---- 8 files changed, 38 insertions(+), 21 deletions(-) diff --git a/core/src/main/python/create.py b/core/src/main/python/create.py index 25548c762..a07c3424b 100644 --- a/core/src/main/python/create.py +++ b/core/src/main/python/create.py @@ -310,7 +310,8 @@ def main(model_context): try: aliases = Aliases(model_context, wlst_mode=__wlst_mode, exception_type=ExceptionType.CREATE) - model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "create", __wlst_mode) + model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "create", __wlst_mode, + validate_crd_sections=False) archive_helper = None archive_file_name = model_context.get_archive_file_name() diff --git a/core/src/main/python/deploy.py b/core/src/main/python/deploy.py index 9b1a0dbf3..286da218e 100644 --- a/core/src/main/python/deploy.py +++ b/core/src/main/python/deploy.py @@ -224,7 +224,8 @@ def main(model_context): try: aliases = Aliases(model_context, wlst_mode=__wlst_mode, exception_type=ExceptionType.DEPLOY) - model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "deploy", __wlst_mode) + model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "deploy", __wlst_mode, + validate_crd_sections=False) model = Model(model_dictionary) _exit_code = __deploy(model, model_context, aliases) except DeployException, ex: diff --git a/core/src/main/python/discover.py b/core/src/main/python/discover.py index 3c937e4fa..abdff1d2b 100644 --- a/core/src/main/python/discover.py +++ b/core/src/main/python/discover.py @@ -490,7 +490,7 @@ def __check_and_customize_model(model, model_context, aliases, credential_inject if inserted: model = Model(variable_model) try: - validator = Validator(model_context, wlst_mode=__wlst_mode, aliases=aliases) + validator = Validator(model_context, aliases, wlst_mode=__wlst_mode) # no variables are generated by the discover tool validator.validate_in_tool_mode(model.get_model(), variables_file_name=variable_file_name, diff --git a/core/src/main/python/update.py b/core/src/main/python/update.py index 2e71abb5f..fa213477b 100644 --- a/core/src/main/python/update.py +++ b/core/src/main/python/update.py @@ -272,7 +272,8 @@ def main(model_context): try: aliases = Aliases(model_context, wlst_mode=__wlst_mode, exception_type=ExceptionType.DEPLOY) - model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "update", __wlst_mode) + model_dictionary = cla_helper.load_model(_program_name, model_context, aliases, "update", __wlst_mode, + validate_crd_sections=False) model = Model(model_dictionary) _exit_code = __update(model, model_context, aliases) except DeployException, ex: diff --git a/core/src/main/python/validate.py b/core/src/main/python/validate.py index 1cd4f7051..85930da6b 100644 --- a/core/src/main/python/validate.py +++ b/core/src/main/python/validate.py @@ -112,7 +112,7 @@ def __perform_model_file_validation(model_file_name, model_context): try: wlst_mode = model_context.get_target_wlst_mode() aliases = Aliases(model_context=model_context, wlst_mode=wlst_mode, exception_type=ExceptionType.VALIDATE) - model_validator = Validator(model_context, aliases=aliases, logger=__logger) + model_validator = Validator(model_context, aliases, logger=__logger) variable_map = model_validator.load_variables(model_context.get_variable_file()) model_dictionary = cla_helper.merge_model_files(model_file_name, variable_map) diff --git a/core/src/main/python/wlsdeploy/tool/validate/validator.py b/core/src/main/python/wlsdeploy/tool/validate/validator.py index 1ed605a98..d7dd28e0c 100644 --- a/core/src/main/python/wlsdeploy/tool/validate/validator.py +++ b/core/src/main/python/wlsdeploy/tool/validate/validator.py @@ -60,7 +60,15 @@ class Validator(object): ValidationStatus = Enum(['VALID', 'INFOS_VALID', 'WARNINGS_INVALID', 'INVALID']) ReturnCode = Enum(['PROCEED', 'STOP']) - def __init__(self, model_context, aliases=None, logger=None, wlst_mode=None, domain_name='base_domain'): + def __init__(self, model_context, aliases, logger=None, wlst_mode=None, validate_crd_sections=True): + """ + Create a validator instance. + :param model_context: used to get command-line options + :param aliases: used to validate folders, attributes. also determines exception type + :param logger: alternate logger to use + :param wlst_mode: online or offline mode + :param validate_crd_sections: True if CRD sections (such as kubernetes) should be validated + """ self._model_context = model_context self._validate_configuration = model_context.get_validate_configuration() @@ -85,18 +93,17 @@ def __init__(self, model_context, aliases=None, logger=None, wlst_mode=None, dom self._wlst_mode = model_context.get_target_wlst_mode() self._wls_version = model_context.get_target_wls_version() - if aliases is None: - self._aliases = Aliases(model_context=model_context, exception_type=ExceptionType.VALIDATE) - else: - self._aliases = aliases + self._aliases = aliases + # need a token here for alias path resolution self._name_tokens_location = LocationContext() - self._name_tokens_location.add_name_token('DOMAIN', domain_name) + self._name_tokens_location.add_name_token('DOMAIN', 'base_domain') self._archive_helper = None self._archive_file_name = None self._archive_entries = None self._model_file_name = self._model_context.get_model_file() + self._validate_crd_sections = validate_crd_sections def validate_in_standalone_mode(self, model_dict, variable_map, archive_file_name=None): """ @@ -254,8 +261,9 @@ def __validate_model_file(self, model_dict, variables_map, archive_file_name): self.__validate_model_section(model.get_model_deployments_key(), model_dict, self._aliases.get_model_app_deployments_top_level_folder_names()) - k8s_validator = KubernetesValidator(self._model_context) - k8s_validator.validate_model(model_dict) + if self._validate_crd_sections: + k8s_validator = KubernetesValidator(self._model_context) + k8s_validator.validate_model(model_dict) self._logger.exiting(class_name=_class_name, method_name=_method_name) diff --git a/core/src/main/python/wlsdeploy/util/cla_helper.py b/core/src/main/python/wlsdeploy/util/cla_helper.py index e0cd7c1f9..f31aadf87 100644 --- a/core/src/main/python/wlsdeploy/util/cla_helper.py +++ b/core/src/main/python/wlsdeploy/util/cla_helper.py @@ -165,7 +165,8 @@ def process_encryption_args(optional_arg_map): optional_arg_map[CommandLineArgUtil.PASSPHRASE_SWITCH] = String(passphrase) -def validate_model(program_name, model_dictionary, model_context, aliases, wlst_mode): +def validate_model(program_name, model_dictionary, model_context, aliases, wlst_mode, + validate_crd_sections=True): """ Validate the model dictionary based on the specified model context and aliases. The tool will exit if exceptions are encountered, or the validation returns a STOP code. @@ -174,12 +175,13 @@ def validate_model(program_name, model_dictionary, model_context, aliases, wlst_ :param model_context: the model context :param aliases: the aliases :param wlst_mode: offline or online + :param validate_crd_sections: True if CRD sections (such as kubernetes) should be validated :return: """ _method_name = 'validate_model' try: - validator = Validator(model_context, aliases, wlst_mode=wlst_mode) + validator = Validator(model_context, aliases, wlst_mode=wlst_mode, validate_crd_sections=validate_crd_sections) # no need to pass the variable file for processing, substitution has already been performed return_code = validator.validate_in_tool_mode(model_dictionary, variables_file_name=None, @@ -201,7 +203,7 @@ def validate_model(program_name, model_dictionary, model_context, aliases, wlst_ raise tool_exception -def load_model(program_name, model_context, aliases, filter_type, wlst_mode): +def load_model(program_name, model_context, aliases, filter_type, wlst_mode, validate_crd_sections=True): """ Load the model based on the arguments in the model context. Apply the variable substitution, if specified, and validate the model. @@ -212,6 +214,7 @@ def load_model(program_name, model_context, aliases, filter_type, wlst_mode): :param aliases: the alias configuration :param filter_type: the type of any filters to be applied :param wlst_mode: offline or online + :param validate_crd_sections: True if CRD sections (such as kubernetes) should be validated :return: the resulting model dictionary """ _method_name = 'load_model' @@ -257,7 +260,8 @@ def load_model(program_name, model_context, aliases, filter_type, wlst_mode): persist_model(model_context, model_dictionary) - validate_model(program_name, model_dictionary, model_context, aliases, wlst_mode) + validate_model(program_name, model_dictionary, model_context, aliases, wlst_mode, + validate_crd_sections=validate_crd_sections) return model_dictionary diff --git a/core/src/test/python/validation_test.py b/core/src/test/python/validation_test.py index f83755281..d249d3964 100644 --- a/core/src/test/python/validation_test.py +++ b/core/src/test/python/validation_test.py @@ -9,6 +9,7 @@ from oracle.weblogic.deploy.logging import SummaryHandler from oracle.weblogic.deploy.logging import WLSDeployLogEndHandler +from wlsdeploy.aliases.aliases import Aliases from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.util.weblogic_helper import WebLogicHelper from wlsdeploy.util.model_translator import FileToPython @@ -37,6 +38,7 @@ class ValidationTestCase(unittest.TestCase): # _model_file = _resources_dir + '/test_empty.json' # _variable_file = _resources_dir + "/test_invalid_variable_file.properties" # _archive_file = _resources_dir + "/test_jms_archive.zip" + _wls_version = '12.2.1.3' def setUp(self): self.name = 'ValidationTestCase' @@ -79,11 +81,11 @@ def testModelValidation(self): } model_context = ModelContext('ValidationTestCase', args_map) + aliases = Aliases(model_context, wls_version=self._wls_version) try: model_dictionary = FileToPython(model_context.get_model_file()).parse() - model_validator = Validator(model_context, - wlst_mode=WlstModes.ONLINE) + model_validator = Validator(model_context, aliases, wlst_mode=WlstModes.ONLINE) return_code = model_validator.validate_in_tool_mode(model_dictionary, model_context.get_variable_file(), model_context.get_archive_file_name()) @@ -129,11 +131,11 @@ def testYamlModelValidation(self): } model_context = ModelContext('ValidationTestCase', args_map) + aliases = Aliases(model_context, wls_version=self._wls_version) try: model_dictionary = FileToPython(model_context.get_model_file()).parse() - model_validator = Validator(model_context, - wlst_mode=WlstModes.ONLINE) + model_validator = Validator(model_context, aliases, wlst_mode=WlstModes.ONLINE) return_code = model_validator.validate_in_tool_mode(model_dictionary, model_context.get_variable_file(), model_context.get_archive_file_name()) From 8886a1523cf6cef593aced5d9ad1370fe0d39eed Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Thu, 20 Oct 2022 13:11:45 -0500 Subject: [PATCH 17/24] Add comments to WKO v4 cluster CRD documents --- .../tool/util/targets/crd_file_updater.py | 16 +++++++++++++++- .../targets}/kubernetes_schema_test.py | 0 2 files changed, 15 insertions(+), 1 deletion(-) rename core/src/test/python/wlsdeploy/tool/{extract => util/targets}/kubernetes_schema_test.py (100%) diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py index 1c8ce69b0..cb841dcd0 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/crd_file_updater.py @@ -99,6 +99,7 @@ def _update_documents(crd_documents, model_content, crd_helper, output_file_path # is this a WKO v4 cluster document? elif kind == WKO_CLUSTER_KIND: _update_crd_cluster(crd_document, model_content, crd_helper, output_file_path) + _add_cluster_comments(crd_document) found = True # is this a Verrazzano WebLogic workload document? @@ -331,7 +332,7 @@ def _check_named_object_list(model_value, type_name, schema_folder, schema_path, def _add_domain_comments(wko_dictionary): """ - Add relevant comments to the output dictionary to provide additional information. + Add relevant comments to the domain CRD dictionary to provide additional information. :param wko_dictionary: the WKO dictionary containing metadata, spec, etc. """ spec = dictionary_utils.get_dictionary_element(wko_dictionary, SPEC) @@ -350,6 +351,19 @@ def _add_domain_comments(wko_dictionary): cluster.addComment(last_key, REPLICAS + ': 99 # ' + message) +def _add_cluster_comments(wko_dictionary): + """ + Add relevant comments to the cluster CRD dictionary to provide additional information. + :param wko_dictionary: the WKO dictionary containing metadata, spec, etc. + """ + spec = dictionary_utils.get_dictionary_element(wko_dictionary, SPEC) + cluster_keys = spec.keys() + if CLUSTER_NAME in cluster_keys and REPLICAS not in cluster_keys: + last_key = spec.keys()[-1] + message = exception_helper.get_message('WLSDPLY-01680') + spec.addComment(last_key, REPLICAS + ': 99 # ' + message) + + def _get_or_create_dictionary(dictionary, key): if key not in dictionary: dictionary[key] = PyOrderedDict() diff --git a/core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py b/core/src/test/python/wlsdeploy/tool/util/targets/kubernetes_schema_test.py similarity index 100% rename from core/src/test/python/wlsdeploy/tool/extract/kubernetes_schema_test.py rename to core/src/test/python/wlsdeploy/tool/util/targets/kubernetes_schema_test.py From 63f4bbb61e375f447a293b21e6351b6e4d584b49 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Thu, 20 Oct 2022 13:18:35 -0500 Subject: [PATCH 18/24] Add WKO v4 target configurations for DII and PV --- core/src/main/targetconfigs/wko4-dii/target.json | 14 ++++++++++++++ core/src/main/targetconfigs/wko4-pv/target.json | 15 +++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 core/src/main/targetconfigs/wko4-dii/target.json create mode 100644 core/src/main/targetconfigs/wko4-pv/target.json diff --git a/core/src/main/targetconfigs/wko4-dii/target.json b/core/src/main/targetconfigs/wko4-dii/target.json new file mode 100644 index 000000000..8198fedc1 --- /dev/null +++ b/core/src/main/targetconfigs/wko4-dii/target.json @@ -0,0 +1,14 @@ +{ + "model_filters" : { + "discover": [ + { "id": "wko_filter" } + ] + }, + "variable_injectors" : {"PORT": {},"HOST": {},"URL": {}}, + "validation_method" : "lax", + "domain_home_source_type" : "dii", + "credentials_output_method" : "script", + "exclude_domain_bin_contents": true, + "product_version" : "v4", + "additional_output" : "wko-domain.yaml" +} diff --git a/core/src/main/targetconfigs/wko4-pv/target.json b/core/src/main/targetconfigs/wko4-pv/target.json new file mode 100644 index 000000000..8b150fde1 --- /dev/null +++ b/core/src/main/targetconfigs/wko4-pv/target.json @@ -0,0 +1,15 @@ +{ + "model_filters" : { + "discover": [ + { "id": "wko_filter" } + ] + }, + "variable_injectors" : {"PORT": {},"HOST": {},"URL": {}}, + "validation_method" : "lax", + "domain_home_source_type" : "pv", + "credentials_output_method" : "script", + "exclude_domain_bin_contents": true, + "use_persistent_volume" : true, + "product_version" : "v4", + "additional_output" : "wko-domain.yaml" +} From fd01924b6de490bdd03c61df5c06e37ff3988de7 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Thu, 20 Oct 2022 17:30:29 -0500 Subject: [PATCH 19/24] Create a results JSON file instead of a k8s secrets file --- .../wlsdeploy/tool/prepare/model_preparer.py | 2 +- .../util/targets/additional_output_helper.py | 4 +- .../wlsdeploy/util/target_configuration.py | 43 ++++++--- .../util/target_configuration_helper.py | 91 +++++++++---------- .../deploy/messages/wlsdeploy_rb.properties | 1 + 5 files changed, 77 insertions(+), 64 deletions(-) diff --git a/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py b/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py index 83d127ce5..cd00592dd 100644 --- a/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py +++ b/core/src/main/python/wlsdeploy/tool/prepare/model_preparer.py @@ -367,7 +367,7 @@ def prepare_models(self): target_configuration_helper.generate_all_output_files(Model(full_model_dictionary), self._aliases, self.credential_injector, self.model_context, - ExceptionType.VALIDATE) + ExceptionType.PREPARE) except (ValidateException, VariableException, TranslateException), e: self._logger.severe('WLSDPLY-20009', _program_name, model_file_name, e.getLocalizedMessage(), diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py index f17213723..b067fccd9 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py @@ -80,13 +80,15 @@ def create_additional_output(model, model_context, aliases, credential_injector, :param domain_home_override: (optionsl) domain home value to use in CRD, or None """ target_configuration = model_context.get_target_configuration() + template_names = target_configuration.get_additional_output_types() + if not len(template_names): + return # -output_dir argument was previously verified output_dir = model_context.get_output_dir() # all current output types use this hash, and process a set of template files template_hash = _build_template_hash(model, model_context, aliases, credential_injector, domain_home_override) - template_names = model_context.get_target_configuration().get_additional_output_types() for index, template_name in enumerate(template_names): source_file_name = _get_template_source_name(template_name, target_configuration) diff --git a/core/src/main/python/wlsdeploy/util/target_configuration.py b/core/src/main/python/wlsdeploy/util/target_configuration.py index f79547b06..644c9bce7 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration.py @@ -10,7 +10,9 @@ # types for credential method CREDENTIALS_METHOD = "credentials_method" -CREDENTIALS_OUTPUT_METHOD = "credentials_output_method" + +# results output method: "default" (script and additional output) or "json" (single results file) +RESULTS_OUTPUT_METHOD = "results_output_method" # type for validation method VALIDATION_METHOD = "validation_method" @@ -56,6 +58,13 @@ PERSISTENT_VOLUME_SOURCE_TYPE: 'PersistentVolume' } +DEFAULT_RESULTS_OUTPUT_METHOD = "default" +JSON_RESULTS_OUTPUT_METHOD = "json" +RESULTS_OUTPUT_METHODS = [ + DEFAULT_RESULTS_OUTPUT_METHOD, + JSON_RESULTS_OUTPUT_METHOD +] + class TargetConfiguration(object): """ @@ -81,12 +90,15 @@ def get_credentials_method(self): """ return dictionary_utils.get_element(self.config_dictionary, CREDENTIALS_METHOD) - def get_credentials_output_method(self): + def get_results_output_method(self): """ - Returns the method for generating secrets creation method. - :return: script or json + Returns the method for generating results output. + :return: "default" (script and additional files) or "json" (single results file) """ - return dictionary_utils.get_element(self.config_dictionary, CREDENTIALS_OUTPUT_METHOD) + result = dictionary_utils.get_element(self.config_dictionary, RESULTS_OUTPUT_METHOD) + if result is None: + result = DEFAULT_RESULTS_OUTPUT_METHOD + return result def get_wls_credentials_name(self): """ @@ -143,20 +155,19 @@ def uses_credential_secrets(self): """ return self.get_credentials_method() in [SECRETS_METHOD, CONFIG_OVERRIDES_SECRETS_METHOD] - def generate_script_for_secrets(self): + def generate_results_file(self): """ - Determine if it needs to generate shell script for creating secrets. - :return: True if it is not equal to json + Determine if a JSON results file should be created. + :return: True if results file should be created, False otherwise """ - # output method is None for discover with no target - return not self.get_credentials_output_method() in [None, 'json'] + return self.get_results_output_method() == JSON_RESULTS_OUTPUT_METHOD - def generate_json_for_secrets(self): + def generate_output_files(self): """ - Determine if it needs to generate json file for creating secrets. - :return: True if generating json file, False otherwise + Determine if scripts and additional output files should be created. + :return: True files should be created, False otherwise """ - return self.get_credentials_output_method() in ['json'] + return self.get_results_output_method() == DEFAULT_RESULTS_OUTPUT_METHOD def manages_credentials(self): """ @@ -241,6 +252,10 @@ def validate_configuration(self, exit_code, target_configuration_file): self._validate_enumerated_field(DOMAIN_HOME_SOURCE_TYPE, source_type, SOURCE_TYPE_NAMES.keys(), exit_code, target_configuration_file) + output_method = self.get_results_output_method() + self._validate_enumerated_field(RESULTS_OUTPUT_METHOD, output_method, RESULTS_OUTPUT_METHODS, exit_code, + target_configuration_file) + ################### # Private methods # ################### diff --git a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py index e2b246691..0c5b14a04 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py @@ -7,6 +7,7 @@ import os from java.io import File +from oracle.weblogic.deploy.json import JsonException from oracle.weblogic.deploy.util import FileUtils from wlsdeploy.aliases.model_constants import ADMIN_PASSWORD @@ -69,8 +70,8 @@ SECURITY_NM_REPLACEMENT = 'SecurityConfig.NodeManager.' K8S_SCRIPT_NAME = 'create_k8s_secrets.sh' -K8S_SECRET_JSON_NAME = 'k8s_secrets.json' K8S_SCRIPT_RESOURCE_PATH = 'oracle/weblogic/deploy/k8s/' + K8S_SCRIPT_NAME +RESULTS_FILE_NAME = 'results.json' def process_target_arguments(argument_map): @@ -96,6 +97,8 @@ def process_target_arguments(argument_map): def generate_all_output_files(model, aliases, credential_injector, model_context, exception_type): """ + Create all output files indicated by the target configuration. + This should be called after model is filtered, but before it is tokenized. :param model: Model object, used to derive some values in the output :param aliases: used to derive secret names :param credential_injector: used to identify secrets @@ -105,15 +108,14 @@ def generate_all_output_files(model, aliases, credential_injector, model_context target_config = model_context.get_target_configuration() credential_cache = credential_injector.get_variable_cache() - # Generate k8s create secret script - if target_config.generate_script_for_secrets(): - generate_k8s_script(model_context, credential_cache, model.get_model(), exception_type) + if target_config.generate_results_file(): + generate_results_json(model_context, credential_cache, model.get_model(), exception_type) - if target_config.generate_json_for_secrets(): - generate_k8s_json(model_context, credential_cache, model.get_model()) + if target_config.generate_output_files(): + # Generate k8s create secret script + generate_k8s_script(model_context, credential_cache, model.get_model(), exception_type) - # create additional output after filtering, but before variables have been inserted - if model_context.is_targetted_config(): + # create additional output files additional_output_helper.create_additional_output(model, model_context, aliases, credential_injector, exception_type) @@ -200,55 +202,48 @@ def generate_k8s_script(model_context, token_dictionary, model_dictionary, excep FileUtils.chmod(k8s_file.getPath(), 0750) -def generate_k8s_json(model_context, token_dictionary, model_dictionary): +def generate_results_json(model_context, token_dictionary, model_dictionary, exception_type): """ - Generate a json file. + Generate a JSON results file. :param model_context: used to determine output directory :param token_dictionary: contains every token - :param model_dictionary: used to determine domain UID + :param model_dictionary: used to determine data :param exception_type: type of exception to throw """ - script_hash = _prepare_k8s_secrets(model_context, token_dictionary, model_dictionary) - file_location = model_context.get_output_dir() - k8s_file = os.path.join(file_location, K8S_SECRET_JSON_NAME) - result = _build_json_secrets_result(script_hash) - json_object = PythonToJson(result) - json_object.write_to_json_file(k8s_file) + results_file = os.path.join(file_location, RESULTS_FILE_NAME) + result = {} + result['secrets'] = _build_json_secrets_result(model_context, token_dictionary, model_dictionary) -def _build_json_secrets_result(script_hash): + json_object = PythonToJson(result) + try: + json_object.write_to_json_file(results_file) + except JsonException, ex: + raise exception_helper.create_exception(exception_type, 'WLSDPLY-01681', results_file, + ex.getLocalizedMessage(), error=ex) - result = {} - secrets_array = [] - - for node in script_hash['secrets']: - secret = {} - for item in ['secretName', 'comments']: - secret[item] = node[item] - secret['keys'] = {} - secret['keys']['password'] = "" - secrets_array.append(secret) - - for node in script_hash['pairedSecrets']: - secret = {} - for item in ['secretName', 'comments']: - secret[item] = node[item] - secret['keys'] = {} - secret['keys']['password'] = "" - secret['keys']['username'] = node['user'] - # For ui, empty it now. - if secret['keys']['username'].startswith('@@SECRET:'): - secret['keys']['username'] = "" - if secret['secretName'] == 'weblogic-credentials': - secret['keys']['username'] = "" - secrets_array.append(secret) - - result['secrets'] = secrets_array - result['domainUID'] = script_hash['domainUid'] - result['namespace'] = script_hash['namespace'] - - return result + +def _build_json_secrets_result(model_context, token_dictionary, model_dictionary): + script_hash = _prepare_k8s_secrets(model_context, token_dictionary, model_dictionary) + secrets_map = {} + for secretType in ['secrets', 'pairedSecrets']: + for node in script_hash[secretType]: + secret_name = node['secretName'] + keys = {} + user = dictionary_utils.get_element(node, 'user') + if user: + # For ui, empty it now. + if user.startswith('@@SECRET:'): + user = "" + if secret_name == WEBLOGIC_CREDENTIALS_SECRET_NAME: + user = "" + keys['username'] = user + + keys['password'] = "" + secret = {'keys': keys} + secrets_map[secret_name] = secret + return secrets_map def format_as_secret_token(secret_id, target_config): diff --git a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties index 7ed7ba5b6..3e6f4f70b 100644 --- a/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties +++ b/core/src/main/resources/oracle/weblogic/deploy/messages/wlsdeploy_rb.properties @@ -322,6 +322,7 @@ WLSDPLY-01677=Expected a map value for {0} in the target output file {1}, skippi WLSDPLY-01678=Expected a list value for {0} in the target output file {1}, skipping update WLSDPLY-01679=Add any credential secrets that are required to pull the image WLSDPLY-01680=Set a specific replica count for this cluster +WLSDPLY-01681=Unable to create results file "{0}": {1} # wlsdeploy/util/enum.py WLSDPLY-01700=The value {0} is not a valid value of the Enum type {1} From 46bbab52812e16780ef12f8b1211864c304cf73f Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Fri, 21 Oct 2022 14:00:23 -0500 Subject: [PATCH 20/24] Replace stack trace in Java exceptions based on Jython exceptions/errors --- .../deploy/exception/PyBaseException.java | 31 ++++++++++++++++++- .../wlsdeploy/exception/exception_helper.py | 2 ++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/oracle/weblogic/deploy/exception/PyBaseException.java b/core/src/main/java/oracle/weblogic/deploy/exception/PyBaseException.java index b3d5eb2d3..f1fe67589 100644 --- a/core/src/main/java/oracle/weblogic/deploy/exception/PyBaseException.java +++ b/core/src/main/java/oracle/weblogic/deploy/exception/PyBaseException.java @@ -1,15 +1,20 @@ /* - * Copyright (c) 2017, 2019, Oracle Corporation and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022, Oracle Corporation and/or its affiliates. All rights reserved. * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. */ package oracle.weblogic.deploy.exception; +import java.io.PrintStream; +import java.io.PrintWriter; + /** * The base class for our python-related exceptions. */ public class PyBaseException extends BundleAwareException { private static final long serialVersionUID = 1L; + private String stackTrace; + /** * Constructs a default exception. */ @@ -73,4 +78,28 @@ public PyBaseException(Throwable cause) { public String getBundleName() { return ExceptionHelper.getResourceBundleName(); } + + // for printing the stack trace with java.util.logging, + // replace the Java stack trace with Jython traceback information. + public void setStackTrace(String stackTrace) { + this.stackTrace = stackTrace; + } + + @Override + public void printStackTrace(PrintStream s) { + if(stackTrace != null) { + s.print(stackTrace); + } else { + super.printStackTrace(s); + } + } + + @Override + public void printStackTrace(PrintWriter s) { + if(stackTrace != null) { + s.print(stackTrace); + } else { + super.printStackTrace(s); + } + } } diff --git a/core/src/main/python/wlsdeploy/exception/exception_helper.py b/core/src/main/python/wlsdeploy/exception/exception_helper.py index 9c82cdb9c..d083e90ec 100644 --- a/core/src/main/python/wlsdeploy/exception/exception_helper.py +++ b/core/src/main/python/wlsdeploy/exception/exception_helper.py @@ -449,6 +449,8 @@ def convert_error_to_exception(): custom_exception = PyAttributeErrorException(exception_message) else: custom_exception = PyBaseException(exception_message) + + custom_exception.setStackTrace(exception_message) return custom_exception From c014082aa554d5867877bddd6914db346789413f Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Fri, 21 Oct 2022 14:24:14 -0500 Subject: [PATCH 21/24] Let tool_main handle unexpected exceptions in prepareModel --- core/src/main/python/prepare_model.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/src/main/python/prepare_model.py b/core/src/main/python/prepare_model.py index 18dc388c6..28d1d62a5 100644 --- a/core/src/main/python/prepare_model.py +++ b/core/src/main/python/prepare_model.py @@ -9,10 +9,10 @@ import sys +from oracle.weblogic.deploy.prepare import PrepareException from oracle.weblogic.deploy.util import CLAException from oracle.weblogic.deploy.util import PyWLSTException -from oracle.weblogic.deploy.prepare import PrepareException from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.tool.prepare.model_preparer import ModelPreparer from wlsdeploy.util import target_configuration_helper @@ -84,11 +84,6 @@ def main(model_context): _exit_code = ExitCode.ERROR __logger.severe('WLSDPLY-05801', ex.getLocalizedMessage(), error=ex, class_name=_class_name, method_name=_method_name) - except Exception, ex: - _exit_code = ExitCode.ERROR - message = str(sys.exc_type) + ': ' + str(sys.exc_value) - __logger.severe('WLSDPLY-05801', message, error=ex, class_name=_class_name, - method_name=_method_name) __logger.exiting(class_name=_class_name, method_name=_method_name, result=_exit_code) return _exit_code From 02fc056ecb78881dcf9ca663bf50b0930d155450 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Fri, 21 Oct 2022 14:25:19 -0500 Subject: [PATCH 22/24] Add cluster server count information to result.json --- .../util/target_configuration_helper.py | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py index 0c5b14a04..2949b43a9 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py @@ -12,6 +12,7 @@ from wlsdeploy.aliases.model_constants import ADMIN_PASSWORD from wlsdeploy.aliases.model_constants import ADMIN_USERNAME +from wlsdeploy.aliases.model_constants import CLUSTER from wlsdeploy.aliases.model_constants import DEFAULT_WLS_DOMAIN_NAME from wlsdeploy.aliases.model_constants import NAME from wlsdeploy.aliases.model_constants import TOPOLOGY @@ -212,11 +213,12 @@ def generate_results_json(model_context, token_dictionary, model_dictionary, exc """ file_location = model_context.get_output_dir() results_file = os.path.join(file_location, RESULTS_FILE_NAME) - - result = {} - result['secrets'] = _build_json_secrets_result(model_context, token_dictionary, model_dictionary) - + result = { + 'secrets': _build_json_secrets_result(model_context, token_dictionary, model_dictionary), + 'clusters': _build_json_cluster_result(model_dictionary) + } json_object = PythonToJson(result) + try: json_object.write_to_json_file(results_file) except JsonException, ex: @@ -246,6 +248,17 @@ def _build_json_secrets_result(model_context, token_dictionary, model_dictionary return secrets_map +def _build_json_cluster_result(model_dictionary): + clusters_map = {} + topology = dictionary_utils.get_dictionary_element(model_dictionary, TOPOLOGY) + clusters = dictionary_utils.get_dictionary_element(topology, CLUSTER) + for cluster_name, cluster_values in clusters.items(): + server_count = k8s_helper.get_server_count(cluster_name, cluster_values, model_dictionary) + cluster_data = {'serverCount': server_count} + clusters_map[cluster_name] = cluster_data + return clusters_map + + def format_as_secret_token(secret_id, target_config): """ Format the secret identifier as an @@SECRET token for use in a model. From d1e2f354034d924c57b6d006e186305605797757 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Fri, 21 Oct 2022 15:48:38 -0500 Subject: [PATCH 23/24] Add domain UID to JSON results file; use helper methods throughout --- .../main/python/wlsdeploy/tool/util/k8s_helper.py | 10 ++++++++++ .../tool/util/targets/additional_output_helper.py | 6 +----- .../wlsdeploy/util/target_configuration_helper.py | 13 ++++++------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/core/src/main/python/wlsdeploy/tool/util/k8s_helper.py b/core/src/main/python/wlsdeploy/tool/util/k8s_helper.py index 5f778da26..c25fd396b 100644 --- a/core/src/main/python/wlsdeploy/tool/util/k8s_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/k8s_helper.py @@ -9,14 +9,24 @@ from wlsdeploy.aliases import alias_utils from wlsdeploy.aliases.model_constants import CLUSTER +from wlsdeploy.aliases.model_constants import DEFAULT_WLS_DOMAIN_NAME from wlsdeploy.aliases.model_constants import DYNAMIC_CLUSTER_SIZE from wlsdeploy.aliases.model_constants import DYNAMIC_SERVERS from wlsdeploy.aliases.model_constants import MAX_DYNAMIC_SERVER_COUNT +from wlsdeploy.aliases.model_constants import NAME from wlsdeploy.aliases.model_constants import SERVER from wlsdeploy.aliases.model_constants import TOPOLOGY from wlsdeploy.util import dictionary_utils +def get_domain_name(model_dictionary): + topology = dictionary_utils.get_dictionary_element(model_dictionary, TOPOLOGY) + domain_name = dictionary_utils.get_element(topology, NAME) + if domain_name is None: + domain_name = DEFAULT_WLS_DOMAIN_NAME + return domain_name + + def get_domain_uid(domain_name): """ Determine the domain UID based on domain name. diff --git a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py index b067fccd9..3760d3171 100644 --- a/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py +++ b/core/src/main/python/wlsdeploy/tool/util/targets/additional_output_helper.py @@ -11,11 +11,9 @@ from wlsdeploy.aliases.location_context import LocationContext from wlsdeploy.aliases.model_constants import APPLICATION from wlsdeploy.aliases.model_constants import CLUSTER -from wlsdeploy.aliases.model_constants import DEFAULT_WLS_DOMAIN_NAME from wlsdeploy.aliases.model_constants import JDBC_DRIVER_PARAMS from wlsdeploy.aliases.model_constants import JDBC_RESOURCE from wlsdeploy.aliases.model_constants import JDBC_SYSTEM_RESOURCE -from wlsdeploy.aliases.model_constants import NAME from wlsdeploy.aliases.model_constants import URL from wlsdeploy.logging.platform_logger import PlatformLogger from wlsdeploy.tool.util import k8s_helper @@ -168,9 +166,7 @@ def _build_template_hash(model, model_context, aliases, credential_injector, dom # actual domain name - domain_name = dictionary_utils.get_element(model.get_model_topology(), NAME) - if domain_name is None: - domain_name = DEFAULT_WLS_DOMAIN_NAME + domain_name = k8s_helper.get_domain_name(model.get_model()) template_hash[DOMAIN_NAME] = domain_name if domain_home_override: diff --git a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py index 2949b43a9..12ab27bb3 100644 --- a/core/src/main/python/wlsdeploy/util/target_configuration_helper.py +++ b/core/src/main/python/wlsdeploy/util/target_configuration_helper.py @@ -13,8 +13,6 @@ from wlsdeploy.aliases.model_constants import ADMIN_PASSWORD from wlsdeploy.aliases.model_constants import ADMIN_USERNAME from wlsdeploy.aliases.model_constants import CLUSTER -from wlsdeploy.aliases.model_constants import DEFAULT_WLS_DOMAIN_NAME -from wlsdeploy.aliases.model_constants import NAME from wlsdeploy.aliases.model_constants import TOPOLOGY from wlsdeploy.exception import exception_helper from wlsdeploy.logging.platform_logger import PlatformLogger @@ -124,11 +122,7 @@ def generate_all_output_files(model, aliases, credential_injector, model_context def _prepare_k8s_secrets(model_context, token_dictionary, model_dictionary): # determine the domain name and UID - topology = dictionary_utils.get_dictionary_element(model_dictionary, TOPOLOGY) - domain_name = dictionary_utils.get_element(topology, NAME) - if domain_name is None: - domain_name = DEFAULT_WLS_DOMAIN_NAME - + domain_name = k8s_helper.get_domain_name(model_dictionary) domain_uid = k8s_helper.get_domain_uid(domain_name) comment = exception_helper.get_message("WLSDPLY-01665") script_hash = {'domainUid': domain_uid, 'topComment': comment, 'namespace': domain_uid} @@ -213,7 +207,12 @@ def generate_results_json(model_context, token_dictionary, model_dictionary, exc """ file_location = model_context.get_output_dir() results_file = os.path.join(file_location, RESULTS_FILE_NAME) + + domain_name = k8s_helper.get_domain_name(model_dictionary) + domain_uid = k8s_helper.get_domain_uid(domain_name) + result = { + 'domainUID': domain_uid, 'secrets': _build_json_secrets_result(model_context, token_dictionary, model_dictionary), 'clusters': _build_json_cluster_result(model_dictionary) } From 02a4cb273cde6a13af587fef23d56ef6c5f075b9 Mon Sep 17 00:00:00 2001 From: Richard Killen Date: Fri, 21 Oct 2022 16:19:20 -0500 Subject: [PATCH 24/24] Revised unit test to use results.json file instead of k8s_secrets.json --- .../wlsdeploy/tool/prepare/prepare_test.py | 30 ++++++++----------- .../prepare/{target.json => target-1.json} | 2 +- 2 files changed, 13 insertions(+), 19 deletions(-) rename core/src/test/resources/prepare/{target.json => target-1.json} (85%) diff --git a/core/src/test/python/wlsdeploy/tool/prepare/prepare_test.py b/core/src/test/python/wlsdeploy/tool/prepare/prepare_test.py index 081ec2e23..6a2ed000d 100644 --- a/core/src/test/python/wlsdeploy/tool/prepare/prepare_test.py +++ b/core/src/test/python/wlsdeploy/tool/prepare/prepare_test.py @@ -1,11 +1,13 @@ """ -Copyright (c) 2021, Oracle and/or its affiliates. +Copyright (c) 2021, 2022, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. """ import os import shutil from base_test import BaseTestCase + +from oracle.weblogic.deploy.util import PyOrderedDict from wlsdeploy.aliases.model_constants import ADMIN_PASSWORD from wlsdeploy.aliases.model_constants import ADMIN_USERNAME from wlsdeploy.aliases.model_constants import DOMAIN_INFO @@ -47,7 +49,7 @@ def setUp(self): if not os.path.exists(target_file): self._establish_directory(targets_dir) self._establish_directory(target_dir) - source_target_file = os.path.join(self.MODELS_DIR, 'target.json') + source_target_file = os.path.join(self.MODELS_DIR, 'target-1.json') shutil.copy(source_target_file, target_file) self._establish_injector_config(config_dir) @@ -126,22 +128,14 @@ def testPrepare(self): # this was never used in the original model self._no_dictionary_key(variables, 'unused.xyz') - # Check the secrets file + # Check the results file - target_secrets_file = os.path.join(output_dir, 'k8s_secrets.json') - secrets_translator = FileToPython(target_secrets_file, use_ordering=True) - secrets_dict = secrets_translator.parse() - secrets_list = secrets_dict['secrets'] - if not isinstance(secrets_list, list): - self.fail('Secrets should be a list') + target_results_file = os.path.join(output_dir, 'results.json') + results_translator = FileToPython(target_results_file, use_ordering=True) + results_dict = results_translator.parse() + secrets_dict = results_dict['secrets'] + if not isinstance(secrets_dict, PyOrderedDict): + self.fail('Secrets should be a PyOrderedDict') # db user secret should retain original value from the variables file - db_secret = self._find_secret(secrets_list, 'jdbc-ds1') - self._match('dsUser9', db_secret, 'keys', 'username') - - def _find_secret(self, secrets, name): - for secret in secrets: - secret_name = self._traverse(secret, 'secretName') - if secret_name == name: - return secret - self.fail('No secret named ' + name) + self._match('dsUser9', secrets_dict, 'jdbc-ds1', 'keys', 'username') diff --git a/core/src/test/resources/prepare/target.json b/core/src/test/resources/prepare/target-1.json similarity index 85% rename from core/src/test/resources/prepare/target.json rename to core/src/test/resources/prepare/target-1.json index 6281748a7..30ffec77b 100644 --- a/core/src/test/resources/prepare/target.json +++ b/core/src/test/resources/prepare/target-1.json @@ -2,7 +2,7 @@ "variable_injectors" : {"PORT": {},"HOST": {},"URL": {}}, "validation_method" : "lax", "credentials_method" : "secrets", - "credentials_output_method" : "json", + "results_output_method" : "json", "wls_credentials_name" : "__weblogic-credentials__", "additional_secrets": "runtime-encryption-secret" }