From 7a929e7df22bf22818100c88a15b12ba20ebe7fa Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 10 Dec 2024 17:28:54 +0100 Subject: [PATCH 01/33] salt, build: automate catalogd install --- buildchain/buildchain/constants.py | 9 + buildchain/buildchain/image.py | 6 + buildchain/buildchain/salt_tree.py | 6 + buildchain/buildchain/versions.py | 12 + .../addons/olm/catalogd/deployed/catalogd.sls | 160 +++++++ .../addons/olm/catalogd/deployed/cert.sls | 57 +++ .../addons/olm/catalogd/deployed/crds.sls | 443 ++++++++++++++++++ .../addons/olm/catalogd/deployed/init.sls | 22 + .../addons/olm/catalogd/deployed/rbac.sls | 178 +++++++ .../addons/olm/catalogd/deployed/webhook.sls | 37 ++ salt/metalk8s/deployed/init.sls | 1 + 11 files changed, 931 insertions(+) create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/cert.sls create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/crds.sls create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/init.sls create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls create mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls diff --git a/buildchain/buildchain/constants.py b/buildchain/buildchain/constants.py index 945105f988..9d6bea84ad 100644 --- a/buildchain/buildchain/constants.py +++ b/buildchain/buildchain/constants.py @@ -32,6 +32,15 @@ PROMETHEUS_REPOSITORY: str = "quay.io/prometheus" THANOS_REPOSITORY: str = "quay.io/thanos" CERT_MANAGER_REPOSITORY: str = "quay.io/jetstack" +OPERATOR_FRAMEWORK_REPOSITORYT: str = "quay.io/operator-framework" +# this repository will disappear in early 2025, +# for now it is used by OLMv1 but most likely they will +# stop using it after they upgrade their version of `kubebuilder` +# cf. https://github.com/kubernetes-sigs/kubebuilder/discussions/3907 +# cf. https://github.com/operator-framework/catalogd/pull/460 +# therefore if you see this comment later in 2025, +# you may not be able to build this. sorry. +KUBE_BUILDER_REPOSITORY: str = "gcr.io/kubebuilder" # Paths {{{ diff --git a/buildchain/buildchain/image.py b/buildchain/buildchain/image.py index 858e473e53..f293c7f434 100644 --- a/buildchain/buildchain/image.py +++ b/buildchain/buildchain/image.py @@ -217,6 +217,12 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: "cert-manager-cainjector", "cert-manager-acmesolver", ], + constants.OPERATOR_FRAMEWORK_REPOSITORYT: [ + "catalogd", + ], + constants.KUBE_BUILDER_REPOSITORY: [ + "kube-rbac-proxy", + ], } REMOTE_NAMES: Dict[str, str] = { diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index 0fdef93c6f..3affdec1b4 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -344,6 +344,12 @@ def task(self) -> types.TaskDict: file_dep=[METALK8S_OPERATOR_MANIFESTS], ), Path("salt/metalk8s/addons/metalk8s-operator/deployed/init.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/cert.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/crds.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/init.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls"), + Path("salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/chart.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/init.sls"), Path("salt/metalk8s/addons/prometheus-operator/macros.j2"), diff --git a/buildchain/buildchain/versions.py b/buildchain/buildchain/versions.py index 93e3f34656..331d6ae4ca 100644 --- a/buildchain/buildchain/versions.py +++ b/buildchain/buildchain/versions.py @@ -32,6 +32,8 @@ CONTAINERD_RELEASE: str = "1" SOSREPORT_RELEASE: str = "2" +OLM_VERSION: str = "1.0.0" + def load_version_information() -> None: """Load version information from `VERSION`.""" @@ -225,6 +227,16 @@ def _version_prefix(version: str, prefix: str = "v") -> str: version="v0.36.1", digest="sha256:e542959e1b36d5046083d1b64a7049c356b68a44a173c58b3ae7c0c9ada932d5", ), + Image( + name="catalogd", + version=_version_prefix(OLM_VERSION), + digest="sha256:f74153f1e83cf3066f6ba1179fa09466e6b1defcbaf628c42c02aca500acd73d", + ), + Image( + name="kube-rbac-proxy", + version="v0.15.0", + digest="sha256:d8cc6ffb98190e8dd403bfe67ddcb454e6127d32b87acc237b3e5240f70a20fb", + ), # Local images Image( name="metalk8s-alert-logger", diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls b/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls new file mode 100644 index 0000000000..81f49de994 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls @@ -0,0 +1,160 @@ +#!jinja | metalk8s_kubernetes +{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} + +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-service + namespace: olmv1-system +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 8443 + - name: webhook + port: 9443 + protocol: TCP + targetPort: 9443 + - name: metrics + port: 7443 + protocol: TCP + targetPort: 7443 + selector: + control-plane: catalogd-controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kubectl.kubernetes.io/default-logs-container: manager + labels: + control-plane: catalogd-controller-manager + name: catalogd-controller-manager + namespace: olmv1-system +spec: + minReadySeconds: 5 + replicas: 1 + selector: + matchLabels: + control-plane: catalogd-controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: catalogd-controller-manager + spec: + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: "" + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --secure-listen-address=0.0.0.0:7443 + - --http2-disable + - --upstream=http://127.0.0.1:8080/ + - --logtostderr=true + image: {{ build_image_name("kube-rbac-proxy") }} + name: kube-rbac-proxy + ports: + - containerPort: 7443 + name: https + protocol: TCP + resources: + requests: + cpu: 5m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + - args: + - --leader-elect + - --metrics-bind-address=127.0.0.1:8080 + - --external-address=catalogd-service.olmv1-system.svc + - --tls-cert=/var/certs/tls.crt + - --tls-key=/var/certs/tls.key + - --ca-certs-dir=/var/ca-certs + command: + - ./manager + image: {{ build_image_name("catalogd") }} + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 200Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/cache/ + name: cache + - mountPath: /var/certs + name: catalogserver-certs + - mountPath: /var/ca-certs/ + name: olmv1-certificate + readOnly: true + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: catalogd-controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - emptyDir: {} + name: cache + - name: catalogserver-certs + secret: + secretName: catalogd-service-cert-v1.0.0 + - name: olmv1-certificate + secret: + items: + - key: ca.crt + path: olm-ca.crt + optional: false + secretName: catalogd-service-cert-v1.0.0 diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls b/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls new file mode 100644 index 0000000000..5205bbdf6c --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls @@ -0,0 +1,57 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: olmv1-ca + namespace: metalk8s-certs +spec: + commonName: olmv1-ca + isCA: true + issuerRef: + group: cert-manager.io + kind: Issuer + name: self-sign-issuer + privateKey: + algorithm: ECDSA + size: 256 + secretName: olmv1-ca + secretTemplate: + annotations: + cert-manager.io/allow-direct-injection: "true" +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: catalogd-service-cert + namespace: olmv1-system +spec: + dnsNames: + - localhost + - catalogd-service.olmv1-system.svc + - catalogd-service.olmv1-system.svc.cluster.local + issuerRef: + group: cert-manager.io + kind: ClusterIssuer + name: olmv1-ca + privateKey: + algorithm: ECDSA + size: 256 + secretName: catalogd-service-cert-v1.0.0 +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: olmv1-ca +spec: + ca: + secretName: olmv1-ca +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: self-sign-issuer + namespace: metalk8s-certs +spec: + selfSigned: {} diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls b/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls new file mode 100644 index 0000000000..eb4a451d96 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls @@ -0,0 +1,443 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: clustercatalogs.olm.operatorframework.io +spec: + group: olm.operatorframework.io + names: + kind: ClusterCatalog + listKind: ClusterCatalogList + plural: clustercatalogs + singular: clustercatalog + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .status.lastUnpacked + name: LastUnpacked + type: date + - jsonPath: .status.conditions[?(@.type=="Serving")].status + name: Serving + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: |- + ClusterCatalog enables users to make File-Based Catalog (FBC) catalog data available to the cluster. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: |- + spec is the desired state of the ClusterCatalog. + spec is required. + The controller will work to ensure that the desired + catalog is unpacked and served over the catalog content HTTP server. + properties: + availabilityMode: + default: Available + description: |- + availabilityMode allows users to define how the ClusterCatalog is made available to clients on the cluster. + availabilityMode is optional. + + Allowed values are "Available" and "Unavailable" and omitted. + + When omitted, the default value is "Available". + + When set to "Available", the catalog contents will be unpacked and served over the catalog content HTTP server. + Setting the availabilityMode to "Available" tells clients that they should consider this ClusterCatalog + and its contents as usable. + + When set to "Unavailable", the catalog contents will no longer be served over the catalog content HTTP server. + When set to this availabilityMode it should be interpreted the same as the ClusterCatalog not existing. + Setting the availabilityMode to "Unavailable" can be useful in scenarios where a user may not want + to delete the ClusterCatalog all together, but would still like it to be treated as if it doesn't exist. + enum: + - Unavailable + - Available + type: string + priority: + default: 0 + description: |- + priority allows the user to define a priority for a ClusterCatalog. + priority is optional. + + A ClusterCatalog's priority is used by clients as a tie-breaker between ClusterCatalogs that meet the client's requirements. + A higher number means higher priority. + + It is up to clients to decide how to handle scenarios where multiple ClusterCatalogs with the same priority meet their requirements. + When deciding how to break the tie in this scenario, it is recommended that clients prompt their users for additional input. + + When omitted, the default priority is 0 because that is the zero value of integers. + + Negative numbers can be used to specify a priority lower than the default. + Positive numbers can be used to specify a priority higher than the default. + + The lowest possible value is -2147483648. + The highest possible value is 2147483647. + format: int32 + type: integer + source: + description: |- + source allows a user to define the source of a catalog. + A "catalog" contains information on content that can be installed on a cluster. + Providing a catalog source makes the contents of the catalog discoverable and usable by + other on-cluster components. + These on-cluster components may do a variety of things with this information, such as + presenting the content in a GUI dashboard or installing content from the catalog on the cluster. + The catalog source must contain catalog metadata in the File-Based Catalog (FBC) format. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs. + source is a required field. + + Below is a minimal example of a ClusterCatalogSpec that sources a catalog from an image: + + source: + type: Image + image: + ref: quay.io/operatorhubio/catalog:latest + properties: + image: + description: |- + image is used to configure how catalog contents are sourced from an OCI image. + This field is required when type is Image, and forbidden otherwise. + properties: + pollIntervalMinutes: + description: |- + pollIntervalMinutes allows the user to set the interval, in minutes, at which the image source should be polled for new content. + pollIntervalMinutes is optional. + pollIntervalMinutes can not be specified when ref is a digest-based reference. + + When omitted, the image will not be polled for new content. + minimum: 1 + type: integer + ref: + description: |- + ref allows users to define the reference to a container image containing Catalog contents. + ref is required. + ref can not be more than 1000 characters. + + A reference can be broken down into 3 parts - the domain, name, and identifier. + + The domain is typically the registry where an image is located. + It must be alphanumeric characters (lowercase and uppercase) separated by the "." character. + Hyphenation is allowed, but the domain must start and end with alphanumeric characters. + Specifying a port to use is also allowed by adding the ":" character followed by numeric values. + The port must be the last value in the domain. + Some examples of valid domain values are "registry.mydomain.io", "quay.io", "my-registry.io:8080". + + The name is typically the repository in the registry where an image is located. + It must contain lowercase alphanumeric characters separated only by the ".", "_", "__", "-" characters. + Multiple names can be concatenated with the "/" character. + The domain and name are combined using the "/" character. + Some examples of valid name values are "operatorhubio/catalog", "catalog", "my-catalog.prod". + An example of the domain and name parts of a reference being combined is "quay.io/operatorhubio/catalog". + + The identifier is typically the tag or digest for an image reference and is present at the end of the reference. + It starts with a separator character used to distinguish the end of the name and beginning of the identifier. + For a digest-based reference, the "@" character is the separator. + For a tag-based reference, the ":" character is the separator. + An identifier is required in the reference. + + Digest-based references must contain an algorithm reference immediately after the "@" separator. + The algorithm reference must be followed by the ":" character and an encoded string. + The algorithm must start with an uppercase or lowercase alpha character followed by alphanumeric characters and may contain the "-", "_", "+", and "." characters. + Some examples of valid algorithm values are "sha256", "sha256+b64u", "multihash+base58". + The encoded string following the algorithm must be hex digits (a-f, A-F, 0-9) and must be a minimum of 32 characters. + + Tag-based references must begin with a word character (alphanumeric + "_") followed by word characters or ".", and "-" characters. + The tag must not be longer than 127 characters. + + An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" + An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest" + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest or a tag + rule: self.find('(@.*:)') != "" || self.find(':.*$') != + "" + - message: tag is invalid. the tag must not be more than 127 + characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').substring(1).size() <= 127 + : true) : true' + - message: tag is invalid. valid tags must begin with a word + character (alphanumeric + "_") followed by word characters + or ".", and "-" characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').matches('':[\\w][\\w.-]*$'') + : true) : true' + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + x-kubernetes-validations: + - message: cannot specify pollIntervalMinutes while using digest-based + image + rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) + : true' + type: + description: |- + type is a reference to the type of source the catalog is sourced from. + type is required. + + The only allowed value is "Image". + + When set to "Image", the ClusterCatalog content will be sourced from an OCI image. + When using an image source, the image field must be set and must be the only field defined for this type. + enum: + - Image + type: string + required: + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + required: + - source + type: object + status: + description: |- + status contains information about the state of the ClusterCatalog such as: + - Whether or not the catalog contents are being served via the catalog content HTTP server + - Whether or not the ClusterCatalog is progressing to a new state + - A reference to the source from which the catalog contents were retrieved + properties: + conditions: + description: |- + conditions is a representation of the current state for this ClusterCatalog. + + The current condition types are Serving and Progressing. + + The Serving condition is used to represent whether or not the contents of the catalog is being served via the HTTP(S) web server. + When it has a status of True and a reason of Available, the contents of the catalog are being served. + When it has a status of False and a reason of Unavailable, the contents of the catalog are not being served because the contents are not yet available. + When it has a status of False and a reason of UserSpecifiedUnavailable, the contents of the catalog are not being served because the catalog has been intentionally marked as unavailable. + + The Progressing condition is used to represent whether or not the ClusterCatalog is progressing or is ready to progress towards a new state. + When it has a status of True and a reason of Retrying, there was an error in the progression of the ClusterCatalog that may be resolved on subsequent reconciliation attempts. + When it has a status of True and a reason of Succeeded, the ClusterCatalog has successfully progressed to a new state and is ready to continue progressing. + When it has a status of False and a reason of Blocked, there was an error in the progression of the ClusterCatalog that requires manual intervention for recovery. + + In the case that the Serving condition is True with reason Available and Progressing is True with reason Retrying, the previously fetched + catalog contents are still being served via the HTTP(S) web server while we are progressing towards serving a new version of the catalog + contents. This could occur when we've initially fetched the latest contents from the source for this catalog and when polling for changes + to the contents we identify that there are updates to the contents. + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + lastUnpacked: + description: |- + lastUnpacked represents the last time the contents of the + catalog were extracted from their source format. As an example, + when using an Image source, the OCI image will be pulled and the + image layers written to a file-system backed cache. We refer to the + act of this extraction from the source format as "unpacking". + format: date-time + type: string + resolvedSource: + description: resolvedSource contains information about the resolved + source based on the source type. + properties: + image: + description: |- + image is a field containing resolution information for a catalog sourced from an image. + This field must be set when type is Image, and forbidden otherwise. + properties: + ref: + description: |- + ref contains the resolved image digest-based reference. + The digest format is used so users can use other tooling to fetch the exact + OCI manifests that were used to extract the catalog contents. + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest + rule: self.find('(@.*:)') != "" + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + type: + description: |- + type is a reference to the type of source the catalog is sourced from. + type is required. + + The only allowed value is "Image". + + When set to "Image", information about the resolved image source will be set in the 'image' field. + enum: + - Image + type: string + required: + - image + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + urls: + description: urls contains the URLs that can be used to access the + catalog. + properties: + base: + description: |- + base is a cluster-internal URL that provides endpoints for + accessing the content of the catalog. + + It is expected that clients append the path for the endpoint they wish + to access. + + Currently, only a single endpoint is served and is accessible at the path + /api/v1. + + The endpoints served for the v1 API are: + - /all - this endpoint returns the entirety of the catalog contents in the FBC format + + As the needs of users and clients of the evolve, new endpoints may be added. + maxLength: 525 + type: string + x-kubernetes-validations: + - message: must be a valid URL + rule: isURL(self) + - message: scheme must be either http or https + rule: 'isURL(self) ? (url(self).getScheme() == "http" || url(self).getScheme() + == "https") : true' + required: + - base + type: object + type: object + required: + - metadata + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/init.sls b/salt/metalk8s/addons/olm/catalogd/deployed/init.sls new file mode 100644 index 0000000000..ae4955e927 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/init.sls @@ -0,0 +1,22 @@ +include: + - .crds + - .rbac + - .cert + - .catalogd + - .webhook + +Wait for the Catalogd Controller Manager deployment to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=catalogd-controller-manager, namespace=olmv1-system) + - comment: Wait for the Catalog Operator to be Ready + - retry: + attempts: 30 + - require: + - sls: metalk8s.addons.olm.catalogd.deployed.crds + - sls: metalk8s.addons.olm.catalogd.deployed.rbac + - sls: metalk8s.addons.olm.catalogd.deployed.cert + - sls: metalk8s.addons.olm.catalogd.deployed.catalogd + - sls: metalk8s.addons.olm.catalogd.deployed.webhook diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls b/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls new file mode 100644 index 0000000000..139cd02b15 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls @@ -0,0 +1,178 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/part-of: olm + pod-security.kubernetes.io/enforce: baseline + pod-security.kubernetes.io/enforce-version: latest + name: olmv1-system + annotations: + scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-leader-election-role + namespace: olmv1-system +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: catalogd-manager-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/finalizers + verbs: + - update +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/status + verbs: + - get + - patch + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-leader-election-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: catalogd-leader-election-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-manager-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: olm + name: catalogd-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-proxy-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls b/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls new file mode 100644 index 0000000000..cca8bb25dc --- /dev/null +++ b/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls @@ -0,0 +1,37 @@ +#!jinja | metalk8s_kubernetes + +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from-secret: metalk8s-certs/olmv1-ca + name: catalogd-mutating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + clientConfig: + service: + name: catalogd-service + namespace: olmv1-system + path: /mutate-olm-operatorframework-io-v1-clustercatalog + port: 9443 + failurePolicy: Fail + matchConditions: + - expression: '''name'' in object.metadata && (!has(object.metadata.labels) || !(''olm.operatorframework.io/metadata.name'' + in object.metadata.labels) || object.metadata.labels[''olm.operatorframework.io/metadata.name''] + != object.metadata.name)' + name: MissingOrIncorrectMetadataNameLabel + name: inject-metadata-name.olm.operatorframework.io + rules: + - apiGroups: + - olm.operatorframework.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - clustercatalogs + sideEffects: None + timeoutSeconds: 10 + diff --git a/salt/metalk8s/deployed/init.sls b/salt/metalk8s/deployed/init.sls index dec83efe11..c549830eef 100644 --- a/salt/metalk8s/deployed/init.sls +++ b/salt/metalk8s/deployed/init.sls @@ -3,6 +3,7 @@ include: - metalk8s.addons.alert-logger.deployed - metalk8s.addons.prometheus-operator.deployed - metalk8s.addons.cert-manager.deployed + - metalk8s.addons.olm.catalogd.deployed - metalk8s.addons.nginx-ingress.deployed - metalk8s.addons.nginx-ingress-control-plane.deployed - metalk8s.addons.volumes.deployed From 9a1491ee15be6f0a64c19aec2e56eee31e01f541 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Wed, 11 Dec 2024 15:27:03 +0100 Subject: [PATCH 02/33] [WIP] salt, build: automate operator-controller install --- buildchain/buildchain/image.py | 1 + buildchain/buildchain/salt_tree.py | 7 + buildchain/buildchain/versions.py | 5 + .../olm/operator-controller/deployed/cert.sls | 53 ++ .../olm/operator-controller/deployed/crds.sls | 591 ++++++++++++++++++ .../olm/operator-controller/deployed/init.sls | 22 + .../deployed/operator-controller.sls | 143 +++++ .../olm/operator-controller/deployed/rbac.sls | 271 ++++++++ salt/metalk8s/deployed/init.sls | 1 + 9 files changed, 1094 insertions(+) create mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls create mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls create mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/init.sls create mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls create mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls diff --git a/buildchain/buildchain/image.py b/buildchain/buildchain/image.py index f293c7f434..0e5153c293 100644 --- a/buildchain/buildchain/image.py +++ b/buildchain/buildchain/image.py @@ -219,6 +219,7 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: ], constants.OPERATOR_FRAMEWORK_REPOSITORYT: [ "catalogd", + "operator-controller", ], constants.KUBE_BUILDER_REPOSITORY: [ "kube-rbac-proxy", diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index 3affdec1b4..88fe113b7f 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -350,6 +350,13 @@ def task(self) -> types.TaskDict: Path("salt/metalk8s/addons/olm/catalogd/deployed/init.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls"), + Path("salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls"), + Path("salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls"), + Path("salt/metalk8s/addons/olm/operator-controller/deployed/init.sls"), + Path( + "salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls" + ), + Path("salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/chart.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/init.sls"), Path("salt/metalk8s/addons/prometheus-operator/macros.j2"), diff --git a/buildchain/buildchain/versions.py b/buildchain/buildchain/versions.py index 331d6ae4ca..0f8adbf149 100644 --- a/buildchain/buildchain/versions.py +++ b/buildchain/buildchain/versions.py @@ -232,6 +232,11 @@ def _version_prefix(version: str, prefix: str = "v") -> str: version=_version_prefix(OLM_VERSION), digest="sha256:f74153f1e83cf3066f6ba1179fa09466e6b1defcbaf628c42c02aca500acd73d", ), + Image( + name="operator-controller", + version=_version_prefix(OLM_VERSION), + digest="sha256:a07181e9c9ce02eb7b5c9f12e3fce58bec416b05adbe946982a8273d3ffbc4d3", + ), Image( name="kube-rbac-proxy", version="v0.15.0", diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls new file mode 100644 index 0000000000..d5d1fed77d --- /dev/null +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls @@ -0,0 +1,53 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: olmv1-ca + namespace: metalk8s-certs +spec: + commonName: olmv1-ca + isCA: true + issuerRef: + group: cert-manager.io + kind: Issuer + name: self-sign-issuer + privateKey: + algorithm: ECDSA + size: 256 + secretName: olmv1-ca +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: olmv1-cert + namespace: olmv1-system +spec: + dnsNames: + - operator-controller.olmv1-system.svc + - operator-controller.olmv1-system.svc.cluster.local + issuerRef: + group: cert-manager.io + kind: ClusterIssuer + name: olmv1-ca + privateKey: + algorithm: ECDSA + size: 256 + secretName: olmv1-cert +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: olmv1-ca +spec: + ca: + secretName: olmv1-ca +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: self-sign-issuer + namespace: metalk8s-certs +spec: + selfSigned: {} diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls new file mode 100644 index 0000000000..cf481587d8 --- /dev/null +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls @@ -0,0 +1,591 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: clusterextensions.olm.operatorframework.io +spec: + group: olm.operatorframework.io + names: + kind: ClusterExtension + listKind: ClusterExtensionList + plural: clusterextensions + singular: clusterextension + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .status.install.bundle.name + name: Installed Bundle + type: string + - jsonPath: .status.install.bundle.version + name: Version + type: string + - jsonPath: .status.conditions[?(@.type=='Installed')].status + name: Installed + type: string + - jsonPath: .status.conditions[?(@.type=='Progressing')].status + name: Progressing + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: ClusterExtension is the Schema for the clusterextensions API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec is an optional field that defines the desired state + of the ClusterExtension. + properties: + install: + description: |- + install is an optional field used to configure the installation options + for the ClusterExtension such as the pre-flight check configuration. + properties: + preflight: + description: |- + preflight is an optional field that can be used to configure the checks that are + run before installation or upgrade of the content for the package specified in the packageName field. + + When specified, it replaces the default preflight configuration for install/upgrade actions. + When not specified, the default configuration will be used. + properties: + crdUpgradeSafety: + description: |- + crdUpgradeSafety is used to configure the CRD Upgrade Safety pre-flight + checks that run prior to upgrades of installed content. + + The CRD Upgrade Safety pre-flight check safeguards from unintended + consequences of upgrading a CRD, such as data loss. + properties: + enforcement: + description: |- + enforcement is a required field, used to configure the state of the CRD Upgrade Safety pre-flight check. + + Allowed values are "None" or "Strict". The default value is "Strict". + + When set to "None", the CRD Upgrade Safety pre-flight check will be skipped + when performing an upgrade operation. This should be used with caution as + unintended consequences such as data loss can occur. + + When set to "Strict", the CRD Upgrade Safety pre-flight check will be run when + performing an upgrade operation. + enum: + - None + - Strict + type: string + required: + - enforcement + type: object + required: + - crdUpgradeSafety + type: object + x-kubernetes-validations: + - message: at least one of [crdUpgradeSafety] are required when + preflight is specified + rule: has(self.crdUpgradeSafety) + type: object + x-kubernetes-validations: + - message: at least one of [preflight] are required when install is + specified + rule: has(self.preflight) + namespace: + description: |- + namespace is a reference to a Kubernetes namespace. + This is the namespace in which the provided ServiceAccount must exist. + It also designates the default namespace where namespace-scoped resources + for the extension are applied to the cluster. + Some extensions may contain namespace-scoped resources to be applied in other namespaces. + This namespace must exist. + + namespace is required, immutable, and follows the DNS label standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters or hyphens (-), + start and end with an alphanumeric character, and be no longer than 63 characters + + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 63 + type: string + x-kubernetes-validations: + - message: namespace is immutable + rule: self == oldSelf + - message: namespace must be a valid DNS1123 label + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") + serviceAccount: + description: |- + serviceAccount is a reference to a ServiceAccount used to perform all interactions + with the cluster that are required to manage the extension. + The ServiceAccount must be configured with the necessary permissions to perform these interactions. + The ServiceAccount must exist in the namespace referenced in the spec. + serviceAccount is required. + properties: + name: + description: |- + name is a required, immutable reference to the name of the ServiceAccount + to be used for installation and management of the content for the package + specified in the packageName field. + + This ServiceAccount must exist in the installNamespace. + + name follows the DNS subdomain standard as defined in [RFC 1123]. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + + Some examples of valid values are: + - some-serviceaccount + - 123-serviceaccount + - 1-serviceaccount-2 + - someserviceaccount + - some.serviceaccount + + Some examples of invalid values are: + - -some-serviceaccount + - some-serviceaccount- + + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 253 + type: string + x-kubernetes-validations: + - message: name is immutable + rule: self == oldSelf + - message: name must be a valid DNS1123 subdomain. It must contain + only lowercase alphanumeric characters, hyphens (-) or periods + (.), start and end with an alphanumeric character, and be + no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + required: + - name + type: object + source: + description: |- + source is a required field which selects the installation source of content + for this ClusterExtension. Selection is performed by setting the sourceType. + + Catalog is currently the only implemented sourceType, and setting the + sourcetype to "Catalog" requires the catalog field to also be defined. + + Below is a minimal example of a source definition (in yaml): + + source: + sourceType: Catalog + catalog: + packageName: example-package + properties: + catalog: + description: |- + catalog is used to configure how information is sourced from a catalog. + This field is required when sourceType is "Catalog", and forbidden otherwise. + properties: + channels: + description: |- + channels is an optional reference to a set of channels belonging to + the package specified in the packageName field. + + A "channel" is a package-author-defined stream of updates for an extension. + + Each channel in the list must follow the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. No more than 256 channels can be specified. + + When specified, it is used to constrain the set of installable bundles and + the automated upgrade path. This constraint is an AND operation with the + version field. For example: + - Given channel is set to "foo" + - Given version is set to ">=1.0.0, <1.5.0" + - Only bundles that exist in channel "foo" AND satisfy the version range comparison will be considered installable + - Automatic upgrades will be constrained to upgrade edges defined by the selected channel + + When unspecified, upgrade edges across all channels will be used to identify valid automatic upgrade paths. + + Some examples of valid values are: + - 1.1.x + - alpha + - stable + - stable-v1 + - v1-stable + - dev-preview + - preview + - community + + Some examples of invalid values are: + - -some-channel + - some-channel- + - thisisareallylongchannelnamethatisgreaterthanthemaximumlength + - original_40 + - --default-channel + + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + items: + maxLength: 253 + type: string + x-kubernetes-validations: + - message: channels entries must be valid DNS1123 subdomains + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + maxItems: 256 + type: array + packageName: + description: |- + packageName is a reference to the name of the package to be installed + and is used to filter the content from catalogs. + + packageName is required, immutable, and follows the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + + Some examples of valid values are: + - some-package + - 123-package + - 1-package-2 + - somepackage + + Some examples of invalid values are: + - -some-package + - some-package- + - thisisareallylongpackagenamethatisgreaterthanthemaximumlength + - some.package + + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 253 + type: string + x-kubernetes-validations: + - message: packageName is immutable + rule: self == oldSelf + - message: packageName must be a valid DNS1123 subdomain. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric + character, and be no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + selector: + description: |- + selector is an optional field that can be used + to filter the set of ClusterCatalogs used in the bundle + selection process. + + When unspecified, all ClusterCatalogs will be used in + the bundle selection process. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + upgradeConstraintPolicy: + default: CatalogProvided + description: |- + upgradeConstraintPolicy is an optional field that controls whether + the upgrade path(s) defined in the catalog are enforced for the package + referenced in the packageName field. + + Allowed values are: "CatalogProvided" or "SelfCertified", or omitted. + + When this field is set to "CatalogProvided", automatic upgrades will only occur + when upgrade constraints specified by the package author are met. + + When this field is set to "SelfCertified", the upgrade constraints specified by + the package author are ignored. This allows for upgrades and downgrades to + any version of the package. This is considered a dangerous operation as it + can lead to unknown and potentially disastrous outcomes, such as data + loss. It is assumed that users have independently verified changes when + using this option. + + When this field is omitted, the default value is "CatalogProvided". + enum: + - CatalogProvided + - SelfCertified + type: string + version: + description: |- + version is an optional semver constraint (a specific version or range of versions). When unspecified, the latest version available will be installed. + + Acceptable version ranges are no longer than 64 characters. + Version ranges are composed of comma- or space-delimited values and one or + more comparison operators, known as comparison strings. Additional + comparison strings can be added using the OR operator (||). + + # Range Comparisons + + To specify a version range, you can use a comparison string like ">=3.0, + <3.6". When specifying a range, automatic updates will occur within that + range. The example comparison string means "install any version greater than + or equal to 3.0.0 but less than 3.6.0.". It also states intent that if any + upgrades are available within the version range after initial installation, + those upgrades should be automatically performed. + + # Pinned Versions + + To specify an exact version to install you can use a version range that + "pins" to a specific version. When pinning to a specific version, no + automatic updates will occur. An example of a pinned version range is + "0.6.0", which means "only install version 0.6.0 and never + upgrade from this version". + + # Basic Comparison Operators + + The basic comparison operators and their meanings are: + - "=", equal (not aliased to an operator) + - "!=", not equal + - "<", less than + - ">", greater than + - ">=", greater than OR equal to + - "<=", less than OR equal to + + # Wildcard Comparisons + + You can use the "x", "X", and "*" characters as wildcard characters in all + comparison operations. Some examples of using the wildcard characters: + - "1.2.x", "1.2.X", and "1.2.*" is equivalent to ">=1.2.0, < 1.3.0" + - ">= 1.2.x", ">= 1.2.X", and ">= 1.2.*" is equivalent to ">= 1.2.0" + - "<= 2.x", "<= 2.X", and "<= 2.*" is equivalent to "< 3" + - "x", "X", and "*" is equivalent to ">= 0.0.0" + + # Patch Release Comparisons + + When you want to specify a minor version up to the next major version you + can use the "~" character to perform patch comparisons. Some examples: + - "~1.2.3" is equivalent to ">=1.2.3, <1.3.0" + - "~1" and "~1.x" is equivalent to ">=1, <2" + - "~2.3" is equivalent to ">=2.3, <2.4" + - "~1.2.x" is equivalent to ">=1.2.0, <1.3.0" + + # Major Release Comparisons + + You can use the "^" character to make major release comparisons after a + stable 1.0.0 version is published. If there is no stable version published, // minor versions define the stability level. Some examples: + - "^1.2.3" is equivalent to ">=1.2.3, <2.0.0" + - "^1.2.x" is equivalent to ">=1.2.0, <2.0.0" + - "^2.3" is equivalent to ">=2.3, <3" + - "^2.x" is equivalent to ">=2.0.0, <3" + - "^0.2.3" is equivalent to ">=0.2.3, <0.3.0" + - "^0.2" is equivalent to ">=0.2.0, <0.3.0" + - "^0.0.3" is equvalent to ">=0.0.3, <0.0.4" + - "^0.0" is equivalent to ">=0.0.0, <0.1.0" + - "^0" is equivalent to ">=0.0.0, <1.0.0" + + # OR Comparisons + You can use the "||" character to represent an OR operation in the version + range. Some examples: + - ">=1.2.3, <2.0.0 || >3.0.0" + - "^0 || ^3 || ^5" + + For more information on semver, please see https://semver.org/ + maxLength: 64 + type: string + x-kubernetes-validations: + - message: invalid version expression + rule: self.matches("^(\\s*(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|[x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*]))?(\\.(0|[1-9]\\d*|x|X|\\*))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)((?:\\s+|,\\s*|\\s*\\|\\|\\s*)(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*))?(\\.(0|[1-9]\\d*|x|X|\\*]))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)*$") + required: + - packageName + type: object + sourceType: + description: |- + sourceType is a required reference to the type of install source. + + Allowed values are "Catalog" + + When this field is set to "Catalog", information for determining the + appropriate bundle of content to install will be fetched from + ClusterCatalog resources existing on the cluster. + When using the Catalog sourceType, the catalog field must also be set. + enum: + - Catalog + type: string + required: + - sourceType + type: object + x-kubernetes-validations: + - message: catalog is required when sourceType is Catalog, and forbidden + otherwise + rule: 'has(self.sourceType) && self.sourceType == ''Catalog'' ? + has(self.catalog) : !has(self.catalog)' + required: + - namespace + - serviceAccount + - source + type: object + status: + description: status is an optional field that defines the observed state + of the ClusterExtension. + properties: + conditions: + description: |- + The set of condition types which apply to all spec.source variations are Installed and Progressing. + + The Installed condition represents whether or not the bundle has been installed for this ClusterExtension. + When Installed is True and the Reason is Succeeded, the bundle has been successfully installed. + When Installed is False and the Reason is Failed, the bundle has failed to install. + + The Progressing condition represents whether or not the ClusterExtension is advancing towards a new state. + When Progressing is True and the Reason is Succeeded, the ClusterExtension is making progress towards a new state. + When Progressing is True and the Reason is Retrying, the ClusterExtension has encountered an error that could be resolved on subsequent reconciliation attempts. + When Progressing is False and the Reason is Blocked, the ClusterExtension has encountered an error that requires manual intervention for recovery. + + When the ClusterExtension is sourced from a catalog, if may also communicate a deprecation condition. + These are indications from a package owner to guide users away from a particular package, channel, or bundle. + BundleDeprecated is set if the requested bundle version is marked deprecated in the catalog. + ChannelDeprecated is set if the requested channel is marked deprecated in the catalog. + PackageDeprecated is set if the requested package is marked deprecated in the catalog. + Deprecated is a rollup condition that is present when any of the deprecated conditions are present. + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + install: + description: install is a representation of the current installation + status for this ClusterExtension. + properties: + bundle: + description: |- + bundle is a required field which represents the identifying attributes of a bundle. + + A "bundle" is a versioned set of content that represents the resources that + need to be applied to a cluster to install a package. + properties: + name: + description: |- + name is required and follows the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + type: string + x-kubernetes-validations: + - message: packageName must be a valid DNS1123 subdomain. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric + character, and be no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + version: + description: |- + version is a required field and is a reference to the version that this bundle represents + version follows the semantic versioning standard as defined in https://semver.org/. + type: string + x-kubernetes-validations: + - message: version must be well-formed semver + rule: self.matches("^([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(-([-0-9A-Za-z]+(\\.[-0-9A-Za-z]+)*))?(\\+([-0-9A-Za-z]+(-\\.[-0-9A-Za-z]+)*))?") + required: + - name + - version + type: object + required: + - bundle + type: object + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls new file mode 100644 index 0000000000..3a0c2dcf6c --- /dev/null +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls @@ -0,0 +1,22 @@ +include: + - ...catalogd.deployed + - .crds + - .rbac + - .cert + - .operator-controller + +Wait for the Operator Controller Controller Manager Deployment to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=operator-controller-controller-manager, namespace=olmv1-system) + - comment: Wait for the Operator Controller to be Ready + - retry: + attempts: 30 + - require: + - test: Wait for the Catalogd Controller Manager deployment to be Ready + - sls: metalk8s.addons.olm.operator-controller.deployed.crds + - sls: metalk8s.addons.olm.operator-controller.deployed.rbac + - sls: metalk8s.addons.olm.operator-controller.deployed.cert + - sls: metalk8s.addons.olm.operator-controller.deployed.operator-controller diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls new file mode 100644 index 0000000000..e9a2acf2ef --- /dev/null +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls @@ -0,0 +1,143 @@ +#!jinja | metalk8s_kubernetes +{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} + +--- +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: operator-controller-controller-manager + name: operator-controller-controller-manager-metrics-service + namespace: olmv1-system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: operator-controller-controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kubectl.kubernetes.io/default-logs-container: manager + labels: + control-plane: operator-controller-controller-manager + name: operator-controller-controller-manager + namespace: olmv1-system +spec: + replicas: 1 + selector: + matchLabels: + control-plane: operator-controller-controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: operator-controller-controller-manager + spec: + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: "" + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --health-probe-bind-address=:8081 + - --metrics-bind-address=127.0.0.1:8080 + - --leader-elect + - --ca-certs-dir=/var/certs + command: + - /manager + image: {{ build_image_name("operator-controller") }} + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/cache + name: cache + - mountPath: /var/certs/ + name: olmv1-certificate + readOnly: true + - args: + - --secure-listen-address=0.0.0.0:8443 + - --http2-disable + - --upstream=http://127.0.0.1:8080/ + - --logtostderr=true + image: {{ build_image_name("kube-rbac-proxy") }} + name: kube-rbac-proxy + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + requests: + cpu: 5m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: operator-controller-controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - emptyDir: {} + name: cache + - name: olmv1-certificate + secret: + items: + - key: ca.crt + path: olm-ca.crt + optional: false + secretName: olmv1-cert diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls new file mode 100644 index 0000000000..bfad5a06bc --- /dev/null +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls @@ -0,0 +1,271 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: v1 +kind: Namespace +metadata: + labels: + pod-security.kubernetes.io/enforce: restricted + pod-security.kubernetes.io/enforce-version: latest + name: olmv1-system + annotations: + scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: operator-controller-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: operator-controller-leader-election-role + namespace: olmv1-system +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: operator-controller-manager-role + namespace: olmv1-system +rules: +- apiGroups: + - "" + resources: + - secrets + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-clusterextension-editor-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-clusterextension-viewer-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-extension-editor-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - extensions + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-extension-viewer-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - extensions + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-manager-role +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get +- apiGroups: + - "" + resources: + - serviceaccounts/token + verbs: + - create +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs + verbs: + - get + - list + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions + verbs: + - get + - list + - patch + - update + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions/finalizers + verbs: + - update +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions/status + verbs: + - patch + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-controller-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: operator-controller-leader-election-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: operator-controller-leader-election-role +subjects: +- kind: ServiceAccount + name: operator-controller-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: operator-controller-manager-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: operator-controller-manager-role +subjects: +- kind: ServiceAccount + name: operator-controller-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operator-controller-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operator-controller-manager-role +subjects: +- kind: ServiceAccount + name: operator-controller-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operator-controller-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operator-controller-proxy-role +subjects: +- kind: ServiceAccount + name: operator-controller-controller-manager + namespace: olmv1-system diff --git a/salt/metalk8s/deployed/init.sls b/salt/metalk8s/deployed/init.sls index c549830eef..a91c8a694d 100644 --- a/salt/metalk8s/deployed/init.sls +++ b/salt/metalk8s/deployed/init.sls @@ -4,6 +4,7 @@ include: - metalk8s.addons.prometheus-operator.deployed - metalk8s.addons.cert-manager.deployed - metalk8s.addons.olm.catalogd.deployed + - metalk8s.addons.olm.operator-controller.deployed - metalk8s.addons.nginx-ingress.deployed - metalk8s.addons.nginx-ingress-control-plane.deployed - metalk8s.addons.volumes.deployed From 5177d3641321888b171e7de67581ffcb6ff61215 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 12 Dec 2024 15:43:09 +0100 Subject: [PATCH 03/33] salt: wait for cert-manager before installing olm --- .../addons/cert-manager/deployed/init.sls | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/salt/metalk8s/addons/cert-manager/deployed/init.sls b/salt/metalk8s/addons/cert-manager/deployed/init.sls index 9510d7dddb..bf5ba53776 100644 --- a/salt/metalk8s/addons/cert-manager/deployed/init.sls +++ b/salt/metalk8s/addons/cert-manager/deployed/init.sls @@ -1,3 +1,39 @@ include: - .namespace - .chart + +Wait for cert-manager deployment to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=cert-manager, namespace=metalk8s-certs) + - comment: wait for cert-manager + - retry: + attempts: 30 + - require: + - sls: metalk8s.addons.cert-manager.deployed.chart + +Wait for cert-manager webhook to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=cert-manager-webhook, namespace=metalk8s-certs) + - comment: wait for cert-manager-webhook + - retry: + attempts: 30 + - require: + - sls: metalk8s.addons.cert-manager.deployed.chart + +Wait for cert-manager cainjector to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=cert-manager-cainjector, namespace=metalk8s-certs) + - comment: wait for cert-manager-cainjector + - retry: + attempts: 30 + - require: + - sls: metalk8s.addons.cert-manager.deployed.chart From 4d16482da8dc87636124f7056a73453de2fbaafd Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 13 Dec 2024 15:39:12 +0100 Subject: [PATCH 04/33] salt: move common olmv1 components to new folder --- buildchain/buildchain/salt_tree.py | 3 ++ .../addons/olm/catalogd/deployed/cert.sls | 36 ------------------ .../addons/olm/catalogd/deployed/init.sls | 2 + .../addons/olm/catalogd/deployed/rbac.sls | 11 ------ .../addons/olm/common/deployed/cert.sls | 38 +++++++++++++++++++ .../addons/olm/common/deployed/init.sls | 9 +++++ .../addons/olm/common/deployed/namespace.sls | 13 +++++++ .../olm/operator-controller/deployed/cert.sls | 33 ---------------- .../olm/operator-controller/deployed/init.sls | 2 + .../olm/operator-controller/deployed/rbac.sls | 10 ----- 10 files changed, 67 insertions(+), 90 deletions(-) create mode 100644 salt/metalk8s/addons/olm/common/deployed/cert.sls create mode 100644 salt/metalk8s/addons/olm/common/deployed/init.sls create mode 100644 salt/metalk8s/addons/olm/common/deployed/namespace.sls diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index 88fe113b7f..93dadf5d44 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -350,6 +350,9 @@ def task(self) -> types.TaskDict: Path("salt/metalk8s/addons/olm/catalogd/deployed/init.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls"), + Path("salt/metalk8s/addons/olm/common/deployed/cert.sls"), + Path("salt/metalk8s/addons/olm/common/deployed/init.sls"), + Path("salt/metalk8s/addons/olm/common/deployed/namespace.sls"), Path("salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls"), Path("salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls"), Path("salt/metalk8s/addons/olm/operator-controller/deployed/init.sls"), diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls b/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls index 5205bbdf6c..8b6df873a4 100644 --- a/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls +++ b/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls @@ -1,25 +1,5 @@ #!jinja | metalk8s_kubernetes ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: olmv1-ca - namespace: metalk8s-certs -spec: - commonName: olmv1-ca - isCA: true - issuerRef: - group: cert-manager.io - kind: Issuer - name: self-sign-issuer - privateKey: - algorithm: ECDSA - size: 256 - secretName: olmv1-ca - secretTemplate: - annotations: - cert-manager.io/allow-direct-injection: "true" --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -39,19 +19,3 @@ spec: algorithm: ECDSA size: 256 secretName: catalogd-service-cert-v1.0.0 ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: olmv1-ca -spec: - ca: - secretName: olmv1-ca ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: self-sign-issuer - namespace: metalk8s-certs -spec: - selfSigned: {} diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/init.sls b/salt/metalk8s/addons/olm/catalogd/deployed/init.sls index ae4955e927..635b3b8363 100644 --- a/salt/metalk8s/addons/olm/catalogd/deployed/init.sls +++ b/salt/metalk8s/addons/olm/catalogd/deployed/init.sls @@ -1,4 +1,5 @@ include: + - ...common.deployed - .crds - .rbac - .cert @@ -15,6 +16,7 @@ Wait for the Catalogd Controller Manager deployment to be Ready: - retry: attempts: 30 - require: + - test: Deploy common OLMv1 components - sls: metalk8s.addons.olm.catalogd.deployed.crds - sls: metalk8s.addons.olm.catalogd.deployed.rbac - sls: metalk8s.addons.olm.catalogd.deployed.cert diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls b/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls index 139cd02b15..bb1bfd88c6 100644 --- a/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls +++ b/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls @@ -1,16 +1,5 @@ #!jinja | metalk8s_kubernetes ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - app.kubernetes.io/part-of: olm - pod-security.kubernetes.io/enforce: baseline - pod-security.kubernetes.io/enforce-version: latest - name: olmv1-system - annotations: - scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' --- apiVersion: v1 kind: ServiceAccount diff --git a/salt/metalk8s/addons/olm/common/deployed/cert.sls b/salt/metalk8s/addons/olm/common/deployed/cert.sls new file mode 100644 index 0000000000..9df69f8655 --- /dev/null +++ b/salt/metalk8s/addons/olm/common/deployed/cert.sls @@ -0,0 +1,38 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: olmv1-ca + namespace: metalk8s-certs +spec: + commonName: olmv1-ca + isCA: true + issuerRef: + group: cert-manager.io + kind: Issuer + name: self-sign-issuer + privateKey: + algorithm: ECDSA + size: 256 + secretName: olmv1-ca + secretTemplate: + annotations: + cert-manager.io/allow-direct-injection: "true" +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: olmv1-ca +spec: + ca: + secretName: olmv1-ca +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: self-sign-issuer + namespace: metalk8s-certs +spec: + selfSigned: {} diff --git a/salt/metalk8s/addons/olm/common/deployed/init.sls b/salt/metalk8s/addons/olm/common/deployed/init.sls new file mode 100644 index 0000000000..badf177810 --- /dev/null +++ b/salt/metalk8s/addons/olm/common/deployed/init.sls @@ -0,0 +1,9 @@ +include: + - .namespace + - .cert + +Deploy common OLMv1 components: + test.succeed_without_changes: + - require: + - sls: metalk8s.addons.olm.common.deployed.namespace + - sls: metalk8s.addons.olm.common.deployed.cert diff --git a/salt/metalk8s/addons/olm/common/deployed/namespace.sls b/salt/metalk8s/addons/olm/common/deployed/namespace.sls new file mode 100644 index 0000000000..e4a33bfdd8 --- /dev/null +++ b/salt/metalk8s/addons/olm/common/deployed/namespace.sls @@ -0,0 +1,13 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/part-of: olm + pod-security.kubernetes.io/enforce: baseline + pod-security.kubernetes.io/enforce-version: latest + name: olmv1-system + annotations: + scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls index d5d1fed77d..6757541340 100644 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls @@ -1,22 +1,5 @@ #!jinja | metalk8s_kubernetes ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: olmv1-ca - namespace: metalk8s-certs -spec: - commonName: olmv1-ca - isCA: true - issuerRef: - group: cert-manager.io - kind: Issuer - name: self-sign-issuer - privateKey: - algorithm: ECDSA - size: 256 - secretName: olmv1-ca --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -35,19 +18,3 @@ spec: algorithm: ECDSA size: 256 secretName: olmv1-cert ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: olmv1-ca -spec: - ca: - secretName: olmv1-ca ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: self-sign-issuer - namespace: metalk8s-certs -spec: - selfSigned: {} diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls index 3a0c2dcf6c..140a7143ce 100644 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls @@ -1,4 +1,5 @@ include: + - ...common.deployed - ...catalogd.deployed - .crds - .rbac @@ -15,6 +16,7 @@ Wait for the Operator Controller Controller Manager Deployment to be Ready: - retry: attempts: 30 - require: + - test: Deploy common OLMv1 components - test: Wait for the Catalogd Controller Manager deployment to be Ready - sls: metalk8s.addons.olm.operator-controller.deployed.crds - sls: metalk8s.addons.olm.operator-controller.deployed.rbac diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls index bfad5a06bc..07cf629a03 100644 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls @@ -1,15 +1,5 @@ #!jinja | metalk8s_kubernetes ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - pod-security.kubernetes.io/enforce: restricted - pod-security.kubernetes.io/enforce-version: latest - name: olmv1-system - annotations: - scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' --- apiVersion: v1 kind: ServiceAccount From 4be186b0d4f937abe086ecf190ff4018f4ea001f Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Mon, 23 Dec 2024 10:30:26 +0100 Subject: [PATCH 05/33] salt: install operatorhubio catalog --- buildchain/buildchain/salt_tree.py | 3 +++ salt/_modules/metalk8s_olm.py | 17 +++++++++++++++++ .../olm/catalog/deployed/cluster-catalog.sls | 12 ++++++++++++ .../addons/olm/catalog/deployed/init.sls | 14 ++++++++++++++ salt/metalk8s/deployed/init.sls | 1 + 5 files changed, 47 insertions(+) create mode 100644 salt/_modules/metalk8s_olm.py create mode 100644 salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls create mode 100644 salt/metalk8s/addons/olm/catalog/deployed/init.sls diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index 93dadf5d44..f042fa074f 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -344,6 +344,8 @@ def task(self) -> types.TaskDict: file_dep=[METALK8S_OPERATOR_MANIFESTS], ), Path("salt/metalk8s/addons/metalk8s-operator/deployed/init.sls"), + Path("salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls"), + Path("salt/metalk8s/addons/olm/catalog/deployed/init.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/cert.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/crds.sls"), @@ -696,6 +698,7 @@ def task(self) -> types.TaskDict: Path("salt/_modules/metalk8s_kubernetes_utils.py"), Path("salt/_modules/metalk8s_monitoring.py"), Path("salt/_modules/metalk8s_network.py"), + Path("salt/_modules/metalk8s_olm.py"), Path("salt/_modules/metalk8s_os.py"), Path("salt/_modules/metalk8s_package_manager_yum.py"), Path("salt/_modules/metalk8s_service_configuration.py"), diff --git a/salt/_modules/metalk8s_olm.py b/salt/_modules/metalk8s_olm.py new file mode 100644 index 0000000000..5a17745c51 --- /dev/null +++ b/salt/_modules/metalk8s_olm.py @@ -0,0 +1,17 @@ +"""Interacts with OLMv1 CRs""" + +__virtualname__ = "metalk8s_olm" + + +def __virtual__(): + return __virtualname__ + + +def check_clustercatalog_serving(name: str): + catalog = __salt__["metalk8s_kubernetes.get_object"]( + kind="ClusterCatalog", apiVersion="olm.operatorframework.io/v1", name=name + ) + for cond in catalog["status"]["conditions"]: + if cond["type"] == "Serving": + return cond["status"] == "True" + return False diff --git a/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls new file mode 100644 index 0000000000..6cb3c925c5 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls @@ -0,0 +1,12 @@ +#!jinja | metalk8s_kubernetes + +apiVersion: olm.operatorframework.io/v1 +kind: ClusterCatalog +metadata: + name: operatorhubio +spec: + source: + type: Image + image: + ref: quay.io/operatorhubio/catalog:latest + pollIntervalMinutes: 10 diff --git a/salt/metalk8s/addons/olm/catalog/deployed/init.sls b/salt/metalk8s/addons/olm/catalog/deployed/init.sls new file mode 100644 index 0000000000..bfe50aa903 --- /dev/null +++ b/salt/metalk8s/addons/olm/catalog/deployed/init.sls @@ -0,0 +1,14 @@ +include: + - ...operator-controller.deployed + - .cluster-catalog + +Wait for Cluster Catalog to be Serving: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_olm.check_clustercatalog_serving("operatorhubio") + - comment: Wait for ClusterCatalog to be Ready + - retry: + attempts: 30 + - require: + - test: Wait for the Operator Controller Controller Manager Deployment to be Ready + - sls: metalk8s.addons.olm.catalog.deployed.cluster-catalog diff --git a/salt/metalk8s/deployed/init.sls b/salt/metalk8s/deployed/init.sls index a91c8a694d..230d968363 100644 --- a/salt/metalk8s/deployed/init.sls +++ b/salt/metalk8s/deployed/init.sls @@ -5,6 +5,7 @@ include: - metalk8s.addons.cert-manager.deployed - metalk8s.addons.olm.catalogd.deployed - metalk8s.addons.olm.operator-controller.deployed + - metalk8s.addons.olm.catalog.deployed - metalk8s.addons.nginx-ingress.deployed - metalk8s.addons.nginx-ingress-control-plane.deployed - metalk8s.addons.volumes.deployed From a11d4ae3fe21a1534929ac4944bc7cf875ed8853 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 26 Dec 2024 11:29:16 +0100 Subject: [PATCH 06/33] buildchain: generate nginx-operator bundle --- buildchain/buildchain/constants.py | 2 + buildchain/buildchain/image.py | 10 + buildchain/buildchain/versions.py | 11 + nginx-operator/.gitignore | 14 + nginx-operator/BUMPING.md | 17 + nginx-operator/Dockerfile | 7 + nginx-operator/Makefile | 230 ++++ nginx-operator/PROJECT | 20 + nginx-operator/README.md | 3 + nginx-operator/bundle.Dockerfile | 20 + .../metalk8s.scality.com_ingressnginxes.yaml | 50 + ...er-manager-metrics-service_v1_service.yaml | 19 + ...c.authorization.k8s.io_v1_clusterrole.yaml | 27 + ...c.authorization.k8s.io_v1_clusterrole.yaml | 23 + ...c.authorization.k8s.io_v1_clusterrole.yaml | 10 + .../nginx-operator.clusterserviceversion.yaml | 726 ++++++++++ .../bundle/metadata/annotations.yaml | 14 + .../bundle/tests/scorecard/config.yaml | 70 + .../metalk8s.scality.com_ingressnginxes.yaml | 44 + nginx-operator/config/crd/kustomization.yaml | 6 + .../config/default/kustomization.yaml | 32 + .../config/default/manager_metrics_patch.yaml | 12 + .../config/default/metrics_service.yaml | 17 + .../config/manager/kustomization.yaml | 8 + nginx-operator/config/manager/manager.yaml | 94 ++ .../nginx-operator.clusterserviceversion.yaml | 46 + .../config/manifests/kustomization.yaml | 7 + .../config/prometheus/kustomization.yaml | 2 + nginx-operator/config/prometheus/monitor.yaml | 30 + .../config/rbac/ingressnginx_editor_role.yaml | 27 + .../config/rbac/ingressnginx_viewer_role.yaml | 23 + nginx-operator/config/rbac/kustomization.yaml | 27 + .../config/rbac/leader_election_role.yaml | 40 + .../rbac/leader_election_role_binding.yaml | 15 + .../config/rbac/metrics_auth_role.yaml | 17 + .../rbac/metrics_auth_role_binding.yaml | 12 + .../config/rbac/metrics_reader_role.yaml | 9 + nginx-operator/config/rbac/role.yaml | 83 ++ nginx-operator/config/rbac/role_binding.yaml | 15 + .../config/rbac/service_account.yaml | 8 + .../config/samples/kustomization.yaml | 4 + .../metalk8s_v1alpha1_ingressnginx.yaml | 419 ++++++ .../config/scorecard/bases/config.yaml | 7 + .../config/scorecard/kustomization.yaml | 18 + .../scorecard/patches/basic.config.yaml | 10 + .../config/scorecard/patches/olm.config.yaml | 50 + .../helm-charts/ingress-nginx/.helmignore | 23 + .../helm-charts/ingress-nginx/Chart.yaml | 25 + .../helm-charts/ingress-nginx/OWNERS | 10 + .../helm-charts/ingress-nginx/README.md | 559 ++++++++ .../ingress-nginx/README.md.gotmpl | 229 ++++ .../changelog/helm-chart-2.10.0.md | 9 + .../changelog/helm-chart-2.11.0.md | 10 + .../changelog/helm-chart-2.11.1.md | 9 + .../changelog/helm-chart-2.11.2.md | 9 + .../changelog/helm-chart-2.11.3.md | 9 + .../changelog/helm-chart-2.12.0.md | 10 + .../changelog/helm-chart-2.12.1.md | 9 + .../changelog/helm-chart-2.13.0.md | 10 + .../changelog/helm-chart-2.14.0.md | 9 + .../changelog/helm-chart-2.15.0.md | 9 + .../changelog/helm-chart-2.16.0.md | 9 + .../changelog/helm-chart-2.9.0.md | 9 + .../changelog/helm-chart-2.9.1.md | 9 + .../changelog/helm-chart-3.0.0.md | 9 + .../changelog/helm-chart-3.10.0.md | 9 + .../changelog/helm-chart-3.10.1.md | 9 + .../changelog/helm-chart-3.11.0.md | 9 + .../changelog/helm-chart-3.11.1.md | 9 + .../changelog/helm-chart-3.12.0.md | 9 + .../changelog/helm-chart-3.13.0.md | 9 + .../changelog/helm-chart-3.14.0.md | 9 + .../changelog/helm-chart-3.15.0.md | 9 + .../changelog/helm-chart-3.15.1.md | 9 + .../changelog/helm-chart-3.16.0.md | 9 + .../changelog/helm-chart-3.16.1.md | 9 + .../changelog/helm-chart-3.17.0.md | 9 + .../changelog/helm-chart-3.18.0.md | 10 + .../changelog/helm-chart-3.19.0.md | 9 + .../changelog/helm-chart-3.20.0.md | 9 + .../changelog/helm-chart-3.20.1.md | 10 + .../changelog/helm-chart-3.21.0.md | 12 + .../changelog/helm-chart-3.22.0.md | 10 + .../changelog/helm-chart-3.23.0.md | 9 + .../changelog/helm-chart-3.24.0.md | 9 + .../changelog/helm-chart-3.25.0.md | 9 + .../changelog/helm-chart-3.26.0.md | 9 + .../changelog/helm-chart-3.27.0.md | 9 + .../changelog/helm-chart-3.28.0.md | 9 + .../changelog/helm-chart-3.29.0.md | 9 + .../changelog/helm-chart-3.3.0.md | 12 + .../changelog/helm-chart-3.3.1.md | 12 + .../changelog/helm-chart-3.30.0.md | 9 + .../changelog/helm-chart-3.31.0.md | 9 + .../changelog/helm-chart-3.32.0.md | 9 + .../changelog/helm-chart-3.33.0.md | 9 + .../changelog/helm-chart-3.34.0.md | 9 + .../changelog/helm-chart-3.4.0.md | 9 + .../changelog/helm-chart-3.5.0.md | 9 + .../changelog/helm-chart-3.5.1.md | 9 + .../changelog/helm-chart-3.6.0.md | 9 + .../changelog/helm-chart-3.7.0.md | 9 + .../changelog/helm-chart-3.7.1.md | 9 + .../changelog/helm-chart-3.8.0.md | 13 + .../changelog/helm-chart-3.9.0.md | 9 + .../changelog/helm-chart-4.0.1.md | 9 + .../changelog/helm-chart-4.0.10.md | 9 + .../changelog/helm-chart-4.0.11.md | 9 + .../changelog/helm-chart-4.0.12.md | 9 + .../changelog/helm-chart-4.0.13.md | 9 + .../changelog/helm-chart-4.0.14.md | 9 + .../changelog/helm-chart-4.0.15.md | 43 + .../changelog/helm-chart-4.0.18.md | 40 + .../changelog/helm-chart-4.0.2.md | 9 + .../changelog/helm-chart-4.0.3.md | 9 + .../changelog/helm-chart-4.0.5.md | 9 + .../changelog/helm-chart-4.0.6.md | 12 + .../changelog/helm-chart-4.0.7.md | 10 + .../changelog/helm-chart-4.0.9.md | 9 + .../changelog/helm-chart-4.1.0.md | 21 + .../changelog/helm-chart-4.1.2.md | 11 + .../changelog/helm-chart-4.10.0.md | 9 + .../changelog/helm-chart-4.10.1.md | 11 + .../changelog/helm-chart-4.10.2.md | 18 + .../changelog/helm-chart-4.11.0.md | 18 + .../changelog/helm-chart-4.11.1.md | 9 + .../changelog/helm-chart-4.11.2.md | 9 + .../changelog/helm-chart-4.11.3.md | 9 + .../changelog/helm-chart-4.2.0.md | 47 + .../changelog/helm-chart-4.2.1.md | 10 + .../changelog/helm-chart-4.3.0.md | 14 + .../changelog/helm-chart-4.4.0.md | 12 + .../changelog/helm-chart-4.5.2.md | 13 + .../changelog/helm-chart-4.6.0.md | 24 + .../changelog/helm-chart-4.6.1.md | 11 + .../changelog/helm-chart-4.7.0.md | 14 + .../changelog/helm-chart-4.7.1.md | 12 + .../changelog/helm-chart-4.7.2.md | 9 + .../changelog/helm-chart-4.8.0-beta.0.md | 13 + .../changelog/helm-chart-4.8.0.md | 13 + .../changelog/helm-chart-4.8.1.md | 9 + .../changelog/helm-chart-4.8.2.md | 10 + .../changelog/helm-chart-4.8.3.md | 9 + .../changelog/helm-chart-4.9.0.md | 13 + .../changelog/helm-chart-4.9.1.md | 10 + .../changelog/helm-chart.md.gotmpl | 11 + ...dmission-webhooks-cert-manager-values.yaml | 12 + ...ontroller-configmap-addheaders-values.yaml | 11 + ...troller-configmap-proxyheaders-values.yaml | 11 + .../ci/controller-configmap-values.yaml | 11 + ...roller-daemonset-extra-modules-values.yaml | 30 + .../controller-daemonset-metrics-values.yaml | 13 + ...roller-daemonset-opentelemetry-values.yaml | 13 + ...oller-daemonset-podannotations-values.yaml | 16 + .../ci/controller-daemonset-values.yaml | 10 + ...oller-deployment-extra-modules-values.yaml | 30 + .../controller-deployment-metrics-values.yaml | 13 + ...oller-deployment-opentelemetry-values.yaml | 13 + ...ller-deployment-podannotations-values.yaml | 16 + .../ci/controller-deployment-values.yaml | 10 + .../ci/controller-hpa-values.yaml | 18 + .../ci/controller-ingressclass-values.yaml | 15 + .../controller-service-internal-values.yaml | 13 + .../ci/controller-service-values.yaml | 22 + .../ci/deamonset-psp-values.yaml | 13 + .../ci/deamonset-webhook-and-psp-values.yaml | 13 + .../ci/deployment-psp-values.yaml | 10 + .../ci/deployment-webhook-and-psp-values.yaml | 12 + .../ingress-nginx/templates/NOTES.txt | 73 + .../ingress-nginx/templates/_helpers.tpl | 272 ++++ .../ingress-nginx/templates/_params.tpl | 77 ++ .../admission-webhooks/cert-manager.yaml | 63 + .../job-patch/clusterrole.yaml | 33 + .../job-patch/clusterrolebinding.yaml | 23 + .../job-patch/job-createSecret.yaml | 79 ++ .../job-patch/job-patchWebhook.yaml | 81 ++ .../job-patch/networkpolicy.yaml | 26 + .../admission-webhooks/job-patch/psp.yaml | 52 + .../admission-webhooks/job-patch/role.yaml | 24 + .../job-patch/rolebinding.yaml | 24 + .../job-patch/serviceaccount.yaml | 17 + .../validating-webhook.yaml | 54 + .../ingress-nginx/templates/clusterrole.yaml | 102 ++ .../templates/clusterrolebinding.yaml | 19 + .../controller-configmap-addheaders.yaml | 14 + .../controller-configmap-proxyheaders.yaml | 14 + .../templates/controller-configmap-tcp.yaml | 17 + .../templates/controller-configmap-udp.yaml | 17 + .../templates/controller-configmap.yaml | 28 + .../templates/controller-daemonset.yaml | 242 ++++ .../templates/controller-deployment.yaml | 245 ++++ .../templates/controller-hpa.yaml | 47 + .../controller-ingressclass-aliases.yaml | 23 + .../templates/controller-ingressclass.yaml | 26 + .../templates/controller-keda.yaml | 46 + .../templates/controller-networkpolicy.yaml | 45 + .../controller-poddisruptionbudget.yaml | 36 + .../templates/controller-prometheusrule.yaml | 23 + .../templates/controller-psp.yaml | 100 ++ .../templates/controller-role.yaml | 104 ++ .../templates/controller-rolebinding.yaml | 21 + .../templates/controller-secret.yaml | 15 + .../controller-service-internal.yaml | 105 ++ .../templates/controller-service-metrics.yaml | 45 + .../templates/controller-service-webhook.yaml | 40 + .../templates/controller-service.yaml | 105 ++ .../templates/controller-serviceaccount.yaml | 17 + .../templates/controller-servicemonitor.yaml | 53 + .../templates/default-backend-deployment.yaml | 119 ++ .../default-backend-extra-configmaps.yaml | 23 + .../templates/default-backend-hpa.yaml | 40 + .../default-backend-networkpolicy.yaml | 25 + .../default-backend-poddisruptionbudget.yaml | 25 + .../templates/default-backend-psp.yaml | 50 + .../templates/default-backend-role.yaml | 22 + .../default-backend-rolebinding.yaml | 21 + .../templates/default-backend-service.yaml | 41 + .../default-backend-serviceaccount.yaml | 14 + .../job-patch/clusterrole_test.yaml | 11 + .../job-patch/clusterrolebinding_test.yaml | 11 + .../job-patch/role_test.yaml | 11 + .../job-patch/rolebinding_test.yaml | 11 + .../job-patch/serviceaccount_test.yaml | 47 + .../validating-webhook_test.yaml | 32 + .../controller-configmap-addheaders_test.yaml | 27 + ...ontroller-configmap-proxyheaders_test.yaml | 27 + .../tests/controller-configmap_test.yaml | 31 + .../tests/controller-daemonset_test.yaml | 172 +++ .../tests/controller-deployment_test.yaml | 191 +++ .../tests/controller-hpa_test.yaml | 31 + .../controller-ingressclass-aliases_test.yaml | 110 ++ .../tests/controller-ingressclass_test.yaml | 93 ++ .../tests/controller-keda_test.yaml | 31 + .../tests/controller-networkpolicy_test.yaml | 23 + .../controller-poddisruptionbudget_test.yaml | 89 ++ .../tests/controller-prometheusrule_test.yaml | 17 + .../controller-service-internal_test.yaml | 25 + .../controller-service-metrics_test.yaml | 23 + .../controller-service-webhook_test.yaml | 32 + .../tests/controller-service_test.yaml | 32 + .../tests/controller-servicemonitor_test.yaml | 29 + .../default-backend-deployment_test.yaml | 169 +++ ...default-backend-extra-configmaps_test.yaml | 50 + ...ault-backend-poddisruptionbudget_test.yaml | 48 + .../tests/default-backend-service_test.yaml | 32 + .../helm-charts/ingress-nginx/values.yaml | 1192 +++++++++++++++++ nginx-operator/watches.yaml | 6 + 247 files changed, 10025 insertions(+) create mode 100644 nginx-operator/.gitignore create mode 100644 nginx-operator/BUMPING.md create mode 100644 nginx-operator/Dockerfile create mode 100644 nginx-operator/Makefile create mode 100644 nginx-operator/PROJECT create mode 100644 nginx-operator/README.md create mode 100644 nginx-operator/bundle.Dockerfile create mode 100644 nginx-operator/bundle/manifests/metalk8s.scality.com_ingressnginxes.yaml create mode 100644 nginx-operator/bundle/manifests/nginx-operator-controller-manager-metrics-service_v1_service.yaml create mode 100644 nginx-operator/bundle/manifests/nginx-operator-ingressnginx-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 nginx-operator/bundle/manifests/nginx-operator-ingressnginx-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 nginx-operator/bundle/manifests/nginx-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml create mode 100644 nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml create mode 100644 nginx-operator/bundle/metadata/annotations.yaml create mode 100644 nginx-operator/bundle/tests/scorecard/config.yaml create mode 100644 nginx-operator/config/crd/bases/metalk8s.scality.com_ingressnginxes.yaml create mode 100644 nginx-operator/config/crd/kustomization.yaml create mode 100644 nginx-operator/config/default/kustomization.yaml create mode 100644 nginx-operator/config/default/manager_metrics_patch.yaml create mode 100644 nginx-operator/config/default/metrics_service.yaml create mode 100644 nginx-operator/config/manager/kustomization.yaml create mode 100644 nginx-operator/config/manager/manager.yaml create mode 100644 nginx-operator/config/manifests/bases/nginx-operator.clusterserviceversion.yaml create mode 100644 nginx-operator/config/manifests/kustomization.yaml create mode 100644 nginx-operator/config/prometheus/kustomization.yaml create mode 100644 nginx-operator/config/prometheus/monitor.yaml create mode 100644 nginx-operator/config/rbac/ingressnginx_editor_role.yaml create mode 100644 nginx-operator/config/rbac/ingressnginx_viewer_role.yaml create mode 100644 nginx-operator/config/rbac/kustomization.yaml create mode 100644 nginx-operator/config/rbac/leader_election_role.yaml create mode 100644 nginx-operator/config/rbac/leader_election_role_binding.yaml create mode 100644 nginx-operator/config/rbac/metrics_auth_role.yaml create mode 100644 nginx-operator/config/rbac/metrics_auth_role_binding.yaml create mode 100644 nginx-operator/config/rbac/metrics_reader_role.yaml create mode 100644 nginx-operator/config/rbac/role.yaml create mode 100644 nginx-operator/config/rbac/role_binding.yaml create mode 100644 nginx-operator/config/rbac/service_account.yaml create mode 100644 nginx-operator/config/samples/kustomization.yaml create mode 100644 nginx-operator/config/samples/metalk8s_v1alpha1_ingressnginx.yaml create mode 100644 nginx-operator/config/scorecard/bases/config.yaml create mode 100644 nginx-operator/config/scorecard/kustomization.yaml create mode 100644 nginx-operator/config/scorecard/patches/basic.config.yaml create mode 100644 nginx-operator/config/scorecard/patches/olm.config.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/.helmignore create mode 100644 nginx-operator/helm-charts/ingress-nginx/Chart.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/OWNERS create mode 100644 nginx-operator/helm-charts/ingress-nginx/README.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/README.md.gotmpl create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.10.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.3.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.13.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.14.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.15.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.16.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.0.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.12.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.13.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.14.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.17.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.18.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.19.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.21.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.22.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.23.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.24.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.25.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.26.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.27.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.28.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.29.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.30.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.31.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.32.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.33.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.34.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.4.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.6.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.8.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.9.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.10.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.11.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.12.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.13.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.14.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.15.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.18.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.3.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.5.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.6.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.7.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.9.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.3.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.3.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.4.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.5.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.2.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.3.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.0.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.1.md create mode 100644 nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart.md.gotmpl create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-hpa-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-ingressclass-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-service-internal-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/controller-service-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/deamonset-psp-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/deployment-psp-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/NOTES.txt create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/_helpers.tpl create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/_params.tpl create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/clusterrole.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/clusterrolebinding.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-addheaders.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-tcp.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-udp.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-daemonset.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-deployment.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-hpa.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-keda.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-networkpolicy.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-prometheusrule.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-psp.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-role.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-rolebinding.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-secret.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-service-internal.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-service-metrics.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-service-webhook.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-service.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-serviceaccount.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/controller-servicemonitor.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-deployment.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-hpa.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-networkpolicy.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-psp.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-role.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-rolebinding.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-service.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/templates/default-backend-serviceaccount.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-daemonset_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-deployment_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-hpa_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-keda_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-networkpolicy_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-prometheusrule_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-service-internal_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-service-metrics_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-service-webhook_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-service_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/controller-servicemonitor_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/default-backend-deployment_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/tests/default-backend-service_test.yaml create mode 100644 nginx-operator/helm-charts/ingress-nginx/values.yaml create mode 100644 nginx-operator/watches.yaml diff --git a/buildchain/buildchain/constants.py b/buildchain/buildchain/constants.py index 9d6bea84ad..dedab1abcc 100644 --- a/buildchain/buildchain/constants.py +++ b/buildchain/buildchain/constants.py @@ -67,6 +67,8 @@ # Path to the MetalK8s operator source directory METALK8S_OPERATOR_ROOT: Path = ROOT / "operator" # Path to the storage-operator source directory. +NGINX_OPERATOR_ROOT: Path = ROOT / "nginx-operator" +# Path to the nginx-operator source directory. STORAGE_OPERATOR_ROOT: Path = ROOT / "storage-operator" # Path to the UI build root directory. UI_BUILD_ROOT: Path = config.BUILD_ROOT / "ui" diff --git a/buildchain/buildchain/image.py b/buildchain/buildchain/image.py index 0e5153c293..eef138146c 100644 --- a/buildchain/buildchain/image.py +++ b/buildchain/buildchain/image.py @@ -330,6 +330,16 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: "VERSION": versions.VERSION, }, ), + _local_image( + name="nginx-operator", + dockerfile=constants.NGINX_OPERATOR_ROOT / "Dockerfile", + build_context=constants.NGINX_OPERATOR_ROOT, + ), + _local_image( + name="nginx-operator-bundle", + dockerfile=constants.NGINX_OPERATOR_ROOT / "bundle.Dockerfile", + build_context=constants.NGINX_OPERATOR_ROOT, + ), ) # }}} diff --git a/buildchain/buildchain/versions.py b/buildchain/buildchain/versions.py index 0f8adbf149..0fab23b544 100644 --- a/buildchain/buildchain/versions.py +++ b/buildchain/buildchain/versions.py @@ -28,6 +28,7 @@ CALICO_VERSION: str = "3.29.0" SALT_VERSION: str = "3002.9" CONTAINERD_VERSION: str = "1.6.36" +NGINX_OPERATOR_VERSION: str = "4.11.3" CONTAINERD_RELEASE: str = "1" SOSREPORT_RELEASE: str = "2" @@ -283,6 +284,16 @@ def _version_prefix(version: str, prefix: str = "v") -> str: version=VERSION, digest=None, ), + Image( + name="nginx-operator", + version=_version_prefix(NGINX_OPERATOR_VERSION), + digest=None, + ), + Image( + name="nginx-operator-bundle", + version=_version_prefix(NGINX_OPERATOR_VERSION), + digest=None, + ), Image( name="loki", version="3.2.0", diff --git a/nginx-operator/.gitignore b/nginx-operator/.gitignore new file mode 100644 index 0000000000..62fd3e3995 --- /dev/null +++ b/nginx-operator/.gitignore @@ -0,0 +1,14 @@ + +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +bin + +# editor and IDE paraphernalia +.idea +*.swp +*.swo +*~ diff --git a/nginx-operator/BUMPING.md b/nginx-operator/BUMPING.md new file mode 100644 index 0000000000..a3ab71e7ac --- /dev/null +++ b/nginx-operator/BUMPING.md @@ -0,0 +1,17 @@ +## instructions + +### Update helm chart + +from within this directory: + +``` +VERSION=<...> +rm -rf helm-charts/ingress-nginx +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +helm fetch -d helm-charts --untar https://kubernetes.github.io/ingress-nginx/ingress-nginx --version $VERSION +sed -i "s/^VERSION.*/VERSION ?= $VERSION/" Makefile +make bundle +``` + +also change `NGINX_OPERATOR_VERSION` in `buildchain/buildchain/versions.py`. diff --git a/nginx-operator/Dockerfile b/nginx-operator/Dockerfile new file mode 100644 index 0000000000..ec384f7b47 --- /dev/null +++ b/nginx-operator/Dockerfile @@ -0,0 +1,7 @@ +# Build the manager binary +FROM quay.io/operator-framework/helm-operator:v1.38.0 + +ENV HOME=/opt/helm +COPY watches.yaml ${HOME}/watches.yaml +COPY helm-charts ${HOME}/helm-charts +WORKDIR ${HOME} diff --git a/nginx-operator/Makefile b/nginx-operator/Makefile new file mode 100644 index 0000000000..330cabdc7a --- /dev/null +++ b/nginx-operator/Makefile @@ -0,0 +1,230 @@ +# VERSION defines the project version for the bundle. +# Update this value when you upgrade the version of your project. +# To re-generate a bundle for another specific version without changing the standard setup, you can: +# - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) +# - use environment variables to overwrite this value (e.g export VERSION=0.0.2) +# +# We keep this aligned with the chart version +# Will also be set in versions.py +VERSION ?= 4.11.3 + +# CHANNELS define the bundle channels used in the bundle. +# Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") +# To re-generate a bundle for other specific channels without changing the standard setup, you can: +# - use the CHANNELS as arg of the bundle target (e.g make bundle CHANNELS=candidate,fast,stable) +# - use environment variables to overwrite this value (e.g export CHANNELS="candidate,fast,stable") +ifneq ($(origin CHANNELS), undefined) +BUNDLE_CHANNELS := --channels=$(CHANNELS) +endif + +# DEFAULT_CHANNEL defines the default channel used in the bundle. +# Add a new line here if you would like to change its default config. (E.g DEFAULT_CHANNEL = "stable") +# To re-generate a bundle for any other default channel without changing the default setup, you can: +# - use the DEFAULT_CHANNEL as arg of the bundle target (e.g make bundle DEFAULT_CHANNEL=stable) +# - use environment variables to overwrite this value (e.g export DEFAULT_CHANNEL="stable") +ifneq ($(origin DEFAULT_CHANNEL), undefined) +BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) +endif +BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) + +# IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images. +# This variable is used to construct full image tags for bundle and catalog images. +# +# For example, running 'make bundle-build bundle-push catalog-build catalog-push' will build and push both +# scality.com/nginx-operator-bundle:$VERSION and scality.com/nginx-operator-catalog:$VERSION. +IMAGE_TAG_BASE ?= scality.com/nginx-operator + +# BUNDLE_IMG defines the image:tag used for the bundle. +# You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=/:) +BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION) + +# BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command +BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) + +# USE_IMAGE_DIGESTS defines if images are resolved via tags or digests +# You can enable this value if you would like to use SHA Based Digests +# To enable set flag to true +USE_IMAGE_DIGESTS ?= false +ifeq ($(USE_IMAGE_DIGESTS), true) + BUNDLE_GEN_FLAGS += --use-image-digests +endif + +# Set the Operator SDK version to use. By default, what is installed on the system is used. +# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit. +OPERATOR_SDK_VERSION ?= v1.38.0 + +# Image URL to use all building/pushing image targets +IMG ?= registry.metalk8s.lan/nginx-operator:v$(VERSION) + +.PHONY: all +all: docker-build + +##@ General + +# The help target prints out all targets with their descriptions organized +# beneath their categories. The categories are represented by '##@' and the +# target descriptions by '##'. The awk commands is responsible for reading the +# entire set of makefiles included in this invocation, looking for lines of the +# file as xyz: ## something, and then pretty-format the target and help. Then, +# if there's a line with ##@ something, that gets pretty-printed as a category. +# More info on the usage of ANSI control characters for terminal formatting: +# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters +# More info on the awk command: +# http://linuxcommand.org/lc3_adv_awk.php + +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +##@ Build + +.PHONY: run +run: helm-operator ## Run against the configured Kubernetes cluster in ~/.kube/config + $(HELM_OPERATOR) run + +.PHONY: docker-build +docker-build: ## Build docker image with the manager. + docker build -t ${IMG} . + +.PHONY: docker-push +docker-push: ## Push docker image with the manager. + docker push ${IMG} + +# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple +# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: +# - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ +# - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ +# - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=> than the export will fail) +# To properly provided solutions that supports more than one platform you should use this option. +PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le +.PHONY: docker-buildx +docker-buildx: ## Build and push docker image for the manager for cross-platform support + - docker buildx create --name project-v3-builder + docker buildx use project-v3-builder + - docker buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile . + - docker buildx rm project-v3-builder + +##@ Deployment + +.PHONY: install +install: kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/crd | kubectl apply -f - + +.PHONY: uninstall +uninstall: kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/crd | kubectl delete -f - + +.PHONY: deploy +deploy: kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + $(KUSTOMIZE) build config/default | kubectl apply -f - + +.PHONY: undeploy +undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/default | kubectl delete -f - + +OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') +ARCH := $(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/') + +.PHONY: kustomize +KUSTOMIZE = $(shell pwd)/bin/kustomize +kustomize: ## Download kustomize locally if necessary. +ifeq (,$(wildcard $(KUSTOMIZE))) +ifeq (,$(shell which kustomize 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(KUSTOMIZE)) ;\ + curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v5.4.2/kustomize_v5.4.2_$(OS)_$(ARCH).tar.gz | \ + tar xzf - -C bin/ ;\ + } +else +KUSTOMIZE = $(shell which kustomize) +endif +endif + +.PHONY: helm-operator +HELM_OPERATOR = $(shell pwd)/bin/helm-operator +helm-operator: ## Download helm-operator locally if necessary, preferring the $(pwd)/bin path over global if both exist. +ifeq (,$(wildcard $(HELM_OPERATOR))) +ifeq (,$(shell which helm-operator 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(HELM_OPERATOR)) ;\ + curl -sSLo $(HELM_OPERATOR) https://github.com/operator-framework/operator-sdk/releases/download/v1.38.0/helm-operator_$(OS)_$(ARCH) ;\ + chmod +x $(HELM_OPERATOR) ;\ + } +else +HELM_OPERATOR = $(shell which helm-operator) +endif +endif + +.PHONY: operator-sdk +OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk +operator-sdk: ## Download operator-sdk locally if necessary. +ifeq (,$(wildcard $(OPERATOR_SDK))) +ifeq (, $(shell which operator-sdk 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPERATOR_SDK)) ;\ + curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$(OS)_$(ARCH) ;\ + chmod +x $(OPERATOR_SDK) ;\ + } +else +OPERATOR_SDK = $(shell which operator-sdk) +endif +endif + +.PHONY: bundle +bundle: kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. + $(OPERATOR_SDK) generate kustomize manifests -q + cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) + $(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) + $(OPERATOR_SDK) bundle validate ./bundle + +.PHONY: bundle-build +bundle-build: ## Build the bundle image. + docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . + +.PHONY: bundle-push +bundle-push: ## Push the bundle image. + $(MAKE) docker-push IMG=$(BUNDLE_IMG) + +.PHONY: opm +OPM = $(LOCALBIN)/opm +opm: ## Download opm locally if necessary. +ifeq (,$(wildcard $(OPM))) +ifeq (,$(shell which opm 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPM)) ;\ + curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.23.0/$(OS)-$(ARCH)-opm ;\ + chmod +x $(OPM) ;\ + } +else +OPM = $(shell which opm) +endif +endif + +# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). +# These images MUST exist in a registry and be pull-able. +BUNDLE_IMGS ?= $(BUNDLE_IMG) + +# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). +CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) + +# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. +ifneq ($(origin CATALOG_BASE_IMG), undefined) +FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) +endif + +# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. +# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see: +# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator +.PHONY: catalog-build +catalog-build: opm ## Build a catalog image. + $(OPM) index add --container-tool docker --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT) + +# Push the catalog image. +.PHONY: catalog-push +catalog-push: ## Push a catalog image. + $(MAKE) docker-push IMG=$(CATALOG_IMG) diff --git a/nginx-operator/PROJECT b/nginx-operator/PROJECT new file mode 100644 index 0000000000..3450d68d55 --- /dev/null +++ b/nginx-operator/PROJECT @@ -0,0 +1,20 @@ +# Code generated by tool. DO NOT EDIT. +# This file is used to track the info used to scaffold your project +# and allow the plugins properly work. +# More info: https://book.kubebuilder.io/reference/project-config.html +domain: scality.com +layout: +- helm.sdk.operatorframework.io/v1 +plugins: + manifests.sdk.operatorframework.io/v2: {} + scorecard.sdk.operatorframework.io/v2: {} +projectName: nginx-operator +resources: +- api: + crdVersion: v1 + namespaced: true + domain: scality.com + group: metalk8s + kind: IngressNginx + version: v1alpha1 +version: "3" diff --git a/nginx-operator/README.md b/nginx-operator/README.md new file mode 100644 index 0000000000..70618ed1cd --- /dev/null +++ b/nginx-operator/README.md @@ -0,0 +1,3 @@ +# NGINX-operator + +This operator manages IngressNginx CRs and uses them as a values file for the [ingress-nginx](https://github.com/kubernetes/ingress-nginx) helm chart. diff --git a/nginx-operator/bundle.Dockerfile b/nginx-operator/bundle.Dockerfile new file mode 100644 index 0000000000..f7b2e43a9a --- /dev/null +++ b/nginx-operator/bundle.Dockerfile @@ -0,0 +1,20 @@ +FROM scratch + +# Core bundle labels. +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=nginx-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.metrics.builder=operator-sdk-v1.38.0 +LABEL operators.operatorframework.io.metrics.mediatype.v1=metrics+v1 +LABEL operators.operatorframework.io.metrics.project_layout=helm.sdk.operatorframework.io/v1 + +# Labels for testing. +LABEL operators.operatorframework.io.test.mediatype.v1=scorecard+v1 +LABEL operators.operatorframework.io.test.config.v1=tests/scorecard/ + +# Copy files to locations specified by labels. +COPY bundle/manifests /manifests/ +COPY bundle/metadata /metadata/ +COPY bundle/tests/scorecard /tests/scorecard/ diff --git a/nginx-operator/bundle/manifests/metalk8s.scality.com_ingressnginxes.yaml b/nginx-operator/bundle/manifests/metalk8s.scality.com_ingressnginxes.yaml new file mode 100644 index 0000000000..b39ea6560d --- /dev/null +++ b/nginx-operator/bundle/manifests/metalk8s.scality.com_ingressnginxes.yaml @@ -0,0 +1,50 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: ingressnginxes.metalk8s.scality.com +spec: + group: metalk8s.scality.com + names: + kind: IngressNginx + listKind: IngressNginxList + plural: ingressnginxes + singular: ingressnginx + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: IngressNginx is the Schema for the ingressnginxes API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Spec defines the desired state of IngressNginx + type: object + x-kubernetes-preserve-unknown-fields: true + status: + description: Status defines the observed state of IngressNginx + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/nginx-operator/bundle/manifests/nginx-operator-controller-manager-metrics-service_v1_service.yaml b/nginx-operator/bundle/manifests/nginx-operator-controller-manager-metrics-service_v1_service.yaml new file mode 100644 index 0000000000..e4d4306533 --- /dev/null +++ b/nginx-operator/bundle/manifests/nginx-operator-controller-manager-metrics-service_v1_service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: nginx-operator + control-plane: controller-manager + name: nginx-operator-controller-manager-metrics-service +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: 8443 + selector: + control-plane: controller-manager +status: + loadBalancer: {} diff --git a/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml b/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 0000000000..7a04755d53 --- /dev/null +++ b/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-editor-role_rbac.authorization.k8s.io_v1_clusterrole.yaml @@ -0,0 +1,27 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: nginx-operator + name: nginx-operator-ingressnginx-editor-role +rules: +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes/status + verbs: + - get diff --git a/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml b/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 0000000000..17b8174c65 --- /dev/null +++ b/nginx-operator/bundle/manifests/nginx-operator-ingressnginx-viewer-role_rbac.authorization.k8s.io_v1_clusterrole.yaml @@ -0,0 +1,23 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: nginx-operator + name: nginx-operator-ingressnginx-viewer-role +rules: +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + verbs: + - get + - list + - watch +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes/status + verbs: + - get diff --git a/nginx-operator/bundle/manifests/nginx-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml b/nginx-operator/bundle/manifests/nginx-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml new file mode 100644 index 0000000000..ecd01b7be2 --- /dev/null +++ b/nginx-operator/bundle/manifests/nginx-operator-metrics-reader_rbac.authorization.k8s.io_v1_clusterrole.yaml @@ -0,0 +1,10 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + name: nginx-operator-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get diff --git a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml new file mode 100644 index 0000000000..0f995b320e --- /dev/null +++ b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml @@ -0,0 +1,726 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "metalk8s.scality.com/v1alpha1", + "kind": "IngressNginx", + "metadata": { + "name": "ingressnginx-sample" + }, + "spec": { + "commonLabels": {}, + "controller": { + "addHeaders": {}, + "admissionWebhooks": { + "annotations": {}, + "certManager": { + "admissionCert": { + "duration": "" + }, + "enabled": false, + "rootCert": { + "duration": "" + } + }, + "certificate": "/usr/local/certificates/cert", + "createSecretJob": { + "name": "create", + "resources": {}, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true, + "runAsNonRoot": true, + "runAsUser": 65532, + "seccompProfile": { + "type": "RuntimeDefault" + } + } + }, + "enabled": true, + "existingPsp": "", + "extraEnvs": [], + "failurePolicy": "Fail", + "key": "/usr/local/certificates/key", + "labels": {}, + "name": "admission", + "namespaceSelector": {}, + "objectSelector": {}, + "patch": { + "enabled": true, + "image": { + "digest": "sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f", + "image": "ingress-nginx/kube-webhook-certgen", + "pullPolicy": "IfNotPresent", + "registry": "registry.k8s.io", + "tag": "v1.4.4" + }, + "labels": {}, + "networkPolicy": { + "enabled": false + }, + "nodeSelector": { + "kubernetes.io/os": "linux" + }, + "podAnnotations": {}, + "priorityClassName": "", + "rbac": { + "create": true + }, + "securityContext": {}, + "serviceAccount": { + "automountServiceAccountToken": true, + "create": true, + "name": "" + }, + "tolerations": [] + }, + "patchWebhookJob": { + "name": "patch", + "resources": {}, + "securityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true, + "runAsNonRoot": true, + "runAsUser": 65532, + "seccompProfile": { + "type": "RuntimeDefault" + } + } + }, + "port": 8443, + "service": { + "annotations": {}, + "externalIPs": [], + "loadBalancerSourceRanges": [], + "servicePort": 443, + "type": "ClusterIP" + } + }, + "affinity": {}, + "allowSnippetAnnotations": false, + "annotations": {}, + "autoscaling": { + "annotations": {}, + "behavior": {}, + "enabled": false, + "maxReplicas": 11, + "minReplicas": 1, + "targetCPUUtilizationPercentage": 50, + "targetMemoryUtilizationPercentage": 50 + }, + "autoscalingTemplate": [], + "config": {}, + "configAnnotations": {}, + "configMapNamespace": "", + "containerName": "controller", + "containerPort": { + "http": 80, + "https": 443 + }, + "containerSecurityContext": {}, + "customTemplate": { + "configMapKey": "", + "configMapName": "" + }, + "disableLeaderElection": false, + "dnsConfig": {}, + "dnsPolicy": "ClusterFirst", + "electionID": "", + "electionTTL": "", + "enableAnnotationValidations": false, + "enableMimalloc": true, + "enableTopologyAwareRouting": false, + "existingPsp": "", + "extraArgs": {}, + "extraContainers": [], + "extraEnvs": [], + "extraInitContainers": [], + "extraModules": [], + "extraVolumeMounts": [], + "extraVolumes": [], + "healthCheckHost": "", + "healthCheckPath": "/healthz", + "hostAliases": [], + "hostNetwork": false, + "hostPort": { + "enabled": false, + "ports": { + "http": 80, + "https": 443 + } + }, + "hostname": {}, + "image": { + "allowPrivilegeEscalation": false, + "chroot": false, + "digest": "sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7", + "digestChroot": "sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14", + "image": "ingress-nginx/controller", + "pullPolicy": "IfNotPresent", + "readOnlyRootFilesystem": false, + "registry": "registry.k8s.io", + "runAsNonRoot": true, + "runAsUser": 101, + "seccompProfile": { + "type": "RuntimeDefault" + }, + "tag": "v1.11.3" + }, + "ingressClass": "nginx", + "ingressClassByName": false, + "ingressClassResource": { + "aliases": [], + "annotations": {}, + "controllerValue": "k8s.io/ingress-nginx", + "default": false, + "enabled": true, + "name": "nginx", + "parameters": {} + }, + "keda": { + "apiVersion": "keda.sh/v1alpha1", + "behavior": {}, + "cooldownPeriod": 300, + "enabled": false, + "maxReplicas": 11, + "minReplicas": 1, + "pollingInterval": 30, + "restoreToOriginalReplicaCount": false, + "scaledObject": { + "annotations": {} + }, + "triggers": [] + }, + "kind": "Deployment", + "labels": {}, + "lifecycle": { + "preStop": { + "exec": { + "command": [ + "/wait-shutdown" + ] + } + } + }, + "livenessProbe": { + "failureThreshold": 5, + "httpGet": { + "path": "/healthz", + "port": 10254, + "scheme": "HTTP" + }, + "initialDelaySeconds": 10, + "periodSeconds": 10, + "successThreshold": 1, + "timeoutSeconds": 1 + }, + "maxmindLicenseKey": "", + "metrics": { + "enabled": false, + "port": 10254, + "portName": "metrics", + "prometheusRule": { + "additionalLabels": {}, + "enabled": false, + "rules": [] + }, + "service": { + "annotations": {}, + "externalIPs": [], + "labels": {}, + "loadBalancerSourceRanges": [], + "servicePort": 10254, + "type": "ClusterIP" + }, + "serviceMonitor": { + "additionalLabels": {}, + "annotations": {}, + "enabled": false, + "metricRelabelings": [], + "namespace": "", + "namespaceSelector": {}, + "relabelings": [], + "scrapeInterval": "30s", + "targetLabels": [] + } + }, + "minAvailable": 1, + "minReadySeconds": 0, + "name": "controller", + "networkPolicy": { + "enabled": false + }, + "nodeSelector": { + "kubernetes.io/os": "linux" + }, + "opentelemetry": { + "containerSecurityContext": { + "allowPrivilegeEscalation": false, + "capabilities": { + "drop": [ + "ALL" + ] + }, + "readOnlyRootFilesystem": true, + "runAsNonRoot": true, + "runAsUser": 65532, + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "enabled": false, + "image": { + "digest": "sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922", + "distroless": true, + "image": "ingress-nginx/opentelemetry-1.25.3", + "registry": "registry.k8s.io", + "tag": "v20240813-b933310d" + }, + "name": "opentelemetry", + "resources": {} + }, + "podAnnotations": {}, + "podLabels": {}, + "podSecurityContext": {}, + "priorityClassName": "", + "proxySetHeaders": {}, + "publishService": { + "enabled": true, + "pathOverride": "" + }, + "readinessProbe": { + "failureThreshold": 3, + "httpGet": { + "path": "/healthz", + "port": 10254, + "scheme": "HTTP" + }, + "initialDelaySeconds": 10, + "periodSeconds": 10, + "successThreshold": 1, + "timeoutSeconds": 1 + }, + "replicaCount": 1, + "reportNodeInternalIp": false, + "resources": { + "requests": { + "cpu": "100m", + "memory": "90Mi" + } + }, + "scope": { + "enabled": false, + "namespace": "", + "namespaceSelector": "" + }, + "service": { + "annotations": {}, + "appProtocol": true, + "clusterIP": "", + "enableHttp": true, + "enableHttps": true, + "enabled": true, + "external": { + "enabled": true + }, + "externalIPs": [], + "externalTrafficPolicy": "", + "internal": { + "annotations": {}, + "appProtocol": true, + "clusterIP": "", + "enabled": false, + "externalIPs": [], + "externalTrafficPolicy": "", + "ipFamilies": [ + "IPv4" + ], + "ipFamilyPolicy": "SingleStack", + "loadBalancerClass": "", + "loadBalancerIP": "", + "loadBalancerSourceRanges": [], + "nodePorts": { + "http": "", + "https": "", + "tcp": {}, + "udp": {} + }, + "ports": {}, + "sessionAffinity": "", + "targetPorts": {}, + "type": "" + }, + "ipFamilies": [ + "IPv4" + ], + "ipFamilyPolicy": "SingleStack", + "labels": {}, + "loadBalancerClass": "", + "loadBalancerIP": "", + "loadBalancerSourceRanges": [], + "nodePorts": { + "http": "", + "https": "", + "tcp": {}, + "udp": {} + }, + "ports": { + "http": 80, + "https": 443 + }, + "sessionAffinity": "", + "targetPorts": { + "http": "http", + "https": "https" + }, + "type": "LoadBalancer" + }, + "shareProcessNamespace": false, + "sysctls": {}, + "tcp": { + "annotations": {}, + "configMapNamespace": "" + }, + "terminationGracePeriodSeconds": 300, + "tolerations": [], + "topologySpreadConstraints": [], + "udp": { + "annotations": {}, + "configMapNamespace": "" + }, + "updateStrategy": {}, + "watchIngressWithoutClass": false + }, + "defaultBackend": { + "affinity": {}, + "autoscaling": { + "annotations": {}, + "enabled": false, + "maxReplicas": 2, + "minReplicas": 1, + "targetCPUUtilizationPercentage": 50, + "targetMemoryUtilizationPercentage": 50 + }, + "containerSecurityContext": {}, + "enabled": false, + "existingPsp": "", + "extraArgs": {}, + "extraConfigMaps": [], + "extraEnvs": [], + "extraVolumeMounts": [], + "extraVolumes": [], + "image": { + "allowPrivilegeEscalation": false, + "image": "defaultbackend-amd64", + "pullPolicy": "IfNotPresent", + "readOnlyRootFilesystem": true, + "registry": "registry.k8s.io", + "runAsNonRoot": true, + "runAsUser": 65534, + "seccompProfile": { + "type": "RuntimeDefault" + }, + "tag": "1.5" + }, + "labels": {}, + "livenessProbe": { + "failureThreshold": 3, + "initialDelaySeconds": 30, + "periodSeconds": 10, + "successThreshold": 1, + "timeoutSeconds": 5 + }, + "minAvailable": 1, + "minReadySeconds": 0, + "name": "defaultbackend", + "networkPolicy": { + "enabled": false + }, + "nodeSelector": { + "kubernetes.io/os": "linux" + }, + "podAnnotations": {}, + "podLabels": {}, + "podSecurityContext": {}, + "port": 8080, + "priorityClassName": "", + "readinessProbe": { + "failureThreshold": 6, + "initialDelaySeconds": 0, + "periodSeconds": 5, + "successThreshold": 1, + "timeoutSeconds": 5 + }, + "replicaCount": 1, + "resources": {}, + "service": { + "annotations": {}, + "externalIPs": [], + "loadBalancerSourceRanges": [], + "servicePort": 80, + "type": "ClusterIP" + }, + "serviceAccount": { + "automountServiceAccountToken": true, + "create": true, + "name": "" + }, + "tolerations": [], + "topologySpreadConstraints": [], + "updateStrategy": {} + }, + "dhParam": "", + "imagePullSecrets": [], + "namespaceOverride": "", + "podSecurityPolicy": { + "enabled": false + }, + "portNamePrefix": "", + "rbac": { + "create": true, + "scope": false + }, + "revisionHistoryLimit": 10, + "serviceAccount": { + "annotations": {}, + "automountServiceAccountToken": true, + "create": true, + "name": "" + }, + "tcp": {}, + "udp": {} + } + } + ] + capabilities: Basic Install + createdAt: "2024-12-26T15:31:56Z" + operators.operatorframework.io/builder: operator-sdk-v1.38.0 + operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 + name: nginx-operator.v4.11.3 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - kind: IngressNginx + name: ingressnginxes.metalk8s.scality.com + version: v1alpha1 + description: Operator Manages Kubernetes Nginx Controllers + displayName: nginx-operator + icon: + - base64data: "" + mediatype: "" + install: + spec: + clusterPermissions: + - rules: + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - secrets + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + - ingressnginxes/status + - ingressnginxes/finalizers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + serviceAccountName: nginx-operator-controller-manager + deployments: + - label: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/name: nginx-operator + control-plane: controller-manager + name: nginx-operator-controller-manager + spec: + replicas: 1 + selector: + matchLabels: + control-plane: controller-manager + strategy: {} + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + containers: + - args: + - --metrics-require-rbac + - --metrics-secure + - --metrics-bind-address=:8443 + - --leader-elect + - --leader-election-id=nginx-operator + - --health-probe-bind-address=:8081 + image: registry.metalk8s.lan/nginx-operator:v4.11.3 + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + securityContext: + runAsNonRoot: true + serviceAccountName: nginx-operator-controller-manager + terminationGracePeriodSeconds: 10 + permissions: + - rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + serviceAccountName: nginx-operator-controller-manager + strategy: deployment + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - operator + - scality + - metalk8s + - nginx + - kubernetes + links: + - name: Nginx Operator + url: https://nginx-operator.domain + maintainers: + - email: ayoub.nasr@scality.com + name: Ayoub Nasr + maturity: alpha + provider: + name: scality + url: scality.com + version: 4.11.3 diff --git a/nginx-operator/bundle/metadata/annotations.yaml b/nginx-operator/bundle/metadata/annotations.yaml new file mode 100644 index 0000000000..e99eec8a01 --- /dev/null +++ b/nginx-operator/bundle/metadata/annotations.yaml @@ -0,0 +1,14 @@ +annotations: + # Core bundle annotations. + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: nginx-operator + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.metrics.builder: operator-sdk-v1.38.0 + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: helm.sdk.operatorframework.io/v1 + + # Annotations for testing. + operators.operatorframework.io.test.mediatype.v1: scorecard+v1 + operators.operatorframework.io.test.config.v1: tests/scorecard/ diff --git a/nginx-operator/bundle/tests/scorecard/config.yaml b/nginx-operator/bundle/tests/scorecard/config.yaml new file mode 100644 index 0000000000..ea6b807940 --- /dev/null +++ b/nginx-operator/bundle/tests/scorecard/config.yaml @@ -0,0 +1,70 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: + - entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: basic + test: basic-check-spec-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-bundle-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-crds-have-validation-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-crds-have-resources-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-spec-descriptors-test + storage: + spec: + mountPath: {} + - entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-status-descriptors-test + storage: + spec: + mountPath: {} +storage: + spec: + mountPath: {} diff --git a/nginx-operator/config/crd/bases/metalk8s.scality.com_ingressnginxes.yaml b/nginx-operator/config/crd/bases/metalk8s.scality.com_ingressnginxes.yaml new file mode 100644 index 0000000000..23ede4b3ee --- /dev/null +++ b/nginx-operator/config/crd/bases/metalk8s.scality.com_ingressnginxes.yaml @@ -0,0 +1,44 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: ingressnginxes.metalk8s.scality.com +spec: + group: metalk8s.scality.com + names: + kind: IngressNginx + listKind: IngressNginxList + plural: ingressnginxes + singular: ingressnginx + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: IngressNginx is the Schema for the ingressnginxes API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Spec defines the desired state of IngressNginx + type: object + x-kubernetes-preserve-unknown-fields: true + status: + description: Status defines the observed state of IngressNginx + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + served: true + storage: true + subresources: + status: {} diff --git a/nginx-operator/config/crd/kustomization.yaml b/nginx-operator/config/crd/kustomization.yaml new file mode 100644 index 0000000000..c4dccd218b --- /dev/null +++ b/nginx-operator/config/crd/kustomization.yaml @@ -0,0 +1,6 @@ +# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +- bases/metalk8s.scality.com_ingressnginxes.yaml +# +kubebuilder:scaffold:crdkustomizeresource diff --git a/nginx-operator/config/default/kustomization.yaml b/nginx-operator/config/default/kustomization.yaml new file mode 100644 index 0000000000..693fa9fd45 --- /dev/null +++ b/nginx-operator/config/default/kustomization.yaml @@ -0,0 +1,32 @@ +# Adds namespace to all resources. +namespace: nginx-operator-system + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: nginx-operator- + +# Labels to add to all resources and selectors. +#labels: +#- includeSelectors: true +# pairs: +# someName: someValue + +resources: +- ../crd +- ../rbac +- ../manager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../prometheus +# [METRICS] Expose the controller manager metrics service. +- metrics_service.yaml + +# Uncomment the patches line if you enable Metrics, and/or are using webhooks and cert-manager +patches: +# [METRICS] The following patch will enable the metrics endpoint using HTTPS and the port :8443. +# More info: https://book.kubebuilder.io/reference/metrics +- path: manager_metrics_patch.yaml + target: + kind: Deployment diff --git a/nginx-operator/config/default/manager_metrics_patch.yaml b/nginx-operator/config/default/manager_metrics_patch.yaml new file mode 100644 index 0000000000..a3cb2f1865 --- /dev/null +++ b/nginx-operator/config/default/manager_metrics_patch.yaml @@ -0,0 +1,12 @@ +# This patch adds the args to allow exposing the metrics endpoint using HTTPS +- op: add + path: /spec/template/spec/containers/0/args/0 + value: --metrics-bind-address=:8443 +# This patch adds the args to allow securing the metrics endpoint +- op: add + path: /spec/template/spec/containers/0/args/0 + value: --metrics-secure +# This patch adds the args to allow RBAC-based authn/authz the metrics endpoint +- op: add + path: /spec/template/spec/containers/0/args/0 + value: --metrics-require-rbac diff --git a/nginx-operator/config/default/metrics_service.yaml b/nginx-operator/config/default/metrics_service.yaml new file mode 100644 index 0000000000..7032beceed --- /dev/null +++ b/nginx-operator/config/default/metrics_service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: 8443 + selector: + control-plane: controller-manager diff --git a/nginx-operator/config/manager/kustomization.yaml b/nginx-operator/config/manager/kustomization.yaml new file mode 100644 index 0000000000..3dc49ca8eb --- /dev/null +++ b/nginx-operator/config/manager/kustomization.yaml @@ -0,0 +1,8 @@ +resources: +- manager.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +images: +- name: controller + newName: registry.metalk8s.lan/nginx-operator + newTag: v4.11.3 diff --git a/nginx-operator/config/manager/manager.yaml b/nginx-operator/config/manager/manager.yaml new file mode 100644 index 0000000000..e0756d06f7 --- /dev/null +++ b/nginx-operator/config/manager/manager.yaml @@ -0,0 +1,94 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + # TODO(user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + securityContext: + runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - args: + - --leader-elect + - --leader-election-id=nginx-operator + - --health-probe-bind-address=:8081 + image: controller:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 diff --git a/nginx-operator/config/manifests/bases/nginx-operator.clusterserviceversion.yaml b/nginx-operator/config/manifests/bases/nginx-operator.clusterserviceversion.yaml new file mode 100644 index 0000000000..1df205c97f --- /dev/null +++ b/nginx-operator/config/manifests/bases/nginx-operator.clusterserviceversion.yaml @@ -0,0 +1,46 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: '[]' + capabilities: Basic Install + name: nginx-operator.v0.0.0 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: {} + description: Operator Manages Kubernetes Nginx Controllers + displayName: nginx-operator + icon: + - base64data: "" + mediatype: "" + install: + spec: + deployments: null + strategy: "" + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - operator + - scality + - metalk8s + - nginx + - kubernetes + links: + - name: Nginx Operator + url: https://nginx-operator.domain + maintainers: + - email: ayoub.nasr@scality.com + name: Ayoub Nasr + maturity: alpha + provider: + name: scality + url: scality.com + version: 0.0.0 diff --git a/nginx-operator/config/manifests/kustomization.yaml b/nginx-operator/config/manifests/kustomization.yaml new file mode 100644 index 0000000000..39cb5ff796 --- /dev/null +++ b/nginx-operator/config/manifests/kustomization.yaml @@ -0,0 +1,7 @@ +# These resources constitute the fully configured set of manifests +# used to generate the 'manifests/' directory in a bundle. +resources: +- bases/nginx-operator.clusterserviceversion.yaml +- ../default +- ../samples +- ../scorecard diff --git a/nginx-operator/config/prometheus/kustomization.yaml b/nginx-operator/config/prometheus/kustomization.yaml new file mode 100644 index 0000000000..ed137168a1 --- /dev/null +++ b/nginx-operator/config/prometheus/kustomization.yaml @@ -0,0 +1,2 @@ +resources: +- monitor.yaml diff --git a/nginx-operator/config/prometheus/monitor.yaml b/nginx-operator/config/prometheus/monitor.yaml new file mode 100644 index 0000000000..cff501f974 --- /dev/null +++ b/nginx-operator/config/prometheus/monitor.yaml @@ -0,0 +1,30 @@ +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https # Ensure this is the name of the port that exposes HTTPS metrics + scheme: https + bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + tlsConfig: + # TODO(user): The option insecureSkipVerify: true is not recommended for production since it disables + # certificate verification. This poses a significant security risk by making the system vulnerable to + # man-in-the-middle attacks, where an attacker could intercept and manipulate the communication between + # Prometheus and the monitored services. This could lead to unauthorized access to sensitive metrics data, + # compromising the integrity and confidentiality of the information. + # Please use the following options for secure configurations: + # caFile: /etc/metrics-certs/ca.crt + # certFile: /etc/metrics-certs/tls.crt + # keyFile: /etc/metrics-certs/tls.key + insecureSkipVerify: true + selector: + matchLabels: + control-plane: controller-manager diff --git a/nginx-operator/config/rbac/ingressnginx_editor_role.yaml b/nginx-operator/config/rbac/ingressnginx_editor_role.yaml new file mode 100644 index 0000000000..0b25086af6 --- /dev/null +++ b/nginx-operator/config/rbac/ingressnginx_editor_role.yaml @@ -0,0 +1,27 @@ +# permissions for end users to edit ingressnginxes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: ingressnginx-editor-role +rules: +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes/status + verbs: + - get diff --git a/nginx-operator/config/rbac/ingressnginx_viewer_role.yaml b/nginx-operator/config/rbac/ingressnginx_viewer_role.yaml new file mode 100644 index 0000000000..524bd43ed1 --- /dev/null +++ b/nginx-operator/config/rbac/ingressnginx_viewer_role.yaml @@ -0,0 +1,23 @@ +# permissions for end users to view ingressnginxes. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: ingressnginx-viewer-role +rules: +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + verbs: + - get + - list + - watch +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes/status + verbs: + - get diff --git a/nginx-operator/config/rbac/kustomization.yaml b/nginx-operator/config/rbac/kustomization.yaml new file mode 100644 index 0000000000..2efe5bf233 --- /dev/null +++ b/nginx-operator/config/rbac/kustomization.yaml @@ -0,0 +1,27 @@ +resources: +# All RBAC will be applied under this service account in +# the deployment namespace. You may comment out this resource +# if your manager will use a service account that exists at +# runtime. Be sure to update RoleBinding and ClusterRoleBinding +# subjects if changing service account names. +- service_account.yaml +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# The following RBAC configurations are used to protect +# the metrics endpoint with authn/authz. These configurations +# ensure that only authorized users and service accounts +# can access the metrics endpoint. Comment the following +# permissions if you want to disable this protection. +# More info: https://book.kubebuilder.io/reference/metrics.html +- metrics_auth_role.yaml +- metrics_auth_role_binding.yaml +- metrics_reader_role.yaml +# For each CRD, "Editor" and "Viewer" roles are scaffolded by +# default, aiding admins in cluster management. Those roles are +# not used by the Project itself. You can comment the following lines +# if you do not want those helpers be installed with your Project. +- ingressnginx_editor_role.yaml +- ingressnginx_viewer_role.yaml + diff --git a/nginx-operator/config/rbac/leader_election_role.yaml b/nginx-operator/config/rbac/leader_election_role.yaml new file mode 100644 index 0000000000..5f17aa89d4 --- /dev/null +++ b/nginx-operator/config/rbac/leader_election_role.yaml @@ -0,0 +1,40 @@ +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/nginx-operator/config/rbac/leader_election_role_binding.yaml b/nginx-operator/config/rbac/leader_election_role_binding.yaml new file mode 100644 index 0000000000..160b5cbf90 --- /dev/null +++ b/nginx-operator/config/rbac/leader_election_role_binding.yaml @@ -0,0 +1,15 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/nginx-operator/config/rbac/metrics_auth_role.yaml b/nginx-operator/config/rbac/metrics_auth_role.yaml new file mode 100644 index 0000000000..32d2e4ec6b --- /dev/null +++ b/nginx-operator/config/rbac/metrics_auth_role.yaml @@ -0,0 +1,17 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: metrics-auth-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create diff --git a/nginx-operator/config/rbac/metrics_auth_role_binding.yaml b/nginx-operator/config/rbac/metrics_auth_role_binding.yaml new file mode 100644 index 0000000000..e775d67ff0 --- /dev/null +++ b/nginx-operator/config/rbac/metrics_auth_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: metrics-auth-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: metrics-auth-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/nginx-operator/config/rbac/metrics_reader_role.yaml b/nginx-operator/config/rbac/metrics_reader_role.yaml new file mode 100644 index 0000000000..51a75db47a --- /dev/null +++ b/nginx-operator/config/rbac/metrics_reader_role.yaml @@ -0,0 +1,9 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: metrics-reader +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get diff --git a/nginx-operator/config/rbac/role.yaml b/nginx-operator/config/rbac/role.yaml new file mode 100644 index 0000000000..5782063557 --- /dev/null +++ b/nginx-operator/config/rbac/role.yaml @@ -0,0 +1,83 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: manager-role +rules: +## +## Base operator rules +## +# We need to get namespaces so the operator can read namespaces to ensure they exist +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get +# We need to manage Helm release secrets +- apiGroups: + - "" + resources: + - secrets + verbs: + - "*" +# We need to create events on CRs about things happening during reconciliation +- apiGroups: + - "" + resources: + - events + verbs: + - create + +## +## Rules for metalk8s.scality.com/v1alpha1, Kind: IngressNginx +## +- apiGroups: + - metalk8s.scality.com + resources: + - ingressnginxes + - ingressnginxes/status + - ingressnginxes/finalizers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + +# +kubebuilder:scaffold:rules diff --git a/nginx-operator/config/rbac/role_binding.yaml b/nginx-operator/config/rbac/role_binding.yaml new file mode 100644 index 0000000000..40002fd6f7 --- /dev/null +++ b/nginx-operator/config/rbac/role_binding.yaml @@ -0,0 +1,15 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/nginx-operator/config/rbac/service_account.yaml b/nginx-operator/config/rbac/service_account.yaml new file mode 100644 index 0000000000..c6c8adb986 --- /dev/null +++ b/nginx-operator/config/rbac/service_account.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: nginx-operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager + namespace: system diff --git a/nginx-operator/config/samples/kustomization.yaml b/nginx-operator/config/samples/kustomization.yaml new file mode 100644 index 0000000000..4079730025 --- /dev/null +++ b/nginx-operator/config/samples/kustomization.yaml @@ -0,0 +1,4 @@ +## Append samples of your project ## +resources: +- metalk8s_v1alpha1_ingressnginx.yaml +# +kubebuilder:scaffold:manifestskustomizesamples diff --git a/nginx-operator/config/samples/metalk8s_v1alpha1_ingressnginx.yaml b/nginx-operator/config/samples/metalk8s_v1alpha1_ingressnginx.yaml new file mode 100644 index 0000000000..a9b20b7e2a --- /dev/null +++ b/nginx-operator/config/samples/metalk8s_v1alpha1_ingressnginx.yaml @@ -0,0 +1,419 @@ +apiVersion: metalk8s.scality.com/v1alpha1 +kind: IngressNginx +metadata: + name: ingressnginx-sample +spec: + # Default values copied from /helm-charts/ingress-nginx/values.yaml + commonLabels: {} + controller: + addHeaders: {} + admissionWebhooks: + annotations: {} + certManager: + admissionCert: + duration: "" + enabled: false + rootCert: + duration: "" + certificate: /usr/local/certificates/cert + createSecretJob: + name: create + resources: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault + enabled: true + existingPsp: "" + extraEnvs: [] + failurePolicy: Fail + key: /usr/local/certificates/key + labels: {} + name: admission + namespaceSelector: {} + objectSelector: {} + patch: + enabled: true + image: + digest: sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f + image: ingress-nginx/kube-webhook-certgen + pullPolicy: IfNotPresent + registry: registry.k8s.io + tag: v1.4.4 + labels: {} + networkPolicy: + enabled: false + nodeSelector: + kubernetes.io/os: linux + podAnnotations: {} + priorityClassName: "" + rbac: + create: true + securityContext: {} + serviceAccount: + automountServiceAccountToken: true + create: true + name: "" + tolerations: [] + patchWebhookJob: + name: patch + resources: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault + port: 8443 + service: + annotations: {} + externalIPs: [] + loadBalancerSourceRanges: [] + servicePort: 443 + type: ClusterIP + affinity: {} + allowSnippetAnnotations: false + annotations: {} + autoscaling: + annotations: {} + behavior: {} + enabled: false + maxReplicas: 11 + minReplicas: 1 + targetCPUUtilizationPercentage: 50 + targetMemoryUtilizationPercentage: 50 + autoscalingTemplate: [] + config: {} + configAnnotations: {} + configMapNamespace: "" + containerName: controller + containerPort: + http: 80 + https: 443 + containerSecurityContext: {} + customTemplate: + configMapKey: "" + configMapName: "" + disableLeaderElection: false + dnsConfig: {} + dnsPolicy: ClusterFirst + electionID: "" + electionTTL: "" + enableAnnotationValidations: false + enableMimalloc: true + enableTopologyAwareRouting: false + existingPsp: "" + extraArgs: {} + extraContainers: [] + extraEnvs: [] + extraInitContainers: [] + extraModules: [] + extraVolumeMounts: [] + extraVolumes: [] + healthCheckHost: "" + healthCheckPath: /healthz + hostAliases: [] + hostNetwork: false + hostPort: + enabled: false + ports: + http: 80 + https: 443 + hostname: {} + image: + allowPrivilegeEscalation: false + chroot: false + digest: sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7 + digestChroot: sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14 + image: ingress-nginx/controller + pullPolicy: IfNotPresent + readOnlyRootFilesystem: false + registry: registry.k8s.io + runAsNonRoot: true + runAsUser: 101 + seccompProfile: + type: RuntimeDefault + tag: v1.11.3 + ingressClass: nginx + ingressClassByName: false + ingressClassResource: + aliases: [] + annotations: {} + controllerValue: k8s.io/ingress-nginx + default: false + enabled: true + name: nginx + parameters: {} + keda: + apiVersion: keda.sh/v1alpha1 + behavior: {} + cooldownPeriod: 300 + enabled: false + maxReplicas: 11 + minReplicas: 1 + pollingInterval: 30 + restoreToOriginalReplicaCount: false + scaledObject: + annotations: {} + triggers: [] + kind: Deployment + labels: {} + lifecycle: + preStop: + exec: + command: + - /wait-shutdown + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + maxmindLicenseKey: "" + metrics: + enabled: false + port: 10254 + portName: metrics + prometheusRule: + additionalLabels: {} + enabled: false + rules: [] + service: + annotations: {} + externalIPs: [] + labels: {} + loadBalancerSourceRanges: [] + servicePort: 10254 + type: ClusterIP + serviceMonitor: + additionalLabels: {} + annotations: {} + enabled: false + metricRelabelings: [] + namespace: "" + namespaceSelector: {} + relabelings: [] + scrapeInterval: 30s + targetLabels: [] + minAvailable: 1 + minReadySeconds: 0 + name: controller + networkPolicy: + enabled: false + nodeSelector: + kubernetes.io/os: linux + opentelemetry: + containerSecurityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 65532 + seccompProfile: + type: RuntimeDefault + enabled: false + image: + digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 + distroless: true + image: ingress-nginx/opentelemetry-1.25.3 + registry: registry.k8s.io + tag: v20240813-b933310d + name: opentelemetry + resources: {} + podAnnotations: {} + podLabels: {} + podSecurityContext: {} + priorityClassName: "" + proxySetHeaders: {} + publishService: + enabled: true + pathOverride: "" + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + replicaCount: 1 + reportNodeInternalIp: false + resources: + requests: + cpu: 100m + memory: 90Mi + scope: + enabled: false + namespace: "" + namespaceSelector: "" + service: + annotations: {} + appProtocol: true + clusterIP: "" + enableHttp: true + enableHttps: true + enabled: true + external: + enabled: true + externalIPs: [] + externalTrafficPolicy: "" + internal: + annotations: {} + appProtocol: true + clusterIP: "" + enabled: false + externalIPs: [] + externalTrafficPolicy: "" + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + loadBalancerClass: "" + loadBalancerIP: "" + loadBalancerSourceRanges: [] + nodePorts: + http: "" + https: "" + tcp: {} + udp: {} + ports: {} + sessionAffinity: "" + targetPorts: {} + type: "" + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + labels: {} + loadBalancerClass: "" + loadBalancerIP: "" + loadBalancerSourceRanges: [] + nodePorts: + http: "" + https: "" + tcp: {} + udp: {} + ports: + http: 80 + https: 443 + sessionAffinity: "" + targetPorts: + http: http + https: https + type: LoadBalancer + shareProcessNamespace: false + sysctls: {} + tcp: + annotations: {} + configMapNamespace: "" + terminationGracePeriodSeconds: 300 + tolerations: [] + topologySpreadConstraints: [] + udp: + annotations: {} + configMapNamespace: "" + updateStrategy: {} + watchIngressWithoutClass: false + defaultBackend: + affinity: {} + autoscaling: + annotations: {} + enabled: false + maxReplicas: 2 + minReplicas: 1 + targetCPUUtilizationPercentage: 50 + targetMemoryUtilizationPercentage: 50 + containerSecurityContext: {} + enabled: false + existingPsp: "" + extraArgs: {} + extraConfigMaps: [] + extraEnvs: [] + extraVolumeMounts: [] + extraVolumes: [] + image: + allowPrivilegeEscalation: false + image: defaultbackend-amd64 + pullPolicy: IfNotPresent + readOnlyRootFilesystem: true + registry: registry.k8s.io + runAsNonRoot: true + runAsUser: 65534 + seccompProfile: + type: RuntimeDefault + tag: "1.5" + labels: {} + livenessProbe: + failureThreshold: 3 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + minAvailable: 1 + minReadySeconds: 0 + name: defaultbackend + networkPolicy: + enabled: false + nodeSelector: + kubernetes.io/os: linux + podAnnotations: {} + podLabels: {} + podSecurityContext: {} + port: 8080 + priorityClassName: "" + readinessProbe: + failureThreshold: 6 + initialDelaySeconds: 0 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 5 + replicaCount: 1 + resources: {} + service: + annotations: {} + externalIPs: [] + loadBalancerSourceRanges: [] + servicePort: 80 + type: ClusterIP + serviceAccount: + automountServiceAccountToken: true + create: true + name: "" + tolerations: [] + topologySpreadConstraints: [] + updateStrategy: {} + dhParam: "" + imagePullSecrets: [] + namespaceOverride: "" + podSecurityPolicy: + enabled: false + portNamePrefix: "" + rbac: + create: true + scope: false + revisionHistoryLimit: 10 + serviceAccount: + annotations: {} + automountServiceAccountToken: true + create: true + name: "" + tcp: {} + udp: {} + + diff --git a/nginx-operator/config/scorecard/bases/config.yaml b/nginx-operator/config/scorecard/bases/config.yaml new file mode 100644 index 0000000000..c77047841e --- /dev/null +++ b/nginx-operator/config/scorecard/bases/config.yaml @@ -0,0 +1,7 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: [] diff --git a/nginx-operator/config/scorecard/kustomization.yaml b/nginx-operator/config/scorecard/kustomization.yaml new file mode 100644 index 0000000000..54e8aa5075 --- /dev/null +++ b/nginx-operator/config/scorecard/kustomization.yaml @@ -0,0 +1,18 @@ +resources: +- bases/config.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +patches: +- path: patches/basic.config.yaml + target: + group: scorecard.operatorframework.io + kind: Configuration + name: config + version: v1alpha3 +- path: patches/olm.config.yaml + target: + group: scorecard.operatorframework.io + kind: Configuration + name: config + version: v1alpha3 +# +kubebuilder:scaffold:patches diff --git a/nginx-operator/config/scorecard/patches/basic.config.yaml b/nginx-operator/config/scorecard/patches/basic.config.yaml new file mode 100644 index 0000000000..84683cf8d7 --- /dev/null +++ b/nginx-operator/config/scorecard/patches/basic.config.yaml @@ -0,0 +1,10 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: basic + test: basic-check-spec-test diff --git a/nginx-operator/config/scorecard/patches/olm.config.yaml b/nginx-operator/config/scorecard/patches/olm.config.yaml new file mode 100644 index 0000000000..43f40a8b3f --- /dev/null +++ b/nginx-operator/config/scorecard/patches/olm.config.yaml @@ -0,0 +1,50 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-bundle-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-crds-have-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-crds-have-resources-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-spec-descriptors-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:v1.38.0 + labels: + suite: olm + test: olm-status-descriptors-test diff --git a/nginx-operator/helm-charts/ingress-nginx/.helmignore b/nginx-operator/helm-charts/ingress-nginx/.helmignore new file mode 100644 index 0000000000..109b40811c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +__snapshot__ diff --git a/nginx-operator/helm-charts/ingress-nginx/Chart.yaml b/nginx-operator/helm-charts/ingress-nginx/Chart.yaml new file mode 100644 index 0000000000..1f0128493d --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/Chart.yaml @@ -0,0 +1,25 @@ +annotations: + artifacthub.io/changes: | + - Update Ingress-Nginx version controller-v1.11.3 + artifacthub.io/prerelease: "false" +apiVersion: v2 +appVersion: 1.11.3 +description: Ingress controller for Kubernetes using NGINX as a reverse proxy and + load balancer +home: https://github.com/kubernetes/ingress-nginx +icon: https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Nginx_logo.svg/500px-Nginx_logo.svg.png +keywords: +- ingress +- nginx +kubeVersion: '>=1.21.0-0' +maintainers: +- name: cpanato +- name: Gacko +- name: puerco +- name: rikatz +- name: strongjz +- name: tao12345666333 +name: ingress-nginx +sources: +- https://github.com/kubernetes/ingress-nginx +version: 4.11.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/OWNERS b/nginx-operator/helm-charts/ingress-nginx/OWNERS new file mode 100644 index 0000000000..d588ede681 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/OWNERS @@ -0,0 +1,10 @@ +# See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners + +approvers: +- ingress-nginx-helm-maintainers + +reviewers: +- ingress-nginx-helm-reviewers + +labels: +- area/helm diff --git a/nginx-operator/helm-charts/ingress-nginx/README.md b/nginx-operator/helm-charts/ingress-nginx/README.md new file mode 100644 index 0000000000..f70bd0ae68 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/README.md @@ -0,0 +1,559 @@ +# ingress-nginx + +[ingress-nginx](https://github.com/kubernetes/ingress-nginx) Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer + +![Version: 4.11.3](https://img.shields.io/badge/Version-4.11.3-informational?style=flat-square) ![AppVersion: 1.11.3](https://img.shields.io/badge/AppVersion-1.11.3-informational?style=flat-square) + +To use, add `ingressClassName: nginx` spec field or the `kubernetes.io/ingress.class: nginx` annotation to your Ingress resources. + +This chart bootstraps an ingress-nginx deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +## Requirements + +Kubernetes: `>=1.21.0-0` + +## Get Repo Info + +```console +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +``` + +## Install Chart + +**Important:** only helm3 is supported + +```console +helm install [RELEASE_NAME] ingress-nginx/ingress-nginx +``` + +The command deploys ingress-nginx on the Kubernetes cluster in the default configuration. + +_See [configuration](#configuration) below._ + +_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ + +## Uninstall Chart + +```console +helm uninstall [RELEASE_NAME] +``` + +This removes all the Kubernetes components associated with the chart and deletes the release. + +_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ + +## Upgrading Chart + +```console +helm upgrade [RELEASE_NAME] [CHART] --install +``` + +_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ + +### Migrating from stable/nginx-ingress + +There are two main ways to migrate a release from `stable/nginx-ingress` to `ingress-nginx/ingress-nginx` chart: + +1. For Nginx Ingress controllers used for non-critical services, the easiest method is to [uninstall](#uninstall-chart) the old release and [install](#install-chart) the new one +1. For critical services in production that require zero-downtime, you will want to: + 1. [Install](#install-chart) a second Ingress controller + 1. Redirect your DNS traffic from the old controller to the new controller + 1. Log traffic from both controllers during this changeover + 1. [Uninstall](#uninstall-chart) the old controller once traffic has fully drained from it + +Note that there are some different and upgraded configurations between the two charts, described by Rimas Mocevicius from JFrog in the "Upgrading to ingress-nginx Helm chart" section of [Migrating from Helm chart nginx-ingress to ingress-nginx](https://rimusz.net/migrating-to-ingress-nginx). As the `ingress-nginx/ingress-nginx` chart continues to update, you will want to check current differences by running [helm configuration](#configuration) commands on both charts. + +## Configuration + +See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: + +```console +helm show values ingress-nginx/ingress-nginx +``` + +### PodDisruptionBudget + +Note that the PodDisruptionBudget resource will only be defined if the replicaCount is greater than one, +else it would make it impossible to evacuate a node. See [gh issue #7127](https://github.com/helm/charts/issues/7127) for more info. + +### Prometheus Metrics + +The Ingress-Nginx Controller can export Prometheus metrics, by setting `controller.metrics.enabled` to `true`. + +You can add Prometheus annotations to the metrics service using `controller.metrics.service.annotations`. +Alternatively, if you use the Prometheus Operator, you can enable ServiceMonitor creation using `controller.metrics.serviceMonitor.enabled`. And set `controller.metrics.serviceMonitor.additionalLabels.release="prometheus"`. "release=prometheus" should match the label configured in the prometheus servicemonitor ( see `kubectl get servicemonitor prometheus-kube-prom-prometheus -oyaml -n prometheus`) + +### ingress-nginx nginx\_status page/stats server + +Previous versions of this chart had a `controller.stats.*` configuration block, which is now obsolete due to the following changes in Ingress-Nginx Controller: + +- In [0.16.1](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0161), the vts (virtual host traffic status) dashboard was removed +- In [0.23.0](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230), the status page at port 18080 is now a unix socket webserver only available at localhost. + You can use `curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status` inside the controller container to access it locally, or use the snippet from [nginx-ingress changelog](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230) to re-enable the http server + +### ExternalDNS Service Configuration + +Add an [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) annotation to the LoadBalancer service: + +```yaml +controller: + service: + annotations: + external-dns.alpha.kubernetes.io/hostname: kubernetes-example.com. +``` + +### AWS L7 ELB with SSL Termination + +Annotate the controller as shown in the [nginx-ingress l7 patch](https://github.com/kubernetes/ingress-nginx/blob/ab3a789caae65eec4ad6e3b46b19750b481b6bce/deploy/aws/l7/service-l7.yaml): + +```yaml +controller: + service: + targetPorts: + http: http + https: http + annotations: + service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX + service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" + service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" + service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600' +``` + +### Additional Internal Load Balancer + +This setup is useful when you need both external and internal load balancers but don't want to have multiple ingress controllers and multiple ingress objects per application. + +By default, the ingress object will point to the external load balancer address, but if correctly configured, you can make use of the internal one if the URL you are looking up resolves to the internal load balancer's URL. + +You'll need to set both the following values: + +`controller.service.internal.enabled` +`controller.service.internal.annotations` + +If one of them is missing the internal load balancer will not be deployed. Example you may have `controller.service.internal.enabled=true` but no annotations set, in this case no action will be taken. + +`controller.service.internal.annotations` varies with the cloud service you're using. + +Example for AWS: + +```yaml +controller: + service: + internal: + enabled: true + annotations: + # Create internal NLB + service.beta.kubernetes.io/aws-load-balancer-scheme: "internal" + # Create internal ELB(Deprecated) + # service.beta.kubernetes.io/aws-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +Example for GCE: + +```yaml +controller: + service: + internal: + enabled: true + annotations: + # Create internal LB. More information: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing + # For GKE versions 1.17 and later + networking.gke.io/load-balancer-type: "Internal" + # For earlier versions + # cloud.google.com/load-balancer-type: "Internal" + + # Any other annotation can be declared here. +``` + +Example for Azure: + +```yaml +controller: + service: + annotations: + # Create internal LB + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +Example for Oracle Cloud Infrastructure: + +```yaml +controller: + service: + annotations: + # Create internal LB + service.beta.kubernetes.io/oci-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +The load balancer annotations of more cloud service providers can be found: [Internal load balancer](https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer). + +An use case for this scenario is having a split-view DNS setup where the public zone CNAME records point to the external balancer URL while the private zone CNAME records point to the internal balancer URL. This way, you only need one ingress kubernetes object. + +Optionally you can set `controller.service.loadBalancerIP` if you need a static IP for the resulting `LoadBalancer`. + +### Ingress Admission Webhooks + +With nginx-ingress-controller version 0.25+, the Ingress-Nginx Controller pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent bad ingress from being added to the cluster. +**This feature is enabled by default since 0.31.0.** + +With nginx-ingress-controller in 0.25.* work only with kubernetes 1.14+, 0.26 fix [this issue](https://github.com/kubernetes/ingress-nginx/pull/4521) + +#### How the Chart Configures the Hooks +A validating and configuration requires the endpoint to which the request is sent to use TLS. It is possible to set up custom certificates to do this, but in most cases, a self-signed certificate is enough. The setup of this component requires some more complex orchestration when using helm. The steps are created to be idempotent and to allow turning the feature on and off without running into helm quirks. + +1. A pre-install hook provisions a certificate into the same namespace using a format compatible with provisioning using end user certificates. If the certificate already exists, the hook exits. +2. The Ingress-Nginx Controller pod is configured to use a TLS proxy container, which will load that certificate. +3. Validating and Mutating webhook configurations are created in the cluster. +4. A post-install hook reads the CA from the secret created by step 1 and patches the Validating and Mutating webhook configurations. This process will allow a custom CA provisioned by some other process to also be patched into the webhook configurations. The chosen failure policy is also patched into the webhook configurations + +#### Alternatives +It should be possible to use [cert-manager/cert-manager](https://github.com/cert-manager/cert-manager) if a more complete solution is required. + +You can enable automatic self-signed TLS certificate provisioning via cert-manager by setting the `controller.admissionWebhooks.certManager.enabled` value to true. + +Please ensure that cert-manager is correctly installed and configured. + +### Helm Error When Upgrading: spec.clusterIP: Invalid value: "" + +If you are upgrading this chart from a version between 0.31.0 and 1.2.2 then you may get an error like this: + +```console +Error: UPGRADE FAILED: Service "?????-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable +``` + +Detail of how and why are in [this issue](https://github.com/helm/charts/pull/13646) but to resolve this you can set `xxxx.service.omitClusterIP` to `true` where `xxxx` is the service referenced in the error. + +As of version `1.26.0` of this chart, by simply not providing any clusterIP value, `invalid: spec.clusterIP: Invalid value: "": field is immutable` will no longer occur since `clusterIP: ""` will not be rendered. + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| commonLabels | object | `{}` | | +| controller.addHeaders | object | `{}` | Will add custom headers before sending response traffic to the client according to: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers | +| controller.admissionWebhooks.annotations | object | `{}` | | +| controller.admissionWebhooks.certManager.admissionCert.duration | string | `""` | | +| controller.admissionWebhooks.certManager.enabled | bool | `false` | | +| controller.admissionWebhooks.certManager.rootCert.duration | string | `""` | | +| controller.admissionWebhooks.certificate | string | `"/usr/local/certificates/cert"` | | +| controller.admissionWebhooks.createSecretJob.name | string | `"create"` | | +| controller.admissionWebhooks.createSecretJob.resources | object | `{}` | | +| controller.admissionWebhooks.createSecretJob.securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":65532,"seccompProfile":{"type":"RuntimeDefault"}}` | Security context for secret creation containers | +| controller.admissionWebhooks.enabled | bool | `true` | | +| controller.admissionWebhooks.existingPsp | string | `""` | Use an existing PSP instead of creating one | +| controller.admissionWebhooks.extraEnvs | list | `[]` | Additional environment variables to set | +| controller.admissionWebhooks.failurePolicy | string | `"Fail"` | Admission Webhook failure policy to use | +| controller.admissionWebhooks.key | string | `"/usr/local/certificates/key"` | | +| controller.admissionWebhooks.labels | object | `{}` | Labels to be added to admission webhooks | +| controller.admissionWebhooks.name | string | `"admission"` | | +| controller.admissionWebhooks.namespaceSelector | object | `{}` | | +| controller.admissionWebhooks.objectSelector | object | `{}` | | +| controller.admissionWebhooks.patch.enabled | bool | `true` | | +| controller.admissionWebhooks.patch.image.digest | string | `"sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f"` | | +| controller.admissionWebhooks.patch.image.image | string | `"ingress-nginx/kube-webhook-certgen"` | | +| controller.admissionWebhooks.patch.image.pullPolicy | string | `"IfNotPresent"` | | +| controller.admissionWebhooks.patch.image.registry | string | `"registry.k8s.io"` | | +| controller.admissionWebhooks.patch.image.tag | string | `"v1.4.4"` | | +| controller.admissionWebhooks.patch.labels | object | `{}` | Labels to be added to patch job resources | +| controller.admissionWebhooks.patch.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | +| controller.admissionWebhooks.patch.nodeSelector."kubernetes.io/os" | string | `"linux"` | | +| controller.admissionWebhooks.patch.podAnnotations | object | `{}` | | +| controller.admissionWebhooks.patch.priorityClassName | string | `""` | Provide a priority class name to the webhook patching job # | +| controller.admissionWebhooks.patch.rbac | object | `{"create":true}` | Admission webhook patch job RBAC | +| controller.admissionWebhooks.patch.rbac.create | bool | `true` | Create RBAC or not | +| controller.admissionWebhooks.patch.securityContext | object | `{}` | Security context for secret creation & webhook patch pods | +| controller.admissionWebhooks.patch.serviceAccount | object | `{"automountServiceAccountToken":true,"create":true,"name":""}` | Admission webhook patch job service account | +| controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken | bool | `true` | Auto-mount service account token or not | +| controller.admissionWebhooks.patch.serviceAccount.create | bool | `true` | Create a service account or not | +| controller.admissionWebhooks.patch.serviceAccount.name | string | `""` | Custom service account name | +| controller.admissionWebhooks.patch.tolerations | list | `[]` | | +| controller.admissionWebhooks.patchWebhookJob.name | string | `"patch"` | | +| controller.admissionWebhooks.patchWebhookJob.resources | object | `{}` | | +| controller.admissionWebhooks.patchWebhookJob.securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":65532,"seccompProfile":{"type":"RuntimeDefault"}}` | Security context for webhook patch containers | +| controller.admissionWebhooks.port | int | `8443` | | +| controller.admissionWebhooks.service.annotations | object | `{}` | | +| controller.admissionWebhooks.service.externalIPs | list | `[]` | | +| controller.admissionWebhooks.service.loadBalancerSourceRanges | list | `[]` | | +| controller.admissionWebhooks.service.servicePort | int | `443` | | +| controller.admissionWebhooks.service.type | string | `"ClusterIP"` | | +| controller.affinity | object | `{}` | Affinity and anti-affinity rules for server scheduling to nodes # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity # | +| controller.allowSnippetAnnotations | bool | `false` | This configuration defines if Ingress Controller should allow users to set their own *-snippet annotations, otherwise this is forbidden / dropped when users add those annotations. Global snippets in ConfigMap are still respected | +| controller.annotations | object | `{}` | Annotations to be added to the controller Deployment or DaemonSet # | +| controller.autoscaling.annotations | object | `{}` | | +| controller.autoscaling.behavior | object | `{}` | | +| controller.autoscaling.enabled | bool | `false` | | +| controller.autoscaling.maxReplicas | int | `11` | | +| controller.autoscaling.minReplicas | int | `1` | | +| controller.autoscaling.targetCPUUtilizationPercentage | int | `50` | | +| controller.autoscaling.targetMemoryUtilizationPercentage | int | `50` | | +| controller.autoscalingTemplate | list | `[]` | | +| controller.config | object | `{}` | Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ | +| controller.configAnnotations | object | `{}` | Annotations to be added to the controller config configuration configmap. | +| controller.configMapNamespace | string | `""` | Allows customization of the configmap / nginx-configmap namespace; defaults to $(POD_NAMESPACE) | +| controller.containerName | string | `"controller"` | Configures the controller container name | +| controller.containerPort | object | `{"http":80,"https":443}` | Configures the ports that the nginx-controller listens on | +| controller.containerSecurityContext | object | `{}` | Security context for controller containers | +| controller.customTemplate.configMapKey | string | `""` | | +| controller.customTemplate.configMapName | string | `""` | | +| controller.disableLeaderElection | bool | `false` | This configuration disable Nginx Controller Leader Election | +| controller.dnsConfig | object | `{}` | Optionally customize the pod dnsConfig. | +| controller.dnsPolicy | string | `"ClusterFirst"` | Optionally change this to ClusterFirstWithHostNet in case you have 'hostNetwork: true'. By default, while using host network, name resolution uses the host's DNS. If you wish nginx-controller to keep resolving names inside the k8s network, use ClusterFirstWithHostNet. | +| controller.electionID | string | `""` | Election ID to use for status update, by default it uses the controller name combined with a suffix of 'leader' | +| controller.electionTTL | string | `""` | Duration a leader election is valid before it's getting re-elected, e.g. `15s`, `10m` or `1h`. (Default: 30s) | +| controller.enableAnnotationValidations | bool | `false` | | +| controller.enableMimalloc | bool | `true` | Enable mimalloc as a drop-in replacement for malloc. # ref: https://github.com/microsoft/mimalloc # | +| controller.enableTopologyAwareRouting | bool | `false` | This configuration enables Topology Aware Routing feature, used together with service annotation service.kubernetes.io/topology-mode="auto" Defaults to false | +| controller.existingPsp | string | `""` | Use an existing PSP instead of creating one | +| controller.extraArgs | object | `{}` | Additional command line arguments to pass to Ingress-Nginx Controller E.g. to specify the default SSL certificate you can use | +| controller.extraContainers | list | `[]` | Additional containers to be added to the controller pod. See https://github.com/lemonldap-ng-controller/lemonldap-ng-controller as example. | +| controller.extraEnvs | list | `[]` | Additional environment variables to set | +| controller.extraInitContainers | list | `[]` | Containers, which are run before the app containers are started. | +| controller.extraModules | list | `[]` | Modules, which are mounted into the core nginx image. See values.yaml for a sample to add opentelemetry module | +| controller.extraVolumeMounts | list | `[]` | Additional volumeMounts to the controller main container. | +| controller.extraVolumes | list | `[]` | Additional volumes to the controller pod. | +| controller.healthCheckHost | string | `""` | Address to bind the health check endpoint. It is better to set this option to the internal node address if the Ingress-Nginx Controller is running in the `hostNetwork: true` mode. | +| controller.healthCheckPath | string | `"/healthz"` | Path of the health check endpoint. All requests received on the port defined by the healthz-port parameter are forwarded internally to this path. | +| controller.hostAliases | list | `[]` | Optionally customize the pod hostAliases. | +| controller.hostNetwork | bool | `false` | Required for use with CNI based kubernetes installations (such as ones set up by kubeadm), since CNI and hostport don't mix yet. Can be deprecated once https://github.com/kubernetes/kubernetes/issues/23920 is merged | +| controller.hostPort.enabled | bool | `false` | Enable 'hostPort' or not | +| controller.hostPort.ports.http | int | `80` | 'hostPort' http port | +| controller.hostPort.ports.https | int | `443` | 'hostPort' https port | +| controller.hostname | object | `{}` | Optionally customize the pod hostname. | +| controller.image.allowPrivilegeEscalation | bool | `false` | | +| controller.image.chroot | bool | `false` | | +| controller.image.digest | string | `"sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7"` | | +| controller.image.digestChroot | string | `"sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14"` | | +| controller.image.image | string | `"ingress-nginx/controller"` | | +| controller.image.pullPolicy | string | `"IfNotPresent"` | | +| controller.image.readOnlyRootFilesystem | bool | `false` | | +| controller.image.registry | string | `"registry.k8s.io"` | | +| controller.image.runAsNonRoot | bool | `true` | | +| controller.image.runAsUser | int | `101` | | +| controller.image.seccompProfile.type | string | `"RuntimeDefault"` | | +| controller.image.tag | string | `"v1.11.3"` | | +| controller.ingressClass | string | `"nginx"` | For backwards compatibility with ingress.class annotation, use ingressClass. Algorithm is as follows, first ingressClassName is considered, if not present, controller looks for ingress.class annotation | +| controller.ingressClassByName | bool | `false` | Process IngressClass per name (additionally as per spec.controller). | +| controller.ingressClassResource | object | `{"aliases":[],"annotations":{},"controllerValue":"k8s.io/ingress-nginx","default":false,"enabled":true,"name":"nginx","parameters":{}}` | This section refers to the creation of the IngressClass resource. IngressClasses are immutable and cannot be changed after creation. We do not support namespaced IngressClasses, yet, so a ClusterRole and a ClusterRoleBinding is required. | +| controller.ingressClassResource.aliases | list | `[]` | Aliases of this IngressClass. Creates copies with identical settings but the respective alias as name. Useful for development environments with only one Ingress Controller but production-like Ingress resources. `default` gets enabled on the original IngressClass only. | +| controller.ingressClassResource.annotations | object | `{}` | Annotations to be added to the IngressClass resource. | +| controller.ingressClassResource.controllerValue | string | `"k8s.io/ingress-nginx"` | Controller of the IngressClass. An Ingress Controller looks for IngressClasses it should reconcile by this value. This value is also being set as the `--controller-class` argument of this Ingress Controller. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class | +| controller.ingressClassResource.default | bool | `false` | If true, Ingresses without `ingressClassName` get assigned to this IngressClass on creation. Ingress creation gets rejected if there are multiple default IngressClasses. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#default-ingress-class | +| controller.ingressClassResource.enabled | bool | `true` | Create the IngressClass or not | +| controller.ingressClassResource.name | string | `"nginx"` | Name of the IngressClass | +| controller.ingressClassResource.parameters | object | `{}` | A link to a custom resource containing additional configuration for the controller. This is optional if the controller consuming this IngressClass does not require additional parameters. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class | +| controller.keda.apiVersion | string | `"keda.sh/v1alpha1"` | | +| controller.keda.behavior | object | `{}` | | +| controller.keda.cooldownPeriod | int | `300` | | +| controller.keda.enabled | bool | `false` | | +| controller.keda.maxReplicas | int | `11` | | +| controller.keda.minReplicas | int | `1` | | +| controller.keda.pollingInterval | int | `30` | | +| controller.keda.restoreToOriginalReplicaCount | bool | `false` | | +| controller.keda.scaledObject.annotations | object | `{}` | | +| controller.keda.triggers | list | `[]` | | +| controller.kind | string | `"Deployment"` | Use a `DaemonSet` or `Deployment` | +| controller.labels | object | `{}` | Labels to be added to the controller Deployment or DaemonSet and other resources that do not have option to specify labels # | +| controller.lifecycle | object | `{"preStop":{"exec":{"command":["/wait-shutdown"]}}}` | Improve connection draining when ingress controller pod is deleted using a lifecycle hook: With this new hook, we increased the default terminationGracePeriodSeconds from 30 seconds to 300, allowing the draining of connections up to five minutes. If the active connections end before that, the pod will terminate gracefully at that time. To effectively take advantage of this feature, the Configmap feature worker-shutdown-timeout new value is 240s instead of 10s. # | +| controller.livenessProbe.failureThreshold | int | `5` | | +| controller.livenessProbe.httpGet.path | string | `"/healthz"` | | +| controller.livenessProbe.httpGet.port | int | `10254` | | +| controller.livenessProbe.httpGet.scheme | string | `"HTTP"` | | +| controller.livenessProbe.initialDelaySeconds | int | `10` | | +| controller.livenessProbe.periodSeconds | int | `10` | | +| controller.livenessProbe.successThreshold | int | `1` | | +| controller.livenessProbe.timeoutSeconds | int | `1` | | +| controller.maxmindLicenseKey | string | `""` | Maxmind license key to download GeoLite2 Databases. # https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ | +| controller.metrics.enabled | bool | `false` | | +| controller.metrics.port | int | `10254` | | +| controller.metrics.portName | string | `"metrics"` | | +| controller.metrics.prometheusRule.additionalLabels | object | `{}` | | +| controller.metrics.prometheusRule.enabled | bool | `false` | | +| controller.metrics.prometheusRule.rules | list | `[]` | | +| controller.metrics.service.annotations | object | `{}` | | +| controller.metrics.service.externalIPs | list | `[]` | List of IP addresses at which the stats-exporter service is available # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips # | +| controller.metrics.service.labels | object | `{}` | Labels to be added to the metrics service resource | +| controller.metrics.service.loadBalancerSourceRanges | list | `[]` | | +| controller.metrics.service.servicePort | int | `10254` | | +| controller.metrics.service.type | string | `"ClusterIP"` | | +| controller.metrics.serviceMonitor.additionalLabels | object | `{}` | | +| controller.metrics.serviceMonitor.annotations | object | `{}` | Annotations to be added to the ServiceMonitor. | +| controller.metrics.serviceMonitor.enabled | bool | `false` | | +| controller.metrics.serviceMonitor.metricRelabelings | list | `[]` | | +| controller.metrics.serviceMonitor.namespace | string | `""` | | +| controller.metrics.serviceMonitor.namespaceSelector | object | `{}` | | +| controller.metrics.serviceMonitor.relabelings | list | `[]` | | +| controller.metrics.serviceMonitor.scrapeInterval | string | `"30s"` | | +| controller.metrics.serviceMonitor.targetLabels | list | `[]` | | +| controller.minAvailable | int | `1` | Minimum available pods set in PodDisruptionBudget. Define either 'minAvailable' or 'maxUnavailable', never both. | +| controller.minReadySeconds | int | `0` | `minReadySeconds` to avoid killing pods before we are ready # | +| controller.name | string | `"controller"` | | +| controller.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | +| controller.nodeSelector | object | `{"kubernetes.io/os":"linux"}` | Node labels for controller pod assignment # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ # | +| controller.opentelemetry.containerSecurityContext.allowPrivilegeEscalation | bool | `false` | | +| controller.opentelemetry.containerSecurityContext.capabilities.drop[0] | string | `"ALL"` | | +| controller.opentelemetry.containerSecurityContext.readOnlyRootFilesystem | bool | `true` | | +| controller.opentelemetry.containerSecurityContext.runAsNonRoot | bool | `true` | | +| controller.opentelemetry.containerSecurityContext.runAsUser | int | `65532` | The image's default user, inherited from its base image `cgr.dev/chainguard/static`. | +| controller.opentelemetry.containerSecurityContext.seccompProfile.type | string | `"RuntimeDefault"` | | +| controller.opentelemetry.enabled | bool | `false` | | +| controller.opentelemetry.image.digest | string | `"sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922"` | | +| controller.opentelemetry.image.distroless | bool | `true` | | +| controller.opentelemetry.image.image | string | `"ingress-nginx/opentelemetry-1.25.3"` | | +| controller.opentelemetry.image.registry | string | `"registry.k8s.io"` | | +| controller.opentelemetry.image.tag | string | `"v20240813-b933310d"` | | +| controller.opentelemetry.name | string | `"opentelemetry"` | | +| controller.opentelemetry.resources | object | `{}` | | +| controller.podAnnotations | object | `{}` | Annotations to be added to controller pods # | +| controller.podLabels | object | `{}` | Labels to add to the pod container metadata | +| controller.podSecurityContext | object | `{}` | Security context for controller pods | +| controller.priorityClassName | string | `""` | | +| controller.proxySetHeaders | object | `{}` | Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers | +| controller.publishService | object | `{"enabled":true,"pathOverride":""}` | Allows customization of the source of the IP address or FQDN to report in the ingress status field. By default, it reads the information provided by the service. If disable, the status field reports the IP address of the node or nodes where an ingress controller pod is running. | +| controller.publishService.enabled | bool | `true` | Enable 'publishService' or not | +| controller.publishService.pathOverride | string | `""` | Allows overriding of the publish service to bind to Must be / | +| controller.readinessProbe.failureThreshold | int | `3` | | +| controller.readinessProbe.httpGet.path | string | `"/healthz"` | | +| controller.readinessProbe.httpGet.port | int | `10254` | | +| controller.readinessProbe.httpGet.scheme | string | `"HTTP"` | | +| controller.readinessProbe.initialDelaySeconds | int | `10` | | +| controller.readinessProbe.periodSeconds | int | `10` | | +| controller.readinessProbe.successThreshold | int | `1` | | +| controller.readinessProbe.timeoutSeconds | int | `1` | | +| controller.replicaCount | int | `1` | | +| controller.reportNodeInternalIp | bool | `false` | Bare-metal considerations via the host network https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network Ingress status was blank because there is no Service exposing the Ingress-Nginx Controller in a configuration using the host network, the default --publish-service flag used in standard cloud setups does not apply | +| controller.resources.requests.cpu | string | `"100m"` | | +| controller.resources.requests.memory | string | `"90Mi"` | | +| controller.scope.enabled | bool | `false` | Enable 'scope' or not | +| controller.scope.namespace | string | `""` | Namespace to limit the controller to; defaults to $(POD_NAMESPACE) | +| controller.scope.namespaceSelector | string | `""` | When scope.enabled == false, instead of watching all namespaces, we watching namespaces whose labels only match with namespaceSelector. Format like foo=bar. Defaults to empty, means watching all namespaces. | +| controller.service.annotations | object | `{}` | Annotations to be added to the external controller service. See `controller.service.internal.annotations` for annotations to be added to the internal controller service. | +| controller.service.appProtocol | bool | `true` | Declare the app protocol of the external HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol | +| controller.service.clusterIP | string | `""` | Pre-defined cluster internal IP address of the external controller service. Take care of collisions with existing services. This value is immutable. Set once, it can not be changed without deleting and re-creating the service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address | +| controller.service.enableHttp | bool | `true` | Enable the HTTP listener on both controller services or not. | +| controller.service.enableHttps | bool | `true` | Enable the HTTPS listener on both controller services or not. | +| controller.service.enabled | bool | `true` | Enable controller services or not. This does not influence the creation of either the admission webhook or the metrics service. | +| controller.service.external.enabled | bool | `true` | Enable the external controller service or not. Useful for internal-only deployments. | +| controller.service.externalIPs | list | `[]` | List of node IP addresses at which the external controller service is available. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips | +| controller.service.externalTrafficPolicy | string | `""` | External traffic policy of the external controller service. Set to "Local" to preserve source IP on providers supporting it. Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip | +| controller.service.internal.annotations | object | `{}` | Annotations to be added to the internal controller service. Mandatory for the internal controller service to be created. Varies with the cloud service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer | +| controller.service.internal.appProtocol | bool | `true` | Declare the app protocol of the internal HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol | +| controller.service.internal.clusterIP | string | `""` | Pre-defined cluster internal IP address of the internal controller service. Take care of collisions with existing services. This value is immutable. Set once, it can not be changed without deleting and re-creating the service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address | +| controller.service.internal.enabled | bool | `false` | Enable the internal controller service or not. Remember to configure `controller.service.internal.annotations` when enabling this. | +| controller.service.internal.externalIPs | list | `[]` | List of node IP addresses at which the internal controller service is available. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips | +| controller.service.internal.externalTrafficPolicy | string | `""` | External traffic policy of the internal controller service. Set to "Local" to preserve source IP on providers supporting it. Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip | +| controller.service.internal.ipFamilies | list | `["IPv4"]` | List of IP families (e.g. IPv4, IPv6) assigned to the internal controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | +| controller.service.internal.ipFamilyPolicy | string | `"SingleStack"` | Represents the dual-stack capabilities of the internal controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. Fields `ipFamilies` and `clusterIP` depend on the value of this field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | +| controller.service.internal.loadBalancerClass | string | `""` | Load balancer class of the internal controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class | +| controller.service.internal.loadBalancerIP | string | `""` | Deprecated: Pre-defined IP address of the internal controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer | +| controller.service.internal.loadBalancerSourceRanges | list | `[]` | Restrict access to the internal controller service. Values must be CIDRs. Allows any source address by default. | +| controller.service.internal.nodePorts.http | string | `""` | Node port allocated for the internal HTTP listener. If left empty, the service controller allocates one from the configured node port range. | +| controller.service.internal.nodePorts.https | string | `""` | Node port allocated for the internal HTTPS listener. If left empty, the service controller allocates one from the configured node port range. | +| controller.service.internal.nodePorts.tcp | object | `{}` | Node port mapping for internal TCP listeners. If left empty, the service controller allocates them from the configured node port range. Example: tcp: 8080: 30080 | +| controller.service.internal.nodePorts.udp | object | `{}` | Node port mapping for internal UDP listeners. If left empty, the service controller allocates them from the configured node port range. Example: udp: 53: 30053 | +| controller.service.internal.ports | object | `{}` | | +| controller.service.internal.sessionAffinity | string | `""` | Session affinity of the internal controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity | +| controller.service.internal.targetPorts | object | `{}` | | +| controller.service.internal.type | string | `""` | Type of the internal controller service. Defaults to the value of `controller.service.type`. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types | +| controller.service.ipFamilies | list | `["IPv4"]` | List of IP families (e.g. IPv4, IPv6) assigned to the external controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | +| controller.service.ipFamilyPolicy | string | `"SingleStack"` | Represents the dual-stack capabilities of the external controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. Fields `ipFamilies` and `clusterIP` depend on the value of this field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | +| controller.service.labels | object | `{}` | Labels to be added to both controller services. | +| controller.service.loadBalancerClass | string | `""` | Load balancer class of the external controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class | +| controller.service.loadBalancerIP | string | `""` | Deprecated: Pre-defined IP address of the external controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer | +| controller.service.loadBalancerSourceRanges | list | `[]` | Restrict access to the external controller service. Values must be CIDRs. Allows any source address by default. | +| controller.service.nodePorts.http | string | `""` | Node port allocated for the external HTTP listener. If left empty, the service controller allocates one from the configured node port range. | +| controller.service.nodePorts.https | string | `""` | Node port allocated for the external HTTPS listener. If left empty, the service controller allocates one from the configured node port range. | +| controller.service.nodePorts.tcp | object | `{}` | Node port mapping for external TCP listeners. If left empty, the service controller allocates them from the configured node port range. Example: tcp: 8080: 30080 | +| controller.service.nodePorts.udp | object | `{}` | Node port mapping for external UDP listeners. If left empty, the service controller allocates them from the configured node port range. Example: udp: 53: 30053 | +| controller.service.ports.http | int | `80` | Port the external HTTP listener is published with. | +| controller.service.ports.https | int | `443` | Port the external HTTPS listener is published with. | +| controller.service.sessionAffinity | string | `""` | Session affinity of the external controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity | +| controller.service.targetPorts.http | string | `"http"` | Port of the ingress controller the external HTTP listener is mapped to. | +| controller.service.targetPorts.https | string | `"https"` | Port of the ingress controller the external HTTPS listener is mapped to. | +| controller.service.type | string | `"LoadBalancer"` | Type of the external controller service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types | +| controller.shareProcessNamespace | bool | `false` | | +| controller.sysctls | object | `{}` | sysctls for controller pods # Ref: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ | +| controller.tcp.annotations | object | `{}` | Annotations to be added to the tcp config configmap | +| controller.tcp.configMapNamespace | string | `""` | Allows customization of the tcp-services-configmap; defaults to $(POD_NAMESPACE) | +| controller.terminationGracePeriodSeconds | int | `300` | `terminationGracePeriodSeconds` to avoid killing pods before we are ready # wait up to five minutes for the drain of connections # | +| controller.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ # | +| controller.topologySpreadConstraints | list | `[]` | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. # Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ # | +| controller.udp.annotations | object | `{}` | Annotations to be added to the udp config configmap | +| controller.udp.configMapNamespace | string | `""` | Allows customization of the udp-services-configmap; defaults to $(POD_NAMESPACE) | +| controller.updateStrategy | object | `{}` | The update strategy to apply to the Deployment or DaemonSet # | +| controller.watchIngressWithoutClass | bool | `false` | Process Ingress objects without ingressClass annotation/ingressClassName field Overrides value for --watch-ingress-without-class flag of the controller binary Defaults to false | +| defaultBackend.affinity | object | `{}` | Affinity and anti-affinity rules for server scheduling to nodes # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity | +| defaultBackend.autoscaling.annotations | object | `{}` | | +| defaultBackend.autoscaling.enabled | bool | `false` | | +| defaultBackend.autoscaling.maxReplicas | int | `2` | | +| defaultBackend.autoscaling.minReplicas | int | `1` | | +| defaultBackend.autoscaling.targetCPUUtilizationPercentage | int | `50` | | +| defaultBackend.autoscaling.targetMemoryUtilizationPercentage | int | `50` | | +| defaultBackend.containerSecurityContext | object | `{}` | Security context for default backend containers | +| defaultBackend.enabled | bool | `false` | | +| defaultBackend.existingPsp | string | `""` | Use an existing PSP instead of creating one | +| defaultBackend.extraArgs | object | `{}` | | +| defaultBackend.extraConfigMaps | list | `[]` | | +| defaultBackend.extraEnvs | list | `[]` | Additional environment variables to set for defaultBackend pods | +| defaultBackend.extraVolumeMounts | list | `[]` | | +| defaultBackend.extraVolumes | list | `[]` | | +| defaultBackend.image.allowPrivilegeEscalation | bool | `false` | | +| defaultBackend.image.image | string | `"defaultbackend-amd64"` | | +| defaultBackend.image.pullPolicy | string | `"IfNotPresent"` | | +| defaultBackend.image.readOnlyRootFilesystem | bool | `true` | | +| defaultBackend.image.registry | string | `"registry.k8s.io"` | | +| defaultBackend.image.runAsNonRoot | bool | `true` | | +| defaultBackend.image.runAsUser | int | `65534` | | +| defaultBackend.image.seccompProfile.type | string | `"RuntimeDefault"` | | +| defaultBackend.image.tag | string | `"1.5"` | | +| defaultBackend.labels | object | `{}` | Labels to be added to the default backend resources | +| defaultBackend.livenessProbe.failureThreshold | int | `3` | | +| defaultBackend.livenessProbe.initialDelaySeconds | int | `30` | | +| defaultBackend.livenessProbe.periodSeconds | int | `10` | | +| defaultBackend.livenessProbe.successThreshold | int | `1` | | +| defaultBackend.livenessProbe.timeoutSeconds | int | `5` | | +| defaultBackend.minAvailable | int | `1` | Minimum available pods set in PodDisruptionBudget. | +| defaultBackend.minReadySeconds | int | `0` | `minReadySeconds` to avoid killing pods before we are ready # | +| defaultBackend.name | string | `"defaultbackend"` | | +| defaultBackend.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | +| defaultBackend.nodeSelector | object | `{"kubernetes.io/os":"linux"}` | Node labels for default backend pod assignment # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ # | +| defaultBackend.podAnnotations | object | `{}` | Annotations to be added to default backend pods # | +| defaultBackend.podLabels | object | `{}` | Labels to add to the pod container metadata | +| defaultBackend.podSecurityContext | object | `{}` | Security context for default backend pods | +| defaultBackend.port | int | `8080` | | +| defaultBackend.priorityClassName | string | `""` | | +| defaultBackend.readinessProbe.failureThreshold | int | `6` | | +| defaultBackend.readinessProbe.initialDelaySeconds | int | `0` | | +| defaultBackend.readinessProbe.periodSeconds | int | `5` | | +| defaultBackend.readinessProbe.successThreshold | int | `1` | | +| defaultBackend.readinessProbe.timeoutSeconds | int | `5` | | +| defaultBackend.replicaCount | int | `1` | | +| defaultBackend.resources | object | `{}` | | +| defaultBackend.service.annotations | object | `{}` | | +| defaultBackend.service.externalIPs | list | `[]` | List of IP addresses at which the default backend service is available # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips # | +| defaultBackend.service.loadBalancerSourceRanges | list | `[]` | | +| defaultBackend.service.servicePort | int | `80` | | +| defaultBackend.service.type | string | `"ClusterIP"` | | +| defaultBackend.serviceAccount.automountServiceAccountToken | bool | `true` | | +| defaultBackend.serviceAccount.create | bool | `true` | | +| defaultBackend.serviceAccount.name | string | `""` | | +| defaultBackend.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ # | +| defaultBackend.topologySpreadConstraints | list | `[]` | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. Ref.: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ | +| defaultBackend.updateStrategy | object | `{}` | The update strategy to apply to the Deployment or DaemonSet # | +| dhParam | string | `""` | A base64-encoded Diffie-Hellman parameter. This can be generated with: `openssl dhparam 4096 2> /dev/null | base64` # Ref: https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/ssl-dh-param | +| imagePullSecrets | list | `[]` | Optional array of imagePullSecrets containing private registry credentials # Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ | +| namespaceOverride | string | `""` | Override the deployment namespace; defaults to .Release.Namespace | +| podSecurityPolicy.enabled | bool | `false` | | +| portNamePrefix | string | `""` | Prefix for TCP and UDP ports names in ingress controller service # Some cloud providers, like Yandex Cloud may have a requirements for a port name regex to support cloud load balancer integration | +| rbac.create | bool | `true` | | +| rbac.scope | bool | `false` | | +| revisionHistoryLimit | int | `10` | Rollback limit # | +| serviceAccount.annotations | object | `{}` | Annotations for the controller service account | +| serviceAccount.automountServiceAccountToken | bool | `true` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `""` | | +| tcp | object | `{}` | TCP service key-value pairs # Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md # | +| udp | object | `{}` | UDP service key-value pairs # Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md # | diff --git a/nginx-operator/helm-charts/ingress-nginx/README.md.gotmpl b/nginx-operator/helm-charts/ingress-nginx/README.md.gotmpl new file mode 100644 index 0000000000..17b029bbfa --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/README.md.gotmpl @@ -0,0 +1,229 @@ +{{ template "chart.header" . }} +[ingress-nginx](https://github.com/kubernetes/ingress-nginx) Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer + +{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} + +To use, add `ingressClassName: nginx` spec field or the `kubernetes.io/ingress.class: nginx` annotation to your Ingress resources. + +This chart bootstraps an ingress-nginx deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +{{ template "chart.requirementsSection" . }} + +## Get Repo Info + +```console +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo update +``` + +## Install Chart + +**Important:** only helm3 is supported + +```console +helm install [RELEASE_NAME] ingress-nginx/ingress-nginx +``` + +The command deploys ingress-nginx on the Kubernetes cluster in the default configuration. + +_See [configuration](#configuration) below._ + +_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ + +## Uninstall Chart + +```console +helm uninstall [RELEASE_NAME] +``` + +This removes all the Kubernetes components associated with the chart and deletes the release. + +_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ + +## Upgrading Chart + +```console +helm upgrade [RELEASE_NAME] [CHART] --install +``` + +_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ + +### Migrating from stable/nginx-ingress + +There are two main ways to migrate a release from `stable/nginx-ingress` to `ingress-nginx/ingress-nginx` chart: + +1. For Nginx Ingress controllers used for non-critical services, the easiest method is to [uninstall](#uninstall-chart) the old release and [install](#install-chart) the new one +1. For critical services in production that require zero-downtime, you will want to: + 1. [Install](#install-chart) a second Ingress controller + 1. Redirect your DNS traffic from the old controller to the new controller + 1. Log traffic from both controllers during this changeover + 1. [Uninstall](#uninstall-chart) the old controller once traffic has fully drained from it + +Note that there are some different and upgraded configurations between the two charts, described by Rimas Mocevicius from JFrog in the "Upgrading to ingress-nginx Helm chart" section of [Migrating from Helm chart nginx-ingress to ingress-nginx](https://rimusz.net/migrating-to-ingress-nginx). As the `ingress-nginx/ingress-nginx` chart continues to update, you will want to check current differences by running [helm configuration](#configuration) commands on both charts. + +## Configuration + +See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: + +```console +helm show values ingress-nginx/ingress-nginx +``` + +### PodDisruptionBudget + +Note that the PodDisruptionBudget resource will only be defined if the replicaCount is greater than one, +else it would make it impossible to evacuate a node. See [gh issue #7127](https://github.com/helm/charts/issues/7127) for more info. + +### Prometheus Metrics + +The Ingress-Nginx Controller can export Prometheus metrics, by setting `controller.metrics.enabled` to `true`. + +You can add Prometheus annotations to the metrics service using `controller.metrics.service.annotations`. +Alternatively, if you use the Prometheus Operator, you can enable ServiceMonitor creation using `controller.metrics.serviceMonitor.enabled`. And set `controller.metrics.serviceMonitor.additionalLabels.release="prometheus"`. "release=prometheus" should match the label configured in the prometheus servicemonitor ( see `kubectl get servicemonitor prometheus-kube-prom-prometheus -oyaml -n prometheus`) + +### ingress-nginx nginx\_status page/stats server + +Previous versions of this chart had a `controller.stats.*` configuration block, which is now obsolete due to the following changes in Ingress-Nginx Controller: + +- In [0.16.1](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0161), the vts (virtual host traffic status) dashboard was removed +- In [0.23.0](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230), the status page at port 18080 is now a unix socket webserver only available at localhost. + You can use `curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status` inside the controller container to access it locally, or use the snippet from [nginx-ingress changelog](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230) to re-enable the http server + +### ExternalDNS Service Configuration + +Add an [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) annotation to the LoadBalancer service: + +```yaml +controller: + service: + annotations: + external-dns.alpha.kubernetes.io/hostname: kubernetes-example.com. +``` + +### AWS L7 ELB with SSL Termination + +Annotate the controller as shown in the [nginx-ingress l7 patch](https://github.com/kubernetes/ingress-nginx/blob/ab3a789caae65eec4ad6e3b46b19750b481b6bce/deploy/aws/l7/service-l7.yaml): + +```yaml +controller: + service: + targetPorts: + http: http + https: http + annotations: + service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX + service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" + service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" + service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600' +``` + +### Additional Internal Load Balancer + +This setup is useful when you need both external and internal load balancers but don't want to have multiple ingress controllers and multiple ingress objects per application. + +By default, the ingress object will point to the external load balancer address, but if correctly configured, you can make use of the internal one if the URL you are looking up resolves to the internal load balancer's URL. + +You'll need to set both the following values: + +`controller.service.internal.enabled` +`controller.service.internal.annotations` + +If one of them is missing the internal load balancer will not be deployed. Example you may have `controller.service.internal.enabled=true` but no annotations set, in this case no action will be taken. + +`controller.service.internal.annotations` varies with the cloud service you're using. + +Example for AWS: + +```yaml +controller: + service: + internal: + enabled: true + annotations: + # Create internal NLB + service.beta.kubernetes.io/aws-load-balancer-scheme: "internal" + # Create internal ELB(Deprecated) + # service.beta.kubernetes.io/aws-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +Example for GCE: + +```yaml +controller: + service: + internal: + enabled: true + annotations: + # Create internal LB. More information: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing + # For GKE versions 1.17 and later + networking.gke.io/load-balancer-type: "Internal" + # For earlier versions + # cloud.google.com/load-balancer-type: "Internal" + + # Any other annotation can be declared here. +``` + +Example for Azure: + +```yaml +controller: + service: + annotations: + # Create internal LB + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +Example for Oracle Cloud Infrastructure: + +```yaml +controller: + service: + annotations: + # Create internal LB + service.beta.kubernetes.io/oci-load-balancer-internal: "true" + # Any other annotation can be declared here. +``` + +The load balancer annotations of more cloud service providers can be found: [Internal load balancer](https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer). + +An use case for this scenario is having a split-view DNS setup where the public zone CNAME records point to the external balancer URL while the private zone CNAME records point to the internal balancer URL. This way, you only need one ingress kubernetes object. + +Optionally you can set `controller.service.loadBalancerIP` if you need a static IP for the resulting `LoadBalancer`. + +### Ingress Admission Webhooks + +With nginx-ingress-controller version 0.25+, the Ingress-Nginx Controller pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent bad ingress from being added to the cluster. +**This feature is enabled by default since 0.31.0.** + +With nginx-ingress-controller in 0.25.* work only with kubernetes 1.14+, 0.26 fix [this issue](https://github.com/kubernetes/ingress-nginx/pull/4521) + +#### How the Chart Configures the Hooks +A validating and configuration requires the endpoint to which the request is sent to use TLS. It is possible to set up custom certificates to do this, but in most cases, a self-signed certificate is enough. The setup of this component requires some more complex orchestration when using helm. The steps are created to be idempotent and to allow turning the feature on and off without running into helm quirks. + +1. A pre-install hook provisions a certificate into the same namespace using a format compatible with provisioning using end user certificates. If the certificate already exists, the hook exits. +2. The Ingress-Nginx Controller pod is configured to use a TLS proxy container, which will load that certificate. +3. Validating and Mutating webhook configurations are created in the cluster. +4. A post-install hook reads the CA from the secret created by step 1 and patches the Validating and Mutating webhook configurations. This process will allow a custom CA provisioned by some other process to also be patched into the webhook configurations. The chosen failure policy is also patched into the webhook configurations + +#### Alternatives +It should be possible to use [cert-manager/cert-manager](https://github.com/cert-manager/cert-manager) if a more complete solution is required. + +You can enable automatic self-signed TLS certificate provisioning via cert-manager by setting the `controller.admissionWebhooks.certManager.enabled` value to true. + +Please ensure that cert-manager is correctly installed and configured. + +### Helm Error When Upgrading: spec.clusterIP: Invalid value: "" + +If you are upgrading this chart from a version between 0.31.0 and 1.2.2 then you may get an error like this: + +```console +Error: UPGRADE FAILED: Service "?????-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable +``` + +Detail of how and why are in [this issue](https://github.com/helm/charts/pull/13646) but to resolve this you can set `xxxx.service.omitClusterIP` to `true` where `xxxx` is the service referenced in the error. + +As of version `1.26.0` of this chart, by simply not providing any clusterIP value, `invalid: spec.clusterIP: Invalid value: "": field is immutable` will no longer occur since `clusterIP: ""` will not be rendered. + +{{ template "chart.valuesSection" . }} diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.10.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.10.0.md new file mode 100644 index 0000000000..b42d6c28b2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.10.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.10.0 + +* [#5843](https://github.com/kubernetes/ingress-nginx/pull/5843) Update jettech/kube-webhook-certgen image + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.9.1...ingress-nginx-2.10.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.0.md new file mode 100644 index 0000000000..e549b3867f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.0.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.11.0 + +* [#5879](https://github.com/kubernetes/ingress-nginx/pull/5879) Update helm chart for v0.34.0 +* [#5671](https://github.com/kubernetes/ingress-nginx/pull/5671) Make liveness probe more fault tolerant than readiness probe + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.10.0...ingress-nginx-2.11.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.1.md new file mode 100644 index 0000000000..d910d3bf49 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.11.1 + +* [#5900](https://github.com/kubernetes/ingress-nginx/pull/5900) Release helm chart for v0.34.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.0...ingress-nginx-2.11.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.2.md new file mode 100644 index 0000000000..9f7821005d --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.2.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.11.2 + +* [#5951](https://github.com/kubernetes/ingress-nginx/pull/5951) Bump chart patch version + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.1...ingress-nginx-2.11.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.3.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.3.md new file mode 100644 index 0000000000..344769163b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.11.3.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.11.3 + +* [#6038](https://github.com/kubernetes/ingress-nginx/pull/6038) Bump chart version PATCH + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.2...ingress-nginx-2.11.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.0.md new file mode 100644 index 0000000000..5cb3888aae --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.0.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.12.0 + +* [#6039](https://github.com/kubernetes/ingress-nginx/pull/6039) Add configurable serviceMonitor metricRelabelling and targetLabels +* [#6044](https://github.com/kubernetes/ingress-nginx/pull/6044) Fix YAML linting + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.3...ingress-nginx-2.12.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.1.md new file mode 100644 index 0000000000..94d121db57 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.12.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.12.1 + +* [#6075](https://github.com/kubernetes/ingress-nginx/pull/6075) Sync helm chart affinity examples + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.12.0...ingress-nginx-2.12.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.13.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.13.0.md new file mode 100644 index 0000000000..01fe0b15d9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.13.0.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.13.0 + +* [#6093](https://github.com/kubernetes/ingress-nginx/pull/6093) Release v0.35.0 +* [#6080](https://github.com/kubernetes/ingress-nginx/pull/6080) Switch images to k8s.gcr.io after Vanity Domain Flip + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.12.1...ingress-nginx-2.13.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.14.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.14.0.md new file mode 100644 index 0000000000..2fb7a5a767 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.14.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.14.0 + +* [#6104](https://github.com/kubernetes/ingress-nginx/pull/6104) Misc fixes for nginx-ingress chart for better keel and prometheus-operator integration + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.13.0...ingress-nginx-2.14.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.15.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.15.0.md new file mode 100644 index 0000000000..543a55927e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.15.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.15.0 + +* [#6087](https://github.com/kubernetes/ingress-nginx/pull/6087) Adding parameter for externalTrafficPolicy in internal controller service spec + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.14.0...ingress-nginx-2.15.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.16.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.16.0.md new file mode 100644 index 0000000000..996f4489eb --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.16.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.16.0 + +* [#6154](https://github.com/kubernetes/ingress-nginx/pull/6154) add `topologySpreadConstraint` to controller + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.15.0...ingress-nginx-2.16.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.0.md new file mode 100644 index 0000000000..11c5f5fedf --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.9.0 + +* [#5795](https://github.com/kubernetes/ingress-nginx/pull/5795) Use fully qualified images to avoid cri-o issues + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-TODO...ingress-nginx-2.9.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.1.md new file mode 100644 index 0000000000..7d4314d9c6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-2.9.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 2.9.1 + +* [#5823](https://github.com/kubernetes/ingress-nginx/pull/5823) Add quoting to sysctls because numeric values need to be presented as strings (#5823) + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.9.0...ingress-nginx-2.9.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.0.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.0.0.md new file mode 100644 index 0000000000..a7d50ee3a3 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.0.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.0.0 + +* [#6167](https://github.com/kubernetes/ingress-nginx/pull/6167) Update chart requirements + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.16.0...ingress-nginx-3.0.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.0.md new file mode 100644 index 0000000000..3369bed032 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.10.0 + +* Fix routing regression introduced in 0.41.0 with PathType Exact + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.9.0...ingress-nginx-3.10.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.1.md new file mode 100644 index 0000000000..6ff682e528 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.10.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.10.1 + +* Fix regression introduced in 0.41.0 with external authentication + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.10.0...ingress-nginx-3.10.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.0.md new file mode 100644 index 0000000000..69ba5506b5 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.11.0 + +* Support Keda Autoscaling + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.10.1...ingress-nginx-3.11.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.1.md new file mode 100644 index 0000000000..4e81f4b418 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.11.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.11.1 + +* [#6505](https://github.com/kubernetes/ingress-nginx/pull/6505) Reorder HPA resource list to work with GitOps tooling + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.11.0...ingress-nginx-3.11.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.12.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.12.0.md new file mode 100644 index 0000000000..41b9744de6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.12.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.12.0 + +* [#6514](https://github.com/kubernetes/ingress-nginx/pull/6514) Remove helm2 support and update docs + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.11.1...ingress-nginx-3.12.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.13.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.13.0.md new file mode 100644 index 0000000000..0855a79139 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.13.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.13.0 + +* [#6544](https://github.com/kubernetes/ingress-nginx/pull/6544) Fix default backend HPA name variable + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.12.0...ingress-nginx-3.13.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.14.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.14.0.md new file mode 100644 index 0000000000..e07880bf49 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.14.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.14.0 + +* [#6469](https://github.com/kubernetes/ingress-nginx/pull/6469) Allow custom service names for controller and backend + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.13.0...ingress-nginx-3.14.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.0.md new file mode 100644 index 0000000000..3053a3548f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.15.0 + +* [#6586](https://github.com/kubernetes/ingress-nginx/pull/6586) Fix 'maxmindLicenseKey' location in values.yaml + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.14.0...ingress-nginx-3.15.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.1.md new file mode 100644 index 0000000000..f11ee0a764 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.15.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.15.1 + +* Fix chart-releaser action + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.15.0...ingress-nginx-3.15.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.0.md new file mode 100644 index 0000000000..fba30b1711 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.16.0 + +* [#6646](https://github.com/kubernetes/ingress-nginx/pull/6646) Added LoadBalancerIP value for internal service + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.15.1...helm-chart-3.16.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.1.md new file mode 100644 index 0000000000..650d1b8fad --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.16.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.16.1 + +* Fix chart-releaser action + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.16.0...helm-chart-3.16.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.17.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.17.0.md new file mode 100644 index 0000000000..175c7a2647 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.17.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.17.0 + +* Update ingress-nginx v0.42.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.16.1...helm-chart-3.17.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.18.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.18.0.md new file mode 100644 index 0000000000..31b815e4ea --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.18.0.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.18.0 + +* [#6688](https://github.com/kubernetes/ingress-nginx/pull/6688) Allow volume-type emptyDir in controller podsecuritypolicy +* [#6691](https://github.com/kubernetes/ingress-nginx/pull/6691) Improve parsing of helm parameters + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.17.0...helm-chart-3.18.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.19.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.19.0.md new file mode 100644 index 0000000000..0970bf02ca --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.19.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.19.0 + +* Update ingress-nginx v0.43.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.18.0...helm-chart-3.19.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.0.md new file mode 100644 index 0000000000..4b81ae42f6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.20.0 + +* [#6730](https://github.com/kubernetes/ingress-nginx/pull/6730) Do not create HPA for defaultBackend if not enabled. + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.19.0...helm-chart-3.20.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.1.md new file mode 100644 index 0000000000..952bf2bd3e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.20.1.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.20.1 + +* Do not create KEDA in case of DaemonSets. +* Fix KEDA v2 definition + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.20.0...helm-chart-3.20.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.21.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.21.0.md new file mode 100644 index 0000000000..25edbefd92 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.21.0.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.21.0 + +* [#6783](https://github.com/kubernetes/ingress-nginx/pull/6783) Add custom annotations to ScaledObject +* [#6761](https://github.com/kubernetes/ingress-nginx/pull/6761) Adding quotes in the serviceAccount name in Helm values +* [#6767](https://github.com/kubernetes/ingress-nginx/pull/6767) Remove ClusterRole when scope option is enabled +* [#6785](https://github.com/kubernetes/ingress-nginx/pull/6785) Update kube-webhook-certgen image to v1.5.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.20.1...helm-chart-3.21.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.22.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.22.0.md new file mode 100644 index 0000000000..147d66421e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.22.0.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.22.0 + +* [#6802](https://github.com/kubernetes/ingress-nginx/pull/6802) Add value for configuring a custom Diffie-Hellman parameters file +* [#6815](https://github.com/kubernetes/ingress-nginx/pull/6815) Allow use of numeric namespaces in helm chart + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.21.0...helm-chart-3.22.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.23.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.23.0.md new file mode 100644 index 0000000000..5dcb50fa82 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.23.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.23.0 + +* Update ingress-nginx v0.44.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.22.0...helm-chart-3.23.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.24.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.24.0.md new file mode 100644 index 0000000000..d7db808b12 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.24.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.24.0 + +* [#6908](https://github.com/kubernetes/ingress-nginx/pull/6908) Add volumes to default-backend deployment + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.23.0...helm-chart-3.24.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.25.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.25.0.md new file mode 100644 index 0000000000..f9679a1242 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.25.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.25.0 + +* [#6957](https://github.com/kubernetes/ingress-nginx/pull/6957) Add ability to specify automountServiceAccountToken + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.24.0...helm-chart-3.25.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.26.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.26.0.md new file mode 100644 index 0000000000..0c3a1df685 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.26.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.26.0 + +* [#6979](https://github.com/kubernetes/ingress-nginx/pull/6979) Changed servicePort value for metrics + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.25.0...helm-chart-3.26.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.27.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.27.0.md new file mode 100644 index 0000000000..8113d7b9b6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.27.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.27.0 + +* Update ingress-nginx v0.45.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.26.0...helm-chart-3.27.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.28.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.28.0.md new file mode 100644 index 0000000000..eee0ccbec8 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.28.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.28.0 + +* [#6900](https://github.com/kubernetes/ingress-nginx/pull/6900) Support existing PSPs + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.27.0...helm-chart-3.28.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.29.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.29.0.md new file mode 100644 index 0000000000..f0fabdce19 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.29.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.29.0 + +* [#6945](https://github.com/kubernetes/ingress-nginx/pull/7020) Add option to specify job label for ServiceMonitor + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.28.0...helm-chart-3.29.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.0.md new file mode 100644 index 0000000000..09fab3756b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.0.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.3.0 + +* [#6203](https://github.com/kubernetes/ingress-nginx/pull/6203) Refactor parsing of key values +* [#6162](https://github.com/kubernetes/ingress-nginx/pull/6162) Add helm chart options to expose metrics service as NodePort +* [#6180](https://github.com/kubernetes/ingress-nginx/pull/6180) Fix helm chart admissionReviewVersions regression +* [#6169](https://github.com/kubernetes/ingress-nginx/pull/6169) Fix Typo in example prometheus rules + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.0.0...ingress-nginx-3.3.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.1.md new file mode 100644 index 0000000000..81f44fdbd7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.3.1.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.3.1 + +* [#6259](https://github.com/kubernetes/ingress-nginx/pull/6259) Release helm chart +* [#6258](https://github.com/kubernetes/ingress-nginx/pull/6258) Fix chart markdown link +* [#6253](https://github.com/kubernetes/ingress-nginx/pull/6253) Release v0.40.0 +* [#6233](https://github.com/kubernetes/ingress-nginx/pull/6233) Add admission controller e2e test + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.3.0...ingress-nginx-3.3.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.30.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.30.0.md new file mode 100644 index 0000000000..77ad6b41bb --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.30.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.30.0 + +* [#7092](https://github.com/kubernetes/ingress-nginx/pull/7092) Removes the possibility of using localhost in ExternalNames as endpoints + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.29.0...helm-chart-3.30.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.31.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.31.0.md new file mode 100644 index 0000000000..bc07fed767 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.31.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.31.0 + +* [7137] https://github.com/kubernetes/ingress-nginx/pull/7137 Add support for custom probes + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.30.0...helm-chart-3.31.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.32.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.32.0.md new file mode 100644 index 0000000000..68f7ed6b24 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.32.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.32.0 + +* [7117] https://github.com/kubernetes/ingress-nginx/pull/7117 Add annotations for HPA + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.31.0...helm-chart-3.32.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.33.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.33.0.md new file mode 100644 index 0000000000..b56c5fc1e3 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.33.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.33.0 + +* [7164] https://github.com/kubernetes/ingress-nginx/pull/7164 Update nginx to v1.20.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.32.0...helm-chart-3.33.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.34.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.34.0.md new file mode 100644 index 0000000000..a28cd0282a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.34.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.34.0 + +* [7256] https://github.com/kubernetes/ingress-nginx/pull/7256 Add namespace field in the namespace scoped resource templates + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.33.0...helm-chart-3.34.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.4.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.4.0.md new file mode 100644 index 0000000000..3b4ca93537 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.4.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.4.0 + +* [#6268](https://github.com/kubernetes/ingress-nginx/pull/6268) Update to 0.40.2 in helm chart #6288 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.3.1...ingress-nginx-3.4.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.0.md new file mode 100644 index 0000000000..44991b3bb6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.5.0 + +* [#6260](https://github.com/kubernetes/ingress-nginx/pull/6260) Allow Helm Chart to customize admission webhook's annotations, timeoutSeconds, namespaceSelector, objectSelector and cert files locations + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.4.0...ingress-nginx-3.5.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.1.md new file mode 100644 index 0000000000..740f00c458 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.5.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.5.1 + +* [#6299](https://github.com/kubernetes/ingress-nginx/pull/6299) Fix helm chart release + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.5.0...ingress-nginx-3.5.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.6.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.6.0.md new file mode 100644 index 0000000000..4af7f11a17 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.6.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.6.0 + +* [#6305](https://github.com/kubernetes/ingress-nginx/pull/6305) Add default linux nodeSelector + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.5.1...ingress-nginx-3.6.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.0.md new file mode 100644 index 0000000000..a6b12994b8 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.7.0 + +* [#6316](https://github.com/kubernetes/ingress-nginx/pull/6316) Numerals in podAnnotations in quotes [#6315](https://github.com/kubernetes/ingress-nginx/issues/6315) + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.6.0...ingress-nginx-3.7.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.1.md new file mode 100644 index 0000000000..6ba12df913 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.7.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.7.1 + +* [#6326](https://github.com/kubernetes/ingress-nginx/pull/6326) Fix liveness and readiness probe path in daemonset chart + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.7.0...ingress-nginx-3.7.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.8.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.8.0.md new file mode 100644 index 0000000000..8df250a982 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.8.0.md @@ -0,0 +1,13 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.8.0 + +* [#6395](https://github.com/kubernetes/ingress-nginx/pull/6395) Update jettech/kube-webhook-certgen image +* [#6377](https://github.com/kubernetes/ingress-nginx/pull/6377) Added loadBalancerSourceRanges for internal lbs +* [#6356](https://github.com/kubernetes/ingress-nginx/pull/6356) Add securitycontext settings on defaultbackend +* [#6401](https://github.com/kubernetes/ingress-nginx/pull/6401) Fix controller service annotations +* [#6403](https://github.com/kubernetes/ingress-nginx/pull/6403) Initial helm chart changelog + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.7.1...ingress-nginx-3.8.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.9.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.9.0.md new file mode 100644 index 0000000000..e8c9def514 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-3.9.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 3.9.0 + +* [#6423](https://github.com/kubernetes/ingress-nginx/pull/6423) Add Default backend HPA autoscaling + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.8.0...ingress-nginx-3.9.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.1.md new file mode 100644 index 0000000000..7a187b350f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.1 + +* [7535] https://github.com/kubernetes/ingress-nginx/pull/7535 Release v1.0.0 ingress-nginx + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.34.0...helm-chart-4.0.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.10.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.10.md new file mode 100644 index 0000000000..c5d651670b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.10.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.10 + +* [7964] https://github.com/kubernetes/ingress-nginx/pull/7964 Update controller version to v1.1.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.9...helm-chart-4.0.10 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.11.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.11.md new file mode 100644 index 0000000000..5541823555 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.11.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.11 + +* [7873] https://github.com/kubernetes/ingress-nginx/pull/7873 Makes the [appProtocol](https://kubernetes.io/docs/concepts/services-networking/_print/#application-protocol) field optional. + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.10...helm-chart-4.0.11 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.12.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.12.md new file mode 100644 index 0000000000..320f6f5462 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.12.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.12 + +* [7978] https://github.com/kubernetes/ingress-nginx/pull/7979 Support custom annotations in admissions Jobs + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.11...helm-chart-4.0.12 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.13.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.13.md new file mode 100644 index 0000000000..edd922814c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.13.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.13 + +* [8008] https://github.com/kubernetes/ingress-nginx/pull/8008 Add relabelings in controller-servicemonitor.yaml + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.12...helm-chart-4.0.13 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.14.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.14.md new file mode 100644 index 0000000000..e927010392 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.14.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.14 + +* [8061] https://github.com/kubernetes/ingress-nginx/pull/8061 Using helm-docs to populate values table in README.md + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.13...helm-chart-4.0.14 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.15.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.15.md new file mode 100644 index 0000000000..d3d14a98d7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.15.md @@ -0,0 +1,43 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.15 + +* [8120] https://github.com/kubernetes/ingress-nginx/pull/8120 Update go in runner and release v1.1.1 +* [8119] https://github.com/kubernetes/ingress-nginx/pull/8119 Update to go v1.17.6 +* [8118] https://github.com/kubernetes/ingress-nginx/pull/8118 Remove deprecated libraries, update other libs +* [8117] https://github.com/kubernetes/ingress-nginx/pull/8117 Fix codegen errors +* [8115] https://github.com/kubernetes/ingress-nginx/pull/8115 chart/ghaction: set the correct permission to have access to push a release +* [8098] https://github.com/kubernetes/ingress-nginx/pull/8098 generating SHA for CA only certs in backend_ssl.go + comparison of P… +* [8088] https://github.com/kubernetes/ingress-nginx/pull/8088 Fix Edit this page link to use main branch +* [8072] https://github.com/kubernetes/ingress-nginx/pull/8072 Expose GeoIP2 Continent code as variable +* [8061] https://github.com/kubernetes/ingress-nginx/pull/8061 docs(charts): using helm-docs for chart +* [8058] https://github.com/kubernetes/ingress-nginx/pull/8058 Bump github.com/spf13/cobra from 1.2.1 to 1.3.0 +* [8054] https://github.com/kubernetes/ingress-nginx/pull/8054 Bump google.golang.org/grpc from 1.41.0 to 1.43.0 +* [8051] https://github.com/kubernetes/ingress-nginx/pull/8051 align bug report with feature request regarding kind documentation +* [8046] https://github.com/kubernetes/ingress-nginx/pull/8046 Report expired certificates (#8045) +* [8044] https://github.com/kubernetes/ingress-nginx/pull/8044 remove G109 check till gosec resolves issues +* [8042] https://github.com/kubernetes/ingress-nginx/pull/8042 docs_multiple_instances_one_cluster_ticket_7543 +* [8041] https://github.com/kubernetes/ingress-nginx/pull/8041 docs: fix typo'd executable name +* [8035] https://github.com/kubernetes/ingress-nginx/pull/8035 Comment busy owners +* [8029] https://github.com/kubernetes/ingress-nginx/pull/8029 Add stream-snippet as a ConfigMap and Annotation option +* [8023] https://github.com/kubernetes/ingress-nginx/pull/8023 fix nginx compilation flags +* [8021] https://github.com/kubernetes/ingress-nginx/pull/8021 Disable default modsecurity_rules_file if modsecurity-snippet is specified +* [8019] https://github.com/kubernetes/ingress-nginx/pull/8019 Revise main documentation page +* [8018] https://github.com/kubernetes/ingress-nginx/pull/8018 Preserve order of plugin invocation +* [8015] https://github.com/kubernetes/ingress-nginx/pull/8015 Add newline indenting to admission webhook annotations +* [8014] https://github.com/kubernetes/ingress-nginx/pull/8014 Add link to example error page manifest in docs +* [8009] https://github.com/kubernetes/ingress-nginx/pull/8009 Fix spelling in documentation and top-level files +* [8008] https://github.com/kubernetes/ingress-nginx/pull/8008 Add relabelings in controller-servicemonitor.yaml +* [8003] https://github.com/kubernetes/ingress-nginx/pull/8003 Minor improvements (formatting, consistency) in install guide +* [8001] https://github.com/kubernetes/ingress-nginx/pull/8001 fix: go-grpc Dockerfile +* [7999] https://github.com/kubernetes/ingress-nginx/pull/7999 images: use k8s-staging-test-infra/gcb-docker-gcloud +* [7996] https://github.com/kubernetes/ingress-nginx/pull/7996 doc: improvement +* [7983] https://github.com/kubernetes/ingress-nginx/pull/7983 Fix a couple of misspellings in the annotations documentation. +* [7979] https://github.com/kubernetes/ingress-nginx/pull/7979 allow set annotations for admission Jobs +* [7977] https://github.com/kubernetes/ingress-nginx/pull/7977 Add ssl_reject_handshake to default server +* [7975] https://github.com/kubernetes/ingress-nginx/pull/7975 add legacy version update v0.50.0 to main changelog +* [7972] https://github.com/kubernetes/ingress-nginx/pull/7972 updated service upstream definition + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.14...helm-chart-4.0.15 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.18.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.18.md new file mode 100644 index 0000000000..30a8f75c11 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.18.md @@ -0,0 +1,40 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.18 + +* [8291](https://github.com/kubernetes/ingress-nginx/pull/8291) remove git tag env from cloud build +* [8286](https://github.com/kubernetes/ingress-nginx/pull/8286) Fix OpenTelemetry sidecar image build +* [8277](https://github.com/kubernetes/ingress-nginx/pull/8277) Add OpenSSF Best practices badge +* [8273](https://github.com/kubernetes/ingress-nginx/pull/8273) Issue#8241 +* [8267](https://github.com/kubernetes/ingress-nginx/pull/8267) Add fsGroup value to admission-webhooks/job-patch charts +* [8262](https://github.com/kubernetes/ingress-nginx/pull/8262) Updated confusing error +* [8256](https://github.com/kubernetes/ingress-nginx/pull/8256) fix: deny locations with invalid auth-url annotation +* [8253](https://github.com/kubernetes/ingress-nginx/pull/8253) Add a certificate info metric +* [8236](https://github.com/kubernetes/ingress-nginx/pull/8236) webhook: remove useless code. +* [8227](https://github.com/kubernetes/ingress-nginx/pull/8227) Update libraries in webhook image +* [8225](https://github.com/kubernetes/ingress-nginx/pull/8225) fix inconsistent-label-cardinality for prometheus metrics: nginx_ingress_controller_requests +* [8221](https://github.com/kubernetes/ingress-nginx/pull/8221) Do not validate ingresses with unknown ingress class in admission webhook endpoint +* [8210](https://github.com/kubernetes/ingress-nginx/pull/8210) Bump github.com/prometheus/client_golang from 1.11.0 to 1.12.1 +* [8209](https://github.com/kubernetes/ingress-nginx/pull/8209) Bump google.golang.org/grpc from 1.43.0 to 1.44.0 +* [8204](https://github.com/kubernetes/ingress-nginx/pull/8204) Add Artifact Hub lint +* [8203](https://github.com/kubernetes/ingress-nginx/pull/8203) Fix Indentation of example and link to cert-manager tutorial +* [8201](https://github.com/kubernetes/ingress-nginx/pull/8201) feat(metrics): add path and method labels to requests countera +* [8199](https://github.com/kubernetes/ingress-nginx/pull/8199) use functional options to reduce number of methods creating an EchoDeployment +* [8196](https://github.com/kubernetes/ingress-nginx/pull/8196) docs: fix inconsistent controller annotation +* [8191](https://github.com/kubernetes/ingress-nginx/pull/8191) Using Go install for misspell +* [8186](https://github.com/kubernetes/ingress-nginx/pull/8186) prometheus+grafana using servicemonitor +* [8185](https://github.com/kubernetes/ingress-nginx/pull/8185) Append elements on match, instead of removing for cors-annotations +* [8179](https://github.com/kubernetes/ingress-nginx/pull/8179) Bump github.com/opencontainers/runc from 1.0.3 to 1.1.0 +* [8173](https://github.com/kubernetes/ingress-nginx/pull/8173) Adding annotations to the controller service account +* [8163](https://github.com/kubernetes/ingress-nginx/pull/8163) Update the $req_id placeholder description +* [8162](https://github.com/kubernetes/ingress-nginx/pull/8162) Versioned static manifests +* [8159](https://github.com/kubernetes/ingress-nginx/pull/8159) Adding some geoip variables and default values +* [8155](https://github.com/kubernetes/ingress-nginx/pull/8155) #7271 feat: avoid-pdb-creation-when-default-backend-disabled-and-replicas-gt-1 +* [8151](https://github.com/kubernetes/ingress-nginx/pull/8151) Automatically generate helm docs +* [8143](https://github.com/kubernetes/ingress-nginx/pull/8143) Allow to configure delay before controller exits +* [8136](https://github.com/kubernetes/ingress-nginx/pull/8136) add ingressClass option to helm chart - back compatibility with ingress.class annotations +* [8126](https://github.com/kubernetes/ingress-nginx/pull/8126) Example for JWT + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.15...helm-chart-4.0.18 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.2.md new file mode 100644 index 0000000000..9dbd003a99 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.2.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.2 + +* [7681] https://github.com/kubernetes/ingress-nginx/pull/7681 Release v1.0.1 of ingress-nginx + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.1...helm-chart-4.0.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.3.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.3.md new file mode 100644 index 0000000000..09b89f66cb --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.3.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.3 + +* [7707] https://github.com/kubernetes/ingress-nginx/pull/7707 Release v1.0.2 of ingress-nginx + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.2...helm-chart-4.0.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.5.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.5.md new file mode 100644 index 0000000000..be67704baf --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.5.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.5 + +* [7740] https://github.com/kubernetes/ingress-nginx/pull/7740 Release v1.0.3 of ingress-nginx + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.3...helm-chart-4.0.5 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.6.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.6.md new file mode 100644 index 0000000000..25276e2be5 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.6.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.6 + +* [7804] https://github.com/kubernetes/ingress-nginx/pull/7804 Release v1.0.4 of ingress-nginx +* [7651] https://github.com/kubernetes/ingress-nginx/pull/7651 Support ipFamilyPolicy and ipFamilies fields in Helm Chart +* [7798] https://github.com/kubernetes/ingress-nginx/pull/7798 Exoscale: use HTTP Healthcheck mode +* [7793] https://github.com/kubernetes/ingress-nginx/pull/7793 Update kube-webhook-certgen to v1.1.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.5...helm-chart-4.0.6 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.7.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.7.md new file mode 100644 index 0000000000..50fd9227c9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.7.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.7 + +* [7923] https://github.com/kubernetes/ingress-nginx/pull/7923 Release v1.0.5 of ingress-nginx +* [7806] https://github.com/kubernetes/ingress-nginx/pull/7806 Choice option for internal/external loadbalancer type service + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.6...helm-chart-4.0.7 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.9.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.9.md new file mode 100644 index 0000000000..f2f725c933 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.0.9.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.0.9 + +* [6992] https://github.com/kubernetes/ingress-nginx/pull/6992 Add ability to specify labels for all resources + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.7...helm-chart-4.0.9 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.0.md new file mode 100644 index 0000000000..24aaf49aed --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.0.md @@ -0,0 +1,21 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.1.0 + +* [8481](https://github.com/kubernetes/ingress-nginx/pull/8481) Fix log creation in chroot script +* [8479](https://github.com/kubernetes/ingress-nginx/pull/8479) changed nginx base img tag to img built with alpine3.14.6 +* [8478](https://github.com/kubernetes/ingress-nginx/pull/8478) update base images and protobuf gomod +* [8468](https://github.com/kubernetes/ingress-nginx/pull/8468) Fallback to ngx.var.scheme for redirectScheme with use-forward-headers when X-Forwarded-Proto is empty +* [8456](https://github.com/kubernetes/ingress-nginx/pull/8456) Implement object deep inspector +* [8455](https://github.com/kubernetes/ingress-nginx/pull/8455) Update dependencies +* [8454](https://github.com/kubernetes/ingress-nginx/pull/8454) Update index.md +* [8447](https://github.com/kubernetes/ingress-nginx/pull/8447) typo fixing +* [8446](https://github.com/kubernetes/ingress-nginx/pull/8446) Fix suggested annotation-value-word-blocklist +* [8444](https://github.com/kubernetes/ingress-nginx/pull/8444) replace deprecated topology key in example with current one +* [8443](https://github.com/kubernetes/ingress-nginx/pull/8443) Add dependency review enforcement +* [8434](https://github.com/kubernetes/ingress-nginx/pull/8434) added new auth-tls-match-cn annotation +* [8426](https://github.com/kubernetes/ingress-nginx/pull/8426) Bump github.com/prometheus/common from 0.32.1 to 0.33.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.18...helm-chart-4.1.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.2.md new file mode 100644 index 0000000000..20618557fc --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.1.2.md @@ -0,0 +1,11 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.1.2 + +* [8587](https://github.com/kubernetes/ingress-nginx/pull/8587) Add CAP_SYS_CHROOT to DS/PSP when needed +* [8458](https://github.com/kubernetes/ingress-nginx/pull/8458) Add portNamePrefix Helm chart parameter +* [8522](https://github.com/kubernetes/ingress-nginx/pull/8522) Add documentation for controller.service.loadBalancerIP in Helm chart + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.1.0...helm-chart-4.1.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.0.md new file mode 100644 index 0000000000..a1f1847ec7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.0.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.10.0 + +* - "Update Ingress-Nginx version controller-v1.10.0" + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.9.1...helm-chart-4.10.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.1.md new file mode 100644 index 0000000000..3a28de00c9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.1.md @@ -0,0 +1,11 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.10.1 + +* - "update post submit helm ci and clean up (#11221)" +* - "refactor helm ci tests part I (#11188)" +* - "Update Ingress-Nginx version controller-v1.10.1" + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.0...helm-chart-4.10.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.2.md new file mode 100644 index 0000000000..399bd98d61 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.10.2.md @@ -0,0 +1,18 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.10.2 + +* Chores: Align security contacts & chart maintainers to actual owners. (#11480) +* Fix helm install on cloud provider admonition block (#11412) +* edited helm-install tips (#11411) +* added info for aws helm install (#11410) +* add workflow to helm release and update ct for branch (#11317) +* Merge pull request #11277 from strongjz/chart-1.10.1 (#11314) +* release helm chart from release branch (#11278) +* update post submit helm ci and clean up (#11221) +* refactor helm ci tests part I (#11188) +* Update Ingress-Nginx version controller-v1.10.2 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.1...helm-chart-4.10.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.0.md new file mode 100644 index 0000000000..64108c04e8 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.0.md @@ -0,0 +1,18 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.11.0 + +* Chores: Align security contacts & chart maintainers to actual owners. (#11465) +* Merge pull request #11277 from strongjz/chart-1.10.1 (#11415) +* Fix helm install on cloud provider admonition block (#11394) +* edited helm-install tips (#11393) +* added info for aws helm install (#11390) +* add workflow to helm release and update ct for branch (#11378) +* release helm chart from release branch (#11276) +* update post submit helm ci and clean up (#11220) +* refactor helm ci tests part I (#11178) +* Update Ingress-Nginx version controller-v1.11.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.2...helm-chart-4.11.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.1.md new file mode 100644 index 0000000000..281513e5f9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.11.1 + +* Update Ingress-Nginx version controller-v1.11.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.0...helm-chart-4.11.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.2.md new file mode 100644 index 0000000000..c7645a5b6f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.2.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.11.2 + +* Update Ingress-Nginx version controller-v1.11.2 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.1...helm-chart-4.11.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.3.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.3.md new file mode 100644 index 0000000000..18ec6ba82c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.11.3.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.11.3 + +* Update Ingress-Nginx version controller-v1.11.3 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.2...helm-chart-4.11.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.0.md new file mode 100644 index 0000000000..2074a0953b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.0.md @@ -0,0 +1,47 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.2.0 + +* Support for Kubernetes v1.19.0 was removed +* [8810](https://github.com/kubernetes/ingress-nginx/pull/8810) Prepare for v1.3.0 +* [8808](https://github.com/kubernetes/ingress-nginx/pull/8808) revert arch var name +* [8805](https://github.com/kubernetes/ingress-nginx/pull/8805) Bump k8s.io/klog/v2 from 2.60.1 to 2.70.1 +* [8803](https://github.com/kubernetes/ingress-nginx/pull/8803) Update to nginx base with alpine v3.16 +* [8802](https://github.com/kubernetes/ingress-nginx/pull/8802) chore: start v1.3.0 release process +* [8798](https://github.com/kubernetes/ingress-nginx/pull/8798) Add v1.24.0 to test matrix +* [8796](https://github.com/kubernetes/ingress-nginx/pull/8796) fix: add MAC_OS variable for static-check +* [8793](https://github.com/kubernetes/ingress-nginx/pull/8793) changed to alpine-v3.16 +* [8781](https://github.com/kubernetes/ingress-nginx/pull/8781) Bump github.com/stretchr/testify from 1.7.5 to 1.8.0 +* [8778](https://github.com/kubernetes/ingress-nginx/pull/8778) chore: remove stable.txt from release process +* [8775](https://github.com/kubernetes/ingress-nginx/pull/8775) Remove stable +* [8773](https://github.com/kubernetes/ingress-nginx/pull/8773) Bump github/codeql-action from 2.1.14 to 2.1.15 +* [8772](https://github.com/kubernetes/ingress-nginx/pull/8772) Bump ossf/scorecard-action from 1.1.1 to 1.1.2 +* [8771](https://github.com/kubernetes/ingress-nginx/pull/8771) fix bullet md format +* [8770](https://github.com/kubernetes/ingress-nginx/pull/8770) Add condition for monitoring.coreos.com/v1 API +* [8769](https://github.com/kubernetes/ingress-nginx/pull/8769) Fix typos and add links to developer guide +* [8767](https://github.com/kubernetes/ingress-nginx/pull/8767) change v1.2.0 to v1.2.1 in deploy doc URLs +* [8765](https://github.com/kubernetes/ingress-nginx/pull/8765) Bump github/codeql-action from 1.0.26 to 2.1.14 +* [8752](https://github.com/kubernetes/ingress-nginx/pull/8752) Bump github.com/spf13/cobra from 1.4.0 to 1.5.0 +* [8751](https://github.com/kubernetes/ingress-nginx/pull/8751) Bump github.com/stretchr/testify from 1.7.2 to 1.7.5 +* [8750](https://github.com/kubernetes/ingress-nginx/pull/8750) added announcement +* [8740](https://github.com/kubernetes/ingress-nginx/pull/8740) change sha e2etestrunner and echoserver +* [8738](https://github.com/kubernetes/ingress-nginx/pull/8738) Update docs to make it easier for noobs to follow step by step +* [8737](https://github.com/kubernetes/ingress-nginx/pull/8737) updated baseimage sha +* [8736](https://github.com/kubernetes/ingress-nginx/pull/8736) set ld-musl-path +* [8733](https://github.com/kubernetes/ingress-nginx/pull/8733) feat: migrate leaderelection lock to leases +* [8726](https://github.com/kubernetes/ingress-nginx/pull/8726) prometheus metric: upstream_latency_seconds +* [8720](https://github.com/kubernetes/ingress-nginx/pull/8720) Ci pin deps +* [8719](https://github.com/kubernetes/ingress-nginx/pull/8719) Working OpenTelemetry sidecar (base nginx image) +* [8714](https://github.com/kubernetes/ingress-nginx/pull/8714) Create Openssf scorecard +* [8708](https://github.com/kubernetes/ingress-nginx/pull/8708) Bump github.com/prometheus/common from 0.34.0 to 0.35.0 +* [8703](https://github.com/kubernetes/ingress-nginx/pull/8703) Bump actions/dependency-review-action from 1 to 2 +* [8701](https://github.com/kubernetes/ingress-nginx/pull/8701) Fix several typos +* [8699](https://github.com/kubernetes/ingress-nginx/pull/8699) fix the gosec test and a make target for it +* [8698](https://github.com/kubernetes/ingress-nginx/pull/8698) Bump actions/upload-artifact from 2.3.1 to 3.1.0 +* [8697](https://github.com/kubernetes/ingress-nginx/pull/8697) Bump actions/setup-go from 2.2.0 to 3.2.0 +* [8695](https://github.com/kubernetes/ingress-nginx/pull/8695) Bump actions/download-artifact from 2 to 3 +* [8694](https://github.com/kubernetes/ingress-nginx/pull/8694) Bump crazy-max/ghaction-docker-buildx from 1.6.2 to 3.3.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.1.2...helm-chart-4.2.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.1.md new file mode 100644 index 0000000000..7965bb1c26 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.2.1.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.2.1 + +* The sha of kube-webhook-certgen image & the opentelemetry image, in values file, was changed to new images built on alpine-v3.16.1 +* [8896](https://github.com/kubernetes/ingress-nginx/pull/8896) updated to new images built today + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.2.0...helm-chart-4.2.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.3.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.3.0.md new file mode 100644 index 0000000000..f9dca22d9f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.3.0.md @@ -0,0 +1,14 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.3.0 + +* Support for Kubernetes v.1.25.0 was added and support for endpoint slices +* Support for Kubernetes v1.20.0 and v1.21.0 was removed +* [8890](https://github.com/kubernetes/ingress-nginx/pull/8890) migrate to endpointslices +* [9059](https://github.com/kubernetes/ingress-nginx/pull/9059) kubewebhookcertgen sha change after go1191 +* [9046](https://github.com/kubernetes/ingress-nginx/pull/9046) Parameterize metrics port name +* [9104](https://github.com/kubernetes/ingress-nginx/pull/9104) Fix yaml formatting error with multiple annotations + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.2.1...helm-chart-4.3.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.4.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.4.0.md new file mode 100644 index 0000000000..20f9e23360 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.4.0.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.4.0 + +* Adding support for disabling liveness and readiness probes to the Helm chart by @njegosrailic in https://github.com/kubernetes/ingress-nginx/pull/9238 +* add:(admission-webhooks) ability to set securityContext by @ybelMekk in https://github.com/kubernetes/ingress-nginx/pull/9186 +* #7652 - Updated Helm chart to use the fullname for the electionID if not specified. by @FutureMatt in https://github.com/kubernetes/ingress-nginx/pull/9133 +* Rename controller-wehbooks-networkpolicy.yaml. by @Gacko in https://github.com/kubernetes/ingress-nginx/pull/9123 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.3.0...helm-chart-4.4.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.5.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.5.2.md new file mode 100644 index 0000000000..b6d8a3b0c3 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.5.2.md @@ -0,0 +1,13 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.5.2 + +* add lint on chart before release (#9570) +* ci: remove setup-helm step (#9404) +* feat(helm): Optionally use cert-manager instead admission patch (#9279) +* run helm release on main only and when the chart/value changes only (#9290) +* Update Ingress-Nginx version controller-v1.6.4 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.4.3...helm-chart-4.5.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.0.md new file mode 100644 index 0000000000..469aaba8cf --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.0.md @@ -0,0 +1,24 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.5.3 + +* docs(helm): fix value key in readme for enabling certManager (#9640) +* Upgrade alpine 3.17.2 +* Upgrade golang 1.20 +* Drop testing/support for Kubernetes 1.23 +* docs(helm): fix value key in readme for enabling certManager (#9640) +* Update Ingress-Nginx version controller-v1.7.0 +* feat: OpenTelemetry module integration (#9062) +* canary-weight-total annotation ignored in rule backends (#9729) +* fix controller psp's volume config (#9740) +* Fix several Helm YAML issues with extraModules and extraInitContainers (#9709) +* Chart: Drop `controller.headers`, rework DH param secret. (#9659) +* Deployment/DaemonSet: Label pods using `ingress-nginx.labels`. (#9732) +* HPA: autoscaling/v2beta1 deprecated, bump apiVersion to v2 for defaultBackend (#9731) +* Fix incorrect annotation name in upstream hashing configuration (#9617) + +* Update Ingress-Nginx version controller-v1.7.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.5.2...helm-chart-4.6.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.1.md new file mode 100644 index 0000000000..57d99b8dbf --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.6.1.md @@ -0,0 +1,11 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.6.1 + +* [helm] Support custom port configuration for internal service (#9846) +* Adding resource type to default HPA configuration to resolve issues with Terraform helm chart usage (#9803) +* Update Ingress-Nginx version controller-v1.7.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.6.0...helm-chart-4.6.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.0.md new file mode 100644 index 0000000000..9d5407053e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.0.md @@ -0,0 +1,14 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.7.0 + +* helm: Fix opentelemetry module installation for daemonset (#9792) +* Update charts/* to keep project name display aligned (#9931) +* HPA: Use capabilities & align manifests. (#9521) +* PodDisruptionBudget spec logic update (#9904) +* add option for annotations in PodDisruptionBudget (#9843) +* Update Ingress-Nginx version controller-v1.8.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.6.1...helm-chart-4.7.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.1.md new file mode 100644 index 0000000000..4d69a71173 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.1.md @@ -0,0 +1,12 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.7.1 + +* Added a doc line to the missing helm value service.internal.loadBalancerIP (#9406) +* feat(helm): Add loadBalancerClass (#9562) +* added helmshowvalues example (#10019) +* Update Ingress-Nginx version controller-v1.8.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.0...helm-chart-4.7.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.2.md new file mode 100644 index 0000000000..57b17b9824 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.7.2.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.7.2 + +* Update Ingress-Nginx version controller-v1.8.2 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.1...helm-chart-4.7.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md new file mode 100644 index 0000000000..9072a75b49 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md @@ -0,0 +1,13 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.8.0-beta.0 + +* ci(helm): fix Helm Chart release action 422 error (#10237) +* helm: Use .Release.Namespace as default for ServiceMonitor namespace (#10249) +* [helm] configure allow to configure hostAliases (#10180) +* [helm] pass service annotations through helm tpl engine (#10084) +* Update Ingress-Nginx version controller-v1.9.0-beta.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.2...helm-chart-4.8.0-beta.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0.md new file mode 100644 index 0000000000..af8f1241f5 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.0.md @@ -0,0 +1,13 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.8.0 + +* ci(helm): fix Helm Chart release action 422 error (#10237) +* helm: Use .Release.Namespace as default for ServiceMonitor namespace (#10249) +* [helm] configure allow to configure hostAliases (#10180) +* [helm] pass service annotations through helm tpl engine (#10084) +* Update Ingress-Nginx version controller-v1.9.0 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.2...helm-chart-4.8.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.1.md new file mode 100644 index 0000000000..53a4493de1 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.1.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.8.1 + +* Update Ingress-Nginx version controller-v1.9.1 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.0...helm-chart-4.8.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.2.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.2.md new file mode 100644 index 0000000000..9957c1a85c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.2.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.8.2 + +* update nginx base, httpbun, e2e, helm webhook cert gen (#10506) +* Update Ingress-Nginx version controller-v1.9.3 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.1...helm-chart-4.8.2 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.3.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.3.md new file mode 100644 index 0000000000..b8d4d56b33 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.8.3.md @@ -0,0 +1,9 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.8.3 + +* Update Ingress-Nginx version controller-v1.9.4 + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.2...helm-chart-4.8.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.0.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.0.md new file mode 100644 index 0000000000..5c7729866d --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.0.md @@ -0,0 +1,13 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.9.0 + +* - "Add controller.metrics.serviceMonitor.annotations in Helm chart" +* - "fix(labels): use complete labels variable on default-backend deployment" +* - "chart: allow setting allocateLoadBalancerNodePorts (#10693)" +* - "[release-1.9] feat(helm): add documentation about metric args (#10695)" +* - "Update Ingress-Nginx version controller-v1.9.5" + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.3...helm-chart-4.9.0 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.1.md b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.1.md new file mode 100644 index 0000000000..c6120e736b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart-4.9.1.md @@ -0,0 +1,10 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### 4.9.1 + +* - "update web hook cert gen to latest release v20231226-1a7112e06" +* - "Update Ingress-Nginx version controller-v1.9.6" + +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.9.0...helm-chart-4.9.1 diff --git a/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart.md.gotmpl b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart.md.gotmpl new file mode 100644 index 0000000000..ef5add55dc --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/changelog/helm-chart.md.gotmpl @@ -0,0 +1,11 @@ +# Changelog + +This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). + +### {{ .NewHelmChartVersion }} +{{ with .HelmUpdates }} +{{- range . }} +* {{ . }} +{{- end }} +{{ end }} +**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-{{ .PreviousHelmChartVersion }}...helm-chart-{{ .NewHelmChartVersion }} diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml new file mode 100644 index 0000000000..7eafd0c5be --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml @@ -0,0 +1,12 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + admissionWebhooks: + certManager: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml new file mode 100644 index 0000000000..460a610bac --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml @@ -0,0 +1,11 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + addHeaders: + X-Frame-Options: deny diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml new file mode 100644 index 0000000000..e23a13c0c6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml @@ -0,0 +1,11 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + proxySetHeaders: + X-Forwarded-Proto: https diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-values.yaml new file mode 100644 index 0000000000..a7029895ca --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-configmap-values.yaml @@ -0,0 +1,11 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + config: + use-proxy-protocol: "true" diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml new file mode 100644 index 0000000000..edf12e77ed --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml @@ -0,0 +1,30 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: DaemonSet + + extraModules: + - name: opentelemetry + image: + registry: registry.k8s.io + image: ingress-nginx/opentelemetry-1.25.3 + tag: v20240813-b933310d + digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 + distroless: true + containerSecurityContext: + runAsNonRoot: true + runAsUser: 65532 + runAsGroup: 65532 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml new file mode 100644 index 0000000000..7a98580cd7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml @@ -0,0 +1,13 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: DaemonSet + + metrics: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml new file mode 100644 index 0000000000..179ab2a85a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml @@ -0,0 +1,13 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: DaemonSet + + opentelemetry: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml new file mode 100644 index 0000000000..405992ef30 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml @@ -0,0 +1,16 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: DaemonSet + + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "10254" + prometheus.io/scheme: http + prometheus.io/path: /metrics diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-values.yaml new file mode 100644 index 0000000000..d34025c80f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-daemonset-values.yaml @@ -0,0 +1,10 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: DaemonSet diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml new file mode 100644 index 0000000000..d4083cc375 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml @@ -0,0 +1,30 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: Deployment + + extraModules: + - name: opentelemetry + image: + registry: registry.k8s.io + image: ingress-nginx/opentelemetry-1.25.3 + tag: v20240813-b933310d + digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 + distroless: true + containerSecurityContext: + runAsNonRoot: true + runAsUser: 65532 + runAsGroup: 65532 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml new file mode 100644 index 0000000000..9c95d347c4 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml @@ -0,0 +1,13 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: Deployment + + metrics: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml new file mode 100644 index 0000000000..9443ddefcc --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml @@ -0,0 +1,13 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: Deployment + + opentelemetry: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml new file mode 100644 index 0000000000..cf1f2611e6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml @@ -0,0 +1,16 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: Deployment + + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "10254" + prometheus.io/scheme: http + prometheus.io/path: /metrics diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-values.yaml new file mode 100644 index 0000000000..1b092dc0c1 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-deployment-values.yaml @@ -0,0 +1,10 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + kind: Deployment diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-hpa-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-hpa-values.yaml new file mode 100644 index 0000000000..54a0d2f75a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-hpa-values.yaml @@ -0,0 +1,18 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + autoscaling: + enabled: true + behavior: + scaleDown: + stabilizationWindowSeconds: 300 + policies: + - type: Pods + value: 1 + periodSeconds: 180 diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-ingressclass-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-ingressclass-values.yaml new file mode 100644 index 0000000000..c06429f975 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-ingressclass-values.yaml @@ -0,0 +1,15 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + ingressClassResource: + name: custom-nginx + default: true + controllerValue: k8s.io/custom-nginx + + watchIngressWithoutClass: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-internal-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-internal-values.yaml new file mode 100644 index 0000000000..11108fbce9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-internal-values.yaml @@ -0,0 +1,13 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: ClusterIP + + internal: + enabled: true + annotations: + service.beta.kubernetes.io/aws-load-balancer-internal: "true" diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-values.yaml new file mode 100644 index 0000000000..9039368c28 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/controller-service-values.yaml @@ -0,0 +1,22 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + + service: + type: NodePort + + nodePorts: + tcp: + 9000: 30090 + udp: + 9001: 30091 + +portNamePrefix: port + +tcp: + 9000: default/test:8080 + +udp: + 9001: default/test:8080 diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-psp-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-psp-values.yaml new file mode 100644 index 0000000000..8026a6356f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-psp-values.yaml @@ -0,0 +1,13 @@ +controller: + kind: DaemonSet + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + admissionWebhooks: + enabled: false + service: + type: ClusterIP + +podSecurityPolicy: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml new file mode 100644 index 0000000000..fccdb134cf --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml @@ -0,0 +1,13 @@ +controller: + kind: DaemonSet + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + admissionWebhooks: + enabled: true + service: + type: ClusterIP + +podSecurityPolicy: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/deployment-psp-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/deployment-psp-values.yaml new file mode 100644 index 0000000000..2f332a7b20 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/deployment-psp-values.yaml @@ -0,0 +1,10 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + service: + type: ClusterIP + +podSecurityPolicy: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml b/nginx-operator/helm-charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml new file mode 100644 index 0000000000..6195bb3391 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml @@ -0,0 +1,12 @@ +controller: + image: + repository: ingress-controller/controller + tag: 1.0.0-dev + digest: null + admissionWebhooks: + enabled: true + service: + type: ClusterIP + +podSecurityPolicy: + enabled: true diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/NOTES.txt b/nginx-operator/helm-charts/ingress-nginx/templates/NOTES.txt new file mode 100644 index 0000000000..f4923007e7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/NOTES.txt @@ -0,0 +1,73 @@ +The ingress-nginx controller has been installed. + +{{- if contains "NodePort" .Values.controller.service.type }} +Get the application URL by running these commands: + +{{- if (not (empty .Values.controller.service.nodePorts.http)) }} + export HTTP_NODE_PORT={{ .Values.controller.service.nodePorts.http }} +{{- else }} + export HTTP_NODE_PORT=$(kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output jsonpath="{.spec.ports[0].nodePort}") +{{- end }} +{{- if (not (empty .Values.controller.service.nodePorts.https)) }} + export HTTPS_NODE_PORT={{ .Values.controller.service.nodePorts.https }} +{{- else }} + export HTTPS_NODE_PORT=$(kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output jsonpath="{.spec.ports[1].nodePort}") +{{- end }} + export NODE_IP="$(kubectl get nodes --output jsonpath="{.items[0].status.addresses[1].address}")" + + echo "Visit http://${NODE_IP}:${HTTP_NODE_PORT} to access your application via HTTP." + echo "Visit https://${NODE_IP}:${HTTPS_NODE_PORT} to access your application via HTTPS." +{{- else if contains "LoadBalancer" .Values.controller.service.type }} +It may take a few minutes for the load balancer IP to be available. +You can watch the status by running 'kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output wide --watch' +{{- else if contains "ClusterIP" .Values.controller.service.type }} +Get the application URL by running these commands: + export POD_NAME="$(kubectl get pods --namespace {{ include "ingress-nginx.namespace" . }} --selector app.kubernetes.io/name={{ include "ingress-nginx.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=controller --output jsonpath="{.items[0].metadata.name}")" + kubectl port-forward --namespace {{ include "ingress-nginx.namespace" . }} "${POD_NAME}" 8080:80 + echo "Visit http://127.0.0.1:8080 to access your application." +{{- end }} + +An example Ingress that makes use of the controller: + +{{- $isV1 := semverCompare ">=1" .Chart.AppVersion}} + apiVersion: networking.k8s.io/v1 + kind: Ingress + metadata: + name: example + namespace: foo + {{- if eq $isV1 false }} + annotations: + kubernetes.io/ingress.class: {{ .Values.controller.ingressClass }} + {{- end }} + spec: + {{- if $isV1 }} + ingressClassName: {{ .Values.controller.ingressClassResource.name }} + {{- end }} + rules: + - host: www.example.com + http: + paths: + - pathType: Prefix + backend: + service: + name: exampleService + port: + number: 80 + path: / + # This section is only required if TLS is to be enabled for the Ingress + tls: + - hosts: + - www.example.com + secretName: example-tls + +If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: + + apiVersion: v1 + kind: Secret + metadata: + name: example-tls + namespace: foo + data: + tls.crt: + tls.key: + type: kubernetes.io/tls diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/_helpers.tpl b/nginx-operator/helm-charts/ingress-nginx/templates/_helpers.tpl new file mode 100644 index 0000000000..24cfd14ad9 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/_helpers.tpl @@ -0,0 +1,272 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ingress-nginx.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ingress-nginx.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Expand the namespace of the release. +Allows overriding it for multi-namespace deployments in combined charts. +*/}} +{{- define "ingress-nginx.namespace" -}} +{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Controller container security context. +*/}} +{{- define "ingress-nginx.controller.containerSecurityContext" -}} +{{- if .Values.controller.containerSecurityContext -}} +{{- toYaml .Values.controller.containerSecurityContext -}} +{{- else -}} +runAsNonRoot: {{ .Values.controller.image.runAsNonRoot }} +runAsUser: {{ .Values.controller.image.runAsUser }} +allowPrivilegeEscalation: {{ or .Values.controller.image.allowPrivilegeEscalation .Values.controller.image.chroot }} +{{- if .Values.controller.image.seccompProfile }} +seccompProfile: {{ toYaml .Values.controller.image.seccompProfile | nindent 2 }} +{{- end }} +capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + {{- if .Values.controller.image.chroot }} + {{- if .Values.controller.image.seccompProfile }} + - SYS_ADMIN + {{- end }} + - SYS_CHROOT + {{- end }} +readOnlyRootFilesystem: {{ .Values.controller.image.readOnlyRootFilesystem }} +{{- end -}} +{{- end -}} + +{{/* +Get specific image +*/}} +{{- define "ingress-nginx.image" -}} +{{- if .chroot -}} +{{- printf "%s-chroot" .image -}} +{{- else -}} +{{- printf "%s" .image -}} +{{- end }} +{{- end -}} + +{{/* +Get specific image digest +*/}} +{{- define "ingress-nginx.imageDigest" -}} +{{- if .chroot -}} +{{- if .digestChroot -}} +{{- printf "@%s" .digestChroot -}} +{{- end }} +{{- else -}} +{{ if .digest -}} +{{- printf "@%s" .digest -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified controller name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.controller.fullname" -}} +{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.controller.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Construct a unique electionID. +Users can provide an override for an explicit electionID if they want via `.Values.controller.electionID` +*/}} +{{- define "ingress-nginx.controller.electionID" -}} +{{- $defElectionID := printf "%s-leader" (include "ingress-nginx.fullname" .) -}} +{{- $electionID := default $defElectionID .Values.controller.electionID -}} +{{- print $electionID -}} +{{- end -}} + +{{/* +Construct the path for the publish-service. + +By convention this will simply use the / to match the name of the +service generated. + +Users can provide an override for an explicit service they want bound via `.Values.controller.publishService.pathOverride` +*/}} +{{- define "ingress-nginx.controller.publishServicePath" -}} +{{- $defServiceName := printf "%s/%s" "$(POD_NAMESPACE)" (include "ingress-nginx.controller.fullname" .) -}} +{{- $servicePath := default $defServiceName .Values.controller.publishService.pathOverride }} +{{- print $servicePath | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "ingress-nginx.labels" -}} +helm.sh/chart: {{ include "ingress-nginx.chart" . }} +{{ include "ingress-nginx.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/part-of: {{ template "ingress-nginx.name" . }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- if .Values.commonLabels}} +{{ toYaml .Values.commonLabels }} +{{- end }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "ingress-nginx.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ingress-nginx.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the controller service account to use +*/}} +{{- define "ingress-nginx.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "ingress-nginx.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified admission webhook name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.admissionWebhooks.fullname" -}} +{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.controller.admissionWebhooks.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the name of the admission webhook patch job service account to use +*/}} +{{- define "ingress-nginx.admissionWebhooks.patch.serviceAccountName" -}} +{{- if .Values.controller.admissionWebhooks.patch.serviceAccount.create -}} + {{ default (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.patch.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.controller.admissionWebhooks.patch.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create a default fully qualified admission webhook secret creation job name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.admissionWebhooks.createSecretJob.fullname" -}} +{{- printf "%s-%s" (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.createSecretJob.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified admission webhook patch job name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" -}} +{{- printf "%s-%s" (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.patchWebhookJob.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified default backend name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "ingress-nginx.defaultBackend.fullname" -}} +{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.defaultBackend.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the name of the default backend service account to use +*/}} +{{- define "ingress-nginx.defaultBackend.serviceAccountName" -}} +{{- if .Values.defaultBackend.serviceAccount.create -}} + {{ default (printf "%s-backend" (include "ingress-nginx.fullname" .)) .Values.defaultBackend.serviceAccount.name }} +{{- else -}} + {{ default "default-backend" .Values.defaultBackend.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Default backend container security context. +*/}} +{{- define "ingress-nginx.defaultBackend.containerSecurityContext" -}} +{{- if .Values.defaultBackend.containerSecurityContext -}} +{{- toYaml .Values.defaultBackend.containerSecurityContext -}} +{{- else -}} +runAsNonRoot: {{ .Values.defaultBackend.image.runAsNonRoot }} +runAsUser: {{ .Values.defaultBackend.image.runAsUser }} +allowPrivilegeEscalation: {{ .Values.defaultBackend.image.allowPrivilegeEscalation }} +{{- if .Values.defaultBackend.image.seccompProfile }} +seccompProfile: {{ toYaml .Values.defaultBackend.image.seccompProfile | nindent 2 }} +{{- end }} +capabilities: + drop: + - ALL +readOnlyRootFilesystem: {{ .Values.defaultBackend.image.readOnlyRootFilesystem }} +{{- end -}} +{{- end -}} + +{{/* +Return the appropriate apiGroup for PodSecurityPolicy. +*/}} +{{- define "podSecurityPolicy.apiGroup" -}} +{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +{{- print "policy" -}} +{{- else -}} +{{- print "extensions" -}} +{{- end -}} +{{- end -}} + +{{/* +Extra modules. +*/}} +{{- define "extraModules" -}} +- name: {{ .name }} + {{- with .image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} + command: + {{- if .distroless }} + - /init_module + {{- else }} + - sh + - -c + - /usr/local/bin/init_module.sh + {{- end }} + {{- end }} + {{- if .containerSecurityContext }} + securityContext: {{ toYaml .containerSecurityContext | nindent 4 }} + {{- end }} + {{- if .resources }} + resources: {{ toYaml .resources | nindent 4 }} + {{- end }} + volumeMounts: + - name: modules + mountPath: /modules_mount +{{- end -}} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/_params.tpl b/nginx-operator/helm-charts/ingress-nginx/templates/_params.tpl new file mode 100644 index 0000000000..48569a8b0c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/_params.tpl @@ -0,0 +1,77 @@ +{{- define "ingress-nginx.params" -}} +- /nginx-ingress-controller +{{- if .Values.controller.enableAnnotationValidations }} +- --enable-annotation-validation=true +{{- end }} +{{- if .Values.defaultBackend.enabled }} +- --default-backend-service=$(POD_NAMESPACE)/{{ include "ingress-nginx.defaultBackend.fullname" . }} +{{- end }} +{{- if and .Values.controller.publishService.enabled .Values.controller.service.enabled }} +{{- if .Values.controller.service.external.enabled }} +- --publish-service={{ template "ingress-nginx.controller.publishServicePath" . }} +{{- else if .Values.controller.service.internal.enabled }} +- --publish-service={{ template "ingress-nginx.controller.publishServicePath" . }}-internal +{{- end }} +{{- end }} +- --election-id={{ include "ingress-nginx.controller.electionID" . }} +- --controller-class={{ .Values.controller.ingressClassResource.controllerValue }} +{{- if .Values.controller.ingressClass }} +- --ingress-class={{ .Values.controller.ingressClass }} +{{- end }} +- --configmap={{ default "$(POD_NAMESPACE)" .Values.controller.configMapNamespace }}/{{ include "ingress-nginx.controller.fullname" . }} +{{- if .Values.tcp }} +- --tcp-services-configmap={{ default "$(POD_NAMESPACE)" .Values.controller.tcp.configMapNamespace }}/{{ include "ingress-nginx.fullname" . }}-tcp +{{- end }} +{{- if .Values.udp }} +- --udp-services-configmap={{ default "$(POD_NAMESPACE)" .Values.controller.udp.configMapNamespace }}/{{ include "ingress-nginx.fullname" . }}-udp +{{- end }} +{{- if .Values.controller.scope.enabled }} +- --watch-namespace={{ default "$(POD_NAMESPACE)" .Values.controller.scope.namespace }} +{{- end }} +{{- if and (not .Values.controller.scope.enabled) .Values.controller.scope.namespaceSelector }} +- --watch-namespace-selector={{ .Values.controller.scope.namespaceSelector }} +{{- end }} +{{- if and .Values.controller.reportNodeInternalIp .Values.controller.hostNetwork }} +- --report-node-internal-ip-address={{ .Values.controller.reportNodeInternalIp }} +{{- end }} +{{- if .Values.controller.admissionWebhooks.enabled }} +- --validating-webhook=:{{ .Values.controller.admissionWebhooks.port }} +- --validating-webhook-certificate={{ .Values.controller.admissionWebhooks.certificate }} +- --validating-webhook-key={{ .Values.controller.admissionWebhooks.key }} +{{- end }} +{{- if .Values.controller.maxmindLicenseKey }} +- --maxmind-license-key={{ .Values.controller.maxmindLicenseKey }} +{{- end }} +{{- if .Values.controller.healthCheckHost }} +- --healthz-host={{ .Values.controller.healthCheckHost }} +{{- end }} +{{- if not (eq .Values.controller.healthCheckPath "/healthz") }} +- --health-check-path={{ .Values.controller.healthCheckPath }} +{{- end }} +{{- if .Values.controller.ingressClassByName }} +- --ingress-class-by-name=true +{{- end }} +{{- if .Values.controller.watchIngressWithoutClass }} +- --watch-ingress-without-class=true +{{- end }} +{{- if not .Values.controller.metrics.enabled }} +- --enable-metrics={{ .Values.controller.metrics.enabled }} +{{- end }} +{{- if .Values.controller.enableTopologyAwareRouting }} +- --enable-topology-aware-routing=true +{{- end }} +{{- if .Values.controller.disableLeaderElection }} +- --disable-leader-election=true +{{- end }} +{{- if .Values.controller.electionTTL }} +- --election-ttl={{ .Values.controller.electionTTL }} +{{- end }} +{{- range $key, $value := .Values.controller.extraArgs }} +{{- /* Accept keys without values or with false as value */}} +{{- if eq ($value | quote | len) 2 }} +- --{{ $key }} +{{- else }} +- --{{ $key }}={{ $value }} +{{- end }} +{{- end }} +{{- end -}} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml new file mode 100644 index 0000000000..db2946c3d1 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml @@ -0,0 +1,63 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.certManager.enabled -}} +{{- if not .Values.controller.admissionWebhooks.certManager.issuerRef -}} +# Create a selfsigned Issuer, in order to create a root CA certificate for +# signing webhook serving certificates +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: {{ include "ingress-nginx.fullname" . }}-self-signed-issuer + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + selfSigned: {} +--- +# Generate a CA Certificate used to sign certificates for the webhook +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: {{ include "ingress-nginx.fullname" . }}-root-cert + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + secretName: {{ include "ingress-nginx.fullname" . }}-root-cert + duration: {{ .Values.controller.admissionWebhooks.certManager.rootCert.duration | default "43800h0m0s" | quote }} + issuerRef: + name: {{ include "ingress-nginx.fullname" . }}-self-signed-issuer + commonName: "ca.webhook.ingress-nginx" + isCA: true + subject: + organizations: + - ingress-nginx +--- +# Create an Issuer that uses the above generated CA certificate to issue certs +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: {{ include "ingress-nginx.fullname" . }}-root-issuer + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + ca: + secretName: {{ include "ingress-nginx.fullname" . }}-root-cert +{{- end }} +--- +# generate a server certificate for the apiservices to use +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + duration: {{ .Values.controller.admissionWebhooks.certManager.admissionCert.duration | default "8760h0m0s" | quote }} + issuerRef: + {{- if .Values.controller.admissionWebhooks.certManager.issuerRef }} + {{- toYaml .Values.controller.admissionWebhooks.certManager.issuerRef | nindent 4 }} + {{- else }} + name: {{ include "ingress-nginx.fullname" . }}-root-issuer + {{- end }} + dnsNames: + - {{ include "ingress-nginx.controller.fullname" . }}-admission + - {{ include "ingress-nginx.controller.fullname" . }}-admission.{{ include "ingress-nginx.namespace" . }} + - {{ include "ingress-nginx.controller.fullname" . }}-admission.{{ include "ingress-nginx.namespace" . }}.svc + subject: + organizations: + - ingress-nginx-admission +{{- end -}} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml new file mode 100644 index 0000000000..a21848201b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml @@ -0,0 +1,33 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +rules: + - apiGroups: + - admissionregistration.k8s.io + resources: + - validatingwebhookconfigurations + verbs: + - get + - update +{{- if .Values.podSecurityPolicy.enabled }} + - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] + resources: ['podsecuritypolicies'] + verbs: ['use'] + {{- with .Values.controller.admissionWebhooks.existingPsp }} + resourceNames: [{{ . }}] + {{- else }} + resourceNames: [{{ include "ingress-nginx.admissionWebhooks.fullname" . }}] + {{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml new file mode 100644 index 0000000000..b893884335 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml @@ -0,0 +1,23 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml new file mode 100644 index 0000000000..176616467c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml @@ -0,0 +1,79 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.createSecretJob.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + {{- with .Values.controller.admissionWebhooks.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} + # Alpha feature since k8s 1.12 + ttlSecondsAfterFinished: 0 +{{- end }} + template: + metadata: + name: {{ include "ingress-nginx.admissionWebhooks.createSecretJob.fullname" . }} + {{- if .Values.controller.admissionWebhooks.patch.podAnnotations }} + annotations: {{ toYaml .Values.controller.admissionWebhooks.patch.podAnnotations | nindent 8 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 8 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }} + priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + containers: + - name: create + {{- with .Values.controller.admissionWebhooks.patch.image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} + {{- end }} + imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.image.pullPolicy }} + args: + - create + - --host={{ include "ingress-nginx.controller.fullname" . }}-admission,{{ include "ingress-nginx.controller.fullname" . }}-admission.$(POD_NAMESPACE).svc + - --namespace=$(POD_NAMESPACE) + - --secret-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if .Values.controller.admissionWebhooks.extraEnvs }} + {{- toYaml .Values.controller.admissionWebhooks.extraEnvs | nindent 12 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.createSecretJob.securityContext }} + securityContext: {{ toYaml .Values.controller.admissionWebhooks.createSecretJob.securityContext | nindent 12 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.createSecretJob.resources }} + resources: {{ toYaml .Values.controller.admissionWebhooks.createSecretJob.resources | nindent 12 }} + {{- end }} + restartPolicy: OnFailure + serviceAccountName: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} + {{- if .Values.controller.admissionWebhooks.patch.nodeSelector }} + nodeSelector: {{ toYaml .Values.controller.admissionWebhooks.patch.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patch.tolerations }} + tolerations: {{ toYaml .Values.controller.admissionWebhooks.patch.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patch.securityContext }} + securityContext: {{ toYaml .Values.controller.admissionWebhooks.patch.securityContext | nindent 8 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml new file mode 100644 index 0000000000..f7d44a24db --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml @@ -0,0 +1,81 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + {{- with .Values.controller.admissionWebhooks.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} + # Alpha feature since k8s 1.12 + ttlSecondsAfterFinished: 0 +{{- end }} + template: + metadata: + name: {{ include "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" . }} + {{- if .Values.controller.admissionWebhooks.patch.podAnnotations }} + annotations: {{ toYaml .Values.controller.admissionWebhooks.patch.podAnnotations | nindent 8 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 8 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }} + priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + containers: + - name: patch + {{- with .Values.controller.admissionWebhooks.patch.image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} + {{- end }} + imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.image.pullPolicy }} + args: + - patch + - --webhook-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} + - --namespace=$(POD_NAMESPACE) + - --patch-mutating=false + - --secret-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} + - --patch-failure-policy={{ .Values.controller.admissionWebhooks.failurePolicy }} + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if .Values.controller.admissionWebhooks.extraEnvs }} + {{- toYaml .Values.controller.admissionWebhooks.extraEnvs | nindent 12 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patchWebhookJob.securityContext }} + securityContext: {{ toYaml .Values.controller.admissionWebhooks.patchWebhookJob.securityContext | nindent 12 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patchWebhookJob.resources }} + resources: {{ toYaml .Values.controller.admissionWebhooks.patchWebhookJob.resources | nindent 12 }} + {{- end }} + restartPolicy: OnFailure + serviceAccountName: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} + {{- if .Values.controller.admissionWebhooks.patch.nodeSelector }} + nodeSelector: {{ toYaml .Values.controller.admissionWebhooks.patch.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patch.tolerations }} + tolerations: {{ toYaml .Values.controller.admissionWebhooks.patch.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.patch.securityContext }} + securityContext: {{ toYaml .Values.controller.admissionWebhooks.patch.securityContext | nindent 8 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml new file mode 100644 index 0000000000..a8f38df96f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml @@ -0,0 +1,26 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.networkPolicy.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + podSelector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: admission-webhook + policyTypes: + - Ingress + - Egress + egress: + - {} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml new file mode 100644 index 0000000000..8e5dc72ac4 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml @@ -0,0 +1,52 @@ +{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} +{{- if and .Values.podSecurityPolicy.enabled .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (empty .Values.controller.admissionWebhooks.existingPsp) -}} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + privileged: false + hostPID: false + hostIPC: false + hostNetwork: false + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + fsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + readOnlyRootFilesystem: true + runAsUser: + rule: MustRunAsNonRoot + runAsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + supplementalGroups: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + allowPrivilegeEscalation: false + requiredDropCapabilities: + - ALL + seLinux: + rule: RunAsAny +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml new file mode 100644 index 0000000000..c4b23aa082 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml @@ -0,0 +1,24 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +rules: + - apiGroups: + - "" + resources: + - secrets + verbs: + - get + - create +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml new file mode 100644 index 0000000000..425e8d8218 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml @@ -0,0 +1,24 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml new file mode 100644 index 0000000000..52f94dcce7 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml @@ -0,0 +1,17 @@ +{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.serviceAccount.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.patch.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml new file mode 100644 index 0000000000..0949cea75a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml @@ -0,0 +1,54 @@ +{{- if .Values.controller.admissionWebhooks.enabled -}} +# before changing this value, check the required kubernetes version +# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + {{- if .Values.controller.admissionWebhooks.certManager.enabled }} + certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s" (include "ingress-nginx.namespace" .) (include "ingress-nginx.admissionWebhooks.fullname" .) | quote }} + cert-manager.io/inject-ca-from: {{ printf "%s/%s" (include "ingress-nginx.namespace" .) (include "ingress-nginx.admissionWebhooks.fullname" .) | quote }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.annotations }} + {{- toYaml .Values.controller.admissionWebhooks.annotations | nindent 4 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: admission-webhook + {{- with .Values.controller.admissionWebhooks.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} +webhooks: + - name: validate.nginx.ingress.kubernetes.io + matchPolicy: Equivalent + rules: + - apiGroups: + - networking.k8s.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - ingresses + failurePolicy: {{ .Values.controller.admissionWebhooks.failurePolicy | default "Fail" }} + sideEffects: None + admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ include "ingress-nginx.controller.fullname" . }}-admission + namespace: {{ include "ingress-nginx.namespace" . }} + port: {{ .Values.controller.admissionWebhooks.service.servicePort }} + path: /networking/v1/ingresses + {{- if .Values.controller.admissionWebhooks.timeoutSeconds }} + timeoutSeconds: {{ .Values.controller.admissionWebhooks.timeoutSeconds }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.namespaceSelector }} + namespaceSelector: {{ toYaml .Values.controller.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.objectSelector }} + objectSelector: {{ toYaml .Values.controller.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/clusterrole.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/clusterrole.yaml new file mode 100644 index 0000000000..51bc5002cc --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/clusterrole.yaml @@ -0,0 +1,102 @@ +{{- if .Values.rbac.create }} + +{{- if and .Values.rbac.scope (not .Values.controller.scope.enabled) -}} + {{ required "Invalid configuration: 'rbac.scope' should be equal to 'controller.scope.enabled' (true/false)." (index (dict) ".") }} +{{- end }} + +{{- if not .Values.rbac.scope -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }} +rules: + - apiGroups: + - "" + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets +{{- if not .Values.controller.scope.enabled }} + - namespaces +{{- end}} + verbs: + - list + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - list + - watch +{{- if and .Values.controller.scope.enabled .Values.controller.scope.namespace }} + - apiGroups: + - "" + resources: + - namespaces + resourceNames: + - "{{ .Values.controller.scope.namespace }}" + verbs: + - get +{{- end }} + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - list + - watch + - get +{{- end }} + +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/clusterrolebinding.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/clusterrolebinding.yaml new file mode 100644 index 0000000000..8f91aac807 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/clusterrolebinding.yaml @@ -0,0 +1,19 @@ +{{- if and .Values.rbac.create (not .Values.rbac.scope) -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "ingress-nginx.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ template "ingress-nginx.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-addheaders.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-addheaders.yaml new file mode 100644 index 0000000000..4e4bd1310a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-addheaders.yaml @@ -0,0 +1,14 @@ +{{- if .Values.controller.addHeaders -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }}-custom-add-headers + namespace: {{ include "ingress-nginx.namespace" . }} +data: {{ toYaml .Values.controller.addHeaders | nindent 2 }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml new file mode 100644 index 0000000000..0a22600db2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml @@ -0,0 +1,14 @@ +{{- if .Values.controller.proxySetHeaders -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }}-custom-proxy-headers + namespace: {{ include "ingress-nginx.namespace" . }} +data: {{ toYaml .Values.controller.proxySetHeaders | nindent 2 }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-tcp.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-tcp.yaml new file mode 100644 index 0000000000..131a9ad510 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-tcp.yaml @@ -0,0 +1,17 @@ +{{- if .Values.tcp -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- if .Values.controller.tcp.annotations }} + annotations: {{ toYaml .Values.controller.tcp.annotations | nindent 4 }} +{{- end }} + name: {{ include "ingress-nginx.fullname" . }}-tcp + namespace: {{ include "ingress-nginx.namespace" . }} +data: {{ tpl (toYaml .Values.tcp) . | nindent 2 }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-udp.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-udp.yaml new file mode 100644 index 0000000000..7137da9ad2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap-udp.yaml @@ -0,0 +1,17 @@ +{{- if .Values.udp -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- if .Values.controller.udp.annotations }} + annotations: {{ toYaml .Values.controller.udp.annotations | nindent 4 }} +{{- end }} + name: {{ include "ingress-nginx.fullname" . }}-udp + namespace: {{ include "ingress-nginx.namespace" . }} +data: {{ tpl (toYaml .Values.udp) . | nindent 2 }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml new file mode 100644 index 0000000000..22080d115f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- if .Values.controller.configAnnotations }} + annotations: {{ toYaml .Values.controller.configAnnotations | nindent 4 }} +{{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +data: + allow-snippet-annotations: "{{ .Values.controller.allowSnippetAnnotations }}" +{{- if .Values.controller.addHeaders }} + add-headers: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.fullname" . }}-custom-add-headers +{{- end }} +{{- if .Values.controller.proxySetHeaders }} + proxy-set-headers: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.fullname" . }}-custom-proxy-headers +{{- end }} +{{- if .Values.dhParam }} + ssl-dh-param: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.controller.fullname" . }} +{{- end }} +{{- range $key, $value := .Values.controller.config }} + {{- $key | nindent 2 }}: {{ tpl (toString $value) $ | quote }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-daemonset.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-daemonset.yaml new file mode 100644 index 0000000000..fcc633d3d4 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-daemonset.yaml @@ -0,0 +1,242 @@ +{{- if eq .Values.controller.kind "DaemonSet" -}} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + {{- if .Values.controller.annotations }} + annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + {{- if .Values.controller.updateStrategy }} + updateStrategy: {{ toYaml .Values.controller.updateStrategy | nindent 4 }} + {{- end }} + minReadySeconds: {{ .Values.controller.minReadySeconds }} + template: + metadata: + {{- if .Values.controller.podAnnotations }} + annotations: + {{- range $key, $value := .Values.controller.podAnnotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 8 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.controller.podLabels }} + {{- toYaml .Values.controller.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if .Values.controller.dnsConfig }} + dnsConfig: {{ toYaml .Values.controller.dnsConfig | nindent 8 }} + {{- end }} + {{- if .Values.controller.hostAliases }} + hostAliases: {{ tpl (toYaml .Values.controller.hostAliases) $ | nindent 8 }} + {{- end }} + {{- if .Values.controller.hostname }} + hostname: {{ toYaml .Values.controller.hostname | nindent 8 }} + {{- end }} + dnsPolicy: {{ .Values.controller.dnsPolicy }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + {{- if .Values.controller.priorityClassName }} + priorityClassName: {{ .Values.controller.priorityClassName | quote }} + {{- end }} + {{- if or .Values.controller.podSecurityContext .Values.controller.sysctls }} + securityContext: + {{- if .Values.controller.podSecurityContext }} + {{- toYaml .Values.controller.podSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.controller.sysctls }} + sysctls: + {{- range $sysctl, $value := .Values.controller.sysctls }} + - name: {{ $sysctl | quote }} + value: {{ $value | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.controller.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.controller.shareProcessNamespace }} + {{- end }} + containers: + - name: {{ .Values.controller.containerName }} + {{- with .Values.controller.image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ include "ingress-nginx.image" . }}{{ end }}:{{ .tag }}{{ include "ingress-nginx.imageDigest" . }} + {{- end }} + imagePullPolicy: {{ .Values.controller.image.pullPolicy }} + {{- if .Values.controller.lifecycle }} + lifecycle: {{ toYaml .Values.controller.lifecycle | nindent 12 }} + {{- end }} + args: {{ include "ingress-nginx.params" . | nindent 12 }} + securityContext: {{ include "ingress-nginx.controller.containerSecurityContext" . | nindent 12 }} + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if .Values.controller.enableMimalloc }} + - name: LD_PRELOAD + value: /usr/local/lib/libmimalloc.so + {{- end }} + {{- if .Values.controller.extraEnvs }} + {{- toYaml .Values.controller.extraEnvs | nindent 12 }} + {{- end }} + {{- if .Values.controller.startupProbe }} + startupProbe: {{ toYaml .Values.controller.startupProbe | nindent 12 }} + {{- end }} + {{- if .Values.controller.livenessProbe }} + livenessProbe: {{ toYaml .Values.controller.livenessProbe | nindent 12 }} + {{- end }} + {{- if .Values.controller.readinessProbe }} + readinessProbe: {{ toYaml .Values.controller.readinessProbe | nindent 12 }} + {{- end }} + ports: + {{- range $key, $value := .Values.controller.containerPort }} + - name: {{ $key }} + containerPort: {{ $value }} + protocol: TCP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ index $.Values.controller.hostPort.ports $key | default $value }} + {{- end }} + {{- end }} + {{- if .Values.controller.metrics.enabled }} + - name: {{ .Values.controller.metrics.portName }} + containerPort: {{ .Values.controller.metrics.port }} + protocol: TCP + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook + containerPort: {{ .Values.controller.admissionWebhooks.port }} + protocol: TCP + {{- end }} + {{- range $key, $value := .Values.tcp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + containerPort: {{ $key }} + protocol: TCP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ $key }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.udp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + containerPort: {{ $key }} + protocol: UDP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ $key }} + {{- end }} + {{- end }} + {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + volumeMounts: + {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + - name: modules + {{- if .Values.controller.image.chroot }} + mountPath: /chroot/modules_mount + {{- else }} + mountPath: /modules_mount + {{- end }} + {{- end }} + {{- if .Values.controller.customTemplate.configMapName }} + - mountPath: /etc/nginx/template + name: nginx-template-volume + readOnly: true + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook-cert + mountPath: /usr/local/certificates/ + readOnly: true + {{- end }} + {{- if .Values.controller.extraVolumeMounts }} + {{- toYaml .Values.controller.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.controller.resources }} + resources: {{ toYaml .Values.controller.resources | nindent 12 }} + {{- end }} + {{- if .Values.controller.extraContainers }} + {{- toYaml .Values.controller.extraContainers | nindent 8 }} + {{- end }} + {{- if (or .Values.controller.extraInitContainers .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + initContainers: + {{- if .Values.controller.extraInitContainers }} + {{- toYaml .Values.controller.extraInitContainers | nindent 8 }} + {{- end }} + {{- if .Values.controller.extraModules }} + {{- range .Values.controller.extraModules }} + {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} + {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.controller.opentelemetry.enabled }} + {{- with .Values.controller.opentelemetry }} + {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} + {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.controller.hostNetwork }} + hostNetwork: {{ .Values.controller.hostNetwork }} + {{- end }} + {{- if .Values.controller.nodeSelector }} + nodeSelector: {{ toYaml .Values.controller.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.controller.tolerations }} + tolerations: {{ toYaml .Values.controller.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.controller.affinity }} + affinity: {{ tpl (toYaml .Values.controller.affinity) $ | nindent 8 }} + {{- end }} + {{- if .Values.controller.topologySpreadConstraints }} + topologySpreadConstraints: {{ tpl (toYaml .Values.controller.topologySpreadConstraints) $ | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "ingress-nginx.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ .Values.controller.terminationGracePeriodSeconds }} + {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + volumes: + {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled)}} + - name: modules + emptyDir: {} + {{- end }} + {{- if .Values.controller.customTemplate.configMapName }} + - name: nginx-template-volume + configMap: + name: {{ .Values.controller.customTemplate.configMapName }} + items: + - key: {{ .Values.controller.customTemplate.configMapKey }} + path: nginx.tmpl + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook-cert + secret: + secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + {{- if .Values.controller.admissionWebhooks.certManager.enabled }} + items: + - key: tls.crt + path: cert + - key: tls.key + path: key + {{- end }} + {{- end }} + {{- if .Values.controller.extraVolumes }} + {{ toYaml .Values.controller.extraVolumes | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-deployment.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-deployment.yaml new file mode 100644 index 0000000000..5211acd0b2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-deployment.yaml @@ -0,0 +1,245 @@ +{{- if eq .Values.controller.kind "Deployment" -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + {{- if .Values.controller.annotations }} + annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller + {{- if eq .Values.controller.autoscaling.enabled .Values.controller.keda.enabled }} + replicas: {{ .Values.controller.replicaCount }} + {{- end }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + {{- if .Values.controller.updateStrategy }} + strategy: {{ toYaml .Values.controller.updateStrategy | nindent 4 }} + {{- end }} + minReadySeconds: {{ .Values.controller.minReadySeconds }} + template: + metadata: + {{- if .Values.controller.podAnnotations }} + annotations: + {{- range $key, $value := .Values.controller.podAnnotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 8 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.controller.podLabels }} + {{- toYaml .Values.controller.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if .Values.controller.dnsConfig }} + dnsConfig: {{ toYaml .Values.controller.dnsConfig | nindent 8 }} + {{- end }} + {{- if .Values.controller.hostAliases }} + hostAliases: {{ tpl (toYaml .Values.controller.hostAliases) $ | nindent 8 }} + {{- end }} + {{- if .Values.controller.hostname }} + hostname: {{ toYaml .Values.controller.hostname | nindent 8 }} + {{- end }} + dnsPolicy: {{ .Values.controller.dnsPolicy }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + {{- if .Values.controller.priorityClassName }} + priorityClassName: {{ .Values.controller.priorityClassName | quote }} + {{- end }} + {{- if or .Values.controller.podSecurityContext .Values.controller.sysctls }} + securityContext: + {{- if .Values.controller.podSecurityContext }} + {{- toYaml .Values.controller.podSecurityContext | nindent 8 }} + {{- end }} + {{- if .Values.controller.sysctls }} + sysctls: + {{- range $sysctl, $value := .Values.controller.sysctls }} + - name: {{ $sysctl | quote }} + value: {{ $value | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.controller.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.controller.shareProcessNamespace }} + {{- end }} + containers: + - name: {{ .Values.controller.containerName }} + {{- with .Values.controller.image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ include "ingress-nginx.image" . }}{{ end }}:{{ .tag }}{{ include "ingress-nginx.imageDigest" . }} + {{- end }} + imagePullPolicy: {{ .Values.controller.image.pullPolicy }} + {{- if .Values.controller.lifecycle }} + lifecycle: {{ toYaml .Values.controller.lifecycle | nindent 12 }} + {{- end }} + args: {{ include "ingress-nginx.params" . | nindent 12 }} + securityContext: {{ include "ingress-nginx.controller.containerSecurityContext" . | nindent 12 }} + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + {{- if .Values.controller.enableMimalloc }} + - name: LD_PRELOAD + value: /usr/local/lib/libmimalloc.so + {{- end }} + {{- if .Values.controller.extraEnvs }} + {{- toYaml .Values.controller.extraEnvs | nindent 12 }} + {{- end }} + {{- if .Values.controller.startupProbe }} + startupProbe: {{ toYaml .Values.controller.startupProbe | nindent 12 }} + {{- end }} + {{- if .Values.controller.livenessProbe }} + livenessProbe: {{ toYaml .Values.controller.livenessProbe | nindent 12 }} + {{- end }} + {{- if .Values.controller.readinessProbe }} + readinessProbe: {{ toYaml .Values.controller.readinessProbe | nindent 12 }} + {{- end }} + ports: + {{- range $key, $value := .Values.controller.containerPort }} + - name: {{ $key }} + containerPort: {{ $value }} + protocol: TCP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ index $.Values.controller.hostPort.ports $key | default $value }} + {{- end }} + {{- end }} + {{- if .Values.controller.metrics.enabled }} + - name: {{ .Values.controller.metrics.portName }} + containerPort: {{ .Values.controller.metrics.port }} + protocol: TCP + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook + containerPort: {{ .Values.controller.admissionWebhooks.port }} + protocol: TCP + {{- end }} + {{- range $key, $value := .Values.tcp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + containerPort: {{ $key }} + protocol: TCP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ $key }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.udp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + containerPort: {{ $key }} + protocol: UDP + {{- if $.Values.controller.hostPort.enabled }} + hostPort: {{ $key }} + {{- end }} + {{- end }} + {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + volumeMounts: + {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + - name: modules + {{- if .Values.controller.image.chroot }} + mountPath: /chroot/modules_mount + {{- else }} + mountPath: /modules_mount + {{- end }} + {{- end }} + {{- if .Values.controller.customTemplate.configMapName }} + - mountPath: /etc/nginx/template + name: nginx-template-volume + readOnly: true + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook-cert + mountPath: /usr/local/certificates/ + readOnly: true + {{- end }} + {{- if .Values.controller.extraVolumeMounts }} + {{- toYaml .Values.controller.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- end }} + {{- if .Values.controller.resources }} + resources: {{ toYaml .Values.controller.resources | nindent 12 }} + {{- end }} + {{- if .Values.controller.extraContainers }} + {{- toYaml .Values.controller.extraContainers | nindent 8 }} + {{- end }} + {{- if (or .Values.controller.extraInitContainers .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + initContainers: + {{- if .Values.controller.extraInitContainers }} + {{- toYaml .Values.controller.extraInitContainers | nindent 8 }} + {{- end }} + {{- if .Values.controller.extraModules }} + {{- range .Values.controller.extraModules }} + {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} + {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} + {{- end }} + {{- end }} + {{- if .Values.controller.opentelemetry.enabled }} + {{- with .Values.controller.opentelemetry }} + {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} + {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.controller.hostNetwork }} + hostNetwork: {{ .Values.controller.hostNetwork }} + {{- end }} + {{- if .Values.controller.nodeSelector }} + nodeSelector: {{ toYaml .Values.controller.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.controller.tolerations }} + tolerations: {{ toYaml .Values.controller.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.controller.affinity }} + affinity: {{ tpl (toYaml .Values.controller.affinity) $ | nindent 8 }} + {{- end }} + {{- if .Values.controller.topologySpreadConstraints }} + topologySpreadConstraints: {{ tpl (toYaml .Values.controller.topologySpreadConstraints) $ | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "ingress-nginx.serviceAccountName" . }} + terminationGracePeriodSeconds: {{ .Values.controller.terminationGracePeriodSeconds }} + {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} + volumes: + {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled)}} + - name: modules + emptyDir: {} + {{- end }} + {{- if .Values.controller.customTemplate.configMapName }} + - name: nginx-template-volume + configMap: + name: {{ .Values.controller.customTemplate.configMapName }} + items: + - key: {{ .Values.controller.customTemplate.configMapKey }} + path: nginx.tmpl + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - name: webhook-cert + secret: + secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} + {{- if .Values.controller.admissionWebhooks.certManager.enabled }} + items: + - key: tls.crt + path: cert + - key: tls.key + path: key + {{- end }} + {{- end }} + {{- if .Values.controller.extraVolumes }} + {{ toYaml .Values.controller.extraVolumes | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-hpa.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-hpa.yaml new file mode 100644 index 0000000000..ec9ad73801 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-hpa.yaml @@ -0,0 +1,47 @@ +{{- if and (eq .Values.controller.kind "Deployment") .Values.controller.autoscaling.enabled (not .Values.controller.keda.enabled) -}} +apiVersion: {{ ternary "autoscaling/v2" "autoscaling/v2beta2" (.Capabilities.APIVersions.Has "autoscaling/v2") }} +kind: HorizontalPodAutoscaler +metadata: + {{- with .Values.controller.autoscaling.annotations }} + annotations: {{ toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "ingress-nginx.controller.fullname" . }} + minReplicas: {{ .Values.controller.autoscaling.minReplicas }} + maxReplicas: {{ .Values.controller.autoscaling.maxReplicas }} + metrics: + {{- with .Values.controller.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ . }} + {{- end }} + {{- with .Values.controller.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ . }} + {{- end }} + {{- with .Values.controller.autoscalingTemplate }} + {{- toYaml . | nindent 2 }} + {{- end }} + {{- with .Values.controller.autoscaling.behavior }} + behavior: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml new file mode 100644 index 0000000000..ffe22310c6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml @@ -0,0 +1,23 @@ +{{- if .Values.controller.ingressClassResource.enabled -}} +{{- range .Values.controller.ingressClassResource.aliases }} +--- +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + labels: + {{- include "ingress-nginx.labels" $ | nindent 4 }} + app.kubernetes.io/component: controller + {{- with $.Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ . }} + {{- if $.Values.controller.ingressClassResource.annotations }} + annotations: {{ toYaml $.Values.controller.ingressClassResource.annotations | nindent 4 }} + {{- end }} +spec: + controller: {{ $.Values.controller.ingressClassResource.controllerValue }} + {{- with $.Values.controller.ingressClassResource.parameters }} + parameters: {{ toYaml . | nindent 4 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass.yaml new file mode 100644 index 0000000000..98479a529e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-ingressclass.yaml @@ -0,0 +1,26 @@ +{{- if .Values.controller.ingressClassResource.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ .Values.controller.ingressClassResource.name }} + {{- if or .Values.controller.ingressClassResource.default .Values.controller.ingressClassResource.annotations }} + annotations: + {{- if .Values.controller.ingressClassResource.default }} + ingressclass.kubernetes.io/is-default-class: "true" + {{- end }} + {{- if .Values.controller.ingressClassResource.annotations }} + {{- toYaml .Values.controller.ingressClassResource.annotations | nindent 4 }} + {{- end }} + {{- end }} +spec: + controller: {{ .Values.controller.ingressClassResource.controllerValue }} + {{- with .Values.controller.ingressClassResource.parameters }} + parameters: {{ toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-keda.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-keda.yaml new file mode 100644 index 0000000000..24d30fa0a0 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-keda.yaml @@ -0,0 +1,46 @@ +{{- if and (eq .Values.controller.kind "Deployment") .Values.controller.keda.enabled (not .Values.controller.autoscaling.enabled) -}} +apiVersion: {{ .Values.controller.keda.apiVersion }} +kind: ScaledObject +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + {{- if .Values.controller.keda.scaledObject.annotations }} + annotations: {{ toYaml .Values.controller.keda.scaledObject.annotations | nindent 4 }} + {{- end }} +spec: + scaleTargetRef: +{{- if eq .Values.controller.keda.apiVersion "keda.k8s.io/v1alpha1" }} + deploymentName: {{ include "ingress-nginx.controller.fullname" . }} +{{- else if eq .Values.controller.keda.apiVersion "keda.sh/v1alpha1" }} + name: {{ include "ingress-nginx.controller.fullname" . }} +{{- end }} + pollingInterval: {{ .Values.controller.keda.pollingInterval }} + cooldownPeriod: {{ .Values.controller.keda.cooldownPeriod }} + minReplicaCount: {{ .Values.controller.keda.minReplicas }} + maxReplicaCount: {{ .Values.controller.keda.maxReplicas }} +{{- with .Values.controller.keda.fallback }} + fallback: + failureThreshold: {{ .failureThreshold | default 3 }} + replicas: {{ .replicas | default $.Values.controller.keda.maxReplicas }} +{{- end }} + triggers: +{{- with .Values.controller.keda.triggers }} +{{ toYaml . | indent 2 }} +{{ end }} + advanced: + restoreToOriginalReplicaCount: {{ .Values.controller.keda.restoreToOriginalReplicaCount }} +{{- if .Values.controller.keda.behavior }} + horizontalPodAutoscalerConfig: + behavior: +{{ with .Values.controller.keda.behavior -}} +{{ toYaml . | indent 8 }} +{{ end }} + +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-networkpolicy.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-networkpolicy.yaml new file mode 100644 index 0000000000..e68f9916de --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-networkpolicy.yaml @@ -0,0 +1,45 @@ +{{- if .Values.controller.networkPolicy.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + podSelector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller + policyTypes: + - Ingress + - Egress + ingress: + - ports: + {{- range $key, $value := .Values.controller.containerPort }} + - protocol: TCP + port: {{ $value }} + {{- end }} + {{- if .Values.controller.metrics.enabled }} + - protocol: TCP + port: {{ .Values.controller.metrics.port }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + - protocol: TCP + port: {{ .Values.controller.admissionWebhooks.port }} + {{- end }} + {{- range $key, $value := .Values.tcp }} + - protocol: TCP + port: {{ $key }} + {{- end }} + {{- range $key, $value := .Values.udp }} + - protocol: UDP + port: {{ $key }} + {{- end }} + egress: + - {} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml new file mode 100644 index 0000000000..8e0181f9f1 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml @@ -0,0 +1,36 @@ +# PDB is not supported for DaemonSets. +# https://github.com/kubernetes/kubernetes/issues/108124 +{{- if eq .Values.controller.kind "Deployment" }} +{{- $replicas := .Values.controller.replicaCount }} +{{- if and .Values.controller.autoscaling.enabled (not .Values.controller.keda.enabled) }} +{{- $replicas = .Values.controller.autoscaling.minReplicas }} +{{- else if and .Values.controller.keda.enabled (not .Values.controller.autoscaling.enabled) }} +{{- $replicas = .Values.controller.keda.minReplicas }} +{{- end }} +{{- if gt ($replicas | int) 1 }} +apiVersion: {{ ternary "policy/v1" "policy/v1beta1" (semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version) }} +kind: PodDisruptionBudget +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + {{- if .Values.controller.annotations }} + annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller + {{- if and .Values.controller.minAvailable (not (hasKey .Values.controller "maxUnavailable")) }} + minAvailable: {{ .Values.controller.minAvailable }} + {{- else if .Values.controller.maxUnavailable }} + maxUnavailable: {{ .Values.controller.maxUnavailable }} + {{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-prometheusrule.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-prometheusrule.yaml new file mode 100644 index 0000000000..41684c3708 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-prometheusrule.yaml @@ -0,0 +1,23 @@ +{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.prometheusRule.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: {{ include "ingress-nginx.controller.fullname" . }} +{{- if .Values.controller.metrics.prometheusRule.namespace }} + namespace: {{ .Values.controller.metrics.prometheusRule.namespace }} +{{- else }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- if .Values.controller.metrics.prometheusRule.additionalLabels }} + {{- toYaml .Values.controller.metrics.prometheusRule.additionalLabels | nindent 4 }} + {{- end }} +spec: +{{- if .Values.controller.metrics.prometheusRule.rules }} + groups: + - name: {{ template "ingress-nginx.name" . }} + rules: {{- toYaml .Values.controller.metrics.prometheusRule.rules | nindent 4 }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-psp.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-psp.yaml new file mode 100644 index 0000000000..aad1d27361 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-psp.yaml @@ -0,0 +1,100 @@ +{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} +{{- if and .Values.podSecurityPolicy.enabled (empty .Values.controller.existingPsp) -}} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "ingress-nginx.fullname" . }} + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + privileged: false + hostPID: false + hostIPC: false + hostNetwork: {{ .Values.controller.hostNetwork }} +{{- if or .Values.controller.hostNetwork .Values.controller.hostPort.enabled }} + hostPorts: + {{- if .Values.controller.hostNetwork }} + {{- range $key, $value := .Values.controller.containerPort }} + # controller.containerPort.{{ $key }} + - min: {{ $value }} + max: {{ $value }} + {{- end }} + {{- else if .Values.controller.hostPort.enabled }} + {{- range $key, $value := .Values.controller.hostPort.ports }} + # controller.hostPort.ports.{{ $key }} + - min: {{ $value }} + max: {{ $value }} + {{- end }} + {{- end }} + {{- if .Values.controller.metrics.enabled }} + # controller.metrics.port + - min: {{ .Values.controller.metrics.port }} + max: {{ .Values.controller.metrics.port }} + {{- end }} + {{- if .Values.controller.admissionWebhooks.enabled }} + # controller.admissionWebhooks.port + - min: {{ .Values.controller.admissionWebhooks.port }} + max: {{ .Values.controller.admissionWebhooks.port }} + {{- end }} + {{- range $key, $value := .Values.tcp }} + # tcp.{{ $key }} + - min: {{ $key }} + max: {{ $key }} + {{- end }} + {{- range $key, $value := .Values.udp }} + # udp.{{ $key }} + - min: {{ $key }} + max: {{ $key }} + {{- end }} +{{- end }} + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + fsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + readOnlyRootFilesystem: false + runAsUser: + rule: MustRunAsNonRoot + runAsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + supplementalGroups: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + allowPrivilegeEscalation: {{ or .Values.controller.image.allowPrivilegeEscalation .Values.controller.image.chroot }} + requiredDropCapabilities: + - ALL + allowedCapabilities: + - NET_BIND_SERVICE + {{- if .Values.controller.image.chroot }} + {{- if .Values.controller.image.seccompProfile }} + - SYS_ADMIN + {{- end }} + - SYS_CHROOT + {{- end }} + seLinux: + rule: RunAsAny +{{- if .Values.controller.sysctls }} + allowedUnsafeSysctls: + {{- range $sysctl, $value := .Values.controller.sysctls }} + - {{ $sysctl }} + {{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-role.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-role.yaml new file mode 100644 index 0000000000..a94b399782 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-role.yaml @@ -0,0 +1,104 @@ +{{- if .Values.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +rules: + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + # Omit Ingress status permissions if `--update-status` is disabled. + {{- if ne (index .Values.controller.extraArgs "update-status") "false" }} + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + {{- end }} + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + resourceNames: + - {{ include "ingress-nginx.controller.electionID" . }} + verbs: + - get + - update + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - list + - watch + - get +{{- if .Values.podSecurityPolicy.enabled }} + - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] + resources: ['podsecuritypolicies'] + verbs: ['use'] + {{- with .Values.controller.existingPsp }} + resourceNames: [{{ . }}] + {{- else }} + resourceNames: [{{ include "ingress-nginx.fullname" . }}] + {{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-rolebinding.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-rolebinding.yaml new file mode 100644 index 0000000000..153430aa2c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-rolebinding.yaml @@ -0,0 +1,21 @@ +{{- if .Values.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ include "ingress-nginx.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ template "ingress-nginx.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-secret.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-secret.yaml new file mode 100644 index 0000000000..f20f53469c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-secret.yaml @@ -0,0 +1,15 @@ +{{- if .Values.dhParam -}} +apiVersion: v1 +kind: Secret +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +data: + dhparam.pem: {{ .Values.dhParam }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-internal.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-internal.yaml new file mode 100644 index 0000000000..6d0b47caf6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-internal.yaml @@ -0,0 +1,105 @@ +{{- if and .Values.controller.service.enabled .Values.controller.service.internal.enabled .Values.controller.service.internal.annotations -}} +apiVersion: v1 +kind: Service +metadata: + annotations: + {{- range $key, $value := .Values.controller.service.internal.annotations }} + {{ $key }}: {{ tpl ($value | toString) $ | quote }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- if .Values.controller.service.labels }} + {{- toYaml .Values.controller.service.labels | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }}-internal + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + type: {{ .Values.controller.service.internal.type | default .Values.controller.service.type }} +{{- if .Values.controller.service.internal.clusterIP }} + clusterIP: {{ .Values.controller.service.internal.clusterIP }} +{{- end }} +{{- if .Values.controller.service.internal.externalIPs }} + externalIPs: {{ toYaml .Values.controller.service.internal.externalIPs | nindent 4 }} +{{- end }} +{{- if .Values.controller.service.internal.loadBalancerIP }} + loadBalancerIP: {{ .Values.controller.service.internal.loadBalancerIP }} +{{- end }} +{{- if .Values.controller.service.internal.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{ toYaml .Values.controller.service.internal.loadBalancerSourceRanges | nindent 4 }} +{{- end }} +{{- if .Values.controller.service.internal.loadBalancerClass }} + loadBalancerClass: {{ .Values.controller.service.internal.loadBalancerClass }} +{{- end }} +{{- if hasKey .Values.controller.service.internal "allocateLoadBalancerNodePorts" }} + allocateLoadBalancerNodePorts: {{ .Values.controller.service.internal.allocateLoadBalancerNodePorts }} +{{- end }} +{{- if .Values.controller.service.internal.externalTrafficPolicy }} + externalTrafficPolicy: {{ .Values.controller.service.internal.externalTrafficPolicy }} +{{- end }} +{{- if .Values.controller.service.internal.sessionAffinity }} + sessionAffinity: {{ .Values.controller.service.internal.sessionAffinity }} +{{- end }} +{{- if .Values.controller.service.internal.healthCheckNodePort }} + healthCheckNodePort: {{ .Values.controller.service.internal.healthCheckNodePort }} +{{- end }} +{{- if semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version -}} +{{- if .Values.controller.service.internal.ipFamilyPolicy }} + ipFamilyPolicy: {{ .Values.controller.service.internal.ipFamilyPolicy }} +{{- end }} +{{- if .Values.controller.service.internal.ipFamilies }} + ipFamilies: {{ toYaml .Values.controller.service.internal.ipFamilies | nindent 4 }} +{{- end }} +{{- end }} + ports: + {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }} + {{- if .Values.controller.service.enableHttp }} + - name: http + port: {{ .Values.controller.service.internal.ports.http | default .Values.controller.service.ports.http }} + protocol: TCP + targetPort: {{ .Values.controller.service.internal.targetPorts.http | default .Values.controller.service.targetPorts.http }} + {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.internal.appProtocol) }} + appProtocol: http + {{- end }} + {{- if (and $setNodePorts (not (empty .Values.controller.service.internal.nodePorts.http))) }} + nodePort: {{ .Values.controller.service.internal.nodePorts.http }} + {{- end }} + {{- end }} + {{- if .Values.controller.service.enableHttps }} + - name: https + port: {{ .Values.controller.service.internal.ports.https | default .Values.controller.service.ports.https }} + protocol: TCP + targetPort: {{ .Values.controller.service.internal.targetPorts.https | default .Values.controller.service.targetPorts.https }} + {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.internal.appProtocol) }} + appProtocol: https + {{- end }} + {{- if (and $setNodePorts (not (empty .Values.controller.service.internal.nodePorts.https))) }} + nodePort: {{ .Values.controller.service.internal.nodePorts.https }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.tcp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + port: {{ $key }} + protocol: TCP + targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + {{- if $.Values.controller.service.internal.nodePorts.tcp }} + {{- if index $.Values.controller.service.internal.nodePorts.tcp $key }} + nodePort: {{ index $.Values.controller.service.internal.nodePorts.tcp $key }} + {{- end }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.udp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + port: {{ $key }} + protocol: UDP + targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + {{- if $.Values.controller.service.internal.nodePorts.udp }} + {{- if index $.Values.controller.service.internal.nodePorts.udp $key }} + nodePort: {{ index $.Values.controller.service.internal.nodePorts.udp $key }} + {{- end }} + {{- end }} + {{- end }} + selector: + {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: controller +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-metrics.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-metrics.yaml new file mode 100644 index 0000000000..7c153295fd --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-metrics.yaml @@ -0,0 +1,45 @@ +{{- if .Values.controller.metrics.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.controller.metrics.service.annotations }} + annotations: {{ toYaml .Values.controller.metrics.service.annotations | nindent 4 }} +{{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- if .Values.controller.metrics.service.labels }} + {{- toYaml .Values.controller.metrics.service.labels | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }}-metrics + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + type: {{ .Values.controller.metrics.service.type }} +{{- if .Values.controller.metrics.service.clusterIP }} + clusterIP: {{ .Values.controller.metrics.service.clusterIP }} +{{- end }} +{{- if .Values.controller.metrics.service.externalIPs }} + externalIPs: {{ toYaml .Values.controller.metrics.service.externalIPs | nindent 4 }} +{{- end }} +{{- if .Values.controller.metrics.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.controller.metrics.service.loadBalancerIP }} +{{- end }} +{{- if .Values.controller.metrics.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{ toYaml .Values.controller.metrics.service.loadBalancerSourceRanges | nindent 4 }} +{{- end }} +{{- if .Values.controller.metrics.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ .Values.controller.metrics.service.externalTrafficPolicy }} +{{- end }} + ports: + - name: {{ .Values.controller.metrics.portName }} + port: {{ .Values.controller.metrics.service.servicePort }} + protocol: TCP + targetPort: {{ .Values.controller.metrics.portName }} + {{- $setNodePorts := (or (eq .Values.controller.metrics.service.type "NodePort") (eq .Values.controller.metrics.service.type "LoadBalancer")) }} + {{- if (and $setNodePorts (not (empty .Values.controller.metrics.service.nodePort))) }} + nodePort: {{ .Values.controller.metrics.service.nodePort }} + {{- end }} + selector: + {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: controller +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-webhook.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-webhook.yaml new file mode 100644 index 0000000000..67aac0d9a2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service-webhook.yaml @@ -0,0 +1,40 @@ +{{- if .Values.controller.admissionWebhooks.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.controller.admissionWebhooks.service.annotations }} + annotations: {{ toYaml .Values.controller.admissionWebhooks.service.annotations | nindent 4 }} +{{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }}-admission + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + type: {{ .Values.controller.admissionWebhooks.service.type }} +{{- if .Values.controller.admissionWebhooks.service.clusterIP }} + clusterIP: {{ .Values.controller.admissionWebhooks.service.clusterIP }} +{{- end }} +{{- if .Values.controller.admissionWebhooks.service.externalIPs }} + externalIPs: {{ toYaml .Values.controller.admissionWebhooks.service.externalIPs | nindent 4 }} +{{- end }} +{{- if .Values.controller.admissionWebhooks.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.controller.admissionWebhooks.service.loadBalancerIP }} +{{- end }} +{{- if .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{ toYaml .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges | nindent 4 }} +{{- end }} + ports: + - name: https-webhook + port: {{ .Values.controller.admissionWebhooks.service.servicePort }} + targetPort: webhook + {{- if semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} + appProtocol: https + {{- end }} + selector: + {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: controller +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-service.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service.yaml new file mode 100644 index 0000000000..cb78a7035f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-service.yaml @@ -0,0 +1,105 @@ +{{- if and .Values.controller.service.enabled .Values.controller.service.external.enabled -}} +apiVersion: v1 +kind: Service +metadata: + annotations: + {{- range $key, $value := .Values.controller.service.annotations }} + {{ $key }}: {{ tpl ($value | toString) $ | quote }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- if .Values.controller.service.labels }} + {{- toYaml .Values.controller.service.labels | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.controller.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + type: {{ .Values.controller.service.type }} +{{- if .Values.controller.service.clusterIP }} + clusterIP: {{ .Values.controller.service.clusterIP }} +{{- end }} +{{- if .Values.controller.service.externalIPs }} + externalIPs: {{ toYaml .Values.controller.service.externalIPs | nindent 4 }} +{{- end }} +{{- if .Values.controller.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.controller.service.loadBalancerIP }} +{{- end }} +{{- if .Values.controller.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{ toYaml .Values.controller.service.loadBalancerSourceRanges | nindent 4 }} +{{- end }} +{{- if .Values.controller.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.controller.service.loadBalancerClass }} +{{- end }} +{{- if hasKey .Values.controller.service "allocateLoadBalancerNodePorts" }} + allocateLoadBalancerNodePorts: {{ .Values.controller.service.allocateLoadBalancerNodePorts }} +{{- end }} +{{- if .Values.controller.service.externalTrafficPolicy }} + externalTrafficPolicy: {{ .Values.controller.service.externalTrafficPolicy }} +{{- end }} +{{- if .Values.controller.service.sessionAffinity }} + sessionAffinity: {{ .Values.controller.service.sessionAffinity }} +{{- end }} +{{- if .Values.controller.service.healthCheckNodePort }} + healthCheckNodePort: {{ .Values.controller.service.healthCheckNodePort }} +{{- end }} +{{- if semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version -}} +{{- if .Values.controller.service.ipFamilyPolicy }} + ipFamilyPolicy: {{ .Values.controller.service.ipFamilyPolicy }} +{{- end }} +{{- if .Values.controller.service.ipFamilies }} + ipFamilies: {{ toYaml .Values.controller.service.ipFamilies | nindent 4 }} +{{- end }} +{{- end }} + ports: + {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }} + {{- if .Values.controller.service.enableHttp }} + - name: http + port: {{ .Values.controller.service.ports.http }} + protocol: TCP + targetPort: {{ .Values.controller.service.targetPorts.http }} + {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.appProtocol) }} + appProtocol: http + {{- end }} + {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.http))) }} + nodePort: {{ .Values.controller.service.nodePorts.http }} + {{- end }} + {{- end }} + {{- if .Values.controller.service.enableHttps }} + - name: https + port: {{ .Values.controller.service.ports.https }} + protocol: TCP + targetPort: {{ .Values.controller.service.targetPorts.https }} + {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.appProtocol) }} + appProtocol: https + {{- end }} + {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.https))) }} + nodePort: {{ .Values.controller.service.nodePorts.https }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.tcp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + port: {{ $key }} + protocol: TCP + targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp + {{- if $.Values.controller.service.nodePorts.tcp }} + {{- if index $.Values.controller.service.nodePorts.tcp $key }} + nodePort: {{ index $.Values.controller.service.nodePorts.tcp $key }} + {{- end }} + {{- end }} + {{- end }} + {{- range $key, $value := .Values.udp }} + - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + port: {{ $key }} + protocol: UDP + targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp + {{- if $.Values.controller.service.nodePorts.udp }} + {{- if index $.Values.controller.service.nodePorts.udp $key }} + nodePort: {{ index $.Values.controller.service.nodePorts.udp $key }} + {{- end }} + {{- end }} + {{- end }} + selector: + {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: controller +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-serviceaccount.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-serviceaccount.yaml new file mode 100644 index 0000000000..df83de3d08 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-serviceaccount.yaml @@ -0,0 +1,17 @@ +{{- if or .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- with .Values.controller.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ template "ingress-nginx.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} + {{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-servicemonitor.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-servicemonitor.yaml new file mode 100644 index 0000000000..62301da454 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-servicemonitor.yaml @@ -0,0 +1,53 @@ +{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "ingress-nginx.controller.fullname" . }} +{{- if .Values.controller.metrics.serviceMonitor.namespace }} + namespace: {{ .Values.controller.metrics.serviceMonitor.namespace }} +{{- else }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: controller + {{- if .Values.controller.metrics.serviceMonitor.additionalLabels }} + {{- toYaml .Values.controller.metrics.serviceMonitor.additionalLabels | nindent 4 }} + {{- end }} + {{- if .Values.controller.metrics.serviceMonitor.annotations }} + annotations: {{ toYaml .Values.controller.metrics.serviceMonitor.annotations | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: {{ .Values.controller.metrics.portName }} + interval: {{ .Values.controller.metrics.serviceMonitor.scrapeInterval }} + {{- if .Values.controller.metrics.serviceMonitor.honorLabels }} + honorLabels: true + {{- end }} + {{- if .Values.controller.metrics.serviceMonitor.relabelings }} + relabelings: {{ toYaml .Values.controller.metrics.serviceMonitor.relabelings | nindent 8 }} + {{- end }} + {{- if .Values.controller.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: {{ toYaml .Values.controller.metrics.serviceMonitor.metricRelabelings | nindent 8 }} + {{- end }} +{{- if .Values.controller.metrics.serviceMonitor.jobLabel }} + jobLabel: {{ .Values.controller.metrics.serviceMonitor.jobLabel | quote }} +{{- end }} +{{- if .Values.controller.metrics.serviceMonitor.namespaceSelector }} + namespaceSelector: {{ toYaml .Values.controller.metrics.serviceMonitor.namespaceSelector | nindent 4 }} +{{- else }} + namespaceSelector: + matchNames: + - {{ include "ingress-nginx.namespace" . }} +{{- end }} +{{- if .Values.controller.metrics.serviceMonitor.targetLabels }} + targetLabels: + {{- range .Values.controller.metrics.serviceMonitor.targetLabels }} + - {{ . }} + {{- end }} +{{- end }} + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-deployment.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-deployment.yaml new file mode 100644 index 0000000000..6755e23783 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-deployment.yaml @@ -0,0 +1,119 @@ +{{- if .Values.defaultBackend.enabled -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: default-backend +{{- if not .Values.defaultBackend.autoscaling.enabled }} + replicas: {{ .Values.defaultBackend.replicaCount }} +{{- end }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + {{- if .Values.defaultBackend.updateStrategy }} + strategy: + {{ toYaml .Values.defaultBackend.updateStrategy | nindent 4 }} + {{- end }} + minReadySeconds: {{ .Values.defaultBackend.minReadySeconds }} + template: + metadata: + {{- if .Values.defaultBackend.podAnnotations }} + annotations: {{ toYaml .Values.defaultBackend.podAnnotations | nindent 8 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 8 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.defaultBackend.podLabels }} + {{- toYaml .Values.defaultBackend.podLabels | nindent 8 }} + {{- end }} + spec: + {{- if .Values.imagePullSecrets }} + imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} + {{- end }} + {{- if .Values.defaultBackend.priorityClassName }} + priorityClassName: {{ .Values.defaultBackend.priorityClassName }} + {{- end }} + {{- if .Values.defaultBackend.podSecurityContext }} + securityContext: {{ toYaml .Values.defaultBackend.podSecurityContext | nindent 8 }} + {{- end }} + containers: + - name: {{ template "ingress-nginx.name" . }}-default-backend + {{- with .Values.defaultBackend.image }} + image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} + {{- end }} + imagePullPolicy: {{ .Values.defaultBackend.image.pullPolicy }} + {{- if .Values.defaultBackend.extraArgs }} + args: + {{- range $key, $value := .Values.defaultBackend.extraArgs }} + {{- /* Accept keys without values or with false as value */}} + {{- if eq ($value | quote | len) 2 }} + - --{{ $key }} + {{- else }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- end }} + {{- end }} + securityContext: {{ include "ingress-nginx.defaultBackend.containerSecurityContext" . | nindent 12 }} + {{- if .Values.defaultBackend.extraEnvs }} + env: {{ toYaml .Values.defaultBackend.extraEnvs | nindent 12 }} + {{- end }} + livenessProbe: + httpGet: + path: /healthz + port: {{ .Values.defaultBackend.port }} + scheme: HTTP + initialDelaySeconds: {{ .Values.defaultBackend.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.defaultBackend.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.defaultBackend.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.defaultBackend.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.defaultBackend.livenessProbe.failureThreshold }} + readinessProbe: + httpGet: + path: /healthz + port: {{ .Values.defaultBackend.port }} + scheme: HTTP + initialDelaySeconds: {{ .Values.defaultBackend.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.defaultBackend.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.defaultBackend.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.defaultBackend.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.defaultBackend.readinessProbe.failureThreshold }} + ports: + - name: http + containerPort: {{ .Values.defaultBackend.port }} + protocol: TCP + {{- if .Values.defaultBackend.extraVolumeMounts }} + volumeMounts: {{- toYaml .Values.defaultBackend.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if .Values.defaultBackend.resources }} + resources: {{ toYaml .Values.defaultBackend.resources | nindent 12 }} + {{- end }} + {{- if .Values.defaultBackend.nodeSelector }} + nodeSelector: {{ toYaml .Values.defaultBackend.nodeSelector | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "ingress-nginx.defaultBackend.serviceAccountName" . }} + {{- if .Values.defaultBackend.tolerations }} + tolerations: {{ toYaml .Values.defaultBackend.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.defaultBackend.affinity }} + affinity: {{ tpl (toYaml .Values.defaultBackend.affinity) $ | nindent 8 }} + {{- end }} + {{- if .Values.defaultBackend.topologySpreadConstraints }} + topologySpreadConstraints: {{ tpl (toYaml .Values.defaultBackend.topologySpreadConstraints) $ | nindent 8 }} + {{- end }} + terminationGracePeriodSeconds: 60 + {{- if .Values.defaultBackend.extraVolumes }} + volumes: {{ toYaml .Values.defaultBackend.extraVolumes | nindent 8 }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml new file mode 100644 index 0000000000..9af56cf388 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml @@ -0,0 +1,23 @@ +{{- if .Values.defaultBackend.enabled }} +{{- range .Values.defaultBackend.extraConfigMaps }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "ingress-nginx.labels" $ | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with $.Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ .name }} + namespace: {{ include "ingress-nginx.namespace" $ }} +data: + {{- with .data }} + {{- toYaml . | nindent 2 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-hpa.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-hpa.yaml new file mode 100644 index 0000000000..49bcdcfdc3 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-hpa.yaml @@ -0,0 +1,40 @@ +{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.autoscaling.enabled }} +apiVersion: {{ ternary "autoscaling/v2" "autoscaling/v2beta2" (.Capabilities.APIVersions.Has "autoscaling/v2") }} +kind: HorizontalPodAutoscaler +metadata: + {{- with .Values.defaultBackend.autoscaling.annotations }} + annotations: {{ toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + minReplicas: {{ .Values.defaultBackend.autoscaling.minReplicas }} + maxReplicas: {{ .Values.defaultBackend.autoscaling.maxReplicas }} + metrics: + {{- with .Values.defaultBackend.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ . }} + {{- end }} + {{- with .Values.defaultBackend.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ . }} + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-networkpolicy.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-networkpolicy.yaml new file mode 100644 index 0000000000..90b3c2ba02 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-networkpolicy.yaml @@ -0,0 +1,25 @@ +{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.networkPolicy.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + podSelector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: default-backend + policyTypes: + - Ingress + - Egress + ingress: + - ports: + - protocol: TCP + port: {{ .Values.defaultBackend.port }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml new file mode 100644 index 0000000000..c8363fd4b4 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml @@ -0,0 +1,25 @@ +{{- if .Values.defaultBackend.enabled -}} +{{- $replicas := .Values.defaultBackend.replicaCount }} +{{- if .Values.defaultBackend.autoscaling.enabled }} +{{- $replicas = .Values.defaultBackend.autoscaling.minReplicas }} +{{- end }} +{{- if gt ($replicas | int) 1 }} +apiVersion: {{ ternary "policy/v1" "policy/v1beta1" (semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version) }} +kind: PodDisruptionBudget +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + selector: + matchLabels: + {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: default-backend + minAvailable: {{ .Values.defaultBackend.minAvailable }} +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-psp.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-psp.yaml new file mode 100644 index 0000000000..4241091091 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-psp.yaml @@ -0,0 +1,50 @@ +{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} +{{- if and .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled (empty .Values.defaultBackend.existingPsp) -}} +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: {{ include "ingress-nginx.fullname" . }}-backend + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + privileged: false + hostPID: false + hostIPC: false + hostNetwork: false + volumes: + - configMap + - downwardAPI + - emptyDir + - secret + - projected + fsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + readOnlyRootFilesystem: true + runAsUser: + rule: MustRunAsNonRoot + runAsGroup: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + supplementalGroups: + rule: MustRunAs + ranges: + - min: 1 + max: 65535 + allowPrivilegeEscalation: false + requiredDropCapabilities: + - ALL + seLinux: + rule: RunAsAny +{{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-role.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-role.yaml new file mode 100644 index 0000000000..dd7868aa0e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-role.yaml @@ -0,0 +1,22 @@ +{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }}-backend + namespace: {{ include "ingress-nginx.namespace" . }} +rules: + - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] + resources: ['podsecuritypolicies'] + verbs: ['use'] + {{- with .Values.defaultBackend.existingPsp }} + resourceNames: [{{ . }}] + {{- else }} + resourceNames: [{{ include "ingress-nginx.fullname" . }}-backend] + {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-rolebinding.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-rolebinding.yaml new file mode 100644 index 0000000000..3203b6f575 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-rolebinding.yaml @@ -0,0 +1,21 @@ +{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.fullname" . }}-backend + namespace: {{ include "ingress-nginx.namespace" . }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ include "ingress-nginx.fullname" . }}-backend +subjects: + - kind: ServiceAccount + name: {{ template "ingress-nginx.defaultBackend.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-service.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-service.yaml new file mode 100644 index 0000000000..65b6b8362c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-service.yaml @@ -0,0 +1,41 @@ +{{- if .Values.defaultBackend.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.defaultBackend.service.annotations }} + annotations: {{ toYaml .Values.defaultBackend.service.annotations | nindent 4 }} +{{- end }} + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.fullname" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +spec: + type: {{ .Values.defaultBackend.service.type }} +{{- if .Values.defaultBackend.service.clusterIP }} + clusterIP: {{ .Values.defaultBackend.service.clusterIP }} +{{- end }} +{{- if .Values.defaultBackend.service.externalIPs }} + externalIPs: {{ toYaml .Values.defaultBackend.service.externalIPs | nindent 4 }} +{{- end }} +{{- if .Values.defaultBackend.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.defaultBackend.service.loadBalancerIP }} +{{- end }} +{{- if .Values.defaultBackend.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: {{ toYaml .Values.defaultBackend.service.loadBalancerSourceRanges | nindent 4 }} +{{- end }} + ports: + - name: http + port: {{ .Values.defaultBackend.service.servicePort }} + protocol: TCP + targetPort: http + {{- if semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} + appProtocol: http + {{- end }} + selector: + {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: default-backend +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-serviceaccount.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-serviceaccount.yaml new file mode 100644 index 0000000000..6fd2d62343 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/templates/default-backend-serviceaccount.yaml @@ -0,0 +1,14 @@ +{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "ingress-nginx.labels" . | nindent 4 }} + app.kubernetes.io/component: default-backend + {{- with .Values.defaultBackend.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ include "ingress-nginx.defaultBackend.serviceAccountName" . }} + namespace: {{ include "ingress-nginx.namespace" . }} +automountServiceAccountToken: {{ .Values.defaultBackend.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml new file mode 100644 index 0000000000..d7a8b88528 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml @@ -0,0 +1,11 @@ +suite: Admission Webhooks > Patch Job > ClusterRole +templates: + - admission-webhooks/job-patch/clusterrole.yaml + +tests: + - it: should not create a ClusterRole if `controller.admissionWebhooks.patch.rbac.create` is false + set: + controller.admissionWebhooks.patch.rbac.create: false + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml new file mode 100644 index 0000000000..d7c3266d21 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml @@ -0,0 +1,11 @@ +suite: Admission Webhooks > Patch Job > ClusterRoleBinding +templates: + - admission-webhooks/job-patch/clusterrolebinding.yaml + +tests: + - it: should not create a ClusterRoleBinding if `controller.admissionWebhooks.patch.rbac.create` is false + set: + controller.admissionWebhooks.patch.rbac.create: false + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml new file mode 100644 index 0000000000..a236f3d7b5 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml @@ -0,0 +1,11 @@ +suite: Admission Webhooks > Patch Job > Role +templates: + - admission-webhooks/job-patch/role.yaml + +tests: + - it: should not create a Role if `controller.admissionWebhooks.patch.rbac.create` is false + set: + controller.admissionWebhooks.patch.rbac.create: false + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml new file mode 100644 index 0000000000..74abaa163b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml @@ -0,0 +1,11 @@ +suite: Admission Webhooks > Patch Job > RoleBinding +templates: + - admission-webhooks/job-patch/rolebinding.yaml + +tests: + - it: should not create a RoleBinding if `controller.admissionWebhooks.patch.rbac.create` is false + set: + controller.admissionWebhooks.patch.rbac.create: false + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml new file mode 100644 index 0000000000..7c30d1e660 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml @@ -0,0 +1,47 @@ +suite: Admission Webhooks > Patch Job > ServiceAccount +templates: + - admission-webhooks/job-patch/serviceaccount.yaml + +tests: + - it: should not create a ServiceAccount if `controller.admissionWebhooks.patch.serviceAccount.create` is false + set: + controller.admissionWebhooks.patch.serviceAccount.create: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a ServiceAccount if `controller.admissionWebhooks.patch.serviceAccount.create` is true + set: + controller.admissionWebhooks.patch.serviceAccount.create: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ServiceAccount + - equal: + path: metadata.name + value: ingress-nginx-admission + + - it: should create a ServiceAccount with specified name if `controller.admissionWebhooks.patch.serviceAccount.name` is set + set: + controller.admissionWebhooks.patch.serviceAccount.name: ingress-nginx-admission-test-sa + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ServiceAccount + - equal: + path: metadata.name + value: ingress-nginx-admission-test-sa + + - it: should create a ServiceAccount with token auto-mounting disabled if `controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken` is false + set: + controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken: false + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ServiceAccount + - equal: + path: automountServiceAccountToken + value: false diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml new file mode 100644 index 0000000000..b9d6d780bb --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml @@ -0,0 +1,32 @@ +suite: Admission Webhooks > ValidatingWebhookConfiguration +templates: + - admission-webhooks/validating-webhook.yaml + +tests: + - it: should not create a ValidatingWebhookConfiguration if `controller.admissionWebhooks.enabled` is false + set: + controller.admissionWebhooks.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a ValidatingWebhookConfiguration if `controller.admissionWebhooks.enabled` is true + set: + controller.admissionWebhooks.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ValidatingWebhookConfiguration + - equal: + path: metadata.name + value: RELEASE-NAME-admission + + - it: should create a ValidatingWebhookConfiguration with a custom port if `controller.admissionWebhooks.service.servicePort` is set + set: + controller.admissionWebhooks.enabled: true + controller.admissionWebhooks.service.servicePort: 9443 + asserts: + - equal: + path: webhooks[0].clientConfig.service.port + value: 9443 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml new file mode 100644 index 0000000000..e831d50c03 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml @@ -0,0 +1,27 @@ +suite: Controller > ConfigMap > Add Headers +templates: + - controller-configmap-addheaders.yaml + +tests: + - it: should not create a ConfigMap if `controller.addHeaders` is not set + set: + controller.addHeaders: null + asserts: + - hasDocuments: + count: 0 + + - it: should create a ConfigMap if `controller.addHeaders` is set + set: + controller.addHeaders: + X-Another-Custom-Header: Value + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ConfigMap + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-custom-add-headers + - equal: + path: data.X-Another-Custom-Header + value: Value diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml new file mode 100644 index 0000000000..0634a3739a --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml @@ -0,0 +1,27 @@ +suite: Controller > ConfigMap > Proxy Headers +templates: + - controller-configmap-proxyheaders.yaml + +tests: + - it: should not create a ConfigMap if `controller.proxySetHeaders` is not set + set: + controller.proxySetHeaders: null + asserts: + - hasDocuments: + count: 0 + + - it: should create a ConfigMap if `controller.proxySetHeaders` is set + set: + controller.proxySetHeaders: + X-Custom-Header: Value + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ConfigMap + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-custom-proxy-headers + - equal: + path: data.X-Custom-Header + value: Value diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap_test.yaml new file mode 100644 index 0000000000..168b657d6b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-configmap_test.yaml @@ -0,0 +1,31 @@ +suite: Controller > ConfigMap +templates: + - controller-configmap.yaml + +tests: + - it: should create a ConfigMap + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ConfigMap + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should create a ConfigMap with templated values if `controller.config` contains templates + set: + controller.config: + template: "test.{{ .Release.Namespace }}.svc.kubernetes.local" + integer: 12345 + boolean: true + asserts: + - equal: + path: data.template + value: test.NAMESPACE.svc.kubernetes.local + - equal: + path: data.integer + value: "12345" + - equal: + path: data.boolean + value: "true" diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-daemonset_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-daemonset_test.yaml new file mode 100644 index 0000000000..81d067bb5f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-daemonset_test.yaml @@ -0,0 +1,172 @@ +suite: Controller > DaemonSet +templates: + - controller-daemonset.yaml + +tests: + - it: should create a DaemonSet if `controller.kind` is "DaemonSet" + set: + controller.kind: DaemonSet + asserts: + - hasDocuments: + count: 1 + - isKind: + of: DaemonSet + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should create a DaemonSet with argument `--enable-metrics=false` if `controller.metrics.enabled` is false + set: + controller.kind: DaemonSet + controller.metrics.enabled: false + asserts: + - contains: + path: spec.template.spec.containers[0].args + content: --enable-metrics=false + + - it: should create a DaemonSet without argument `--enable-metrics=false` if `controller.metrics.enabled` is true + set: + controller.kind: DaemonSet + controller.metrics.enabled: true + asserts: + - notContains: + path: spec.template.spec.containers[0].args + content: --enable-metrics=false + + - it: should create a DaemonSet with argument `--controller-class=k8s.io/ingress-nginx-internal` if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" + set: + controller.kind: DaemonSet + controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal + asserts: + - contains: + path: spec.template.spec.containers[0].args + content: --controller-class=k8s.io/ingress-nginx-internal + + - it: should create a DaemonSet with resource limits if `controller.resources.limits` is set + set: + controller.kind: DaemonSet + controller.resources.limits.cpu: 500m + controller.resources.limits.memory: 512Mi + asserts: + - equal: + path: spec.template.spec.containers[0].resources.limits.cpu + value: 500m + - equal: + path: spec.template.spec.containers[0].resources.limits.memory + value: 512Mi + + - it: should create a DaemonSet with topology spread constraints if `controller.topologySpreadConstraints` is set + set: + controller.kind: DaemonSet + controller.topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: controller + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: controller + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + asserts: + - equal: + path: spec.template.spec.topologySpreadConstraints + value: + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: controller + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: controller + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + + - it: should create a DaemonSet with affinity if `controller.affinity` is set + set: + controller.kind: DaemonSet + controller.affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - '{{ include "ingress-nginx.name" . }}' + - key: app.kubernetes.io/instance + operator: In + values: + - '{{ .Release.Name }}' + - key: app.kubernetes.io/component + operator: In + values: + - controller + topologyKey: kubernetes.io/hostname + asserts: + - equal: + path: spec.template.spec.affinity + value: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - ingress-nginx + - key: app.kubernetes.io/instance + operator: In + values: + - RELEASE-NAME + - key: app.kubernetes.io/component + operator: In + values: + - controller + topologyKey: kubernetes.io/hostname + + - it: should create a DaemonSet with a custom registry if `controller.image.registry` is set + set: + controller.kind: DaemonSet + controller.image.registry: custom.registry.io + controller.image.tag: v1.0.0-dev + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom.registry.io/ingress-nginx/controller:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a DaemonSet with a custom image if `controller.image.image` is set + set: + controller.kind: DaemonSet + controller.image.image: custom-repo/custom-image + controller.image.tag: v1.0.0-dev + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a DaemonSet with a custom tag if `controller.image.tag` is set + set: + controller.kind: DaemonSet + controller.image.tag: custom-tag + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/ingress-nginx/controller:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-deployment_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-deployment_test.yaml new file mode 100644 index 0000000000..382aecd710 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-deployment_test.yaml @@ -0,0 +1,191 @@ +suite: Controller > Deployment +templates: + - controller-deployment.yaml + +tests: + - it: should create a Deployment + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Deployment + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should create a Deployment with 3 replicas if `controller.replicaCount` is 3 + set: + controller.replicaCount: 3 + asserts: + - equal: + path: spec.replicas + value: 3 + + - it: should create a Deployment without replicas if `controller.autoscaling.enabled` is true + set: + controller.autoscaling.enabled: true + asserts: + - notExists: + path: spec.replicas + + - it: should create a Deployment without replicas if `controller.keda.enabled` is true + set: + controller.keda.enabled: true + asserts: + - notExists: + path: spec.replicas + + - it: should create a Deployment with replicas if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true + set: + controller.autoscaling.enabled: true + controller.keda.enabled: true + asserts: + - exists: + path: spec.replicas + + - it: should create a Deployment with argument `--enable-metrics=false` if `controller.metrics.enabled` is false + set: + controller.metrics.enabled: false + asserts: + - contains: + path: spec.template.spec.containers[0].args + content: --enable-metrics=false + + - it: should create a Deployment without argument `--enable-metrics=false` if `controller.metrics.enabled` is true + set: + controller.metrics.enabled: true + asserts: + - notContains: + path: spec.template.spec.containers[0].args + content: --enable-metrics=false + + - it: should create a Deployment with argument `--controller-class=k8s.io/ingress-nginx-internal` if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" + set: + controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal + asserts: + - contains: + path: spec.template.spec.containers[0].args + content: --controller-class=k8s.io/ingress-nginx-internal + + - it: should create a Deployment with resource limits if `controller.resources.limits` is set + set: + controller.resources.limits.cpu: 500m + controller.resources.limits.memory: 512Mi + asserts: + - equal: + path: spec.template.spec.containers[0].resources.limits.cpu + value: 500m + - equal: + path: spec.template.spec.containers[0].resources.limits.memory + value: 512Mi + + - it: should create a Deployment with topology spread constraints if `controller.topologySpreadConstraints` is set + set: + controller.topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: controller + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: controller + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + asserts: + - equal: + path: spec.template.spec.topologySpreadConstraints + value: + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: controller + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: controller + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + + - it: should create a Deployment with affinity if `controller.affinity` is set + set: + controller.affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - '{{ include "ingress-nginx.name" . }}' + - key: app.kubernetes.io/instance + operator: In + values: + - '{{ .Release.Name }}' + - key: app.kubernetes.io/component + operator: In + values: + - controller + topologyKey: kubernetes.io/hostname + asserts: + - equal: + path: spec.template.spec.affinity + value: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - ingress-nginx + - key: app.kubernetes.io/instance + operator: In + values: + - RELEASE-NAME + - key: app.kubernetes.io/component + operator: In + values: + - controller + topologyKey: kubernetes.io/hostname + + - it: should create a Deployment with a custom registry if `controller.image.registry` is set + set: + controller.image.registry: custom.registry.io + controller.image.tag: v1.0.0-dev + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom.registry.io/ingress-nginx/controller:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a Deployment with a custom image if `controller.image.image` is set + set: + controller.image.image: custom-repo/custom-image + controller.image.tag: v1.0.0-dev + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a Deployment with a custom tag if `controller.image.tag` is set + set: + controller.image.tag: custom-tag + controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/ingress-nginx/controller:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-hpa_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-hpa_test.yaml new file mode 100644 index 0000000000..869d3a690e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-hpa_test.yaml @@ -0,0 +1,31 @@ +suite: Controller > HPA +templates: + - controller-hpa.yaml + +tests: + - it: should create an HPA if `controller.autoscaling.enabled` is true + set: + controller.autoscaling.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: HorizontalPodAutoscaler + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should not create an HPA if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true + set: + controller.autoscaling.enabled: true + controller.keda.enabled: true + asserts: + - hasDocuments: + count: 0 + + - it: should not create an HPA if `controller.kind` is "DaemonSet" + set: + controller.kind: DaemonSet + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml new file mode 100644 index 0000000000..9a4a576b78 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml @@ -0,0 +1,110 @@ +suite: Controller > IngressClass > Aliases +templates: + - controller-ingressclass-aliases.yaml + +tests: + - it: should not create IngressClass aliases + asserts: + - hasDocuments: + count: 0 + + - it: should create an IngressClass alias with name "nginx-alias" if `controller.ingressClassResource.aliases` is set + set: + controller.ingressClassResource.aliases: + - nginx-alias + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-alias + + - it: should create an IngressClass alias without annotation `ingressclass.kubernetes.io/is-default-class` if `controller.ingressClassResource.default` is true + set: + controller.ingressClassResource.aliases: + - nginx-alias + controller.ingressClassResource.default: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-alias + - notExists: + path: metadata.annotations["ingressclass.kubernetes.io/is-default-class"] + + - it: should create an IngressClass alias with annotations if `controller.ingressClassResource.annotations` is set + set: + controller.ingressClassResource.aliases: + - nginx-alias + controller.ingressClassResource.annotations: + my-fancy-annotation: has-a-value + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-alias + - equal: + path: metadata.annotations.my-fancy-annotation + value: has-a-value + + - it: should create an IngressClass alias with controller "k8s.io/ingress-nginx-internal" if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" + set: + controller.ingressClassResource.aliases: + - nginx-alias + controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-alias + - equal: + path: spec.controller + value: k8s.io/ingress-nginx-internal + + - it: should create an IngressClass alias with parameters if `controller.ingressClassResource.parameters` is set + set: + controller.ingressClassResource.aliases: + - nginx-alias + controller.ingressClassResource.parameters: + apiGroup: k8s.example.com + kind: IngressParameters + name: external-lb + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-alias + - equal: + path: spec.parameters + value: + apiGroup: k8s.example.com + kind: IngressParameters + name: external-lb + + - it: should create two IngressClass aliases if `controller.ingressClassResource.aliases` has two elements + set: + controller.ingressClassResource.aliases: + - nginx-alias-1 + - nginx-alias-2 + asserts: + - hasDocuments: + count: 2 + - isKind: + of: IngressClass + - matchRegex: + path: metadata.name + pattern: nginx-alias-(1|2) diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass_test.yaml new file mode 100644 index 0000000000..b3384af32c --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-ingressclass_test.yaml @@ -0,0 +1,93 @@ +suite: Controller > IngressClass +templates: + - controller-ingressclass.yaml + +tests: + - it: should create an IngressClass + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx + + - it: should create an IngressClass with name "nginx-internal" if `controller.ingressClassResource.name` is "nginx-internal" + set: + controller.ingressClassResource.name: nginx-internal + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx-internal + + - it: "should create an IngressClass with annotation `ingressclass.kubernetes.io/is-default-class: \"true\"` if `controller.ingressClassResource.default` is true" + set: + controller.ingressClassResource.default: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx + - equal: + path: metadata.annotations["ingressclass.kubernetes.io/is-default-class"] + value: "true" + + - it: should create an IngressClass with annotations if `controller.ingressClassResource.annotations` is set + set: + controller.ingressClassResource.annotations: + my-fancy-annotation: has-a-value + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx + - equal: + path: metadata.annotations.my-fancy-annotation + value: has-a-value + + - it: should create an IngressClass with controller "k8s.io/ingress-nginx-internal" if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" + set: + controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx + - equal: + path: spec.controller + value: k8s.io/ingress-nginx-internal + + - it: should create an IngressClass with parameters if `controller.ingressClassResource.parameters` is set + set: + controller.ingressClassResource.parameters: + apiGroup: k8s.example.com + kind: IngressParameters + name: external-lb + asserts: + - hasDocuments: + count: 1 + - isKind: + of: IngressClass + - equal: + path: metadata.name + value: nginx + - equal: + path: spec.parameters + value: + apiGroup: k8s.example.com + kind: IngressParameters + name: external-lb diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-keda_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-keda_test.yaml new file mode 100644 index 0000000000..800283483b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-keda_test.yaml @@ -0,0 +1,31 @@ +suite: Controller > KEDA +templates: + - controller-keda.yaml + +tests: + - it: should create a ScaledObject if `controller.keda.enabled` is true + set: + controller.keda.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ScaledObject + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should not create a ScaledObject if `controller.keda.enabled` is true and `controller.autoscaling.enabled` is true + set: + controller.keda.enabled: true + controller.autoscaling.enabled: true + asserts: + - hasDocuments: + count: 0 + + - it: should not create a ScaledObject if `controller.kind` is "DaemonSet" + set: + controller.kind: DaemonSet + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-networkpolicy_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-networkpolicy_test.yaml new file mode 100644 index 0000000000..5de12e9c4b --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-networkpolicy_test.yaml @@ -0,0 +1,23 @@ +suite: Controller > NetworkPolicy +templates: + - controller-networkpolicy.yaml + +tests: + - it: should not create a NetworkPolicy if `controller.networkPolicy.enabled` is false + set: + controller.networkPolicy.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a NetworkPolicy if `controller.networkPolicy.enabled` is true + set: + controller.networkPolicy.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: NetworkPolicy + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml new file mode 100644 index 0000000000..f215f35207 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml @@ -0,0 +1,89 @@ +suite: Controller > PodDisruptionBudget +templates: + - controller-poddisruptionbudget.yaml + +tests: + - it: should create a PodDisruptionBudget if `controller.replicaCount` is greater than 1 + set: + controller.replicaCount: 2 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should not create a PodDisruptionBudget if `controller.replicaCount` is less than or equal 1 + set: + controller.replicaCount: 1 + asserts: + - hasDocuments: + count: 0 + + - it: should create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.autoscaling.minReplicas` is greater than 1 + set: + controller.autoscaling.enabled: true + controller.autoscaling.minReplicas: 2 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should not create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.autoscaling.minReplicas` is less than or equal 1 + set: + controller.autoscaling.enabled: true + controller.autoscaling.minReplicas: 1 + asserts: + - hasDocuments: + count: 0 + + - it: should create a PodDisruptionBudget if `controller.keda.enabled` is true and `controller.keda.minReplicas` is greater than 1 + set: + controller.keda.enabled: true + controller.keda.minReplicas: 2 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should not create a PodDisruptionBudget if `controller.keda.enabled` is true and `controller.keda.minReplicas` is less than or equal 1 + set: + controller.keda.enabled: true + controller.keda.minReplicas: 1 + asserts: + - hasDocuments: + count: 0 + + - it: should not create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true + set: + controller.autoscaling.enabled: true + controller.keda.enabled: true + asserts: + - hasDocuments: + count: 0 + + - it: should create a PodDisruptionBudget without `minAvailable` and with `maxUnavailable` if `controller.minAvailable` and `controller.maxUnavailable` are set + set: + controller.replicaCount: 2 + controller.minAvailable: 1 + controller.maxUnavailable: 1 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - notExists: + path: spec.minAvailable + - equal: + path: spec.maxUnavailable + value: 1 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-prometheusrule_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-prometheusrule_test.yaml new file mode 100644 index 0000000000..d60a98315f --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-prometheusrule_test.yaml @@ -0,0 +1,17 @@ +suite: Controller > PrometheusRule +templates: + - controller-prometheusrule.yaml + +tests: + - it: should create a PrometheusRule if `controller.metrics.prometheusRule.enabled` is true + set: + controller.metrics.enabled: true + controller.metrics.prometheusRule.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PrometheusRule + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-internal_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-internal_test.yaml new file mode 100644 index 0000000000..5465e1a2b8 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-internal_test.yaml @@ -0,0 +1,25 @@ +suite: Controller > Service > Internal +templates: + - controller-service-internal.yaml + +tests: + - it: should not create an internal Service if `controller.service.internal.enabled` is false + set: + controller.service.internal.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create an internal Service if `controller.service.internal.enabled` is true and `controller.service.internal.annotations` are set + set: + controller.service.internal.enabled: true + controller.service.internal.annotations: + test.annotation: "true" + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Service + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller-internal diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-metrics_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-metrics_test.yaml new file mode 100644 index 0000000000..afdb940464 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-metrics_test.yaml @@ -0,0 +1,23 @@ +suite: Controller > Service > Metrics +templates: + - controller-service-metrics.yaml + +tests: + - it: should not create a metrics Service if `controller.metrics.enabled` is false + set: + controller.metrics.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a metrics Service if `controller.metrics.enabled` is true + set: + controller.metrics.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Service + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller-metrics diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-webhook_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-webhook_test.yaml new file mode 100644 index 0000000000..1c759edbe6 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service-webhook_test.yaml @@ -0,0 +1,32 @@ +suite: Controller > Service > Webhook +templates: + - controller-service-webhook.yaml + +tests: + - it: should not create a webhook Service if `controller.admissionWebhooks.enabled` is false + set: + controller.admissionWebhooks.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a webhook Service if `controller.admissionWebhooks.enabled` is true + set: + controller.admissionWebhooks.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Service + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller-admission + + - it: should create a webhook Service with a custom port if `controller.admissionWebhooks.service.servicePort` is set + set: + controller.admissionWebhooks.enabled: true + controller.admissionWebhooks.service.servicePort: 9443 + asserts: + - equal: + path: spec.ports[0].port + value: 9443 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-service_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service_test.yaml new file mode 100644 index 0000000000..10574f227d --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-service_test.yaml @@ -0,0 +1,32 @@ +suite: Controller > Service +templates: + - controller-service.yaml + +tests: + - it: should not create a Service if `controller.service.external.enabled` is false + set: + controller.service.external.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a Service if `controller.service.external.enabled` is true + set: + controller.service.external.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Service + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should create a Service of type "NodePort" if `controller.service.external.enabled` is true and `controller.service.type` is "NodePort" + set: + controller.service.external.enabled: true + controller.service.type: NodePort + asserts: + - equal: + path: spec.type + value: NodePort diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/controller-servicemonitor_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/controller-servicemonitor_test.yaml new file mode 100644 index 0000000000..310097c1a2 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/controller-servicemonitor_test.yaml @@ -0,0 +1,29 @@ +suite: Controller > ServiceMonitor +templates: + - controller-servicemonitor.yaml + +tests: + - it: should create a ServiceMonitor if `controller.metrics.serviceMonitor.enabled` is true + set: + controller.metrics.enabled: true + controller.metrics.serviceMonitor.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ServiceMonitor + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-controller + + - it: should create a ServiceMonitor with annotations if `controller.metrics.serviceMonitor.annotations` is set + set: + controller.metrics.enabled: true + controller.metrics.serviceMonitor.enabled: true + controller.metrics.serviceMonitor.annotations: + my-little-annotation: test-value + asserts: + - equal: + path: metadata.annotations + value: + my-little-annotation: test-value diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-deployment_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-deployment_test.yaml new file mode 100644 index 0000000000..4ba4b03d3e --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-deployment_test.yaml @@ -0,0 +1,169 @@ +suite: Default Backend > Deployment +templates: + - default-backend-deployment.yaml + +tests: + - it: should not create a Deployment if `defaultBackend.enabled` is false + set: + defaultBackend.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a Deployment if `defaultBackend.enabled` is true + set: + defaultBackend.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Deployment + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-defaultbackend + + - it: should create a Deployment with 3 replicas if `defaultBackend.replicaCount` is 3 + set: + defaultBackend.enabled: true + defaultBackend.replicaCount: 3 + asserts: + - equal: + path: spec.replicas + value: 3 + + - it: should create a Deployment without replicas if `defaultBackend.autoscaling.enabled` is true + set: + defaultBackend.enabled: true + defaultBackend.autoscaling.enabled: true + asserts: + - notExists: + path: spec.replicas + + - it: should create a Deployment with resource limits if `defaultBackend.resources.limits` is set + set: + defaultBackend.enabled: true + defaultBackend.resources.limits.cpu: 500m + defaultBackend.resources.limits.memory: 512Mi + asserts: + - equal: + path: spec.template.spec.containers[0].resources.limits.cpu + value: 500m + - equal: + path: spec.template.spec.containers[0].resources.limits.memory + value: 512Mi + + - it: should create a Deployment with topology spread constraints if `defaultBackend.topologySpreadConstraints` is set + set: + defaultBackend.enabled: true + defaultBackend.topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: default-backend + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + app.kubernetes.io/instance: '{{ .Release.Name }}' + app.kubernetes.io/component: default-backend + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + asserts: + - equal: + path: spec.template.spec.topologySpreadConstraints + value: + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: default-backend + topologyKey: topology.kubernetes.io/zone + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + - labelSelector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: RELEASE-NAME + app.kubernetes.io/component: default-backend + topologyKey: kubernetes.io/hostname + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + + - it: should create a Deployment with affinity if `defaultBackend.affinity` is set + set: + defaultBackend.enabled: true + defaultBackend.affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - '{{ include "ingress-nginx.name" . }}' + - key: app.kubernetes.io/instance + operator: In + values: + - '{{ .Release.Name }}' + - key: app.kubernetes.io/component + operator: In + values: + - default-backend + topologyKey: kubernetes.io/hostname + asserts: + - equal: + path: spec.template.spec.affinity + value: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - ingress-nginx + - key: app.kubernetes.io/instance + operator: In + values: + - RELEASE-NAME + - key: app.kubernetes.io/component + operator: In + values: + - default-backend + topologyKey: kubernetes.io/hostname + + - it: should create a Deployment with a custom registry if `defaultBackend.image.registry` is set + set: + defaultBackend.enabled: true + defaultBackend.image.registry: custom.registry.io + defaultBackend.image.tag: v1.0.0-dev + defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: custom.registry.io/defaultbackend-amd64:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a Deployment with a custom image if `defaultBackend.image.image` is set + set: + defaultBackend.enabled: true + defaultBackend.image.image: custom-repo/custom-image + defaultBackend.image.tag: v1.0.0-dev + defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + + - it: should create a Deployment with a custom tag if `defaultBackend.image.tag` is set + set: + defaultBackend.enabled: true + defaultBackend.image.tag: custom-tag + defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: registry.k8s.io/defaultbackend-amd64:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml new file mode 100644 index 0000000000..aa600e7493 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml @@ -0,0 +1,50 @@ +suite: Default Backend > Extra ConfigMaps +templates: + - default-backend-extra-configmaps.yaml + +tests: + - it: should not create a ConfigMap if `defaultBackend.extraConfigMaps` is empty + set: + defaultBackend.enabled: true + defaultBackend.extraConfigMaps: [] + asserts: + - hasDocuments: + count: 0 + + - it: should create one ConfigMap if `defaultBackend.extraConfigMaps` has one element + set: + defaultBackend.enabled: true + defaultBackend.extraConfigMaps: + - name: my-configmap-1 + data: + key1: value1 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: ConfigMap + - equal: + path: metadata.name + value: my-configmap-1 + - equal: + path: data.key1 + value: value1 + + - it: should create two ConfigMaps if `defaultBackend.extraConfigMaps` has two elements + set: + defaultBackend.enabled: true + defaultBackend.extraConfigMaps: + - name: my-configmap-1 + data: + key1: value1 + - name: my-configmap-2 + data: + key2: value2 + asserts: + - hasDocuments: + count: 2 + - isKind: + of: ConfigMap + - matchRegex: + path: metadata.name + pattern: my-configmap-(1|2) diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml new file mode 100644 index 0000000000..0958018620 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml @@ -0,0 +1,48 @@ +suite: Default Backend > PodDisruptionBudget +templates: + - default-backend-poddisruptionbudget.yaml + +tests: + - it: should create a PodDisruptionBudget if `defaultBackend.replicaCount` is greater than 1 + set: + defaultBackend.enabled: true + defaultBackend.replicaCount: 2 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-defaultbackend + + - it: should not create a PodDisruptionBudget if `defaultBackend.replicaCount` is less than or equal 1 + set: + defaultBackend.enabled: true + defaultBackend.replicaCount: 1 + asserts: + - hasDocuments: + count: 0 + + - it: should create a PodDisruptionBudget if `defaultBackend.autoscaling.enabled` is true and `defaultBackend.autoscaling.minReplicas` is greater than 1 + set: + defaultBackend.enabled: true + defaultBackend.autoscaling.enabled: true + defaultBackend.autoscaling.minReplicas: 2 + asserts: + - hasDocuments: + count: 1 + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-defaultbackend + + - it: should not create a PodDisruptionBudget if `defaultBackend.autoscaling.enabled` is true and `defaultBackend.autoscaling.minReplicas` is less than or equal 1 + set: + defaultBackend.enabled: true + defaultBackend.autoscaling.enabled: true + defaultBackend.autoscaling.minReplicas: 1 + asserts: + - hasDocuments: + count: 0 diff --git a/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-service_test.yaml b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-service_test.yaml new file mode 100644 index 0000000000..f16904f9f0 --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/tests/default-backend-service_test.yaml @@ -0,0 +1,32 @@ +suite: Default Backend > Service +templates: + - default-backend-service.yaml + +tests: + - it: should not create a Service if `defaultBackend.enabled` is false + set: + defaultBackend.enabled: false + asserts: + - hasDocuments: + count: 0 + + - it: should create a Service if `defaultBackend.enabled` is true + set: + defaultBackend.enabled: true + asserts: + - hasDocuments: + count: 1 + - isKind: + of: Service + - equal: + path: metadata.name + value: RELEASE-NAME-ingress-nginx-defaultbackend + + - it: should create a Service with port 80 if `defaultBackend.service.port` is 80 + set: + defaultBackend.enabled: true + defaultBackend.service.port: 80 + asserts: + - equal: + path: spec.ports[0].port + value: 80 diff --git a/nginx-operator/helm-charts/ingress-nginx/values.yaml b/nginx-operator/helm-charts/ingress-nginx/values.yaml new file mode 100644 index 0000000000..f42a6821dc --- /dev/null +++ b/nginx-operator/helm-charts/ingress-nginx/values.yaml @@ -0,0 +1,1192 @@ +## nginx configuration +## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/index.md +## + +## Overrides for generated resource names +# See templates/_helpers.tpl +# nameOverride: +# fullnameOverride: + +# -- Override the deployment namespace; defaults to .Release.Namespace +namespaceOverride: "" +## Labels to apply to all resources +## +commonLabels: {} +# scmhash: abc123 +# myLabel: aakkmd + +controller: + name: controller + enableAnnotationValidations: false + image: + ## Keep false as default for now! + chroot: false + registry: registry.k8s.io + image: ingress-nginx/controller + ## for backwards compatibility consider setting the full image url via the repository value below + ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail + ## repository: + tag: "v1.11.3" + digest: sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7 + digestChroot: sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14 + pullPolicy: IfNotPresent + runAsNonRoot: true + # www-data -> uid 101 + runAsUser: 101 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + readOnlyRootFilesystem: false + # -- Use an existing PSP instead of creating one + existingPsp: "" + # -- Configures the controller container name + containerName: controller + # -- Configures the ports that the nginx-controller listens on + containerPort: + http: 80 + https: 443 + # -- Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. + # Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ + config: {} + # -- Annotations to be added to the controller config configuration configmap. + configAnnotations: {} + # -- Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers + proxySetHeaders: {} + # -- Will add custom headers before sending response traffic to the client according to: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers + addHeaders: {} + # -- Optionally customize the pod dnsConfig. + dnsConfig: {} + # -- Optionally customize the pod hostAliases. + hostAliases: [] + # - ip: 127.0.0.1 + # hostnames: + # - foo.local + # - bar.local + # - ip: 10.1.2.3 + # hostnames: + # - foo.remote + # - bar.remote + # -- Optionally customize the pod hostname. + hostname: {} + # -- Optionally change this to ClusterFirstWithHostNet in case you have 'hostNetwork: true'. + # By default, while using host network, name resolution uses the host's DNS. If you wish nginx-controller + # to keep resolving names inside the k8s network, use ClusterFirstWithHostNet. + dnsPolicy: ClusterFirst + # -- Bare-metal considerations via the host network https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network + # Ingress status was blank because there is no Service exposing the Ingress-Nginx Controller in a configuration using the host network, the default --publish-service flag used in standard cloud setups does not apply + reportNodeInternalIp: false + # -- Process Ingress objects without ingressClass annotation/ingressClassName field + # Overrides value for --watch-ingress-without-class flag of the controller binary + # Defaults to false + watchIngressWithoutClass: false + # -- Process IngressClass per name (additionally as per spec.controller). + ingressClassByName: false + # -- This configuration enables Topology Aware Routing feature, used together with service annotation service.kubernetes.io/topology-mode="auto" + # Defaults to false + enableTopologyAwareRouting: false + # -- This configuration disable Nginx Controller Leader Election + disableLeaderElection: false + # -- Duration a leader election is valid before it's getting re-elected, e.g. `15s`, `10m` or `1h`. (Default: 30s) + electionTTL: "" + # -- This configuration defines if Ingress Controller should allow users to set + # their own *-snippet annotations, otherwise this is forbidden / dropped + # when users add those annotations. + # Global snippets in ConfigMap are still respected + allowSnippetAnnotations: false + # -- Required for use with CNI based kubernetes installations (such as ones set up by kubeadm), + # since CNI and hostport don't mix yet. Can be deprecated once https://github.com/kubernetes/kubernetes/issues/23920 + # is merged + hostNetwork: false + ## Use host ports 80 and 443 + ## Disabled by default + hostPort: + # -- Enable 'hostPort' or not + enabled: false + ports: + # -- 'hostPort' http port + http: 80 + # -- 'hostPort' https port + https: 443 + # NetworkPolicy for controller component. + networkPolicy: + # -- Enable 'networkPolicy' or not + enabled: false + # -- Election ID to use for status update, by default it uses the controller name combined with a suffix of 'leader' + electionID: "" + # -- This section refers to the creation of the IngressClass resource. + # IngressClasses are immutable and cannot be changed after creation. + # We do not support namespaced IngressClasses, yet, so a ClusterRole and a ClusterRoleBinding is required. + ingressClassResource: + # -- Name of the IngressClass + name: nginx + # -- Create the IngressClass or not + enabled: true + # -- If true, Ingresses without `ingressClassName` get assigned to this IngressClass on creation. + # Ingress creation gets rejected if there are multiple default IngressClasses. + # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#default-ingress-class + default: false + # -- Annotations to be added to the IngressClass resource. + annotations: {} + # -- Controller of the IngressClass. An Ingress Controller looks for IngressClasses it should reconcile by this value. + # This value is also being set as the `--controller-class` argument of this Ingress Controller. + # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class + controllerValue: k8s.io/ingress-nginx + # -- Aliases of this IngressClass. Creates copies with identical settings but the respective alias as name. + # Useful for development environments with only one Ingress Controller but production-like Ingress resources. + # `default` gets enabled on the original IngressClass only. + aliases: [] + # aliases: + # - nginx-alias-1 + # - nginx-alias-2 + # -- A link to a custom resource containing additional configuration for the controller. + # This is optional if the controller consuming this IngressClass does not require additional parameters. + # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class + parameters: {} + # parameters: + # apiGroup: k8s.example.com + # kind: IngressParameters + # name: external-lb + # -- For backwards compatibility with ingress.class annotation, use ingressClass. + # Algorithm is as follows, first ingressClassName is considered, if not present, controller looks for ingress.class annotation + ingressClass: nginx + # -- Labels to add to the pod container metadata + podLabels: {} + # key: value + + # -- Security context for controller pods + podSecurityContext: {} + # -- sysctls for controller pods + ## Ref: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ + sysctls: {} + # sysctls: + # "net.core.somaxconn": "8192" + # -- Security context for controller containers + containerSecurityContext: {} + # -- Allows customization of the source of the IP address or FQDN to report + # in the ingress status field. By default, it reads the information provided + # by the service. If disable, the status field reports the IP address of the + # node or nodes where an ingress controller pod is running. + publishService: + # -- Enable 'publishService' or not + enabled: true + # -- Allows overriding of the publish service to bind to + # Must be / + pathOverride: "" + # Limit the scope of the controller to a specific namespace + scope: + # -- Enable 'scope' or not + enabled: false + # -- Namespace to limit the controller to; defaults to $(POD_NAMESPACE) + namespace: "" + # -- When scope.enabled == false, instead of watching all namespaces, we watching namespaces whose labels + # only match with namespaceSelector. Format like foo=bar. Defaults to empty, means watching all namespaces. + namespaceSelector: "" + # -- Allows customization of the configmap / nginx-configmap namespace; defaults to $(POD_NAMESPACE) + configMapNamespace: "" + tcp: + # -- Allows customization of the tcp-services-configmap; defaults to $(POD_NAMESPACE) + configMapNamespace: "" + # -- Annotations to be added to the tcp config configmap + annotations: {} + udp: + # -- Allows customization of the udp-services-configmap; defaults to $(POD_NAMESPACE) + configMapNamespace: "" + # -- Annotations to be added to the udp config configmap + annotations: {} + # -- Maxmind license key to download GeoLite2 Databases. + ## https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ + maxmindLicenseKey: "" + # -- Additional command line arguments to pass to Ingress-Nginx Controller + # E.g. to specify the default SSL certificate you can use + extraArgs: {} + ## extraArgs: + ## default-ssl-certificate: "/" + ## time-buckets: "0.005,0.01,0.025,0.05,0.1,0.25,0.5,1,2.5,5,10" + ## length-buckets: "10,20,30,40,50,60,70,80,90,100" + ## size-buckets: "10,100,1000,10000,100000,1e+06,1e+07" + + # -- Additional environment variables to set + extraEnvs: [] + # extraEnvs: + # - name: FOO + # valueFrom: + # secretKeyRef: + # key: FOO + # name: secret-resource + + # -- Use a `DaemonSet` or `Deployment` + kind: Deployment + # -- Annotations to be added to the controller Deployment or DaemonSet + ## + annotations: {} + # keel.sh/pollSchedule: "@every 60m" + + # -- Labels to be added to the controller Deployment or DaemonSet and other resources that do not have option to specify labels + ## + labels: {} + # keel.sh/policy: patch + # keel.sh/trigger: poll + + # -- The update strategy to apply to the Deployment or DaemonSet + ## + updateStrategy: {} + # rollingUpdate: + # maxUnavailable: 1 + # type: RollingUpdate + + # -- `minReadySeconds` to avoid killing pods before we are ready + ## + minReadySeconds: 0 + # -- Node tolerations for server scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + # -- Affinity and anti-affinity rules for server scheduling to nodes + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## + affinity: {} + # # An example of preferred pod anti-affinity, weight is in the range 1-100 + # podAntiAffinity: + # preferredDuringSchedulingIgnoredDuringExecution: + # - weight: 100 + # podAffinityTerm: + # labelSelector: + # matchExpressions: + # - key: app.kubernetes.io/name + # operator: In + # values: + # - '{{ include "ingress-nginx.name" . }}' + # - key: app.kubernetes.io/instance + # operator: In + # values: + # - '{{ .Release.Name }}' + # - key: app.kubernetes.io/component + # operator: In + # values: + # - controller + # topologyKey: kubernetes.io/hostname + + # # An example of required pod anti-affinity + # podAntiAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # - labelSelector: + # matchExpressions: + # - key: app.kubernetes.io/name + # operator: In + # values: + # - '{{ include "ingress-nginx.name" . }}' + # - key: app.kubernetes.io/instance + # operator: In + # values: + # - '{{ .Release.Name }}' + # - key: app.kubernetes.io/component + # operator: In + # values: + # - controller + # topologyKey: kubernetes.io/hostname + + # -- Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ + ## + topologySpreadConstraints: [] + # - labelSelector: + # matchLabels: + # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + # app.kubernetes.io/instance: '{{ .Release.Name }}' + # app.kubernetes.io/component: controller + # topologyKey: topology.kubernetes.io/zone + # maxSkew: 1 + # whenUnsatisfiable: ScheduleAnyway + # - labelSelector: + # matchLabels: + # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + # app.kubernetes.io/instance: '{{ .Release.Name }}' + # app.kubernetes.io/component: controller + # topologyKey: kubernetes.io/hostname + # maxSkew: 1 + # whenUnsatisfiable: ScheduleAnyway + + # -- `terminationGracePeriodSeconds` to avoid killing pods before we are ready + ## wait up to five minutes for the drain of connections + ## + terminationGracePeriodSeconds: 300 + # -- Node labels for controller pod assignment + ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: + kubernetes.io/os: linux + ## Liveness and readiness probe values + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes + ## + ## startupProbe: + ## httpGet: + ## # should match container.healthCheckPath + ## path: "/healthz" + ## port: 10254 + ## scheme: HTTP + ## initialDelaySeconds: 5 + ## periodSeconds: 5 + ## timeoutSeconds: 2 + ## successThreshold: 1 + ## failureThreshold: 5 + livenessProbe: + httpGet: + # should match container.healthCheckPath + path: "/healthz" + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 5 + readinessProbe: + httpGet: + # should match container.healthCheckPath + path: "/healthz" + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + # -- Path of the health check endpoint. All requests received on the port defined by + # the healthz-port parameter are forwarded internally to this path. + healthCheckPath: "/healthz" + # -- Address to bind the health check endpoint. + # It is better to set this option to the internal node address + # if the Ingress-Nginx Controller is running in the `hostNetwork: true` mode. + healthCheckHost: "" + # -- Annotations to be added to controller pods + ## + podAnnotations: {} + replicaCount: 1 + # -- Minimum available pods set in PodDisruptionBudget. + # Define either 'minAvailable' or 'maxUnavailable', never both. + minAvailable: 1 + # -- Maximum unavailable pods set in PodDisruptionBudget. If set, 'minAvailable' is ignored. + # maxUnavailable: 1 + + ## Define requests resources to avoid probe issues due to CPU utilization in busy nodes + ## ref: https://github.com/kubernetes/ingress-nginx/issues/4735#issuecomment-551204903 + ## Ideally, there should be no limits. + ## https://engineering.indeedblog.com/blog/2019/12/cpu-throttling-regression-fix/ + resources: + ## limits: + ## cpu: 100m + ## memory: 90Mi + requests: + cpu: 100m + memory: 90Mi + # Mutually exclusive with keda autoscaling + autoscaling: + enabled: false + annotations: {} + minReplicas: 1 + maxReplicas: 11 + targetCPUUtilizationPercentage: 50 + targetMemoryUtilizationPercentage: 50 + behavior: {} + # scaleDown: + # stabilizationWindowSeconds: 300 + # policies: + # - type: Pods + # value: 1 + # periodSeconds: 180 + # scaleUp: + # stabilizationWindowSeconds: 300 + # policies: + # - type: Pods + # value: 2 + # periodSeconds: 60 + autoscalingTemplate: [] + # Custom or additional autoscaling metrics + # ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#support-for-custom-metrics + # - type: Pods + # pods: + # metric: + # name: nginx_ingress_controller_nginx_process_requests_total + # target: + # type: AverageValue + # averageValue: 10000m + + # Mutually exclusive with hpa autoscaling + keda: + apiVersion: "keda.sh/v1alpha1" + ## apiVersion changes with keda 1.x vs 2.x + ## 2.x = keda.sh/v1alpha1 + ## 1.x = keda.k8s.io/v1alpha1 + enabled: false + minReplicas: 1 + maxReplicas: 11 + pollingInterval: 30 + cooldownPeriod: 300 + # fallback: + # failureThreshold: 3 + # replicas: 11 + restoreToOriginalReplicaCount: false + scaledObject: + annotations: {} + # Custom annotations for ScaledObject resource + # annotations: + # key: value + triggers: [] + # - type: prometheus + # metadata: + # serverAddress: http://:9090 + # metricName: http_requests_total + # threshold: '100' + # query: sum(rate(http_requests_total{deployment="my-deployment"}[2m])) + + behavior: {} + # scaleDown: + # stabilizationWindowSeconds: 300 + # policies: + # - type: Pods + # value: 1 + # periodSeconds: 180 + # scaleUp: + # stabilizationWindowSeconds: 300 + # policies: + # - type: Pods + # value: 2 + # periodSeconds: 60 + # -- Enable mimalloc as a drop-in replacement for malloc. + ## ref: https://github.com/microsoft/mimalloc + ## + enableMimalloc: true + ## Override NGINX template + customTemplate: + configMapName: "" + configMapKey: "" + service: + # -- Enable controller services or not. This does not influence the creation of either the admission webhook or the metrics service. + enabled: true + external: + # -- Enable the external controller service or not. Useful for internal-only deployments. + enabled: true + # -- Annotations to be added to the external controller service. See `controller.service.internal.annotations` for annotations to be added to the internal controller service. + annotations: {} + # -- Labels to be added to both controller services. + labels: {} + # -- Type of the external controller service. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types + type: LoadBalancer + # -- Pre-defined cluster internal IP address of the external controller service. Take care of collisions with existing services. + # This value is immutable. Set once, it can not be changed without deleting and re-creating the service. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address + clusterIP: "" + # -- List of node IP addresses at which the external controller service is available. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips + externalIPs: [] + # -- Deprecated: Pre-defined IP address of the external controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer + loadBalancerIP: "" + # -- Restrict access to the external controller service. Values must be CIDRs. Allows any source address by default. + loadBalancerSourceRanges: [] + # -- Load balancer class of the external controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class + loadBalancerClass: "" + # -- Enable node port allocation for the external controller service or not. Applies to type `LoadBalancer` only. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-nodeport-allocation + # allocateLoadBalancerNodePorts: true + + # -- External traffic policy of the external controller service. Set to "Local" to preserve source IP on providers supporting it. + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + externalTrafficPolicy: "" + # -- Session affinity of the external controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". + # Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity + sessionAffinity: "" + # -- Specifies the health check node port (numeric port number) for the external controller service. + # If not specified, the service controller allocates a port from your cluster's node port range. + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + # healthCheckNodePort: 0 + + # -- Represents the dual-stack capabilities of the external controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. + # Fields `ipFamilies` and `clusterIP` depend on the value of this field. + # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services + ipFamilyPolicy: SingleStack + # -- List of IP families (e.g. IPv4, IPv6) assigned to the external controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. + # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services + ipFamilies: + - IPv4 + # -- Enable the HTTP listener on both controller services or not. + enableHttp: true + # -- Enable the HTTPS listener on both controller services or not. + enableHttps: true + ports: + # -- Port the external HTTP listener is published with. + http: 80 + # -- Port the external HTTPS listener is published with. + https: 443 + targetPorts: + # -- Port of the ingress controller the external HTTP listener is mapped to. + http: http + # -- Port of the ingress controller the external HTTPS listener is mapped to. + https: https + # -- Declare the app protocol of the external HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol + appProtocol: true + nodePorts: + # -- Node port allocated for the external HTTP listener. If left empty, the service controller allocates one from the configured node port range. + http: "" + # -- Node port allocated for the external HTTPS listener. If left empty, the service controller allocates one from the configured node port range. + https: "" + # -- Node port mapping for external TCP listeners. If left empty, the service controller allocates them from the configured node port range. + # Example: + # tcp: + # 8080: 30080 + tcp: {} + # -- Node port mapping for external UDP listeners. If left empty, the service controller allocates them from the configured node port range. + # Example: + # udp: + # 53: 30053 + udp: {} + internal: + # -- Enable the internal controller service or not. Remember to configure `controller.service.internal.annotations` when enabling this. + enabled: false + # -- Annotations to be added to the internal controller service. Mandatory for the internal controller service to be created. Varies with the cloud service. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer + annotations: {} + # -- Type of the internal controller service. + # Defaults to the value of `controller.service.type`. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types + type: "" + # -- Pre-defined cluster internal IP address of the internal controller service. Take care of collisions with existing services. + # This value is immutable. Set once, it can not be changed without deleting and re-creating the service. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address + clusterIP: "" + # -- List of node IP addresses at which the internal controller service is available. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips + externalIPs: [] + # -- Deprecated: Pre-defined IP address of the internal controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer + loadBalancerIP: "" + # -- Restrict access to the internal controller service. Values must be CIDRs. Allows any source address by default. + loadBalancerSourceRanges: [] + # -- Load balancer class of the internal controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class + loadBalancerClass: "" + # -- Enable node port allocation for the internal controller service or not. Applies to type `LoadBalancer` only. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-nodeport-allocation + # allocateLoadBalancerNodePorts: true + + # -- External traffic policy of the internal controller service. Set to "Local" to preserve source IP on providers supporting it. + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + externalTrafficPolicy: "" + # -- Session affinity of the internal controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". + # Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity + sessionAffinity: "" + # -- Specifies the health check node port (numeric port number) for the internal controller service. + # If not specified, the service controller allocates a port from your cluster's node port range. + # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + # healthCheckNodePort: 0 + + # -- Represents the dual-stack capabilities of the internal controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. + # Fields `ipFamilies` and `clusterIP` depend on the value of this field. + # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services + ipFamilyPolicy: SingleStack + # -- List of IP families (e.g. IPv4, IPv6) assigned to the internal controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. + # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services + ipFamilies: + - IPv4 + ports: {} + # -- Port the internal HTTP listener is published with. + # Defaults to the value of `controller.service.ports.http`. + # http: 80 + # -- Port the internal HTTPS listener is published with. + # Defaults to the value of `controller.service.ports.https`. + # https: 443 + + targetPorts: {} + # -- Port of the ingress controller the internal HTTP listener is mapped to. + # Defaults to the value of `controller.service.targetPorts.http`. + # http: http + # -- Port of the ingress controller the internal HTTPS listener is mapped to. + # Defaults to the value of `controller.service.targetPorts.https`. + # https: https + + # -- Declare the app protocol of the internal HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. + # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol + appProtocol: true + nodePorts: + # -- Node port allocated for the internal HTTP listener. If left empty, the service controller allocates one from the configured node port range. + http: "" + # -- Node port allocated for the internal HTTPS listener. If left empty, the service controller allocates one from the configured node port range. + https: "" + # -- Node port mapping for internal TCP listeners. If left empty, the service controller allocates them from the configured node port range. + # Example: + # tcp: + # 8080: 30080 + tcp: {} + # -- Node port mapping for internal UDP listeners. If left empty, the service controller allocates them from the configured node port range. + # Example: + # udp: + # 53: 30053 + udp: {} + # shareProcessNamespace enables process namespace sharing within the pod. + # This can be used for example to signal log rotation using `kill -USR1` from a sidecar. + shareProcessNamespace: false + # -- Additional containers to be added to the controller pod. + # See https://github.com/lemonldap-ng-controller/lemonldap-ng-controller as example. + extraContainers: [] + # - name: my-sidecar + # image: nginx:latest + # - name: lemonldap-ng-controller + # image: lemonldapng/lemonldap-ng-controller:0.2.0 + # args: + # - /lemonldap-ng-controller + # - --alsologtostderr + # - --configmap=$(POD_NAMESPACE)/lemonldap-ng-configuration + # env: + # - name: POD_NAME + # valueFrom: + # fieldRef: + # fieldPath: metadata.name + # - name: POD_NAMESPACE + # valueFrom: + # fieldRef: + # fieldPath: metadata.namespace + # volumeMounts: + # - name: copy-portal-skins + # mountPath: /srv/var/lib/lemonldap-ng/portal/skins + + # -- Additional volumeMounts to the controller main container. + extraVolumeMounts: [] + # - name: copy-portal-skins + # mountPath: /var/lib/lemonldap-ng/portal/skins + + # -- Additional volumes to the controller pod. + extraVolumes: [] + # - name: copy-portal-skins + # emptyDir: {} + + # -- Containers, which are run before the app containers are started. + extraInitContainers: [] + # - name: init-myservice + # image: busybox + # command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] + + # -- Modules, which are mounted into the core nginx image. See values.yaml for a sample to add opentelemetry module + extraModules: [] + # - name: mytestmodule + # image: + # registry: registry.k8s.io + # image: ingress-nginx/mytestmodule + # ## for backwards compatibility consider setting the full image url via the repository value below + # ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail + # ## repository: + # tag: "v1.0.0" + # digest: "" + # distroless: false + # containerSecurityContext: + # runAsNonRoot: true + # runAsUser: + # allowPrivilegeEscalation: false + # seccompProfile: + # type: RuntimeDefault + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # resources: {} + # + # The image must contain a `/usr/local/bin/init_module.sh` executable, which + # will be executed as initContainers, to move its config files within the + # mounted volume. + + opentelemetry: + enabled: false + name: opentelemetry + image: + registry: registry.k8s.io + image: ingress-nginx/opentelemetry-1.25.3 + ## for backwards compatibility consider setting the full image url via the repository value below + ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail + ## repository: + tag: v20240813-b933310d + digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 + distroless: true + containerSecurityContext: + runAsNonRoot: true + # -- The image's default user, inherited from its base image `cgr.dev/chainguard/static`. + runAsUser: 65532 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + resources: {} + admissionWebhooks: + name: admission + annotations: {} + # ignore-check.kube-linter.io/no-read-only-rootfs: "This deployment needs write access to root filesystem". + + ## Additional annotations to the admission webhooks. + ## These annotations will be added to the ValidatingWebhookConfiguration and + ## the Jobs Spec of the admission webhooks. + enabled: true + # -- Additional environment variables to set + extraEnvs: [] + # extraEnvs: + # - name: FOO + # valueFrom: + # secretKeyRef: + # key: FOO + # name: secret-resource + # -- Admission Webhook failure policy to use + failurePolicy: Fail + # timeoutSeconds: 10 + port: 8443 + certificate: "/usr/local/certificates/cert" + key: "/usr/local/certificates/key" + namespaceSelector: {} + objectSelector: {} + # -- Labels to be added to admission webhooks + labels: {} + # -- Use an existing PSP instead of creating one + existingPsp: "" + service: + annotations: {} + # clusterIP: "" + externalIPs: [] + # loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 443 + type: ClusterIP + createSecretJob: + name: create + # -- Security context for secret creation containers + securityContext: + runAsNonRoot: true + runAsUser: 65532 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + resources: {} + # limits: + # cpu: 10m + # memory: 20Mi + # requests: + # cpu: 10m + # memory: 20Mi + patchWebhookJob: + name: patch + # -- Security context for webhook patch containers + securityContext: + runAsNonRoot: true + runAsUser: 65532 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + resources: {} + patch: + enabled: true + image: + registry: registry.k8s.io + image: ingress-nginx/kube-webhook-certgen + ## for backwards compatibility consider setting the full image url via the repository value below + ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail + ## repository: + tag: v1.4.4 + digest: sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f + pullPolicy: IfNotPresent + # -- Provide a priority class name to the webhook patching job + ## + priorityClassName: "" + podAnnotations: {} + # NetworkPolicy for webhook patch + networkPolicy: + # -- Enable 'networkPolicy' or not + enabled: false + nodeSelector: + kubernetes.io/os: linux + tolerations: [] + # -- Labels to be added to patch job resources + labels: {} + # -- Security context for secret creation & webhook patch pods + securityContext: {} + # -- Admission webhook patch job RBAC + rbac: + # -- Create RBAC or not + create: true + # -- Admission webhook patch job service account + serviceAccount: + # -- Create a service account or not + create: true + # -- Custom service account name + name: "" + # -- Auto-mount service account token or not + automountServiceAccountToken: true + # Use certmanager to generate webhook certs + certManager: + enabled: false + # self-signed root certificate + rootCert: + # default to be 5y + duration: "" + admissionCert: + # default to be 1y + duration: "" + # issuerRef: + # name: "issuer" + # kind: "ClusterIssuer" + metrics: + port: 10254 + portName: metrics + # if this port is changed, change healthz-port: in extraArgs: accordingly + enabled: false + service: + annotations: {} + # prometheus.io/scrape: "true" + # prometheus.io/port: "10254" + # -- Labels to be added to the metrics service resource + labels: {} + # clusterIP: "" + + # -- List of IP addresses at which the stats-exporter service is available + ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips + ## + externalIPs: [] + # loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 10254 + type: ClusterIP + # externalTrafficPolicy: "" + # nodePort: "" + serviceMonitor: + enabled: false + additionalLabels: {} + # -- Annotations to be added to the ServiceMonitor. + annotations: {} + ## The label to use to retrieve the job name from. + ## jobLabel: "app.kubernetes.io/name" + namespace: "" + namespaceSelector: {} + ## Default: scrape .Release.Namespace or namespaceOverride only + ## To scrape all, use the following: + ## namespaceSelector: + ## any: true + scrapeInterval: 30s + # honorLabels: true + targetLabels: [] + relabelings: [] + metricRelabelings: [] + prometheusRule: + enabled: false + additionalLabels: {} + # namespace: "" + rules: [] + # # These are just examples rules, please adapt them to your needs + # - alert: NGINXConfigFailed + # expr: count(nginx_ingress_controller_config_last_reload_successful == 0) > 0 + # for: 1s + # labels: + # severity: critical + # annotations: + # description: bad ingress config - nginx config test failed + # summary: uninstall the latest ingress changes to allow config reloads to resume + # # By default a fake self-signed certificate is generated as default and + # # it is fine if it expires. If `--default-ssl-certificate` flag is used + # # and a valid certificate passed please do not filter for `host` label! + # # (i.e. delete `{host!="_"}` so also the default SSL certificate is + # # checked for expiration) + # - alert: NGINXCertificateExpiry + # expr: (avg(nginx_ingress_controller_ssl_expire_time_seconds{host!="_"}) by (host) - time()) < 604800 + # for: 1s + # labels: + # severity: critical + # annotations: + # description: ssl certificate(s) will expire in less then a week + # summary: renew expiring certificates to avoid downtime + # - alert: NGINXTooMany500s + # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5 + # for: 1m + # labels: + # severity: warning + # annotations: + # description: Too many 5XXs + # summary: More than 5% of all requests returned 5XX, this requires your attention + # - alert: NGINXTooMany400s + # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5 + # for: 1m + # labels: + # severity: warning + # annotations: + # description: Too many 4XXs + # summary: More than 5% of all requests returned 4XX, this requires your attention + # -- Improve connection draining when ingress controller pod is deleted using a lifecycle hook: + # With this new hook, we increased the default terminationGracePeriodSeconds from 30 seconds + # to 300, allowing the draining of connections up to five minutes. + # If the active connections end before that, the pod will terminate gracefully at that time. + # To effectively take advantage of this feature, the Configmap feature + # worker-shutdown-timeout new value is 240s instead of 10s. + ## + lifecycle: + preStop: + exec: + command: + - /wait-shutdown + priorityClassName: "" +# -- Rollback limit +## +revisionHistoryLimit: 10 +## Default 404 backend +## +defaultBackend: + ## + enabled: false + name: defaultbackend + image: + registry: registry.k8s.io + image: defaultbackend-amd64 + ## for backwards compatibility consider setting the full image url via the repository value below + ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail + ## repository: + tag: "1.5" + pullPolicy: IfNotPresent + runAsNonRoot: true + # nobody user -> uid 65534 + runAsUser: 65534 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + readOnlyRootFilesystem: true + # -- Use an existing PSP instead of creating one + existingPsp: "" + extraArgs: {} + serviceAccount: + create: true + name: "" + automountServiceAccountToken: true + # -- Additional environment variables to set for defaultBackend pods + extraEnvs: [] + port: 8080 + ## Readiness and liveness probes for default backend + ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ + ## + livenessProbe: + failureThreshold: 3 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + readinessProbe: + failureThreshold: 6 + initialDelaySeconds: 0 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 5 + # -- The update strategy to apply to the Deployment or DaemonSet + ## + updateStrategy: {} + # rollingUpdate: + # maxUnavailable: 1 + # type: RollingUpdate + + # -- `minReadySeconds` to avoid killing pods before we are ready + ## + minReadySeconds: 0 + # -- Node tolerations for server scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + # -- Affinity and anti-affinity rules for server scheduling to nodes + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + affinity: {} + # # An example of preferred pod anti-affinity, weight is in the range 1-100 + # podAntiAffinity: + # preferredDuringSchedulingIgnoredDuringExecution: + # - weight: 100 + # podAffinityTerm: + # labelSelector: + # matchExpressions: + # - key: app.kubernetes.io/name + # operator: In + # values: + # - '{{ include "ingress-nginx.name" . }}' + # - key: app.kubernetes.io/instance + # operator: In + # values: + # - '{{ .Release.Name }}' + # - key: app.kubernetes.io/component + # operator: In + # values: + # - default-backend + # topologyKey: kubernetes.io/hostname + + # # An example of required pod anti-affinity + # podAntiAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # - labelSelector: + # matchExpressions: + # - key: app.kubernetes.io/name + # operator: In + # values: + # - '{{ include "ingress-nginx.name" . }}' + # - key: app.kubernetes.io/instance + # operator: In + # values: + # - '{{ .Release.Name }}' + # - key: app.kubernetes.io/component + # operator: In + # values: + # - default-backend + # topologyKey: kubernetes.io/hostname + + # -- Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. + # Ref.: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ + topologySpreadConstraints: [] + # - labelSelector: + # matchLabels: + # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + # app.kubernetes.io/instance: '{{ .Release.Name }}' + # app.kubernetes.io/component: default-backend + # topologyKey: topology.kubernetes.io/zone + # maxSkew: 1 + # whenUnsatisfiable: ScheduleAnyway + # - labelSelector: + # matchLabels: + # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' + # app.kubernetes.io/instance: '{{ .Release.Name }}' + # app.kubernetes.io/component: default-backend + # topologyKey: kubernetes.io/hostname + # maxSkew: 1 + # whenUnsatisfiable: ScheduleAnyway + # -- Security context for default backend pods + podSecurityContext: {} + # -- Security context for default backend containers + containerSecurityContext: {} + # -- Labels to add to the pod container metadata + podLabels: {} + # key: value + + # -- Node labels for default backend pod assignment + ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: + kubernetes.io/os: linux + # -- Annotations to be added to default backend pods + ## + podAnnotations: {} + replicaCount: 1 + # -- Minimum available pods set in PodDisruptionBudget. + minAvailable: 1 + resources: {} + # limits: + # cpu: 10m + # memory: 20Mi + # requests: + # cpu: 10m + # memory: 20Mi + + extraVolumeMounts: [] + ## Additional volumeMounts to the default backend container. + # - name: copy-portal-skins + # mountPath: /var/lib/lemonldap-ng/portal/skins + + extraVolumes: [] + ## Additional volumes to the default backend pod. + # - name: copy-portal-skins + # emptyDir: {} + + extraConfigMaps: [] + ## Additional configmaps to the default backend pod. + # - name: my-extra-configmap-1 + # labels: + # type: config-1 + # data: + # extra_file_1.html: | + # + # - name: my-extra-configmap-2 + # labels: + # type: config-2 + # data: + # extra_file_2.html: | + # + + autoscaling: + annotations: {} + enabled: false + minReplicas: 1 + maxReplicas: 2 + targetCPUUtilizationPercentage: 50 + targetMemoryUtilizationPercentage: 50 + # NetworkPolicy for default backend component. + networkPolicy: + # -- Enable 'networkPolicy' or not + enabled: false + service: + annotations: {} + # clusterIP: "" + + # -- List of IP addresses at which the default backend service is available + ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips + ## + externalIPs: [] + # loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 80 + type: ClusterIP + priorityClassName: "" + # -- Labels to be added to the default backend resources + labels: {} +## Enable RBAC as per https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/rbac.md and https://github.com/kubernetes/ingress-nginx/issues/266 +rbac: + create: true + scope: false +## If true, create & use Pod Security Policy resources +## https://kubernetes.io/docs/concepts/policy/pod-security-policy/ +podSecurityPolicy: + enabled: false +serviceAccount: + create: true + name: "" + automountServiceAccountToken: true + # -- Annotations for the controller service account + annotations: {} +# -- Optional array of imagePullSecrets containing private registry credentials +## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ +imagePullSecrets: [] +# - name: secretName + +# -- TCP service key-value pairs +## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md +## +tcp: {} +# "8080": "default/example-tcp-svc:9000" + +# -- UDP service key-value pairs +## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md +## +udp: {} +# "53": "kube-system/kube-dns:53" + +# -- Prefix for TCP and UDP ports names in ingress controller service +## Some cloud providers, like Yandex Cloud may have a requirements for a port name regex to support cloud load balancer integration +portNamePrefix: "" +# -- (string) A base64-encoded Diffie-Hellman parameter. +# This can be generated with: `openssl dhparam 4096 2> /dev/null | base64` +## Ref: https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/ssl-dh-param +dhParam: "" diff --git a/nginx-operator/watches.yaml b/nginx-operator/watches.yaml new file mode 100644 index 0000000000..ccc890f1d3 --- /dev/null +++ b/nginx-operator/watches.yaml @@ -0,0 +1,6 @@ +# Use the 'create api' subcommand to add watches to this file. +- group: metalk8s.scality.com + version: v1alpha1 + kind: IngressNginx + chart: helm-charts/ingress-nginx +# +kubebuilder:scaffold:watch From 33dcf1ab6425a4a7f8a82d981e030b12240307ab Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 26 Dec 2024 17:08:25 +0100 Subject: [PATCH 07/33] build: metalk8s catalog source --- buildchain/buildchain/constants.py | 2 + buildchain/buildchain/image.py | 9 +++++ buildchain/buildchain/versions.py | 10 +++++ catalog-source/.indexignore | 2 + catalog-source/README.md | 5 +++ catalog-source/catalog.Dockerfile | 23 +++++++++++ catalog-source/catalog/.indexignore | 1 + .../nginx-operator/bundles/v4.11.3.yaml | 38 +++++++++++++++++++ .../nginx-operator/channels/stable.yaml | 6 +++ .../catalog/nginx-operator/package.yaml | 8 ++++ 10 files changed, 104 insertions(+) create mode 100644 catalog-source/.indexignore create mode 100644 catalog-source/README.md create mode 100644 catalog-source/catalog.Dockerfile create mode 100644 catalog-source/catalog/.indexignore create mode 100644 catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml create mode 100644 catalog-source/catalog/nginx-operator/channels/stable.yaml create mode 100644 catalog-source/catalog/nginx-operator/package.yaml diff --git a/buildchain/buildchain/constants.py b/buildchain/buildchain/constants.py index dedab1abcc..151abebc71 100644 --- a/buildchain/buildchain/constants.py +++ b/buildchain/buildchain/constants.py @@ -74,6 +74,8 @@ UI_BUILD_ROOT: Path = config.BUILD_ROOT / "ui" # Path to the shell-ui build root directory. SHELL_UI_BUILD_ROOT: Path = config.BUILD_ROOT / "shell-ui" +# Path to the MetalK8s Catalog Source root directory +CATALOG_SOURCE_ROOT: Path = ROOT / "catalog-source" # Docker entrypoints. REDHAT_ENTRYPOINT: Path = ROOT / "packages/redhat/common/entrypoint.sh" diff --git a/buildchain/buildchain/image.py b/buildchain/buildchain/image.py index eef138146c..90d9852e6c 100644 --- a/buildchain/buildchain/image.py +++ b/buildchain/buildchain/image.py @@ -220,6 +220,7 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: constants.OPERATOR_FRAMEWORK_REPOSITORYT: [ "catalogd", "operator-controller", + "opm" ], constants.KUBE_BUILDER_REPOSITORY: [ "kube-rbac-proxy", @@ -340,6 +341,14 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: dockerfile=constants.NGINX_OPERATOR_ROOT / "bundle.Dockerfile", build_context=constants.NGINX_OPERATOR_ROOT, ), + _local_image( + name="metalk8s-catalog-source", + dockerfile=constants.CATALOG_SOURCE_ROOT / "catalog.Dockerfile", + build_context=constants.CATALOG_SOURCE_ROOT, + build_args={ + "BASE_IMG": TO_PULL["opm"].remote_fullname_digest, + }, + ), ) # }}} diff --git a/buildchain/buildchain/versions.py b/buildchain/buildchain/versions.py index 0fab23b544..5e21876e85 100644 --- a/buildchain/buildchain/versions.py +++ b/buildchain/buildchain/versions.py @@ -294,6 +294,16 @@ def _version_prefix(version: str, prefix: str = "v") -> str: version=_version_prefix(NGINX_OPERATOR_VERSION), digest=None, ), + Image( + name="opm", + version="v1.49.0", + digest="sha256:0bbe4054f2f88410ae364169379639c06b0e253d6e233bc24fcf2c0cd2d9803d", + ), + Image( + name="metalk8s-catalog-source", + version=VERSION, + digest=None, + ), Image( name="loki", version="3.2.0", diff --git a/catalog-source/.indexignore b/catalog-source/.indexignore new file mode 100644 index 0000000000..01ea697c74 --- /dev/null +++ b/catalog-source/.indexignore @@ -0,0 +1,2 @@ +README.md +*.Dockerfile diff --git a/catalog-source/README.md b/catalog-source/README.md new file mode 100644 index 0000000000..551d037cc9 --- /dev/null +++ b/catalog-source/README.md @@ -0,0 +1,5 @@ +# MetalK8s catalog source for OLMv1 + +contains the current operators: + + - MetalK8s [nginx-operator](../nginx-operator) diff --git a/catalog-source/catalog.Dockerfile b/catalog-source/catalog.Dockerfile new file mode 100644 index 0000000000..798df031f7 --- /dev/null +++ b/catalog-source/catalog.Dockerfile @@ -0,0 +1,23 @@ +ARG BASE_IMG=quay.io/operator-framework/opm:latest +# The builder image is expected to contain +# /bin/opm (with serve subcommand) +FROM ${BASE_IMG} as builder + +# Copy FBC root into image at /configs and pre-populate serve cache +ADD catalog /configs +RUN ["/bin/opm", "serve", "/configs", "--cache-dir=/tmp/cache", "--cache-only"] + +FROM ${BASE_IMG} +# The base image is expected to contain +# /bin/opm (with serve subcommand) and /bin/grpc_health_probe + +# Configure the entrypoint and command +ENTRYPOINT ["/bin/opm"] +CMD ["serve", "/configs", "--cache-dir=/tmp/cache"] + +COPY --from=builder /configs /configs +COPY --from=builder /tmp/cache /tmp/cache + +# Set FBC-specific label for the location of the FBC root directory +# in the image +LABEL operators.operatorframework.io.index.configs.v1=/configs diff --git a/catalog-source/catalog/.indexignore b/catalog-source/catalog/.indexignore new file mode 100644 index 0000000000..b43bf86b50 --- /dev/null +++ b/catalog-source/catalog/.indexignore @@ -0,0 +1 @@ +README.md diff --git a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml new file mode 100644 index 0000000000..60b48eb0b5 --- /dev/null +++ b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml @@ -0,0 +1,38 @@ +--- +image: registry.metalk8s.lan/nginx-operator-bundle:v4.11.3 +name: nginx-operator.v4.11.3 +package: nginx-operator +properties: +- type: olm.gvk + value: + group: metalk8s.scality.com + kind: IngressNginx + version: v1alpha1 +- type: olm.package + value: + packageName: nginx-operator + version: 4.11.3 +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSJ9LCJzcGVjIjp7Imdyb3VwIjoibWV0YWxrOHMuc2NhbGl0eS5jb20iLCJuYW1lcyI6eyJraW5kIjoiSW5ncmVzc05naW54IiwibGlzdEtpbmQiOiJJbmdyZXNzTmdpbnhMaXN0IiwicGx1cmFsIjoiaW5ncmVzc25naW54ZXMiLCJzaW5ndWxhciI6ImluZ3Jlc3NuZ2lueCJ9LCJzY29wZSI6Ik5hbWVzcGFjZWQiLCJ2ZXJzaW9ucyI6W3sibmFtZSI6InYxYWxwaGExIiwic2NoZW1hIjp7Im9wZW5BUElWM1NjaGVtYSI6eyJkZXNjcmlwdGlvbiI6IkluZ3Jlc3NOZ2lueCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgaW5ncmVzc25naW54ZXMgQVBJIiwicHJvcGVydGllcyI6eyJhcGlWZXJzaW9uIjp7ImRlc2NyaXB0aW9uIjoiQVBJVmVyc2lvbiBkZWZpbmVzIHRoZSB2ZXJzaW9uZWQgc2NoZW1hIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBTZXJ2ZXJzIHNob3VsZCBjb252ZXJ0IHJlY29nbml6ZWQgc2NoZW1hcyB0byB0aGUgbGF0ZXN0IGludGVybmFsIHZhbHVlLCBhbmQgbWF5IHJlamVjdCB1bnJlY29nbml6ZWQgdmFsdWVzLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlcyIsInR5cGUiOiJzdHJpbmcifSwia2luZCI6eyJkZXNjcmlwdGlvbiI6IktpbmQgaXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBSRVNUIHJlc291cmNlIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFNlcnZlcnMgbWF5IGluZmVyIHRoaXMgZnJvbSB0aGUgZW5kcG9pbnQgdGhlIGNsaWVudCBzdWJtaXRzIHJlcXVlc3RzIHRvLiBDYW5ub3QgYmUgdXBkYXRlZC4gSW4gQ2FtZWxDYXNlLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3R5cGVzLWtpbmRzIiwidHlwZSI6InN0cmluZyJ9LCJtZXRhZGF0YSI6eyJ0eXBlIjoib2JqZWN0In0sInNwZWMiOnsiZGVzY3JpcHRpb24iOiJTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgSW5ncmVzc05naW54IiwidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IlN0YXR1cyBkZWZpbmVzIHRoZSBvYnNlcnZlZCBzdGF0ZSBvZiBJbmdyZXNzTmdpbngiLCJ0eXBlIjoib2JqZWN0IiwieC1rdWJlcm5ldGVzLXByZXNlcnZlLXVua25vd24tZmllbGRzIjp0cnVlfX0sInR5cGUiOiJvYmplY3QifX0sInNlcnZlZCI6dHJ1ZSwic3RvcmFnZSI6dHJ1ZSwic3VicmVzb3VyY2VzIjp7InN0YXR1cyI6e319fV19LCJzdGF0dXMiOnsiYWNjZXB0ZWROYW1lcyI6eyJraW5kIjoiIiwicGx1cmFsIjoiIn0sImNvbmRpdGlvbnMiOm51bGwsInN0b3JlZFZlcnNpb25zIjpudWxsfX0= +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI0LTEyLTI2VDE1OjMxOjU2WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV0sImRlcGxveW1lbnRzIjpbeyJsYWJlbCI6eyJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5Ijoia3VzdG9taXplIiwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSI6Im5naW54LW9wZXJhdG9yIiwiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwic3BlYyI6eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3RyYXRlZ3kiOnt9LCJ0ZW1wbGF0ZSI6eyJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJrdWJlY3RsLmt1YmVybmV0ZXMuaW8vZGVmYXVsdC1jb250YWluZXIiOiJtYW5hZ2VyIn0sImxhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImFyZ3MiOlsiLS1tZXRyaWNzLXJlcXVpcmUtcmJhYyIsIi0tbWV0cmljcy1zZWN1cmUiLCItLW1ldHJpY3MtYmluZC1hZGRyZXNzPTo4NDQzIiwiLS1sZWFkZXItZWxlY3QiLCItLWxlYWRlci1lbGVjdGlvbi1pZD1uZ2lueC1vcGVyYXRvciIsIi0taGVhbHRoLXByb2JlLWJpbmQtYWRkcmVzcz06ODA4MSJdLCJpbWFnZSI6InJlZ2lzdHJ5Lm1ldGFsazhzLmxhbi9uZ2lueC1vcGVyYXRvcjp2NC4xMS4zIiwibGl2ZW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvaGVhbHRoeiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxNSwicGVyaW9kU2Vjb25kcyI6MjB9LCJuYW1lIjoibWFuYWdlciIsInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9yZWFkeXoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NSwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjUwMG0iLCJtZW1vcnkiOiIxMjhNaSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI2NE1pIn19LCJzZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19fX1dLCJzZWN1cml0eUNvbnRleHQiOnsicnVuQXNOb25Sb290Ijp0cnVlfSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyJjb29yZGluYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJsZWFzZXMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJldmVudHMiXSwidmVyYnMiOlsiY3JlYXRlIiwicGF0Y2giXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIm9wZXJhdG9yIiwic2NhbGl0eSIsIm1ldGFsazhzIiwibmdpbngiLCJrdWJlcm5ldGVzIl0sImxpbmtzIjpbeyJuYW1lIjoiTmdpbnggT3BlcmF0b3IiLCJ1cmwiOiJodHRwczovL25naW54LW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoiYXlvdWIubmFzckBzY2FsaXR5LmNvbSIsIm5hbWUiOiJBeW91YiBOYXNyIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6InNjYWxpdHkiLCJ1cmwiOiJzY2FsaXR5LmNvbSJ9LCJ2ZXJzaW9uIjoiNC4xMS4zIn19 +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LWVkaXRvci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImNyZWF0ZSIsImRlbGV0ZSIsImdldCIsImxpc3QiLCJwYXRjaCIsInVwZGF0ZSIsIndhdGNoIl19LHsiYXBpR3JvdXBzIjpbIm1ldGFsazhzLnNjYWxpdHkuY29tIl0sInJlc291cmNlcyI6WyJpbmdyZXNzbmdpbnhlcy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0Il19XX0= +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LXZpZXdlci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyJtZXRhbGs4cy5zY2FsaXR5LmNvbSJdLCJyZXNvdXJjZXMiOlsiaW5ncmVzc25naW54ZXMvc3RhdHVzIl0sInZlcmJzIjpbImdldCJdfV19 +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJuYW1lIjoibmdpbngtb3BlcmF0b3ItbWV0cmljcy1yZWFkZXIifSwicnVsZXMiOlt7Im5vblJlc291cmNlVVJMcyI6WyIvbWV0cmljcyJdLCJ2ZXJicyI6WyJnZXQiXX1dfQ== +- type: olm.bundle.object + value: + data: eyJhcGlWZXJzaW9uIjoidjEiLCJraW5kIjoiU2VydmljZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciIsImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifSwibmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlci1tZXRyaWNzLXNlcnZpY2UifSwic3BlYyI6eyJwb3J0cyI6W3sibmFtZSI6Imh0dHBzIiwicG9ydCI6ODQ0MywicHJvdG9jb2wiOiJUQ1AiLCJ0YXJnZXRQb3J0Ijo4NDQzfV0sInNlbGVjdG9yIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0YXR1cyI6eyJsb2FkQmFsYW5jZXIiOnt9fX0= +relatedImages: +- image: registry.metalk8s.lan/nginx-operator-bundle:v4.11.3 + name: "" +- image: registry.metalk8s.lan/nginx-operator:v4.11.3 + name: "" +schema: olm.bundle diff --git a/catalog-source/catalog/nginx-operator/channels/stable.yaml b/catalog-source/catalog/nginx-operator/channels/stable.yaml new file mode 100644 index 0000000000..3fbc9d716e --- /dev/null +++ b/catalog-source/catalog/nginx-operator/channels/stable.yaml @@ -0,0 +1,6 @@ +--- +schema: olm.channel +package: nginx-operator +name: stable +entries: + - name: nginx-operator.v4.11.3 diff --git a/catalog-source/catalog/nginx-operator/package.yaml b/catalog-source/catalog/nginx-operator/package.yaml new file mode 100644 index 0000000000..702ca4a14f --- /dev/null +++ b/catalog-source/catalog/nginx-operator/package.yaml @@ -0,0 +1,8 @@ +--- +defaultChannel: stable +description: | + # NGINX-operator + + This operator manages IngressNginx CRs and uses them as a values file for the [ingress-nginx](https://github.com/kubernetes/ingress-nginx) helm chart. +name: nginx-operator +schema: olm.package From e8d94c0ff8039bd19b6f2caacec3b5dd720eeafd Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 27 Dec 2024 09:34:57 +0100 Subject: [PATCH 08/33] hack registry to fix catalogsource --- .../static-container-registry.py | 22 +++++++++++++++++++ .../olm/catalog/deployed/cluster-catalog.sls | 13 +++++++++++ .../container-engine/containerd/installed.sls | 3 +++ 3 files changed, 38 insertions(+) diff --git a/buildchain/static-container-registry/static-container-registry.py b/buildchain/static-container-registry/static-container-registry.py index 661487275f..933485dc0c 100755 --- a/buildchain/static-container-registry/static-container-registry.py +++ b/buildchain/static-container-registry/static-container-registry.py @@ -118,6 +118,10 @@ def create_config( types {{ }} default_type "application/json"; return 200 '{payload:s}'; }} +location = /v2/{name:s}/tags/list {{ + types {{ }} default_type "application/json"; + return 200 '{payload:s}'; +}} """.format( name=name, name_prefix=name_prefix.lstrip("/"), @@ -145,6 +149,13 @@ def create_config( try_files manifest.json =404; error_page 404 @404_tag; }} +location = "/v2/{name:s}/manifests/{tag:s}" {{ + alias {server_root:s}/{name:s}/{tag:s}/; + types {{ }} default_type "application/vnd.docker.distribution.manifest.v2+json"; + add_header 'Docker-Content-Digest' 'sha256:{digest:s}'; + try_files manifest.json =404; + error_page 404 @404_tag; +}} """.format( name=name, tag=tag, @@ -162,6 +173,13 @@ def create_config( try_files manifest.json =404; error_page 404 @404_tag; }} +location = "/v2/{name:s}/manifests/sha256:{digest:s}" {{ + alias {server_root:s}/{name:s}/{tag:s}/; + types {{ }} default_type "application/vnd.docker.distribution.manifest.v2+json"; + add_header 'Docker-Content-Digest' 'sha256:{digest:s}'; + try_files manifest.json =404; + error_page 404 @404_tag; +}} """.format( name=name, tag=tag, @@ -184,6 +202,10 @@ def create_config( alias {server_root:s}/{name:s}/; try_files {paths:s} =404; }} +location ~ "/v2/{name:s}/blobs/sha256:([a-f0-9]{{64}})" {{ + alias {server_root:s}/{name:s}/; + try_files {paths:s} =404; +}} """.format( name_prefix=name_prefix.lstrip("/"), server_root=server_root, diff --git a/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls index 6cb3c925c5..add9db309a 100644 --- a/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls +++ b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls @@ -1,5 +1,7 @@ #!jinja | metalk8s_kubernetes +{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} +--- apiVersion: olm.operatorframework.io/v1 kind: ClusterCatalog metadata: @@ -10,3 +12,14 @@ spec: image: ref: quay.io/operatorhubio/catalog:latest pollIntervalMinutes: 10 +--- +apiVersion: olm.operatorframework.io/v1 +kind: ClusterCatalog +metadata: + name: metalk8s-catalog-source +spec: + source: + type: Image + image: + ref: {{ build_image_name("metalk8s-catalog-source") }} + pollIntervalMinutes: 10 diff --git a/salt/metalk8s/container-engine/containerd/installed.sls b/salt/metalk8s/container-engine/containerd/installed.sls index 136bb5ca73..3e78f23cf8 100644 --- a/salt/metalk8s/container-engine/containerd/installed.sls +++ b/salt/metalk8s/container-engine/containerd/installed.sls @@ -112,6 +112,9 @@ Configure registry IP in containerd conf: [plugins."io.containerd.grpc.v1.cri".registry.mirrors."{{ repo.registry_endpoint }}"] endpoint = [{{ registry_eps | join(",") }}] + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.metalk8s.lan"] + endpoint = [{{ registry_eps | join(",") }}] + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] From 4b473fcaec4fc2400edb91b37691a403606330c3 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 3 Jan 2025 09:51:19 +0100 Subject: [PATCH 09/33] fix registry config in OLM --- .../addons/olm/catalogd/deployed/catalogd.sls | 22 +++++++++++++++++++ .../deployed/operator-controller.sls | 5 +++++ 2 files changed, 27 insertions(+) diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls b/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls index 81f49de994..32870f1f70 100644 --- a/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls +++ b/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls @@ -1,4 +1,5 @@ #!jinja | metalk8s_kubernetes +{%- from "metalk8s/map.jinja" import repo with context %} {%- from "metalk8s/repo/macro.sls" import build_image_name with context %} --- @@ -27,6 +28,22 @@ spec: selector: control-plane: catalogd-controller-manager --- +apiVersion: v1 +kind: ConfigMap +metadata: + name: registries-conf + namespace: olmv1-system +data: + registries.conf: | + [[registry]] + prefix = "{{ repo.registry_endpoint }}" + insecure = true + location = "{{ repo.registry_endpoint }}:80" + [[registry]] + prefix = "registry.metalk8s.lan" + insecure = true + location = "{{ repo.registry_endpoint }}:80" +--- apiVersion: apps/v1 kind: Deployment metadata: @@ -132,6 +149,8 @@ spec: - ALL terminationMessagePolicy: FallbackToLogsOnError volumeMounts: + - mountPath: /etc/containers/ + name: registries-conf - mountPath: /var/cache/ name: cache - mountPath: /var/certs @@ -146,6 +165,9 @@ spec: serviceAccountName: catalogd-controller-manager terminationGracePeriodSeconds: 10 volumes: + - name: registries-conf + configMap: + name: registries-conf - emptyDir: {} name: cache - name: catalogserver-certs diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls index e9a2acf2ef..e45fe602be 100644 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls +++ b/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls @@ -99,6 +99,8 @@ spec: - ALL terminationMessagePolicy: FallbackToLogsOnError volumeMounts: + - mountPath: /etc/containers/ + name: registries-conf - mountPath: /var/cache name: cache - mountPath: /var/certs/ @@ -132,6 +134,9 @@ spec: serviceAccountName: operator-controller-controller-manager terminationGracePeriodSeconds: 10 volumes: + - name: registries-conf + configMap: + name: registries-conf - emptyDir: {} name: cache - name: olmv1-certificate From 0e6b891e877e82d50eedb4f51e7f032c9d175af1 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 3 Jan 2025 16:10:27 +0100 Subject: [PATCH 10/33] Add tolerations directly in nginx-operator bundle --- .../catalog/nginx-operator/bundles/v4.11.3.yaml | 2 +- .../nginx-operator.clusterserviceversion.yaml | 14 +++++++++++++- nginx-operator/config/manager/manager.yaml | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml index 60b48eb0b5..d1b48b1a48 100644 --- a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml +++ b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml @@ -17,7 +17,7 @@ properties: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSJ9LCJzcGVjIjp7Imdyb3VwIjoibWV0YWxrOHMuc2NhbGl0eS5jb20iLCJuYW1lcyI6eyJraW5kIjoiSW5ncmVzc05naW54IiwibGlzdEtpbmQiOiJJbmdyZXNzTmdpbnhMaXN0IiwicGx1cmFsIjoiaW5ncmVzc25naW54ZXMiLCJzaW5ndWxhciI6ImluZ3Jlc3NuZ2lueCJ9LCJzY29wZSI6Ik5hbWVzcGFjZWQiLCJ2ZXJzaW9ucyI6W3sibmFtZSI6InYxYWxwaGExIiwic2NoZW1hIjp7Im9wZW5BUElWM1NjaGVtYSI6eyJkZXNjcmlwdGlvbiI6IkluZ3Jlc3NOZ2lueCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgaW5ncmVzc25naW54ZXMgQVBJIiwicHJvcGVydGllcyI6eyJhcGlWZXJzaW9uIjp7ImRlc2NyaXB0aW9uIjoiQVBJVmVyc2lvbiBkZWZpbmVzIHRoZSB2ZXJzaW9uZWQgc2NoZW1hIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBTZXJ2ZXJzIHNob3VsZCBjb252ZXJ0IHJlY29nbml6ZWQgc2NoZW1hcyB0byB0aGUgbGF0ZXN0IGludGVybmFsIHZhbHVlLCBhbmQgbWF5IHJlamVjdCB1bnJlY29nbml6ZWQgdmFsdWVzLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlcyIsInR5cGUiOiJzdHJpbmcifSwia2luZCI6eyJkZXNjcmlwdGlvbiI6IktpbmQgaXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBSRVNUIHJlc291cmNlIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFNlcnZlcnMgbWF5IGluZmVyIHRoaXMgZnJvbSB0aGUgZW5kcG9pbnQgdGhlIGNsaWVudCBzdWJtaXRzIHJlcXVlc3RzIHRvLiBDYW5ub3QgYmUgdXBkYXRlZC4gSW4gQ2FtZWxDYXNlLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3R5cGVzLWtpbmRzIiwidHlwZSI6InN0cmluZyJ9LCJtZXRhZGF0YSI6eyJ0eXBlIjoib2JqZWN0In0sInNwZWMiOnsiZGVzY3JpcHRpb24iOiJTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgSW5ncmVzc05naW54IiwidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IlN0YXR1cyBkZWZpbmVzIHRoZSBvYnNlcnZlZCBzdGF0ZSBvZiBJbmdyZXNzTmdpbngiLCJ0eXBlIjoib2JqZWN0IiwieC1rdWJlcm5ldGVzLXByZXNlcnZlLXVua25vd24tZmllbGRzIjp0cnVlfX0sInR5cGUiOiJvYmplY3QifX0sInNlcnZlZCI6dHJ1ZSwic3RvcmFnZSI6dHJ1ZSwic3VicmVzb3VyY2VzIjp7InN0YXR1cyI6e319fV19LCJzdGF0dXMiOnsiYWNjZXB0ZWROYW1lcyI6eyJraW5kIjoiIiwicGx1cmFsIjoiIn0sImNvbmRpdGlvbnMiOm51bGwsInN0b3JlZFZlcnNpb25zIjpudWxsfX0= - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI0LTEyLTI2VDE1OjMxOjU2WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV0sImRlcGxveW1lbnRzIjpbeyJsYWJlbCI6eyJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5Ijoia3VzdG9taXplIiwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSI6Im5naW54LW9wZXJhdG9yIiwiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwic3BlYyI6eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3RyYXRlZ3kiOnt9LCJ0ZW1wbGF0ZSI6eyJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJrdWJlY3RsLmt1YmVybmV0ZXMuaW8vZGVmYXVsdC1jb250YWluZXIiOiJtYW5hZ2VyIn0sImxhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImFyZ3MiOlsiLS1tZXRyaWNzLXJlcXVpcmUtcmJhYyIsIi0tbWV0cmljcy1zZWN1cmUiLCItLW1ldHJpY3MtYmluZC1hZGRyZXNzPTo4NDQzIiwiLS1sZWFkZXItZWxlY3QiLCItLWxlYWRlci1lbGVjdGlvbi1pZD1uZ2lueC1vcGVyYXRvciIsIi0taGVhbHRoLXByb2JlLWJpbmQtYWRkcmVzcz06ODA4MSJdLCJpbWFnZSI6InJlZ2lzdHJ5Lm1ldGFsazhzLmxhbi9uZ2lueC1vcGVyYXRvcjp2NC4xMS4zIiwibGl2ZW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvaGVhbHRoeiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxNSwicGVyaW9kU2Vjb25kcyI6MjB9LCJuYW1lIjoibWFuYWdlciIsInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9yZWFkeXoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NSwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjUwMG0iLCJtZW1vcnkiOiIxMjhNaSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI2NE1pIn19LCJzZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19fX1dLCJzZWN1cml0eUNvbnRleHQiOnsicnVuQXNOb25Sb290Ijp0cnVlfSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyJjb29yZGluYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJsZWFzZXMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJldmVudHMiXSwidmVyYnMiOlsiY3JlYXRlIiwicGF0Y2giXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIm9wZXJhdG9yIiwic2NhbGl0eSIsIm1ldGFsazhzIiwibmdpbngiLCJrdWJlcm5ldGVzIl0sImxpbmtzIjpbeyJuYW1lIjoiTmdpbnggT3BlcmF0b3IiLCJ1cmwiOiJodHRwczovL25naW54LW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoiYXlvdWIubmFzckBzY2FsaXR5LmNvbSIsIm5hbWUiOiJBeW91YiBOYXNyIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6InNjYWxpdHkiLCJ1cmwiOiJzY2FsaXR5LmNvbSJ9LCJ2ZXJzaW9uIjoiNC4xMS4zIn19 + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTAzVDE1OjA3OjI5WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV0sImRlcGxveW1lbnRzIjpbeyJsYWJlbCI6eyJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5Ijoia3VzdG9taXplIiwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSI6Im5naW54LW9wZXJhdG9yIiwiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwic3BlYyI6eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3RyYXRlZ3kiOnt9LCJ0ZW1wbGF0ZSI6eyJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJrdWJlY3RsLmt1YmVybmV0ZXMuaW8vZGVmYXVsdC1jb250YWluZXIiOiJtYW5hZ2VyIn0sImxhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImFyZ3MiOlsiLS1tZXRyaWNzLXJlcXVpcmUtcmJhYyIsIi0tbWV0cmljcy1zZWN1cmUiLCItLW1ldHJpY3MtYmluZC1hZGRyZXNzPTo4NDQzIiwiLS1sZWFkZXItZWxlY3QiLCItLWxlYWRlci1lbGVjdGlvbi1pZD1uZ2lueC1vcGVyYXRvciIsIi0taGVhbHRoLXByb2JlLWJpbmQtYWRkcmVzcz06ODA4MSJdLCJpbWFnZSI6InJlZ2lzdHJ5Lm1ldGFsazhzLmxhbi9uZ2lueC1vcGVyYXRvcjp2NC4xMS4zIiwibGl2ZW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvaGVhbHRoeiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxNSwicGVyaW9kU2Vjb25kcyI6MjB9LCJuYW1lIjoibWFuYWdlciIsInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9yZWFkeXoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NSwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjUwMG0iLCJtZW1vcnkiOiIxMjhNaSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI2NE1pIn19LCJzZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19fX1dLCJub2RlU2VsZWN0b3IiOnsia3ViZXJuZXRlcy5pby9vcyI6ImxpbnV4Iiwibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vaW5mcmEiOiIifSwic2VjdXJpdHlDb250ZXh0Ijp7InJ1bkFzTm9uUm9vdCI6dHJ1ZSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19LCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIiLCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MTAsInRvbGVyYXRpb25zIjpbeyJlZmZlY3QiOiJOb1NjaGVkdWxlIiwia2V5Ijoibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vYm9vdHN0cmFwIiwib3BlcmF0b3IiOiJFeGlzdHMifSx7ImVmZmVjdCI6Ik5vU2NoZWR1bGUiLCJrZXkiOiJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9pbmZyYSIsIm9wZXJhdG9yIjoiRXhpc3RzIn1dfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyJjb29yZGluYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJsZWFzZXMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJldmVudHMiXSwidmVyYnMiOlsiY3JlYXRlIiwicGF0Y2giXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIm9wZXJhdG9yIiwic2NhbGl0eSIsIm1ldGFsazhzIiwibmdpbngiLCJrdWJlcm5ldGVzIl0sImxpbmtzIjpbeyJuYW1lIjoiTmdpbnggT3BlcmF0b3IiLCJ1cmwiOiJodHRwczovL25naW54LW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoiYXlvdWIubmFzckBzY2FsaXR5LmNvbSIsIm5hbWUiOiJBeW91YiBOYXNyIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6InNjYWxpdHkiLCJ1cmwiOiJzY2FsaXR5LmNvbSJ9LCJ2ZXJzaW9uIjoiNC4xMS4zIn19 - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LWVkaXRvci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImNyZWF0ZSIsImRlbGV0ZSIsImdldCIsImxpc3QiLCJwYXRjaCIsInVwZGF0ZSIsIndhdGNoIl19LHsiYXBpR3JvdXBzIjpbIm1ldGFsazhzLnNjYWxpdHkuY29tIl0sInJlc291cmNlcyI6WyJpbmdyZXNzbmdpbnhlcy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0Il19XX0= diff --git a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml index 0f995b320e..5d201a8ec4 100644 --- a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml +++ b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml @@ -506,7 +506,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2024-12-26T15:31:56Z" + createdAt: "2025-01-03T15:07:29Z" operators.operatorframework.io/builder: operator-sdk-v1.38.0 operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 name: nginx-operator.v4.11.3 @@ -659,10 +659,22 @@ spec: capabilities: drop: - ALL + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: "" securityContext: runAsNonRoot: true + seccompProfile: + type: RuntimeDefault serviceAccountName: nginx-operator-controller-manager terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists permissions: - rules: - apiGroups: diff --git a/nginx-operator/config/manager/manager.yaml b/nginx-operator/config/manager/manager.yaml index e0756d06f7..69fcba60d6 100644 --- a/nginx-operator/config/manager/manager.yaml +++ b/nginx-operator/config/manager/manager.yaml @@ -55,8 +55,8 @@ spec: # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted # Please uncomment the following code if your project does NOT have to work on old Kubernetes # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). - # seccompProfile: - # type: RuntimeDefault + seccompProfile: + type: RuntimeDefault containers: - args: - --leader-elect @@ -92,3 +92,13 @@ spec: memory: 64Mi serviceAccountName: controller-manager terminationGracePeriodSeconds: 10 + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: "" + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists From a8b88280dc17a4007fd6a62639f5585129ea4549 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Mon, 6 Jan 2025 10:49:28 +0100 Subject: [PATCH 11/33] Automate nginx-operator install --- buildchain/buildchain/salt_tree.py | 4 ++++ salt/_modules/metalk8s_olm.py | 19 ++++++++++------- .../deployed/clusterextension.sls | 16 ++++++++++++++ .../addons/nginx-operator/deployed/init.sls | 18 ++++++++++++++++ .../nginx-operator/deployed/namespace.sls | 7 +++++++ .../addons/nginx-operator/deployed/rbac.sls | 21 +++++++++++++++++++ salt/metalk8s/deployed/init.sls | 1 + 7 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls create mode 100644 salt/metalk8s/addons/nginx-operator/deployed/init.sls create mode 100644 salt/metalk8s/addons/nginx-operator/deployed/namespace.sls create mode 100644 salt/metalk8s/addons/nginx-operator/deployed/rbac.sls diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index f042fa074f..444450d679 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -344,6 +344,10 @@ def task(self) -> types.TaskDict: file_dep=[METALK8S_OPERATOR_MANIFESTS], ), Path("salt/metalk8s/addons/metalk8s-operator/deployed/init.sls"), + Path("salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls"), + Path("salt/metalk8s/addons/nginx-operator/deployed/init.sls"), + Path("salt/metalk8s/addons/nginx-operator/deployed/namespace.sls"), + Path("salt/metalk8s/addons/nginx-operator/deployed/rbac.sls"), Path("salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls"), Path("salt/metalk8s/addons/olm/catalog/deployed/init.sls"), Path("salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls"), diff --git a/salt/_modules/metalk8s_olm.py b/salt/_modules/metalk8s_olm.py index 5a17745c51..24c009104e 100644 --- a/salt/_modules/metalk8s_olm.py +++ b/salt/_modules/metalk8s_olm.py @@ -6,12 +6,17 @@ def __virtual__(): return __virtualname__ - -def check_clustercatalog_serving(name: str): - catalog = __salt__["metalk8s_kubernetes.get_object"]( - kind="ClusterCatalog", apiVersion="olm.operatorframework.io/v1", name=name +def check_condition_status(kind: str, name: str, condition: str, status: str): + obj = __salt__["metalk8s_kubernetes.get_object"]( + kind=kind, apiVersion="olm.operatorframework.io/v1", name=name ) - for cond in catalog["status"]["conditions"]: - if cond["type"] == "Serving": - return cond["status"] == "True" + for cond in obj["status"]["conditions"]: + if cond["type"] == condition: + return cond["status"] == status return False + +def check_clustercatalog_serving(name: str): + return check_condition_status("ClusterCatalog", name, "Serving", "True") + +def check_clusterextension_installed(name: str): + return check_condition_status("ClusterExtension", name, "Installed", "True") diff --git a/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls b/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls new file mode 100644 index 0000000000..7560099793 --- /dev/null +++ b/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls @@ -0,0 +1,16 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: olm.operatorframework.io/v1 +kind: ClusterExtension +metadata: + name: nginx-install +spec: + namespace: nginx-operator + serviceAccount: + name: nginx-installer + source: + sourceType: Catalog + catalog: + packageName: nginx-operator + version: "v4.11.3" diff --git a/salt/metalk8s/addons/nginx-operator/deployed/init.sls b/salt/metalk8s/addons/nginx-operator/deployed/init.sls new file mode 100644 index 0000000000..6773ddc3c9 --- /dev/null +++ b/salt/metalk8s/addons/nginx-operator/deployed/init.sls @@ -0,0 +1,18 @@ +include: + - ...olm.operator-controller.deployed + - .namespace + - .rbac + - .clusterextension + +Wait for the Nginx Operator Cluster Extension to be Installed: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_olm.check_clusterextension_installed("nginx-install") + - comment: Wait for the Nginx Operator Cluster Extension to be Installed + - retry: + attempts: 30 + - require: + - test: Wait for the Operator Controller Controller Manager Deployment to be Ready + - sls: metalk8s.addons.nginx-operator.deployed.namespace + - sls: metalk8s.addons.nginx-operator.deployed.rbac + - sls: metalk8s.addons.nginx-operator.deployed.clusterextension diff --git a/salt/metalk8s/addons/nginx-operator/deployed/namespace.sls b/salt/metalk8s/addons/nginx-operator/deployed/namespace.sls new file mode 100644 index 0000000000..8c3803f1b5 --- /dev/null +++ b/salt/metalk8s/addons/nginx-operator/deployed/namespace.sls @@ -0,0 +1,7 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: v1 +kind: Namespace +metadata: + name: nginx-operator diff --git a/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls b/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls new file mode 100644 index 0000000000..51905d9b8e --- /dev/null +++ b/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls @@ -0,0 +1,21 @@ +#!jinja | metalk8s_kubernetes + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx-installer + namespace: nginx-operator +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nginx-installer-admin +subjects: +- kind: ServiceAccount + name: nginx-installer + namespace: nginx-operator +roleRef: + kind: ClusterRole + name: cluster-admin + apiGroup: rbac.authorization.k8s.io diff --git a/salt/metalk8s/deployed/init.sls b/salt/metalk8s/deployed/init.sls index 230d968363..f24dd4ecc8 100644 --- a/salt/metalk8s/deployed/init.sls +++ b/salt/metalk8s/deployed/init.sls @@ -6,6 +6,7 @@ include: - metalk8s.addons.olm.catalogd.deployed - metalk8s.addons.olm.operator-controller.deployed - metalk8s.addons.olm.catalog.deployed + - metalk8s.addons.nginx-operator.deployed - metalk8s.addons.nginx-ingress.deployed - metalk8s.addons.nginx-ingress-control-plane.deployed - metalk8s.addons.volumes.deployed From 17d648f5b455ac9a711d16bdb1eb015e51d23131 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 7 Jan 2025 16:00:04 +0100 Subject: [PATCH 12/33] Give nginx-operator priviledge for rbac management --- .../nginx-operator/bundles/v4.11.3.yaml | 2 +- .../nginx-operator.clusterserviceversion.yaml | 17 ++++++++++++++- nginx-operator/config/rbac/kustomization.yaml | 4 ++++ nginx-operator/config/rbac/rbac_role.yaml | 21 +++++++++++++++++++ .../config/rbac/rbac_role_binding.yaml | 12 +++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 nginx-operator/config/rbac/rbac_role.yaml create mode 100644 nginx-operator/config/rbac/rbac_role_binding.yaml diff --git a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml index d1b48b1a48..c60c102e89 100644 --- a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml +++ b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml @@ -17,7 +17,7 @@ properties: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSJ9LCJzcGVjIjp7Imdyb3VwIjoibWV0YWxrOHMuc2NhbGl0eS5jb20iLCJuYW1lcyI6eyJraW5kIjoiSW5ncmVzc05naW54IiwibGlzdEtpbmQiOiJJbmdyZXNzTmdpbnhMaXN0IiwicGx1cmFsIjoiaW5ncmVzc25naW54ZXMiLCJzaW5ndWxhciI6ImluZ3Jlc3NuZ2lueCJ9LCJzY29wZSI6Ik5hbWVzcGFjZWQiLCJ2ZXJzaW9ucyI6W3sibmFtZSI6InYxYWxwaGExIiwic2NoZW1hIjp7Im9wZW5BUElWM1NjaGVtYSI6eyJkZXNjcmlwdGlvbiI6IkluZ3Jlc3NOZ2lueCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgaW5ncmVzc25naW54ZXMgQVBJIiwicHJvcGVydGllcyI6eyJhcGlWZXJzaW9uIjp7ImRlc2NyaXB0aW9uIjoiQVBJVmVyc2lvbiBkZWZpbmVzIHRoZSB2ZXJzaW9uZWQgc2NoZW1hIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBTZXJ2ZXJzIHNob3VsZCBjb252ZXJ0IHJlY29nbml6ZWQgc2NoZW1hcyB0byB0aGUgbGF0ZXN0IGludGVybmFsIHZhbHVlLCBhbmQgbWF5IHJlamVjdCB1bnJlY29nbml6ZWQgdmFsdWVzLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlcyIsInR5cGUiOiJzdHJpbmcifSwia2luZCI6eyJkZXNjcmlwdGlvbiI6IktpbmQgaXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBSRVNUIHJlc291cmNlIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFNlcnZlcnMgbWF5IGluZmVyIHRoaXMgZnJvbSB0aGUgZW5kcG9pbnQgdGhlIGNsaWVudCBzdWJtaXRzIHJlcXVlc3RzIHRvLiBDYW5ub3QgYmUgdXBkYXRlZC4gSW4gQ2FtZWxDYXNlLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3R5cGVzLWtpbmRzIiwidHlwZSI6InN0cmluZyJ9LCJtZXRhZGF0YSI6eyJ0eXBlIjoib2JqZWN0In0sInNwZWMiOnsiZGVzY3JpcHRpb24iOiJTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgSW5ncmVzc05naW54IiwidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IlN0YXR1cyBkZWZpbmVzIHRoZSBvYnNlcnZlZCBzdGF0ZSBvZiBJbmdyZXNzTmdpbngiLCJ0eXBlIjoib2JqZWN0IiwieC1rdWJlcm5ldGVzLXByZXNlcnZlLXVua25vd24tZmllbGRzIjp0cnVlfX0sInR5cGUiOiJvYmplY3QifX0sInNlcnZlZCI6dHJ1ZSwic3RvcmFnZSI6dHJ1ZSwic3VicmVzb3VyY2VzIjp7InN0YXR1cyI6e319fV19LCJzdGF0dXMiOnsiYWNjZXB0ZWROYW1lcyI6eyJraW5kIjoiIiwicGx1cmFsIjoiIn0sImNvbmRpdGlvbnMiOm51bGwsInN0b3JlZFZlcnNpb25zIjpudWxsfX0= - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTAzVDE1OjA3OjI5WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV0sImRlcGxveW1lbnRzIjpbeyJsYWJlbCI6eyJhcHAua3ViZXJuZXRlcy5pby9tYW5hZ2VkLWJ5Ijoia3VzdG9taXplIiwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZSI6Im5naW54LW9wZXJhdG9yIiwiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwic3BlYyI6eyJyZXBsaWNhcyI6MSwic2VsZWN0b3IiOnsibWF0Y2hMYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3RyYXRlZ3kiOnt9LCJ0ZW1wbGF0ZSI6eyJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJrdWJlY3RsLmt1YmVybmV0ZXMuaW8vZGVmYXVsdC1jb250YWluZXIiOiJtYW5hZ2VyIn0sImxhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImFyZ3MiOlsiLS1tZXRyaWNzLXJlcXVpcmUtcmJhYyIsIi0tbWV0cmljcy1zZWN1cmUiLCItLW1ldHJpY3MtYmluZC1hZGRyZXNzPTo4NDQzIiwiLS1sZWFkZXItZWxlY3QiLCItLWxlYWRlci1lbGVjdGlvbi1pZD1uZ2lueC1vcGVyYXRvciIsIi0taGVhbHRoLXByb2JlLWJpbmQtYWRkcmVzcz06ODA4MSJdLCJpbWFnZSI6InJlZ2lzdHJ5Lm1ldGFsazhzLmxhbi9uZ2lueC1vcGVyYXRvcjp2NC4xMS4zIiwibGl2ZW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvaGVhbHRoeiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxNSwicGVyaW9kU2Vjb25kcyI6MjB9LCJuYW1lIjoibWFuYWdlciIsInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9yZWFkeXoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NSwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjUwMG0iLCJtZW1vcnkiOiIxMjhNaSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI2NE1pIn19LCJzZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19fX1dLCJub2RlU2VsZWN0b3IiOnsia3ViZXJuZXRlcy5pby9vcyI6ImxpbnV4Iiwibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vaW5mcmEiOiIifSwic2VjdXJpdHlDb250ZXh0Ijp7InJ1bkFzTm9uUm9vdCI6dHJ1ZSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19LCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIiLCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MTAsInRvbGVyYXRpb25zIjpbeyJlZmZlY3QiOiJOb1NjaGVkdWxlIiwia2V5Ijoibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vYm9vdHN0cmFwIiwib3BlcmF0b3IiOiJFeGlzdHMifSx7ImVmZmVjdCI6Ik5vU2NoZWR1bGUiLCJrZXkiOiJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9pbmZyYSIsIm9wZXJhdG9yIjoiRXhpc3RzIn1dfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyJjb29yZGluYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJsZWFzZXMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJldmVudHMiXSwidmVyYnMiOlsiY3JlYXRlIiwicGF0Y2giXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIm9wZXJhdG9yIiwic2NhbGl0eSIsIm1ldGFsazhzIiwibmdpbngiLCJrdWJlcm5ldGVzIl0sImxpbmtzIjpbeyJuYW1lIjoiTmdpbnggT3BlcmF0b3IiLCJ1cmwiOiJodHRwczovL25naW54LW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoiYXlvdWIubmFzckBzY2FsaXR5LmNvbSIsIm5hbWUiOiJBeW91YiBOYXNyIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6InNjYWxpdHkiLCJ1cmwiOiJzY2FsaXR5LmNvbSJ9LCJ2ZXJzaW9uIjoiNC4xMS4zIn19 + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTA3VDE0OjUzOjE3WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJzZXJ2aWNlYWNjb3VudHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJyb2xlcyIsInJvbGViaW5kaW5ncyIsImNsdXN0ZXJyb2xlcyIsImNsdXN0ZXJyb2xlYmluZGluZ3MiXSwidmVyYnMiOlsiKiJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciJ9XSwiZGVwbG95bWVudHMiOlt7ImxhYmVsIjp7ImFwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnkiOiJrdXN0b21pemUiLCJhcHAua3ViZXJuZXRlcy5pby9uYW1lIjoibmdpbngtb3BlcmF0b3IiLCJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn0sIm5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIiLCJzcGVjIjp7InJlcGxpY2FzIjoxLCJzZWxlY3RvciI6eyJtYXRjaExhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzdHJhdGVneSI6e30sInRlbXBsYXRlIjp7Im1ldGFkYXRhIjp7ImFubm90YXRpb25zIjp7Imt1YmVjdGwua3ViZXJuZXRlcy5pby9kZWZhdWx0LWNvbnRhaW5lciI6Im1hbmFnZXIifSwibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLW1ldHJpY3MtcmVxdWlyZS1yYmFjIiwiLS1tZXRyaWNzLXNlY3VyZSIsIi0tbWV0cmljcy1iaW5kLWFkZHJlc3M9Ojg0NDMiLCItLWxlYWRlci1lbGVjdCIsIi0tbGVhZGVyLWVsZWN0aW9uLWlkPW5naW54LW9wZXJhdG9yIiwiLS1oZWFsdGgtcHJvYmUtYmluZC1hZGRyZXNzPTo4MDgxIl0sImltYWdlIjoicmVnaXN0cnkubWV0YWxrOHMubGFuL25naW54LW9wZXJhdG9yOnY0LjExLjMiLCJsaXZlbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9oZWFsdGh6IiwicG9ydCI6ODA4MX0sImluaXRpYWxEZWxheVNlY29uZHMiOjE1LCJwZXJpb2RTZWNvbmRzIjoyMH0sIm5hbWUiOiJtYW5hZ2VyIiwicmVhZGluZXNzUHJvYmUiOnsiaHR0cEdldCI6eyJwYXRoIjoiL3JlYWR5eiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo1LCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSIsIm1lbW9yeSI6IjEyOE1pIn0sInJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjY0TWkifX0sInNlY3VyaXR5Q29udGV4dCI6eyJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb24iOmZhbHNlLCJjYXBhYmlsaXRpZXMiOnsiZHJvcCI6WyJBTEwiXX19fV0sIm5vZGVTZWxlY3RvciI6eyJrdWJlcm5ldGVzLmlvL29zIjoibGludXgiLCJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9pbmZyYSI6IiJ9LCJzZWN1cml0eUNvbnRleHQiOnsicnVuQXNOb25Sb290Ijp0cnVlLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciIsInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjoxMCwidG9sZXJhdGlvbnMiOlt7ImVmZmVjdCI6Ik5vU2NoZWR1bGUiLCJrZXkiOiJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9ib290c3RyYXAiLCJvcGVyYXRvciI6IkV4aXN0cyJ9LHsiZWZmZWN0IjoiTm9TY2hlZHVsZSIsImtleSI6Im5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2luZnJhIiwib3BlcmF0b3IiOiJFeGlzdHMifV19fX19XSwicGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJjb25maWdtYXBzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCIsImNyZWF0ZSIsInVwZGF0ZSIsInBhdGNoIiwiZGVsZXRlIl19LHsiYXBpR3JvdXBzIjpbImNvb3JkaW5hdGlvbi5rOHMuaW8iXSwicmVzb3VyY2VzIjpbImxlYXNlcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJwYXRjaCJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciJ9XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJpbnN0YWxsTW9kZXMiOlt7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJPd25OYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJTaW5nbGVOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJNdWx0aU5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjp0cnVlLCJ0eXBlIjoiQWxsTmFtZXNwYWNlcyJ9XSwia2V5d29yZHMiOlsib3BlcmF0b3IiLCJzY2FsaXR5IiwibWV0YWxrOHMiLCJuZ2lueCIsImt1YmVybmV0ZXMiXSwibGlua3MiOlt7Im5hbWUiOiJOZ2lueCBPcGVyYXRvciIsInVybCI6Imh0dHBzOi8vbmdpbngtb3BlcmF0b3IuZG9tYWluIn1dLCJtYWludGFpbmVycyI6W3siZW1haWwiOiJheW91Yi5uYXNyQHNjYWxpdHkuY29tIiwibmFtZSI6IkF5b3ViIE5hc3IifV0sIm1hdHVyaXR5IjoiYWxwaGEiLCJwcm92aWRlciI6eyJuYW1lIjoic2NhbGl0eSIsInVybCI6InNjYWxpdHkuY29tIn0sInZlcnNpb24iOiI0LjExLjMifX0= - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LWVkaXRvci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImNyZWF0ZSIsImRlbGV0ZSIsImdldCIsImxpc3QiLCJwYXRjaCIsInVwZGF0ZSIsIndhdGNoIl19LHsiYXBpR3JvdXBzIjpbIm1ldGFsazhzLnNjYWxpdHkuY29tIl0sInJlc291cmNlcyI6WyJpbmdyZXNzbmdpbnhlcy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0Il19XX0= diff --git a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml index 5d201a8ec4..9fce7e43f7 100644 --- a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml +++ b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml @@ -506,7 +506,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2025-01-03T15:07:29Z" + createdAt: "2025-01-07T14:53:17Z" operators.operatorframework.io/builder: operator-sdk-v1.38.0 operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 name: nginx-operator.v4.11.3 @@ -605,6 +605,21 @@ spec: - subjectaccessreviews verbs: - create + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + - clusterroles + - clusterrolebindings + verbs: + - '*' serviceAccountName: nginx-operator-controller-manager deployments: - label: diff --git a/nginx-operator/config/rbac/kustomization.yaml b/nginx-operator/config/rbac/kustomization.yaml index 2efe5bf233..89d52fa602 100644 --- a/nginx-operator/config/rbac/kustomization.yaml +++ b/nginx-operator/config/rbac/kustomization.yaml @@ -24,4 +24,8 @@ resources: # if you do not want those helpers be installed with your Project. - ingressnginx_editor_role.yaml - ingressnginx_viewer_role.yaml +# These roles and role bindings help the operator create +# serviceaccounts, roles, rolebindings, clusterroles, clusterrolebindings +- rbac_role.yaml +- rbac_role_binding.yaml diff --git a/nginx-operator/config/rbac/rbac_role.yaml b/nginx-operator/config/rbac/rbac_role.yaml new file mode 100644 index 0000000000..d1b2a2a8bc --- /dev/null +++ b/nginx-operator/config/rbac/rbac_role.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: nginx-operator-rbac-role +rules: +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - "*" +- apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + - clusterroles + - clusterrolebindings + verbs: + - "*" + diff --git a/nginx-operator/config/rbac/rbac_role_binding.yaml b/nginx-operator/config/rbac/rbac_role_binding.yaml new file mode 100644 index 0000000000..b1d78fe567 --- /dev/null +++ b/nginx-operator/config/rbac/rbac_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nginx-operator-rbac-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-operator-rbac-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system From c4ffe25853be70a2c47f1bd5dddaae8c0b990283 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 7 Jan 2025 18:57:59 +0100 Subject: [PATCH 13/33] Give nginx-operator priviledge for other kinds --- .../catalog/nginx-operator/bundles/v4.11.3.yaml | 2 +- .../nginx-operator.clusterserviceversion.yaml | 14 +++++++++++++- nginx-operator/config/rbac/kustomization.yaml | 7 ++++++- nginx-operator/config/rbac/monitoring_role.yaml | 12 ++++++++++++ .../config/rbac/monitoring_role_binding.yaml | 12 ++++++++++++ nginx-operator/config/rbac/network_role.yaml | 12 ++++++++++++ .../config/rbac/network_role_binding.yaml | 12 ++++++++++++ 7 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 nginx-operator/config/rbac/monitoring_role.yaml create mode 100644 nginx-operator/config/rbac/monitoring_role_binding.yaml create mode 100644 nginx-operator/config/rbac/network_role.yaml create mode 100644 nginx-operator/config/rbac/network_role_binding.yaml diff --git a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml index c60c102e89..9b5fe5aa28 100644 --- a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml +++ b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml @@ -17,7 +17,7 @@ properties: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSJ9LCJzcGVjIjp7Imdyb3VwIjoibWV0YWxrOHMuc2NhbGl0eS5jb20iLCJuYW1lcyI6eyJraW5kIjoiSW5ncmVzc05naW54IiwibGlzdEtpbmQiOiJJbmdyZXNzTmdpbnhMaXN0IiwicGx1cmFsIjoiaW5ncmVzc25naW54ZXMiLCJzaW5ndWxhciI6ImluZ3Jlc3NuZ2lueCJ9LCJzY29wZSI6Ik5hbWVzcGFjZWQiLCJ2ZXJzaW9ucyI6W3sibmFtZSI6InYxYWxwaGExIiwic2NoZW1hIjp7Im9wZW5BUElWM1NjaGVtYSI6eyJkZXNjcmlwdGlvbiI6IkluZ3Jlc3NOZ2lueCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgaW5ncmVzc25naW54ZXMgQVBJIiwicHJvcGVydGllcyI6eyJhcGlWZXJzaW9uIjp7ImRlc2NyaXB0aW9uIjoiQVBJVmVyc2lvbiBkZWZpbmVzIHRoZSB2ZXJzaW9uZWQgc2NoZW1hIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBTZXJ2ZXJzIHNob3VsZCBjb252ZXJ0IHJlY29nbml6ZWQgc2NoZW1hcyB0byB0aGUgbGF0ZXN0IGludGVybmFsIHZhbHVlLCBhbmQgbWF5IHJlamVjdCB1bnJlY29nbml6ZWQgdmFsdWVzLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlcyIsInR5cGUiOiJzdHJpbmcifSwia2luZCI6eyJkZXNjcmlwdGlvbiI6IktpbmQgaXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBSRVNUIHJlc291cmNlIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFNlcnZlcnMgbWF5IGluZmVyIHRoaXMgZnJvbSB0aGUgZW5kcG9pbnQgdGhlIGNsaWVudCBzdWJtaXRzIHJlcXVlc3RzIHRvLiBDYW5ub3QgYmUgdXBkYXRlZC4gSW4gQ2FtZWxDYXNlLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3R5cGVzLWtpbmRzIiwidHlwZSI6InN0cmluZyJ9LCJtZXRhZGF0YSI6eyJ0eXBlIjoib2JqZWN0In0sInNwZWMiOnsiZGVzY3JpcHRpb24iOiJTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgSW5ncmVzc05naW54IiwidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IlN0YXR1cyBkZWZpbmVzIHRoZSBvYnNlcnZlZCBzdGF0ZSBvZiBJbmdyZXNzTmdpbngiLCJ0eXBlIjoib2JqZWN0IiwieC1rdWJlcm5ldGVzLXByZXNlcnZlLXVua25vd24tZmllbGRzIjp0cnVlfX0sInR5cGUiOiJvYmplY3QifX0sInNlcnZlZCI6dHJ1ZSwic3RvcmFnZSI6dHJ1ZSwic3VicmVzb3VyY2VzIjp7InN0YXR1cyI6e319fV19LCJzdGF0dXMiOnsiYWNjZXB0ZWROYW1lcyI6eyJraW5kIjoiIiwicGx1cmFsIjoiIn0sImNvbmRpdGlvbnMiOm51bGwsInN0b3JlZFZlcnNpb25zIjpudWxsfX0= - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTA3VDE0OjUzOjE3WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJzZXJ2aWNlYWNjb3VudHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJyb2xlcyIsInJvbGViaW5kaW5ncyIsImNsdXN0ZXJyb2xlcyIsImNsdXN0ZXJyb2xlYmluZGluZ3MiXSwidmVyYnMiOlsiKiJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciJ9XSwiZGVwbG95bWVudHMiOlt7ImxhYmVsIjp7ImFwcC5rdWJlcm5ldGVzLmlvL21hbmFnZWQtYnkiOiJrdXN0b21pemUiLCJhcHAua3ViZXJuZXRlcy5pby9uYW1lIjoibmdpbngtb3BlcmF0b3IiLCJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn0sIm5hbWUiOiJuZ2lueC1vcGVyYXRvci1jb250cm9sbGVyLW1hbmFnZXIiLCJzcGVjIjp7InJlcGxpY2FzIjoxLCJzZWxlY3RvciI6eyJtYXRjaExhYmVscyI6eyJjb250cm9sLXBsYW5lIjoiY29udHJvbGxlci1tYW5hZ2VyIn19LCJzdHJhdGVneSI6e30sInRlbXBsYXRlIjp7Im1ldGFkYXRhIjp7ImFubm90YXRpb25zIjp7Imt1YmVjdGwua3ViZXJuZXRlcy5pby9kZWZhdWx0LWNvbnRhaW5lciI6Im1hbmFnZXIifSwibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLW1ldHJpY3MtcmVxdWlyZS1yYmFjIiwiLS1tZXRyaWNzLXNlY3VyZSIsIi0tbWV0cmljcy1iaW5kLWFkZHJlc3M9Ojg0NDMiLCItLWxlYWRlci1lbGVjdCIsIi0tbGVhZGVyLWVsZWN0aW9uLWlkPW5naW54LW9wZXJhdG9yIiwiLS1oZWFsdGgtcHJvYmUtYmluZC1hZGRyZXNzPTo4MDgxIl0sImltYWdlIjoicmVnaXN0cnkubWV0YWxrOHMubGFuL25naW54LW9wZXJhdG9yOnY0LjExLjMiLCJsaXZlbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9oZWFsdGh6IiwicG9ydCI6ODA4MX0sImluaXRpYWxEZWxheVNlY29uZHMiOjE1LCJwZXJpb2RTZWNvbmRzIjoyMH0sIm5hbWUiOiJtYW5hZ2VyIiwicmVhZGluZXNzUHJvYmUiOnsiaHR0cEdldCI6eyJwYXRoIjoiL3JlYWR5eiIsInBvcnQiOjgwODF9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo1LCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSIsIm1lbW9yeSI6IjEyOE1pIn0sInJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjY0TWkifX0sInNlY3VyaXR5Q29udGV4dCI6eyJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb24iOmZhbHNlLCJjYXBhYmlsaXRpZXMiOnsiZHJvcCI6WyJBTEwiXX19fV0sIm5vZGVTZWxlY3RvciI6eyJrdWJlcm5ldGVzLmlvL29zIjoibGludXgiLCJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9pbmZyYSI6IiJ9LCJzZWN1cml0eUNvbnRleHQiOnsicnVuQXNOb25Sb290Ijp0cnVlLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciIsInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjoxMCwidG9sZXJhdGlvbnMiOlt7ImVmZmVjdCI6Ik5vU2NoZWR1bGUiLCJrZXkiOiJub2RlLXJvbGUua3ViZXJuZXRlcy5pby9ib290c3RyYXAiLCJvcGVyYXRvciI6IkV4aXN0cyJ9LHsiZWZmZWN0IjoiTm9TY2hlZHVsZSIsImtleSI6Im5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2luZnJhIiwib3BlcmF0b3IiOiJFeGlzdHMifV19fX19XSwicGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJjb25maWdtYXBzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCIsImNyZWF0ZSIsInVwZGF0ZSIsInBhdGNoIiwiZGVsZXRlIl19LHsiYXBpR3JvdXBzIjpbImNvb3JkaW5hdGlvbi5rOHMuaW8iXSwicmVzb3VyY2VzIjpbImxlYXNlcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJwYXRjaCJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciJ9XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJpbnN0YWxsTW9kZXMiOlt7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJPd25OYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJTaW5nbGVOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6ZmFsc2UsInR5cGUiOiJNdWx0aU5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjp0cnVlLCJ0eXBlIjoiQWxsTmFtZXNwYWNlcyJ9XSwia2V5d29yZHMiOlsib3BlcmF0b3IiLCJzY2FsaXR5IiwibWV0YWxrOHMiLCJuZ2lueCIsImt1YmVybmV0ZXMiXSwibGlua3MiOlt7Im5hbWUiOiJOZ2lueCBPcGVyYXRvciIsInVybCI6Imh0dHBzOi8vbmdpbngtb3BlcmF0b3IuZG9tYWluIn1dLCJtYWludGFpbmVycyI6W3siZW1haWwiOiJheW91Yi5uYXNyQHNjYWxpdHkuY29tIiwibmFtZSI6IkF5b3ViIE5hc3IifV0sIm1hdHVyaXR5IjoiYWxwaGEiLCJwcm92aWRlciI6eyJuYW1lIjoic2NhbGl0eSIsInVybCI6InNjYWxpdHkuY29tIn0sInZlcnNpb24iOiI0LjExLjMifX0= + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTA3VDE3OjU2OjE0WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibW9uaXRvcmluZy5jb3Jlb3MuY29tIl0sInJlc291cmNlcyI6WyJzZXJ2aWNlbW9uaXRvcnMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyJuZXR3b3JraW5nLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsiaW5ncmVzc2NsYXNzZXMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlcnZpY2VhY2NvdW50cyJdLCJ2ZXJicyI6WyIqIl19LHsiYXBpR3JvdXBzIjpbInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8iXSwicmVzb3VyY2VzIjpbInJvbGVzIiwicm9sZWJpbmRpbmdzIiwiY2x1c3RlcnJvbGVzIiwiY2x1c3RlcnJvbGViaW5kaW5ncyJdLCJ2ZXJicyI6WyIqIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dLCJkZXBsb3ltZW50cyI6W3sibGFiZWwiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciIsImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifSwibmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsia3ViZWN0bC5rdWJlcm5ldGVzLmlvL2RlZmF1bHQtY29udGFpbmVyIjoibWFuYWdlciJ9LCJsYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3BlYyI6eyJjb250YWluZXJzIjpbeyJhcmdzIjpbIi0tbWV0cmljcy1yZXF1aXJlLXJiYWMiLCItLW1ldHJpY3Mtc2VjdXJlIiwiLS1tZXRyaWNzLWJpbmQtYWRkcmVzcz06ODQ0MyIsIi0tbGVhZGVyLWVsZWN0IiwiLS1sZWFkZXItZWxlY3Rpb24taWQ9bmdpbngtb3BlcmF0b3IiLCItLWhlYWx0aC1wcm9iZS1iaW5kLWFkZHJlc3M9OjgwODEiXSwiaW1hZ2UiOiJyZWdpc3RyeS5tZXRhbGs4cy5sYW4vbmdpbngtb3BlcmF0b3I6djQuMTEuMyIsImxpdmVuZXNzUHJvYmUiOnsiaHR0cEdldCI6eyJwYXRoIjoiL2hlYWx0aHoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTUsInBlcmlvZFNlY29uZHMiOjIwfSwibmFtZSI6Im1hbmFnZXIiLCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvcmVhZHl6IiwicG9ydCI6ODA4MX0sImluaXRpYWxEZWxheVNlY29uZHMiOjUsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIiwibWVtb3J5IjoiMTI4TWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNjRNaSJ9fSwic2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfX19XSwibm9kZVNlbGVjdG9yIjp7Imt1YmVybmV0ZXMuaW8vb3MiOiJsaW51eCIsIm5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2luZnJhIjoiIn0sInNlY3VyaXR5Q29udGV4dCI6eyJydW5Bc05vblJvb3QiOnRydWUsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwLCJ0b2xlcmF0aW9ucyI6W3siZWZmZWN0IjoiTm9TY2hlZHVsZSIsImtleSI6Im5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2Jvb3RzdHJhcCIsIm9wZXJhdG9yIjoiRXhpc3RzIn0seyJlZmZlY3QiOiJOb1NjaGVkdWxlIiwia2V5Ijoibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vaW5mcmEiLCJvcGVyYXRvciI6IkV4aXN0cyJ9XX19fX1dLCJwZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiY29vcmRpbmF0aW9uLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsibGVhc2VzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCIsImNyZWF0ZSIsInVwZGF0ZSIsInBhdGNoIiwiZGVsZXRlIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSIsInBhdGNoIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dfSwic3RyYXRlZ3kiOiJkZXBsb3ltZW50In0sImluc3RhbGxNb2RlcyI6W3sic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik93bk5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6IlNpbmdsZU5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik11bHRpTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOnRydWUsInR5cGUiOiJBbGxOYW1lc3BhY2VzIn1dLCJrZXl3b3JkcyI6WyJvcGVyYXRvciIsInNjYWxpdHkiLCJtZXRhbGs4cyIsIm5naW54Iiwia3ViZXJuZXRlcyJdLCJsaW5rcyI6W3sibmFtZSI6Ik5naW54IE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly9uZ2lueC1vcGVyYXRvci5kb21haW4ifV0sIm1haW50YWluZXJzIjpbeyJlbWFpbCI6ImF5b3ViLm5hc3JAc2NhbGl0eS5jb20iLCJuYW1lIjoiQXlvdWIgTmFzciJ9XSwibWF0dXJpdHkiOiJhbHBoYSIsInByb3ZpZGVyIjp7Im5hbWUiOiJzY2FsaXR5IiwidXJsIjoic2NhbGl0eS5jb20ifSwidmVyc2lvbiI6IjQuMTEuMyJ9fQ== - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LWVkaXRvci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImNyZWF0ZSIsImRlbGV0ZSIsImdldCIsImxpc3QiLCJwYXRjaCIsInVwZGF0ZSIsIndhdGNoIl19LHsiYXBpR3JvdXBzIjpbIm1ldGFsazhzLnNjYWxpdHkuY29tIl0sInJlc291cmNlcyI6WyJpbmdyZXNzbmdpbnhlcy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0Il19XX0= diff --git a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml index 9fce7e43f7..a438a5a8b2 100644 --- a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml +++ b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml @@ -506,7 +506,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2025-01-07T14:53:17Z" + createdAt: "2025-01-07T17:56:14Z" operators.operatorframework.io/builder: operator-sdk-v1.38.0 operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 name: nginx-operator.v4.11.3 @@ -605,6 +605,18 @@ spec: - subjectaccessreviews verbs: - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - '*' + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - '*' - apiGroups: - "" resources: diff --git a/nginx-operator/config/rbac/kustomization.yaml b/nginx-operator/config/rbac/kustomization.yaml index 89d52fa602..b0f024cc89 100644 --- a/nginx-operator/config/rbac/kustomization.yaml +++ b/nginx-operator/config/rbac/kustomization.yaml @@ -28,4 +28,9 @@ resources: # serviceaccounts, roles, rolebindings, clusterroles, clusterrolebindings - rbac_role.yaml - rbac_role_binding.yaml - +# IngressClass +- network_role.yaml +- network_role_binding.yaml +# ServiceMonitor +- monitoring_role.yaml +- monitoring_role_binding.yaml diff --git a/nginx-operator/config/rbac/monitoring_role.yaml b/nginx-operator/config/rbac/monitoring_role.yaml new file mode 100644 index 0000000000..99f03bdade --- /dev/null +++ b/nginx-operator/config/rbac/monitoring_role.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: nginx-operator-monitoring-role +rules: +- apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - "*" + diff --git a/nginx-operator/config/rbac/monitoring_role_binding.yaml b/nginx-operator/config/rbac/monitoring_role_binding.yaml new file mode 100644 index 0000000000..ff01ae5d6d --- /dev/null +++ b/nginx-operator/config/rbac/monitoring_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nginx-operator-monitoring-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-operator-monitoring-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/nginx-operator/config/rbac/network_role.yaml b/nginx-operator/config/rbac/network_role.yaml new file mode 100644 index 0000000000..248fbae1df --- /dev/null +++ b/nginx-operator/config/rbac/network_role.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: nginx-operator-networking-role +rules: +- apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - "*" + diff --git a/nginx-operator/config/rbac/network_role_binding.yaml b/nginx-operator/config/rbac/network_role_binding.yaml new file mode 100644 index 0000000000..f9dda4ef74 --- /dev/null +++ b/nginx-operator/config/rbac/network_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nginx-operator-networking-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-operator-networking-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system From 74f7ed3a9760a32fa0dbe70e6041d90ecba578f3 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Wed, 8 Jan 2025 11:08:11 +0100 Subject: [PATCH 14/33] Use minimal RBAC for nginx-operator isntall --- .../deployed/clusterextension.sls | 2 +- .../addons/nginx-operator/deployed/rbac.sls | 479 +++++++++++++++++- 2 files changed, 474 insertions(+), 7 deletions(-) diff --git a/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls b/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls index 7560099793..f684d5d882 100644 --- a/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls +++ b/salt/metalk8s/addons/nginx-operator/deployed/clusterextension.sls @@ -8,7 +8,7 @@ metadata: spec: namespace: nginx-operator serviceAccount: - name: nginx-installer + name: nginx-operator-installer source: sourceType: Catalog catalog: diff --git a/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls b/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls index 51905d9b8e..0944a1e5a2 100644 --- a/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls +++ b/salt/metalk8s/addons/nginx-operator/deployed/rbac.sls @@ -1,21 +1,488 @@ #!jinja | metalk8s_kubernetes +# TODO: cluster role and cluster role binding +# names must bne injected here to make sure operator-installer can only +# manage the operator's resources + +# generated on running platform using +# https://github.com/operator-framework/operator-controller/tree/main/hack/tools/catalogs + --- apiVersion: v1 kind: ServiceAccount metadata: - name: nginx-installer + name: nginx-operator-installer namespace: nginx-operator --- +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: nginx-operator-installer-cluster-role +rules: [ + { + "apiGroups": [ + "olm.operatorframework.io" + ], + "resources": [ + "clusterextensions/finalizers" + ], + "verbs": [ + "update" + ], + "resourceNames": [ + "nginx-operator" + ] + }, + { + "apiGroups": [ + "apiextensions.k8s.io" + ], + "resources": [ + "customresourcedefinitions" + ], + "verbs": [ + "create", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "apiextensions.k8s.io" + ], + "resources": [ + "customresourcedefinitions" + ], + "verbs": [ + "get", + "update", + "patch", + "delete" + ], + "resourceNames": [ + "ingressnginxes.metalk8s.scality.com" + ] + }, + { + "apiGroups": [ + "rbac.authorization.k8s.io" + ], + "resources": [ + "clusterroles" + ], + "verbs": [ + "create", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "rbac.authorization.k8s.io" + ], + "resources": [ + "clusterroles" + ], + "verbs": [ + "get", + "update", + "patch", + "delete" + ] + }, + { + "apiGroups": [ + "metalk8s.scality.com" + ], + "resources": [ + "ingressnginxes" + ], + "verbs": [ + "create", + "delete", + "get", + "list", + "patch", + "update", + "watch" + ] + }, + { + "apiGroups": [ + "metalk8s.scality.com" + ], + "resources": [ + "ingressnginxes/status" + ], + "verbs": [ + "get" + ] + }, + { + "apiGroups": [ + "metalk8s.scality.com" + ], + "resources": [ + "ingressnginxes" + ], + "verbs": [ + "get", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "metalk8s.scality.com" + ], + "resources": [ + "ingressnginxes/status" + ], + "verbs": [ + "get" + ] + }, + { + "nonResourceURLs": [ + "/metrics" + ], + "verbs": [ + "get" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "namespaces" + ], + "verbs": [ + "get" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "secrets" + ], + "verbs": [ + "*" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "events" + ], + "verbs": [ + "create" + ] + }, + { + "apiGroups": [ + "metalk8s.scality.com" + ], + "resources": [ + "ingressnginxes", + "ingressnginxes/status", + "ingressnginxes/finalizers" + ], + "verbs": [ + "create", + "delete", + "get", + "list", + "patch", + "update", + "watch" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "pods", + "services", + "services/finalizers", + "endpoints", + "persistentvolumeclaims", + "events", + "configmaps", + "secrets" + ], + "verbs": [ + "create", + "delete", + "get", + "list", + "patch", + "update", + "watch" + ] + }, + { + "apiGroups": [ + "apps" + ], + "resources": [ + "deployments", + "daemonsets", + "replicasets", + "statefulsets" + ], + "verbs": [ + "create", + "delete", + "get", + "list", + "patch", + "update", + "watch" + ] + }, + { + "apiGroups": [ + "authentication.k8s.io" + ], + "resources": [ + "tokenreviews" + ], + "verbs": [ + "create" + ] + }, + { + "apiGroups": [ + "authorization.k8s.io" + ], + "resources": [ + "subjectaccessreviews" + ], + "verbs": [ + "create" + ] + }, + { + "apiGroups": [ + "monitoring.coreos.com" + ], + "resources": [ + "servicemonitors" + ], + "verbs": [ + "*" + ] + }, + { + "apiGroups": [ + "networking.k8s.io" + ], + "resources": [ + "ingressclasses" + ], + "verbs": [ + "*" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "serviceaccounts" + ], + "verbs": [ + "*" + ] + }, + { + "apiGroups": [ + "rbac.authorization.k8s.io" + ], + "resources": [ + "roles", + "rolebindings", + "clusterroles", + "clusterrolebindings" + ], + "verbs": [ + "*" + ] + }, + { + "apiGroups": [ + "rbac.authorization.k8s.io" + ], + "resources": [ + "clusterrolebindings" + ], + "verbs": [ + "create", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "rbac.authorization.k8s.io" + ], + "resources": [ + "clusterrolebindings" + ], + "verbs": [ + "get", + "update", + "patch", + "delete" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "configmaps" + ], + "verbs": [ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete" + ] + }, + { + "apiGroups": [ + "coordination.k8s.io" + ], + "resources": [ + "leases" + ], + "verbs": [ + "get", + "list", + "watch", + "create", + "update", + "patch", + "delete" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "events" + ], + "verbs": [ + "create", + "patch" + ] + } +] +--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: nginx-installer-admin + name: nginx-operator-installer-cluster-role-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-operator-installer-cluster-role subjects: -- kind: ServiceAccount - name: nginx-installer + - kind: ServiceAccount + name: nginx-operator-installer + namespace: nginx-operator +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: nginx-operator-installer-installer-role + namespace: nginx-operator +rules: [ + { + "apiGroups": [ + "apps" + ], + "resources": [ + "deployments" + ], + "verbs": [ + "create", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "apps" + ], + "resources": [ + "deployments" + ], + "verbs": [ + "get", + "update", + "patch", + "delete" + ], + "resourceNames": [ + "nginx-operator-controller-manager" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "serviceaccounts" + ], + "verbs": [ + "create", + "list", + "watch" + ] + }, + { + "apiGroups": [ + "" + ], + "resources": [ + "serviceaccounts" + ], + "verbs": [ + "get", + "update", + "patch", + "delete" + ], + "resourceNames": [ + "nginx-operator-controller-manager" + ] + } +] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: nginx-operator-installer-installer-role-binding namespace: nginx-operator roleRef: - kind: ClusterRole - name: cluster-admin apiGroup: rbac.authorization.k8s.io + kind: Role + name: nginx-operator-installer-installer-role +subjects: + - kind: ServiceAccount + name: nginx-operator-installer + namespace: nginx-operator + From cdcd70f176767fe886a3ff355755e87b294242fa Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Wed, 8 Jan 2025 11:43:58 +0100 Subject: [PATCH 15/33] install main ingress through ingress-operator --- .../addons/nginx-ingress/deployed/chart.sls | 511 ++---------------- 1 file changed, 36 insertions(+), 475 deletions(-) diff --git a/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls b/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls index 9586e867f8..dbe8141e9a 100644 --- a/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls +++ b/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls @@ -3,482 +3,43 @@ {%- from "metalk8s/map.jinja" import repo with context %} {%- from "metalk8s/repo/macro.sls" import build_image_name with context %} - - -{% raw %} - -apiVersion: v1 -automountServiceAccountToken: true -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx - namespace: metalk8s-ingress ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx - namespace: metalk8s-ingress -rules: -- apiGroups: - - '' - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets - - namespaces - verbs: - - list - - watch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - list - - watch -- apiGroups: - - '' - resources: - - nodes - verbs: - - get -- apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -- apiGroups: - - '' - resources: - - events - verbs: - - create - - patch -- apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update -- apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx - namespace: metalk8s-ingress -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx -subjects: -- kind: ServiceAccount - name: ingress-nginx - namespace: metalk8s-ingress ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx - namespace: metalk8s-ingress -rules: -- apiGroups: - - '' - resources: - - namespaces - verbs: - - get -- apiGroups: - - '' - resources: - - configmaps - - pods - - secrets - - endpoints - verbs: - - get - - list - - watch -- apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update -- apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch -- apiGroups: - - coordination.k8s.io - resourceNames: - - ingress-nginx-leader - resources: - - leases - verbs: - - get - - update -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create -- apiGroups: - - '' - resources: - - events - verbs: - - create - - patch -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding +apiVersion: metalk8s.scality.com/v1alpha1 +kind: IngressNginx metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s name: ingress-nginx namespace: metalk8s-ingress -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx -subjects: -- kind: ServiceAccount - name: ingress-nginx - namespace: metalk8s-ingress ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-controller-metrics - namespace: metalk8s-ingress -spec: - ports: - - name: metrics - port: 10254 - protocol: TCP - targetPort: metrics - selector: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - annotations: null - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-controller - namespace: metalk8s-ingress -spec: - ipFamilies: - - IPv4 - ipFamilyPolicy: SingleStack - ports: - - appProtocol: http - name: http - port: 80 - protocol: TCP - targetPort: http - - appProtocol: https - name: https - port: 443 - protocol: TCP - targetPort: https - selector: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - type: ClusterIP ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-controller - namespace: metalk8s-ingress -spec: - minReadySeconds: 0 - revisionHistoryLimit: 10 - selector: - matchLabels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - template: - metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - spec: - containers: - - args: - - /nginx-ingress-controller - - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - - --election-id=ingress-nginx-leader - - --controller-class=k8s.io/ingress-nginx - - --ingress-class=nginx - - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller - - --watch-ingress-without-class=true - - --default-backend-service=metalk8s-ui/metalk8s-ui - - --default-ssl-certificate=metalk8s-ingress/ingress-workload-plane-default-certificate - - --metrics-per-host=false - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - image: {% endraw -%}{{ build_image_name("nginx-ingress-controller", False) }}{%- raw %}:v1.11.3 - imagePullPolicy: IfNotPresent - lifecycle: - preStop: - exec: - command: - - /wait-shutdown - livenessProbe: - failureThreshold: 5 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - name: controller - ports: - - containerPort: 80 - hostPort: 80 - name: http - protocol: TCP - - containerPort: 443 - hostPort: 443 - name: https - protocol: TCP - - containerPort: 10254 - name: metrics - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - resources: - requests: - cpu: 100m - memory: 90Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - add: - - NET_BIND_SERVICE - drop: - - ALL - readOnlyRootFilesystem: false - runAsNonRoot: true - runAsUser: 101 - seccompProfile: - type: RuntimeDefault - dnsPolicy: ClusterFirst - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: ingress-nginx - terminationGracePeriodSeconds: 300 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/bootstrap - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/infra - operator: Exists ---- -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - annotations: - ingressclass.kubernetes.io/is-default-class: 'true' - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: nginx - namespace: metalk8s-ingress spec: - controller: k8s.io/ingress-nginx ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - metalk8s.scality.com/monitor: '' - name: ingress-nginx-controller - namespace: metalk8s-ingress -spec: - endpoints: - - interval: 30s - port: metrics - namespaceSelector: - matchNames: - - metalk8s-ingress - selector: - matchLabels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/name: ingress-nginx - -{% endraw %} + controller: + allowSnippetAnnotations: true + image: + digest: null + repository: {{ build_image_name("nginx-ingress-controller") }} + hostPort: + enabled: true + ingressClassResource: + default: true + watchIngressWithoutClass: true + admissionWebhooks: + enabled: false + kind: DaemonSet + tolerations: + - key: "node-role.kubernetes.io/bootstrap" + operator: "Exists" + effect: "NoSchedule" + - key: "node-role.kubernetes.io/infra" + operator: "Exists" + effect: "NoSchedule" + service: + type: ClusterIP + extraArgs: + default-backend-service: metalk8s-ui/metalk8s-ui + default-ssl-certificate: "metalk8s-ingress/ingress-workload-plane-default-certificate" + metrics-per-host: false + metrics: + enabled: true + serviceMonitor: + enabled: true + additionalLabels: + metalk8s.scality.com/monitor: '' + defaultBackend: + enabled: false From 46fdc59d04b18bc57a6e3d7229de2380f64c8d75 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 11:11:21 +0100 Subject: [PATCH 16/33] patch nginx-ingress chart: disable CM generation --- .../nginx-operator/bundles/v4.11.3.yaml | 2 +- nginx-operator/BUMPING.md | 8 ++++++ .../nginx-operator.clusterserviceversion.yaml | 2 +- .../templates/controller-configmap.yaml | 2 ++ .../helm-charts/ingress-nginx/values.yaml | 2 ++ nginx-operator/remove_configmap.patch | 27 +++++++++++++++++++ 6 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 nginx-operator/remove_configmap.patch diff --git a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml index 9b5fe5aa28..b3ce45e29a 100644 --- a/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml +++ b/catalog-source/catalog/nginx-operator/bundles/v4.11.3.yaml @@ -17,7 +17,7 @@ properties: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSJ9LCJzcGVjIjp7Imdyb3VwIjoibWV0YWxrOHMuc2NhbGl0eS5jb20iLCJuYW1lcyI6eyJraW5kIjoiSW5ncmVzc05naW54IiwibGlzdEtpbmQiOiJJbmdyZXNzTmdpbnhMaXN0IiwicGx1cmFsIjoiaW5ncmVzc25naW54ZXMiLCJzaW5ndWxhciI6ImluZ3Jlc3NuZ2lueCJ9LCJzY29wZSI6Ik5hbWVzcGFjZWQiLCJ2ZXJzaW9ucyI6W3sibmFtZSI6InYxYWxwaGExIiwic2NoZW1hIjp7Im9wZW5BUElWM1NjaGVtYSI6eyJkZXNjcmlwdGlvbiI6IkluZ3Jlc3NOZ2lueCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgaW5ncmVzc25naW54ZXMgQVBJIiwicHJvcGVydGllcyI6eyJhcGlWZXJzaW9uIjp7ImRlc2NyaXB0aW9uIjoiQVBJVmVyc2lvbiBkZWZpbmVzIHRoZSB2ZXJzaW9uZWQgc2NoZW1hIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBTZXJ2ZXJzIHNob3VsZCBjb252ZXJ0IHJlY29nbml6ZWQgc2NoZW1hcyB0byB0aGUgbGF0ZXN0IGludGVybmFsIHZhbHVlLCBhbmQgbWF5IHJlamVjdCB1bnJlY29nbml6ZWQgdmFsdWVzLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlcyIsInR5cGUiOiJzdHJpbmcifSwia2luZCI6eyJkZXNjcmlwdGlvbiI6IktpbmQgaXMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBSRVNUIHJlc291cmNlIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFNlcnZlcnMgbWF5IGluZmVyIHRoaXMgZnJvbSB0aGUgZW5kcG9pbnQgdGhlIGNsaWVudCBzdWJtaXRzIHJlcXVlc3RzIHRvLiBDYW5ub3QgYmUgdXBkYXRlZC4gSW4gQ2FtZWxDYXNlLiBNb3JlIGluZm86IGh0dHBzOi8vZ2l0Lms4cy5pby9jb21tdW5pdHkvY29udHJpYnV0b3JzL2RldmVsL3NpZy1hcmNoaXRlY3R1cmUvYXBpLWNvbnZlbnRpb25zLm1kI3R5cGVzLWtpbmRzIiwidHlwZSI6InN0cmluZyJ9LCJtZXRhZGF0YSI6eyJ0eXBlIjoib2JqZWN0In0sInNwZWMiOnsiZGVzY3JpcHRpb24iOiJTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgSW5ncmVzc05naW54IiwidHlwZSI6Im9iamVjdCIsIngta3ViZXJuZXRlcy1wcmVzZXJ2ZS11bmtub3duLWZpZWxkcyI6dHJ1ZX0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IlN0YXR1cyBkZWZpbmVzIHRoZSBvYnNlcnZlZCBzdGF0ZSBvZiBJbmdyZXNzTmdpbngiLCJ0eXBlIjoib2JqZWN0IiwieC1rdWJlcm5ldGVzLXByZXNlcnZlLXVua25vd24tZmllbGRzIjp0cnVlfX0sInR5cGUiOiJvYmplY3QifX0sInNlcnZlZCI6dHJ1ZSwic3RvcmFnZSI6dHJ1ZSwic3VicmVzb3VyY2VzIjp7InN0YXR1cyI6e319fV19LCJzdGF0dXMiOnsiYWNjZXB0ZWROYW1lcyI6eyJraW5kIjoiIiwicGx1cmFsIjoiIn0sImNvbmRpdGlvbnMiOm51bGwsInN0b3JlZFZlcnNpb25zIjpudWxsfX0= - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTA3VDE3OjU2OjE0WiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibW9uaXRvcmluZy5jb3Jlb3MuY29tIl0sInJlc291cmNlcyI6WyJzZXJ2aWNlbW9uaXRvcnMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyJuZXR3b3JraW5nLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsiaW5ncmVzc2NsYXNzZXMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlcnZpY2VhY2NvdW50cyJdLCJ2ZXJicyI6WyIqIl19LHsiYXBpR3JvdXBzIjpbInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8iXSwicmVzb3VyY2VzIjpbInJvbGVzIiwicm9sZWJpbmRpbmdzIiwiY2x1c3RlcnJvbGVzIiwiY2x1c3RlcnJvbGViaW5kaW5ncyJdLCJ2ZXJicyI6WyIqIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dLCJkZXBsb3ltZW50cyI6W3sibGFiZWwiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciIsImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifSwibmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsia3ViZWN0bC5rdWJlcm5ldGVzLmlvL2RlZmF1bHQtY29udGFpbmVyIjoibWFuYWdlciJ9LCJsYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3BlYyI6eyJjb250YWluZXJzIjpbeyJhcmdzIjpbIi0tbWV0cmljcy1yZXF1aXJlLXJiYWMiLCItLW1ldHJpY3Mtc2VjdXJlIiwiLS1tZXRyaWNzLWJpbmQtYWRkcmVzcz06ODQ0MyIsIi0tbGVhZGVyLWVsZWN0IiwiLS1sZWFkZXItZWxlY3Rpb24taWQ9bmdpbngtb3BlcmF0b3IiLCItLWhlYWx0aC1wcm9iZS1iaW5kLWFkZHJlc3M9OjgwODEiXSwiaW1hZ2UiOiJyZWdpc3RyeS5tZXRhbGs4cy5sYW4vbmdpbngtb3BlcmF0b3I6djQuMTEuMyIsImxpdmVuZXNzUHJvYmUiOnsiaHR0cEdldCI6eyJwYXRoIjoiL2hlYWx0aHoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTUsInBlcmlvZFNlY29uZHMiOjIwfSwibmFtZSI6Im1hbmFnZXIiLCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvcmVhZHl6IiwicG9ydCI6ODA4MX0sImluaXRpYWxEZWxheVNlY29uZHMiOjUsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIiwibWVtb3J5IjoiMTI4TWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNjRNaSJ9fSwic2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfX19XSwibm9kZVNlbGVjdG9yIjp7Imt1YmVybmV0ZXMuaW8vb3MiOiJsaW51eCIsIm5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2luZnJhIjoiIn0sInNlY3VyaXR5Q29udGV4dCI6eyJydW5Bc05vblJvb3QiOnRydWUsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwLCJ0b2xlcmF0aW9ucyI6W3siZWZmZWN0IjoiTm9TY2hlZHVsZSIsImtleSI6Im5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2Jvb3RzdHJhcCIsIm9wZXJhdG9yIjoiRXhpc3RzIn0seyJlZmZlY3QiOiJOb1NjaGVkdWxlIiwia2V5Ijoibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vaW5mcmEiLCJvcGVyYXRvciI6IkV4aXN0cyJ9XX19fX1dLCJwZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiY29vcmRpbmF0aW9uLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsibGVhc2VzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCIsImNyZWF0ZSIsInVwZGF0ZSIsInBhdGNoIiwiZGVsZXRlIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSIsInBhdGNoIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dfSwic3RyYXRlZ3kiOiJkZXBsb3ltZW50In0sImluc3RhbGxNb2RlcyI6W3sic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik93bk5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6IlNpbmdsZU5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik11bHRpTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOnRydWUsInR5cGUiOiJBbGxOYW1lc3BhY2VzIn1dLCJrZXl3b3JkcyI6WyJvcGVyYXRvciIsInNjYWxpdHkiLCJtZXRhbGs4cyIsIm5naW54Iiwia3ViZXJuZXRlcyJdLCJsaW5rcyI6W3sibmFtZSI6Ik5naW54IE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly9uZ2lueC1vcGVyYXRvci5kb21haW4ifV0sIm1haW50YWluZXJzIjpbeyJlbWFpbCI6ImF5b3ViLm5hc3JAc2NhbGl0eS5jb20iLCJuYW1lIjoiQXlvdWIgTmFzciJ9XSwibWF0dXJpdHkiOiJhbHBoYSIsInByb3ZpZGVyIjp7Im5hbWUiOiJzY2FsaXR5IiwidXJsIjoic2NhbGl0eS5jb20ifSwidmVyc2lvbiI6IjQuMTEuMyJ9fQ== + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwibWV0YWxrOHMuc2NhbGl0eS5jb20vdjFhbHBoYTFcIixcbiAgICBcImtpbmRcIjogXCJJbmdyZXNzTmdpbnhcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcImluZ3Jlc3NuZ2lueC1zYW1wbGVcIlxuICAgIH0sXG4gICAgXCJzcGVjXCI6IHtcbiAgICAgIFwiY29tbW9uTGFiZWxzXCI6IHt9LFxuICAgICAgXCJjb250cm9sbGVyXCI6IHtcbiAgICAgICAgXCJhZGRIZWFkZXJzXCI6IHt9LFxuICAgICAgICBcImFkbWlzc2lvbldlYmhvb2tzXCI6IHtcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgIFwiY2VydE1hbmFnZXJcIjoge1xuICAgICAgICAgICAgXCJhZG1pc3Npb25DZXJ0XCI6IHtcbiAgICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJyb290Q2VydFwiOiB7XG4gICAgICAgICAgICAgIFwiZHVyYXRpb25cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2NlcnRcIixcbiAgICAgICAgICBcImNyZWF0ZVNlY3JldEpvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJjcmVhdGVcIixcbiAgICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICAgICAgXCJzZWN1cml0eUNvbnRleHRcIjoge1xuICAgICAgICAgICAgICBcImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvblwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFwiZHJvcFwiOiBbXG4gICAgICAgICAgICAgICAgICBcIkFMTFwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW1cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzIsXG4gICAgICAgICAgICAgIFwic2VjY29tcFByb2ZpbGVcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICAgIFwiZmFpbHVyZVBvbGljeVwiOiBcIkZhaWxcIixcbiAgICAgICAgICBcImtleVwiOiBcIi91c3IvbG9jYWwvY2VydGlmaWNhdGVzL2tleVwiLFxuICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgIFwibmFtZVwiOiBcImFkbWlzc2lvblwiLFxuICAgICAgICAgIFwibmFtZXNwYWNlU2VsZWN0b3JcIjoge30sXG4gICAgICAgICAgXCJvYmplY3RTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICBcInBhdGNoXCI6IHtcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmE5ZjAzYjM0YTNjYmZiYjI2ZDEwM2ExNDA0NmFiMmM1MTMwYTgwYzNkNjlkNTI2ZmY4MDYzZDJiMzdiOWZkM2ZcIixcbiAgICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngva3ViZS13ZWJob29rLWNlcnRnZW5cIixcbiAgICAgICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgICAgXCJ0YWdcIjogXCJ2MS40LjRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJuZXR3b3JrUG9saWN5XCI6IHtcbiAgICAgICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJub2RlU2VsZWN0b3JcIjoge1xuICAgICAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb2RBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgICAgIFwicmJhY1wiOiB7XG4gICAgICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgICAgICBcImF1dG9tb3VudFNlcnZpY2VBY2NvdW50VG9rZW5cIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRvbGVyYXRpb25zXCI6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdGNoV2ViaG9va0pvYlwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogXCJwYXRjaFwiLFxuICAgICAgICAgICAgXCJyZXNvdXJjZXNcIjoge30sXG4gICAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJkcm9wXCI6IFtcbiAgICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB0cnVlLFxuICAgICAgICAgICAgICBcInJ1bkFzVXNlclwiOiA2NTUzMixcbiAgICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUnVudGltZURlZmF1bHRcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBvcnRcIjogODQ0MyxcbiAgICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxJUHNcIjogW10sXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwic2VydmljZVBvcnRcIjogNDQzLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYWxsb3dTbmlwcGV0QW5ub3RhdGlvbnNcIjogZmFsc2UsXG4gICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJiZWhhdmlvclwiOiB7fSxcbiAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgXCJtYXhSZXBsaWNhc1wiOiAxMSxcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdXRvc2NhbGluZ1RlbXBsYXRlXCI6IFtdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdBbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIixcbiAgICAgICAgXCJjb250YWluZXJOYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xuICAgICAgICAgIFwiaHR0cFwiOiA4MCxcbiAgICAgICAgICBcImh0dHBzXCI6IDQ0M1xuICAgICAgICB9LFxuICAgICAgICBcImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJjdXN0b21UZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgXCJjb25maWdNYXBLZXlcIjogXCJcIixcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcImRpc2FibGVMZWFkZXJFbGVjdGlvblwiOiBmYWxzZSxcbiAgICAgICAgXCJkbnNDb25maWdcIjoge30sXG4gICAgICAgIFwiZG5zUG9saWN5XCI6IFwiQ2x1c3RlckZpcnN0XCIsXG4gICAgICAgIFwiZWxlY3Rpb25JRFwiOiBcIlwiLFxuICAgICAgICBcImVsZWN0aW9uVFRMXCI6IFwiXCIsXG4gICAgICAgIFwiZW5hYmxlQW5ub3RhdGlvblZhbGlkYXRpb25zXCI6IGZhbHNlLFxuICAgICAgICBcImVuYWJsZU1pbWFsbG9jXCI6IHRydWUsXG4gICAgICAgIFwiZW5hYmxlVG9wb2xvZ3lBd2FyZVJvdXRpbmdcIjogZmFsc2UsXG4gICAgICAgIFwiZXhpc3RpbmdQc3BcIjogXCJcIixcbiAgICAgICAgXCJleHRyYUFyZ3NcIjoge30sXG4gICAgICAgIFwiZXh0cmFDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhRW52c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYUluaXRDb250YWluZXJzXCI6IFtdLFxuICAgICAgICBcImV4dHJhTW9kdWxlc1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZU1vdW50c1wiOiBbXSxcbiAgICAgICAgXCJleHRyYVZvbHVtZXNcIjogW10sXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tIb3N0XCI6IFwiXCIsXG4gICAgICAgIFwiaGVhbHRoQ2hlY2tQYXRoXCI6IFwiL2hlYWx0aHpcIixcbiAgICAgICAgXCJob3N0QWxpYXNlc1wiOiBbXSxcbiAgICAgICAgXCJob3N0TmV0d29ya1wiOiBmYWxzZSxcbiAgICAgICAgXCJob3N0UG9ydFwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaG9zdG5hbWVcIjoge30sXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgIFwiY2hyb290XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmQ1NmYxMzViNjQ2MmNmYzQ3NjQ0N2NmZTU2NGI4M2E0NWU4YmI3ZGEyNzc0OTYzYjAwZDEyMTYxMTEyMjcwYjdcIixcbiAgICAgICAgICBcImRpZ2VzdENocm9vdFwiOiBcInNoYTI1NjoyMjcwMWYwZmMwZjJkZDIwOWVmNzgyZjRlMjgxYmZlMmQ4Y2NjZDUwZWRlZGEwMGFlYzg4ZTBjZGJlN2VkZDE0XCIsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3MtbmdpbngvY29udHJvbGxlclwiLFxuICAgICAgICAgIFwicHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxuICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiBmYWxzZSxcbiAgICAgICAgICBcInJlZ2lzdHJ5XCI6IFwicmVnaXN0cnkuazhzLmlvXCIsXG4gICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiAxMDEsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcInYxLjExLjNcIlxuICAgICAgICB9LFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1wiOiBcIm5naW54XCIsXG4gICAgICAgIFwiaW5ncmVzc0NsYXNzQnlOYW1lXCI6IGZhbHNlLFxuICAgICAgICBcImluZ3Jlc3NDbGFzc1Jlc291cmNlXCI6IHtcbiAgICAgICAgICBcImFsaWFzZXNcIjogW10sXG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbnRyb2xsZXJWYWx1ZVwiOiBcIms4cy5pby9pbmdyZXNzLW5naW54XCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGZhbHNlLFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm5naW54XCIsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIFwia2VkYVwiOiB7XG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IFwia2VkYS5zaC92MWFscGhhMVwiLFxuICAgICAgICAgIFwiYmVoYXZpb3JcIjoge30sXG4gICAgICAgICAgXCJjb29sZG93blBlcmlvZFwiOiAzMDAsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMTEsXG4gICAgICAgICAgXCJtaW5SZXBsaWNhc1wiOiAxLFxuICAgICAgICAgIFwicG9sbGluZ0ludGVydmFsXCI6IDMwLFxuICAgICAgICAgIFwicmVzdG9yZVRvT3JpZ2luYWxSZXBsaWNhQ291bnRcIjogZmFsc2UsXG4gICAgICAgICAgXCJzY2FsZWRPYmplY3RcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0cmlnZ2Vyc1wiOiBbXVxuICAgICAgICB9LFxuICAgICAgICBcImtpbmRcIjogXCJEZXBsb3ltZW50XCIsXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpZmVjeWNsZVwiOiB7XG4gICAgICAgICAgXCJwcmVTdG9wXCI6IHtcbiAgICAgICAgICAgIFwiZXhlY1wiOiB7XG4gICAgICAgICAgICAgIFwiY29tbWFuZFwiOiBbXG4gICAgICAgICAgICAgICAgXCIvd2FpdC1zaHV0ZG93blwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGl2ZW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDUsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXhtaW5kTGljZW5zZUtleVwiOiBcIlwiLFxuICAgICAgICBcIm1ldHJpY3NcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgXCJwb3J0TmFtZVwiOiBcIm1ldHJpY3NcIixcbiAgICAgICAgICBcInByb21ldGhldXNSdWxlXCI6IHtcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbExhYmVsc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwicnVsZXNcIjogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgICBcImFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXNcIjogW10sXG4gICAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDEwMjU0LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiQ2x1c3RlcklQXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VydmljZU1vbml0b3JcIjoge1xuICAgICAgICAgICAgXCJhZGRpdGlvbmFsTGFiZWxzXCI6IHt9LFxuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwibWV0cmljUmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcIm5hbWVzcGFjZVwiOiBcIlwiLFxuICAgICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiB7fSxcbiAgICAgICAgICAgIFwicmVsYWJlbGluZ3NcIjogW10sXG4gICAgICAgICAgICBcInNjcmFwZUludGVydmFsXCI6IFwiMzBzXCIsXG4gICAgICAgICAgICBcInRhcmdldExhYmVsc1wiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtaW5BdmFpbGFibGVcIjogMSxcbiAgICAgICAgXCJtaW5SZWFkeVNlY29uZHNcIjogMCxcbiAgICAgICAgXCJuYW1lXCI6IFwiY29udHJvbGxlclwiLFxuICAgICAgICBcIm5ldHdvcmtQb2xpY3lcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vZGVTZWxlY3RvclwiOiB7XG4gICAgICAgICAgXCJrdWJlcm5ldGVzLmlvL29zXCI6IFwibGludXhcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW50ZWxlbWV0cnlcIjoge1xuICAgICAgICAgIFwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0XCI6IHtcbiAgICAgICAgICAgIFwiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjoge1xuICAgICAgICAgICAgICBcImRyb3BcIjogW1xuICAgICAgICAgICAgICAgIFwiQUxMXCJcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVhZE9ubHlSb290RmlsZXN5c3RlbVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJydW5Bc05vblJvb3RcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicnVuQXNVc2VyXCI6IDY1NTMyLFxuICAgICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcIlJ1bnRpbWVEZWZhdWx0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiZGlnZXN0XCI6IFwic2hhMjU2OmY3NjA0YWMwNTQ3ZWQ2NGQ3OWI5OGQ5MjEzMzIzNGU2NmMyYzhhYWRlM2MxZjQ4MDlmZWQ1ZWVjMWZiN2Y5MjJcIixcbiAgICAgICAgICAgIFwiZGlzdHJvbGVzc1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImluZ3Jlc3Mtbmdpbngvb3BlbnRlbGVtZXRyeS0xLjI1LjNcIixcbiAgICAgICAgICAgIFwicmVnaXN0cnlcIjogXCJyZWdpc3RyeS5rOHMuaW9cIixcbiAgICAgICAgICAgIFwidGFnXCI6IFwidjIwMjQwODEzLWI5MzMzMTBkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibmFtZVwiOiBcIm9wZW50ZWxlbWV0cnlcIixcbiAgICAgICAgICBcInJlc291cmNlc1wiOiB7fVxuICAgICAgICB9LFxuICAgICAgICBcInBvZEFubm90YXRpb25zXCI6IHt9LFxuICAgICAgICBcInBvZExhYmVsc1wiOiB7fSxcbiAgICAgICAgXCJwb2RTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJwcm94eVNldEhlYWRlcnNcIjoge30sXG4gICAgICAgIFwicHVibGlzaFNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICAgIFwicGF0aE92ZXJyaWRlXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDMsXG4gICAgICAgICAgXCJodHRwR2V0XCI6IHtcbiAgICAgICAgICAgIFwicGF0aFwiOiBcIi9oZWFsdGh6XCIsXG4gICAgICAgICAgICBcInBvcnRcIjogMTAyNTQsXG4gICAgICAgICAgICBcInNjaGVtZVwiOiBcIkhUVFBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDEwLFxuICAgICAgICAgIFwicGVyaW9kU2Vjb25kc1wiOiAxMCxcbiAgICAgICAgICBcInN1Y2Nlc3NUaHJlc2hvbGRcIjogMSxcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXBsaWNhQ291bnRcIjogMSxcbiAgICAgICAgXCJyZXBvcnROb2RlSW50ZXJuYWxJcFwiOiBmYWxzZSxcbiAgICAgICAgXCJyZXNvdXJjZXNcIjoge1xuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xuICAgICAgICAgICAgXCJjcHVcIjogXCIxMDBtXCIsXG4gICAgICAgICAgICBcIm1lbW9yeVwiOiBcIjkwTWlcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzY29wZVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IFwiXCIsXG4gICAgICAgICAgXCJuYW1lc3BhY2VTZWxlY3RvclwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZVwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImFwcFByb3RvY29sXCI6IHRydWUsXG4gICAgICAgICAgXCJjbHVzdGVySVBcIjogXCJcIixcbiAgICAgICAgICBcImVuYWJsZUh0dHBcIjogdHJ1ZSxcbiAgICAgICAgICBcImVuYWJsZUh0dHBzXCI6IHRydWUsXG4gICAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgICAgXCJleHRlcm5hbFwiOiB7XG4gICAgICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOiBcIlwiLFxuICAgICAgICAgIFwiaW50ZXJuYWxcIjoge1xuICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICAgIFwiYXBwUHJvdG9jb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiY2x1c3RlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImVuYWJsZWRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImV4dGVybmFsSVBzXCI6IFtdLFxuICAgICAgICAgICAgXCJleHRlcm5hbFRyYWZmaWNQb2xpY3lcIjogXCJcIixcbiAgICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICAgIFwiSVB2NFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlckNsYXNzXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlcklQXCI6IFwiXCIsXG4gICAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICAgIFwibm9kZVBvcnRzXCI6IHtcbiAgICAgICAgICAgICAgXCJodHRwXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICAgICAgICAgIFwidWRwXCI6IHt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwb3J0c1wiOiB7fSxcbiAgICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgICBcInRhcmdldFBvcnRzXCI6IHt9LFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiaXBGYW1pbGllc1wiOiBbXG4gICAgICAgICAgICBcIklQdjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJpcEZhbWlseVBvbGljeVwiOiBcIlNpbmdsZVN0YWNrXCIsXG4gICAgICAgICAgXCJsYWJlbHNcIjoge30sXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJDbGFzc1wiOiBcIlwiLFxuICAgICAgICAgIFwibG9hZEJhbGFuY2VySVBcIjogXCJcIixcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcIm5vZGVQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJcIixcbiAgICAgICAgICAgIFwiaHR0cHNcIjogXCJcIixcbiAgICAgICAgICAgIFwidGNwXCI6IHt9LFxuICAgICAgICAgICAgXCJ1ZHBcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicG9ydHNcIjoge1xuICAgICAgICAgICAgXCJodHRwXCI6IDgwLFxuICAgICAgICAgICAgXCJodHRwc1wiOiA0NDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IFwiXCIsXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0c1wiOiB7XG4gICAgICAgICAgICBcImh0dHBcIjogXCJodHRwXCIsXG4gICAgICAgICAgICBcImh0dHBzXCI6IFwiaHR0cHNcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiTG9hZEJhbGFuY2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaGFyZVByb2Nlc3NOYW1lc3BhY2VcIjogZmFsc2UsXG4gICAgICAgIFwic3lzY3Rsc1wiOiB7fSxcbiAgICAgICAgXCJ0Y3BcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJjb25maWdNYXBOYW1lc3BhY2VcIjogXCJcIlxuICAgICAgICB9LFxuICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IDMwMCxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVkcFwiOiB7XG4gICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgICBcImNvbmZpZ01hcE5hbWVzcGFjZVwiOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlU3RyYXRlZ3lcIjoge30sXG4gICAgICAgIFwid2F0Y2hJbmdyZXNzV2l0aG91dENsYXNzXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJkZWZhdWx0QmFja2VuZFwiOiB7XG4gICAgICAgIFwiYWZmaW5pdHlcIjoge30sXG4gICAgICAgIFwiYXV0b3NjYWxpbmdcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlLFxuICAgICAgICAgIFwibWF4UmVwbGljYXNcIjogMixcbiAgICAgICAgICBcIm1pblJlcGxpY2FzXCI6IDEsXG4gICAgICAgICAgXCJ0YXJnZXRDUFVVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTAsXG4gICAgICAgICAgXCJ0YXJnZXRNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRhZ2VcIjogNTBcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb250YWluZXJTZWN1cml0eUNvbnRleHRcIjoge30sXG4gICAgICAgIFwiZW5hYmxlZFwiOiBmYWxzZSxcbiAgICAgICAgXCJleGlzdGluZ1BzcFwiOiBcIlwiLFxuICAgICAgICBcImV4dHJhQXJnc1wiOiB7fSxcbiAgICAgICAgXCJleHRyYUNvbmZpZ01hcHNcIjogW10sXG4gICAgICAgIFwiZXh0cmFFbnZzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lTW91bnRzXCI6IFtdLFxuICAgICAgICBcImV4dHJhVm9sdW1lc1wiOiBbXSxcbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZUVzY2FsYXRpb25cIjogZmFsc2UsXG4gICAgICAgICAgXCJpbWFnZVwiOiBcImRlZmF1bHRiYWNrZW5kLWFtZDY0XCIsXG4gICAgICAgICAgXCJwdWxsUG9saWN5XCI6IFwiSWZOb3RQcmVzZW50XCIsXG4gICAgICAgICAgXCJyZWFkT25seVJvb3RGaWxlc3lzdGVtXCI6IHRydWUsXG4gICAgICAgICAgXCJyZWdpc3RyeVwiOiBcInJlZ2lzdHJ5Lms4cy5pb1wiLFxuICAgICAgICAgIFwicnVuQXNOb25Sb290XCI6IHRydWUsXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjogNjU1MzQsXG4gICAgICAgICAgXCJzZWNjb21wUHJvZmlsZVwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJSdW50aW1lRGVmYXVsdFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInRhZ1wiOiBcIjEuNVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxzXCI6IHt9LFxuICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xuICAgICAgICAgIFwiZmFpbHVyZVRocmVzaG9sZFwiOiAzLFxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiAzMCxcbiAgICAgICAgICBcInBlcmlvZFNlY29uZHNcIjogMTAsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwibWluQXZhaWxhYmxlXCI6IDEsXG4gICAgICAgIFwibWluUmVhZHlTZWNvbmRzXCI6IDAsXG4gICAgICAgIFwibmFtZVwiOiBcImRlZmF1bHRiYWNrZW5kXCIsXG4gICAgICAgIFwibmV0d29ya1BvbGljeVwiOiB7XG4gICAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcbiAgICAgICAgICBcImt1YmVybmV0ZXMuaW8vb3NcIjogXCJsaW51eFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicG9kQW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgIFwicG9kTGFiZWxzXCI6IHt9LFxuICAgICAgICBcInBvZFNlY3VyaXR5Q29udGV4dFwiOiB7fSxcbiAgICAgICAgXCJwb3J0XCI6IDgwODAsXG4gICAgICAgIFwicHJpb3JpdHlDbGFzc05hbWVcIjogXCJcIixcbiAgICAgICAgXCJyZWFkaW5lc3NQcm9iZVwiOiB7XG4gICAgICAgICAgXCJmYWlsdXJlVGhyZXNob2xkXCI6IDYsXG4gICAgICAgICAgXCJpbml0aWFsRGVsYXlTZWNvbmRzXCI6IDAsXG4gICAgICAgICAgXCJwZXJpb2RTZWNvbmRzXCI6IDUsXG4gICAgICAgICAgXCJzdWNjZXNzVGhyZXNob2xkXCI6IDEsXG4gICAgICAgICAgXCJ0aW1lb3V0U2Vjb25kc1wiOiA1XG4gICAgICAgIH0sXG4gICAgICAgIFwicmVwbGljYUNvdW50XCI6IDEsXG4gICAgICAgIFwicmVzb3VyY2VzXCI6IHt9LFxuICAgICAgICBcInNlcnZpY2VcIjoge1xuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge30sXG4gICAgICAgICAgXCJleHRlcm5hbElQc1wiOiBbXSxcbiAgICAgICAgICBcImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlc1wiOiBbXSxcbiAgICAgICAgICBcInNlcnZpY2VQb3J0XCI6IDgwLFxuICAgICAgICAgIFwidHlwZVwiOiBcIkNsdXN0ZXJJUFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VydmljZUFjY291bnRcIjoge1xuICAgICAgICAgIFwiYXV0b21vdW50U2VydmljZUFjY291bnRUb2tlblwiOiB0cnVlLFxuICAgICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0b2xlcmF0aW9uc1wiOiBbXSxcbiAgICAgICAgXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6IFtdLFxuICAgICAgICBcInVwZGF0ZVN0cmF0ZWd5XCI6IHt9XG4gICAgICB9LFxuICAgICAgXCJkaFBhcmFtXCI6IFwiXCIsXG4gICAgICBcImltYWdlUHVsbFNlY3JldHNcIjogW10sXG4gICAgICBcIm5hbWVzcGFjZU92ZXJyaWRlXCI6IFwiXCIsXG4gICAgICBcInBvZFNlY3VyaXR5UG9saWN5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IGZhbHNlXG4gICAgICB9LFxuICAgICAgXCJwb3J0TmFtZVByZWZpeFwiOiBcIlwiLFxuICAgICAgXCJyYmFjXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjogdHJ1ZSxcbiAgICAgICAgXCJzY29wZVwiOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIFwicmV2aXNpb25IaXN0b3J5TGltaXRcIjogMTAsXG4gICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcbiAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiB7fSxcbiAgICAgICAgXCJhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuXCI6IHRydWUsXG4gICAgICAgIFwiY3JlYXRlXCI6IHRydWUsXG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgICB9LFxuICAgICAgXCJ0Y3BcIjoge30sXG4gICAgICBcInVkcFwiOiB7fVxuICAgIH1cbiAgfVxuXSIsImNhcGFiaWxpdGllcyI6IkJhc2ljIEluc3RhbGwiLCJjcmVhdGVkQXQiOiIyMDI1LTAxLTA5VDEwOjA4OjUzWiIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjM4LjAiLCJvcGVyYXRvcnMub3BlcmF0b3JmcmFtZXdvcmsuaW8vcHJvamVjdF9sYXlvdXQiOiJoZWxtLnNkay5vcGVyYXRvcmZyYW1ld29yay5pby92MSJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3IudjQuMTEuMyIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IkluZ3Jlc3NOZ2lueCIsIm5hbWUiOiJpbmdyZXNzbmdpbnhlcy5tZXRhbGs4cy5zY2FsaXR5LmNvbSIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sImRlc2NyaXB0aW9uIjoiT3BlcmF0b3IgTWFuYWdlcyBLdWJlcm5ldGVzIE5naW54IENvbnRyb2xsZXJzIiwiZGlzcGxheU5hbWUiOiJuZ2lueC1vcGVyYXRvciIsImljb24iOlt7ImJhc2U2NGRhdGEiOiIiLCJtZWRpYXR5cGUiOiIifV0sImluc3RhbGwiOnsic3BlYyI6eyJjbHVzdGVyUGVybWlzc2lvbnMiOlt7InJ1bGVzIjpbeyJhcGlHcm91cHMiOlsiIl0sInJlc291cmNlcyI6WyJuYW1lc3BhY2VzIl0sInZlcmJzIjpbImdldCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlY3JldHMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImV2ZW50cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIiwiaW5ncmVzc25naW54ZXMvc3RhdHVzIiwiaW5ncmVzc25naW54ZXMvZmluYWxpemVycyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInBvZHMiLCJzZXJ2aWNlcyIsInNlcnZpY2VzL2ZpbmFsaXplcnMiLCJlbmRwb2ludHMiLCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zIiwiZXZlbnRzIiwiY29uZmlnbWFwcyIsInNlY3JldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXBwcyJdLCJyZXNvdXJjZXMiOlsiZGVwbG95bWVudHMiLCJkYWVtb25zZXRzIiwicmVwbGljYXNldHMiLCJzdGF0ZWZ1bHNldHMiXSwidmVyYnMiOlsiY3JlYXRlIiwiZGVsZXRlIiwiZ2V0IiwibGlzdCIsInBhdGNoIiwidXBkYXRlIiwid2F0Y2giXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX0seyJhcGlHcm91cHMiOlsibW9uaXRvcmluZy5jb3Jlb3MuY29tIl0sInJlc291cmNlcyI6WyJzZXJ2aWNlbW9uaXRvcnMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyJuZXR3b3JraW5nLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsiaW5ncmVzc2NsYXNzZXMiXSwidmVyYnMiOlsiKiJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbInNlcnZpY2VhY2NvdW50cyJdLCJ2ZXJicyI6WyIqIl19LHsiYXBpR3JvdXBzIjpbInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8iXSwicmVzb3VyY2VzIjpbInJvbGVzIiwicm9sZWJpbmRpbmdzIiwiY2x1c3RlcnJvbGVzIiwiY2x1c3RlcnJvbGViaW5kaW5ncyJdLCJ2ZXJicyI6WyIqIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dLCJkZXBsb3ltZW50cyI6W3sibGFiZWwiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciIsImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifSwibmFtZSI6Im5naW54LW9wZXJhdG9yLWNvbnRyb2xsZXItbWFuYWdlciIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsia3ViZWN0bC5rdWJlcm5ldGVzLmlvL2RlZmF1bHQtY29udGFpbmVyIjoibWFuYWdlciJ9LCJsYWJlbHMiOnsiY29udHJvbC1wbGFuZSI6ImNvbnRyb2xsZXItbWFuYWdlciJ9fSwic3BlYyI6eyJjb250YWluZXJzIjpbeyJhcmdzIjpbIi0tbWV0cmljcy1yZXF1aXJlLXJiYWMiLCItLW1ldHJpY3Mtc2VjdXJlIiwiLS1tZXRyaWNzLWJpbmQtYWRkcmVzcz06ODQ0MyIsIi0tbGVhZGVyLWVsZWN0IiwiLS1sZWFkZXItZWxlY3Rpb24taWQ9bmdpbngtb3BlcmF0b3IiLCItLWhlYWx0aC1wcm9iZS1iaW5kLWFkZHJlc3M9OjgwODEiXSwiaW1hZ2UiOiJyZWdpc3RyeS5tZXRhbGs4cy5sYW4vbmdpbngtb3BlcmF0b3I6djQuMTEuMyIsImxpdmVuZXNzUHJvYmUiOnsiaHR0cEdldCI6eyJwYXRoIjoiL2hlYWx0aHoiLCJwb3J0Ijo4MDgxfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTUsInBlcmlvZFNlY29uZHMiOjIwfSwibmFtZSI6Im1hbmFnZXIiLCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvcmVhZHl6IiwicG9ydCI6ODA4MX0sImluaXRpYWxEZWxheVNlY29uZHMiOjUsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIiwibWVtb3J5IjoiMTI4TWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNjRNaSJ9fSwic2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfX19XSwibm9kZVNlbGVjdG9yIjp7Imt1YmVybmV0ZXMuaW8vb3MiOiJsaW51eCIsIm5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2luZnJhIjoiIn0sInNlY3VyaXR5Q29udGV4dCI6eyJydW5Bc05vblJvb3QiOnRydWUsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIiwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwLCJ0b2xlcmF0aW9ucyI6W3siZWZmZWN0IjoiTm9TY2hlZHVsZSIsImtleSI6Im5vZGUtcm9sZS5rdWJlcm5ldGVzLmlvL2Jvb3RzdHJhcCIsIm9wZXJhdG9yIjoiRXhpc3RzIn0seyJlZmZlY3QiOiJOb1NjaGVkdWxlIiwia2V5Ijoibm9kZS1yb2xlLmt1YmVybmV0ZXMuaW8vaW5mcmEiLCJvcGVyYXRvciI6IkV4aXN0cyJ9XX19fX1dLCJwZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMiXSwidmVyYnMiOlsiZ2V0IiwibGlzdCIsIndhdGNoIiwiY3JlYXRlIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiXX0seyJhcGlHcm91cHMiOlsiY29vcmRpbmF0aW9uLms4cy5pbyJdLCJyZXNvdXJjZXMiOlsibGVhc2VzIl0sInZlcmJzIjpbImdldCIsImxpc3QiLCJ3YXRjaCIsImNyZWF0ZSIsInVwZGF0ZSIsInBhdGNoIiwiZGVsZXRlIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSIsInBhdGNoIl19XSwic2VydmljZUFjY291bnROYW1lIjoibmdpbngtb3BlcmF0b3ItY29udHJvbGxlci1tYW5hZ2VyIn1dfSwic3RyYXRlZ3kiOiJkZXBsb3ltZW50In0sImluc3RhbGxNb2RlcyI6W3sic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik93bk5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6IlNpbmdsZU5hbWVzcGFjZSJ9LHsic3VwcG9ydGVkIjpmYWxzZSwidHlwZSI6Ik11bHRpTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOnRydWUsInR5cGUiOiJBbGxOYW1lc3BhY2VzIn1dLCJrZXl3b3JkcyI6WyJvcGVyYXRvciIsInNjYWxpdHkiLCJtZXRhbGs4cyIsIm5naW54Iiwia3ViZXJuZXRlcyJdLCJsaW5rcyI6W3sibmFtZSI6Ik5naW54IE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly9uZ2lueC1vcGVyYXRvci5kb21haW4ifV0sIm1haW50YWluZXJzIjpbeyJlbWFpbCI6ImF5b3ViLm5hc3JAc2NhbGl0eS5jb20iLCJuYW1lIjoiQXlvdWIgTmFzciJ9XSwibWF0dXJpdHkiOiJhbHBoYSIsInByb3ZpZGVyIjp7Im5hbWUiOiJzY2FsaXR5IiwidXJsIjoic2NhbGl0eS5jb20ifSwidmVyc2lvbiI6IjQuMTEuMyJ9fQ== - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MSIsImtpbmQiOiJDbHVzdGVyUm9sZSIsIm1ldGFkYXRhIjp7ImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJsYWJlbHMiOnsiYXBwLmt1YmVybmV0ZXMuaW8vbWFuYWdlZC1ieSI6Imt1c3RvbWl6ZSIsImFwcC5rdWJlcm5ldGVzLmlvL25hbWUiOiJuZ2lueC1vcGVyYXRvciJ9LCJuYW1lIjoibmdpbngtb3BlcmF0b3ItaW5ncmVzc25naW54LWVkaXRvci1yb2xlIn0sInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsibWV0YWxrOHMuc2NhbGl0eS5jb20iXSwicmVzb3VyY2VzIjpbImluZ3Jlc3NuZ2lueGVzIl0sInZlcmJzIjpbImNyZWF0ZSIsImRlbGV0ZSIsImdldCIsImxpc3QiLCJwYXRjaCIsInVwZGF0ZSIsIndhdGNoIl19LHsiYXBpR3JvdXBzIjpbIm1ldGFsazhzLnNjYWxpdHkuY29tIl0sInJlc291cmNlcyI6WyJpbmdyZXNzbmdpbnhlcy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0Il19XX0= diff --git a/nginx-operator/BUMPING.md b/nginx-operator/BUMPING.md index a3ab71e7ac..079e5fc8b7 100644 --- a/nginx-operator/BUMPING.md +++ b/nginx-operator/BUMPING.md @@ -10,8 +10,16 @@ rm -rf helm-charts/ingress-nginx helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm fetch -d helm-charts --untar https://kubernetes.github.io/ingress-nginx/ingress-nginx --version $VERSION +git apply remove_configmap.patch sed -i "s/^VERSION.*/VERSION ?= $VERSION/" Makefile make bundle ``` also change `NGINX_OPERATOR_VERSION` in `buildchain/buildchain/versions.py`. + +### About the patch + +The ConfigMaps are managed by salt. Previously, they were automatically deleted from the manifest +after generating the chart. +If we keep them, they interfere with the salt-generated configmap. +We don't have a way to disable the configmap generation, so we patch it in the chart. diff --git a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml index a438a5a8b2..5a06cc0700 100644 --- a/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml +++ b/nginx-operator/bundle/manifests/nginx-operator.clusterserviceversion.yaml @@ -506,7 +506,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2025-01-07T17:56:14Z" + createdAt: "2025-01-09T10:08:53Z" operators.operatorframework.io/builder: operator-sdk-v1.38.0 operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 name: nginx-operator.v4.11.3 diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml index 22080d115f..e24a967426 100644 --- a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml +++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml @@ -1,3 +1,4 @@ +{{- if .Values.controller.generateConfigMap -}} apiVersion: v1 kind: ConfigMap metadata: @@ -26,3 +27,4 @@ data: {{- range $key, $value := .Values.controller.config }} {{- $key | nindent 2 }}: {{ tpl (toString $value) $ | quote }} {{- end }} +{{- end }} diff --git a/nginx-operator/helm-charts/ingress-nginx/values.yaml b/nginx-operator/helm-charts/ingress-nginx/values.yaml index f42a6821dc..6c44a3a921 100644 --- a/nginx-operator/helm-charts/ingress-nginx/values.yaml +++ b/nginx-operator/helm-charts/ingress-nginx/values.yaml @@ -48,6 +48,8 @@ controller: # -- Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. # Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ config: {} + # -- whether to generate the configmap object or not + generateConfigMap: false # -- Annotations to be added to the controller config configuration configmap. configAnnotations: {} # -- Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers diff --git a/nginx-operator/remove_configmap.patch b/nginx-operator/remove_configmap.patch new file mode 100644 index 0000000000..eadba8db08 --- /dev/null +++ b/nginx-operator/remove_configmap.patch @@ -0,0 +1,27 @@ +diff --git a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml +index 22080d115..e24a96742 100644 +--- a/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml ++++ b/nginx-operator/helm-charts/ingress-nginx/templates/controller-configmap.yaml +@@ -1,3 +1,4 @@ ++{{- if .Values.controller.generateConfigMap -}} + apiVersion: v1 + kind: ConfigMap + metadata: +@@ -26,3 +27,4 @@ data: + {{- range $key, $value := .Values.controller.config }} + {{- $key | nindent 2 }}: {{ tpl (toString $value) $ | quote }} + {{- end }} ++{{- end }} +diff --git a/nginx-operator/helm-charts/ingress-nginx/values.yaml b/nginx-operator/helm-charts/ingress-nginx/values.yaml +index f42a6821d..6c44a3a92 100644 +--- a/nginx-operator/helm-charts/ingress-nginx/values.yaml ++++ b/nginx-operator/helm-charts/ingress-nginx/values.yaml +@@ -48,6 +48,8 @@ controller: + # -- Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. + # Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ + config: {} ++ # -- whether to generate the configmap object or not ++ generateConfigMap: false + # -- Annotations to be added to the controller config configuration configmap. + configAnnotations: {} + # -- Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers From 6b31da340f919b6abd6a7d7170b56b81e8fa1759 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 15:38:58 +0100 Subject: [PATCH 17/33] fix image registry in ClusterExtension --- salt/metalk8s/addons/nginx-ingress/deployed/chart.sls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls b/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls index dbe8141e9a..18ad8fae77 100644 --- a/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls +++ b/salt/metalk8s/addons/nginx-ingress/deployed/chart.sls @@ -13,7 +13,7 @@ spec: allowSnippetAnnotations: true image: digest: null - repository: {{ build_image_name("nginx-ingress-controller") }} + repository: {{ build_image_name("nginx-ingress-controller", False) }} hostPort: enabled: true ingressClassResource: From 769325e6d14a7e308bb35f0ec5ae564cb50db0c5 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 17:40:50 +0100 Subject: [PATCH 18/33] replace control plane ingress with operator generated --- .../deployed/chart.sls | 517 ++---------------- 1 file changed, 46 insertions(+), 471 deletions(-) diff --git a/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/chart.sls b/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/chart.sls index f61f7a059d..b53360f91d 100644 --- a/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/chart.sls +++ b/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/chart.sls @@ -3,478 +3,53 @@ {%- from "metalk8s/map.jinja" import repo with context %} {%- from "metalk8s/repo/macro.sls" import build_image_name with context %} - - -{% raw %} - -apiVersion: v1 -automountServiceAccountToken: true -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane - namespace: metalk8s-ingress ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane - namespace: metalk8s-ingress -rules: -- apiGroups: - - '' - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets - - namespaces - verbs: - - list - - watch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - list - - watch -- apiGroups: - - '' - resources: - - nodes - verbs: - - get -- apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -- apiGroups: - - '' - resources: - - events - verbs: - - create - - patch -- apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update -- apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane - namespace: metalk8s-ingress -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx-control-plane -subjects: -- kind: ServiceAccount - name: ingress-nginx-control-plane - namespace: metalk8s-ingress ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane - namespace: metalk8s-ingress -rules: -- apiGroups: - - '' - resources: - - namespaces - verbs: - - get -- apiGroups: - - '' - resources: - - configmaps - - pods - - secrets - - endpoints - verbs: - - get - - list - - watch -- apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update -- apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch -- apiGroups: - - coordination.k8s.io - resourceNames: - - ingress-control-plane-controller-leader - resources: - - leases - verbs: - - get - - update -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create -- apiGroups: - - '' - resources: - - events - verbs: - - create - - patch -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding +apiVersion: metalk8s.scality.com/v1alpha1 +kind: IngressNginx metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s name: ingress-nginx-control-plane namespace: metalk8s-ingress -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx-control-plane -subjects: -- kind: ServiceAccount - name: ingress-nginx-control-plane - namespace: metalk8s-ingress ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane-controller-metrics - namespace: metalk8s-ingress -spec: - ports: - - name: metrics - port: 10254 - protocol: TCP - targetPort: metrics - selector: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/name: ingress-nginx - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - annotations: null - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane-controller - namespace: metalk8s-ingress -spec: - externalIPs: {% endraw -%}{{ salt.metalk8s_network.get_control_plane_ingress_external_ips() | tojson }}{%- raw %} - ipFamilies: - - IPv4 - ipFamilyPolicy: SingleStack - ports: - - appProtocol: https - name: https - port: 8443 - protocol: TCP - targetPort: https - selector: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/name: ingress-nginx - type: ClusterIP ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: ingress-nginx-control-plane-controller - namespace: metalk8s-ingress -spec: - minReadySeconds: 0 - revisionHistoryLimit: 10 - selector: - matchLabels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/name: ingress-nginx - template: - metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - spec: - containers: - - args: - - /nginx-ingress-controller - - --publish-service=$(POD_NAMESPACE)/ingress-nginx-control-plane-controller - - --election-id=ingress-control-plane-controller-leader - - --controller-class=k8s.io/ingress-nginx-control-plane - - --ingress-class=nginx-control-plane - - --configmap=$(POD_NAMESPACE)/ingress-nginx-control-plane-controller - - --default-ssl-certificate=metalk8s-ingress/ingress-control-plane-default-certificate - - --metrics-per-host=false - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - image: {% endraw -%}{{ build_image_name("nginx-ingress-controller", False) }}{%- raw %}:v1.11.3 - imagePullPolicy: IfNotPresent - lifecycle: - preStop: - exec: - command: - - /wait-shutdown - livenessProbe: - failureThreshold: 5 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - name: controller - ports: - - containerPort: 80 - name: http - protocol: TCP - - containerPort: 443 - name: https - protocol: TCP - - containerPort: 10254 - name: metrics - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - resources: - requests: - cpu: 100m - memory: 90Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - add: - - NET_BIND_SERVICE - drop: - - ALL - readOnlyRootFilesystem: false - runAsNonRoot: true - runAsUser: 101 - seccompProfile: - type: RuntimeDefault - dnsPolicy: ClusterFirst - nodeSelector: - kubernetes.io/os: linux - node-role.kubernetes.io/master: '' - serviceAccountName: ingress-nginx-control-plane - terminationGracePeriodSeconds: 300 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/bootstrap - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/infra - operator: Exists - updateStrategy: - type: RollingUpdate ---- -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - name: nginx-control-plane - namespace: metalk8s-ingress spec: - controller: k8s.io/ingress-nginx-control-plane ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - labels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: 1.11.3 - helm.sh/chart: ingress-nginx-4.11.3 - heritage: metalk8s - metalk8s.scality.com/monitor: '' - name: ingress-nginx-control-plane-controller - namespace: metalk8s-ingress -spec: - endpoints: - - interval: 30s - port: metrics - namespaceSelector: - matchNames: - - metalk8s-ingress - selector: - matchLabels: - app.kubernetes.io/component: controller - app.kubernetes.io/instance: ingress-nginx-control-plane - app.kubernetes.io/name: ingress-nginx - -{% endraw %} + controller: + allowSnippetAnnotations: true + image: + digest: null + repository: {{ build_image_name("nginx-ingress-controller", False) }} + electionID: ingress-control-plane-controller-leader + ingressClassResource: + name: nginx-control-plane + controllerValue: "k8s.io/ingress-nginx-control-plane" + ingressClass: nginx-control-plane + admissionWebhooks: + enabled: false + kind: DaemonSet + updateStrategy: + type: RollingUpdate + tolerations: + - key: "node-role.kubernetes.io/bootstrap" + operator: "Exists" + effect: "NoSchedule" + - key: "node-role.kubernetes.io/master" + operator: "Exists" + effect: "NoSchedule" + - key: "node-role.kubernetes.io/infra" + operator: "Exists" + effect: "NoSchedule" + nodeSelector: + node-role.kubernetes.io/master: '' + service: + type: ClusterIP + externalIPs: {{ salt.metalk8s_network.get_control_plane_ingress_external_ips() | tojson }} + enableHttp: false + ports: + https: 8443 + extraArgs: + default-ssl-certificate: "metalk8s-ingress/ingress-control-plane-default-certificate" + metrics-per-host: false + metrics: + enabled: true + serviceMonitor: + enabled: true + additionalLabels: + metalk8s.scality.com/monitor: '' + defaultBackend: + enabled: false From 670c15112579c1607880ffa4f7b2df6000dd7abf Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 17:46:28 +0100 Subject: [PATCH 19/33] completely remove ingress-nginx chart --- BUMPING.md | 6 +- buildchain/buildchain/codegen.py | 55 - charts/ingress-nginx-control-plane.yaml | 60 - charts/ingress-nginx.yaml | 45 - charts/ingress-nginx/.helmignore | 23 - charts/ingress-nginx/Chart.yaml | 25 - charts/ingress-nginx/OWNERS | 10 - charts/ingress-nginx/README.md | 559 -------- charts/ingress-nginx/README.md.gotmpl | 229 ---- .../changelog/helm-chart-2.10.0.md | 9 - .../changelog/helm-chart-2.11.0.md | 10 - .../changelog/helm-chart-2.11.1.md | 9 - .../changelog/helm-chart-2.11.2.md | 9 - .../changelog/helm-chart-2.11.3.md | 9 - .../changelog/helm-chart-2.12.0.md | 10 - .../changelog/helm-chart-2.12.1.md | 9 - .../changelog/helm-chart-2.13.0.md | 10 - .../changelog/helm-chart-2.14.0.md | 9 - .../changelog/helm-chart-2.15.0.md | 9 - .../changelog/helm-chart-2.16.0.md | 9 - .../changelog/helm-chart-2.9.0.md | 9 - .../changelog/helm-chart-2.9.1.md | 9 - .../changelog/helm-chart-3.0.0.md | 9 - .../changelog/helm-chart-3.10.0.md | 9 - .../changelog/helm-chart-3.10.1.md | 9 - .../changelog/helm-chart-3.11.0.md | 9 - .../changelog/helm-chart-3.11.1.md | 9 - .../changelog/helm-chart-3.12.0.md | 9 - .../changelog/helm-chart-3.13.0.md | 9 - .../changelog/helm-chart-3.14.0.md | 9 - .../changelog/helm-chart-3.15.0.md | 9 - .../changelog/helm-chart-3.15.1.md | 9 - .../changelog/helm-chart-3.16.0.md | 9 - .../changelog/helm-chart-3.16.1.md | 9 - .../changelog/helm-chart-3.17.0.md | 9 - .../changelog/helm-chart-3.18.0.md | 10 - .../changelog/helm-chart-3.19.0.md | 9 - .../changelog/helm-chart-3.20.0.md | 9 - .../changelog/helm-chart-3.20.1.md | 10 - .../changelog/helm-chart-3.21.0.md | 12 - .../changelog/helm-chart-3.22.0.md | 10 - .../changelog/helm-chart-3.23.0.md | 9 - .../changelog/helm-chart-3.24.0.md | 9 - .../changelog/helm-chart-3.25.0.md | 9 - .../changelog/helm-chart-3.26.0.md | 9 - .../changelog/helm-chart-3.27.0.md | 9 - .../changelog/helm-chart-3.28.0.md | 9 - .../changelog/helm-chart-3.29.0.md | 9 - .../changelog/helm-chart-3.3.0.md | 12 - .../changelog/helm-chart-3.3.1.md | 12 - .../changelog/helm-chart-3.30.0.md | 9 - .../changelog/helm-chart-3.31.0.md | 9 - .../changelog/helm-chart-3.32.0.md | 9 - .../changelog/helm-chart-3.33.0.md | 9 - .../changelog/helm-chart-3.34.0.md | 9 - .../changelog/helm-chart-3.4.0.md | 9 - .../changelog/helm-chart-3.5.0.md | 9 - .../changelog/helm-chart-3.5.1.md | 9 - .../changelog/helm-chart-3.6.0.md | 9 - .../changelog/helm-chart-3.7.0.md | 9 - .../changelog/helm-chart-3.7.1.md | 9 - .../changelog/helm-chart-3.8.0.md | 13 - .../changelog/helm-chart-3.9.0.md | 9 - .../changelog/helm-chart-4.0.1.md | 9 - .../changelog/helm-chart-4.0.10.md | 9 - .../changelog/helm-chart-4.0.11.md | 9 - .../changelog/helm-chart-4.0.12.md | 9 - .../changelog/helm-chart-4.0.13.md | 9 - .../changelog/helm-chart-4.0.14.md | 9 - .../changelog/helm-chart-4.0.15.md | 43 - .../changelog/helm-chart-4.0.18.md | 40 - .../changelog/helm-chart-4.0.2.md | 9 - .../changelog/helm-chart-4.0.3.md | 9 - .../changelog/helm-chart-4.0.5.md | 9 - .../changelog/helm-chart-4.0.6.md | 12 - .../changelog/helm-chart-4.0.7.md | 10 - .../changelog/helm-chart-4.0.9.md | 9 - .../changelog/helm-chart-4.1.0.md | 21 - .../changelog/helm-chart-4.1.2.md | 11 - .../changelog/helm-chart-4.10.0.md | 9 - .../changelog/helm-chart-4.10.1.md | 11 - .../changelog/helm-chart-4.10.2.md | 18 - .../changelog/helm-chart-4.11.0.md | 18 - .../changelog/helm-chart-4.11.1.md | 9 - .../changelog/helm-chart-4.11.2.md | 9 - .../changelog/helm-chart-4.11.3.md | 9 - .../changelog/helm-chart-4.2.0.md | 47 - .../changelog/helm-chart-4.2.1.md | 10 - .../changelog/helm-chart-4.3.0.md | 14 - .../changelog/helm-chart-4.4.0.md | 12 - .../changelog/helm-chart-4.5.2.md | 13 - .../changelog/helm-chart-4.6.0.md | 24 - .../changelog/helm-chart-4.6.1.md | 11 - .../changelog/helm-chart-4.7.0.md | 14 - .../changelog/helm-chart-4.7.1.md | 12 - .../changelog/helm-chart-4.7.2.md | 9 - .../changelog/helm-chart-4.8.0-beta.0.md | 13 - .../changelog/helm-chart-4.8.0.md | 13 - .../changelog/helm-chart-4.8.1.md | 9 - .../changelog/helm-chart-4.8.2.md | 10 - .../changelog/helm-chart-4.8.3.md | 9 - .../changelog/helm-chart-4.9.0.md | 13 - .../changelog/helm-chart-4.9.1.md | 10 - .../changelog/helm-chart.md.gotmpl | 11 - ...dmission-webhooks-cert-manager-values.yaml | 12 - ...ontroller-configmap-addheaders-values.yaml | 11 - ...troller-configmap-proxyheaders-values.yaml | 11 - .../ci/controller-configmap-values.yaml | 11 - ...roller-daemonset-extra-modules-values.yaml | 30 - .../controller-daemonset-metrics-values.yaml | 13 - ...roller-daemonset-opentelemetry-values.yaml | 13 - ...oller-daemonset-podannotations-values.yaml | 16 - .../ci/controller-daemonset-values.yaml | 10 - ...oller-deployment-extra-modules-values.yaml | 30 - .../controller-deployment-metrics-values.yaml | 13 - ...oller-deployment-opentelemetry-values.yaml | 13 - ...ller-deployment-podannotations-values.yaml | 16 - .../ci/controller-deployment-values.yaml | 10 - .../ci/controller-hpa-values.yaml | 18 - .../ci/controller-ingressclass-values.yaml | 15 - .../controller-service-internal-values.yaml | 13 - .../ci/controller-service-values.yaml | 22 - .../ci/deamonset-psp-values.yaml | 13 - .../ci/deamonset-webhook-and-psp-values.yaml | 13 - .../ci/deployment-psp-values.yaml | 10 - .../ci/deployment-webhook-and-psp-values.yaml | 12 - charts/ingress-nginx/templates/NOTES.txt | 73 - charts/ingress-nginx/templates/_helpers.tpl | 272 ---- charts/ingress-nginx/templates/_params.tpl | 77 -- .../admission-webhooks/cert-manager.yaml | 63 - .../job-patch/clusterrole.yaml | 33 - .../job-patch/clusterrolebinding.yaml | 23 - .../job-patch/job-createSecret.yaml | 79 -- .../job-patch/job-patchWebhook.yaml | 81 -- .../job-patch/networkpolicy.yaml | 26 - .../admission-webhooks/job-patch/psp.yaml | 52 - .../admission-webhooks/job-patch/role.yaml | 24 - .../job-patch/rolebinding.yaml | 24 - .../job-patch/serviceaccount.yaml | 17 - .../validating-webhook.yaml | 54 - .../ingress-nginx/templates/clusterrole.yaml | 102 -- .../templates/clusterrolebinding.yaml | 19 - .../controller-configmap-addheaders.yaml | 14 - .../controller-configmap-proxyheaders.yaml | 14 - .../templates/controller-configmap-tcp.yaml | 17 - .../templates/controller-configmap-udp.yaml | 17 - .../templates/controller-configmap.yaml | 28 - .../templates/controller-daemonset.yaml | 242 ---- .../templates/controller-deployment.yaml | 245 ---- .../templates/controller-hpa.yaml | 47 - .../controller-ingressclass-aliases.yaml | 23 - .../templates/controller-ingressclass.yaml | 26 - .../templates/controller-keda.yaml | 46 - .../templates/controller-networkpolicy.yaml | 45 - .../controller-poddisruptionbudget.yaml | 36 - .../templates/controller-prometheusrule.yaml | 23 - .../templates/controller-psp.yaml | 100 -- .../templates/controller-role.yaml | 104 -- .../templates/controller-rolebinding.yaml | 21 - .../templates/controller-secret.yaml | 15 - .../controller-service-internal.yaml | 105 -- .../templates/controller-service-metrics.yaml | 45 - .../templates/controller-service-webhook.yaml | 40 - .../templates/controller-service.yaml | 105 -- .../templates/controller-serviceaccount.yaml | 17 - .../templates/controller-servicemonitor.yaml | 53 - .../templates/default-backend-deployment.yaml | 119 -- .../default-backend-extra-configmaps.yaml | 23 - .../templates/default-backend-hpa.yaml | 40 - .../default-backend-networkpolicy.yaml | 25 - .../default-backend-poddisruptionbudget.yaml | 25 - .../templates/default-backend-psp.yaml | 50 - .../templates/default-backend-role.yaml | 22 - .../default-backend-rolebinding.yaml | 21 - .../templates/default-backend-service.yaml | 41 - .../default-backend-serviceaccount.yaml | 14 - .../job-patch/clusterrole_test.yaml | 11 - .../job-patch/clusterrolebinding_test.yaml | 11 - .../job-patch/role_test.yaml | 11 - .../job-patch/rolebinding_test.yaml | 11 - .../job-patch/serviceaccount_test.yaml | 47 - .../validating-webhook_test.yaml | 32 - .../controller-configmap-addheaders_test.yaml | 27 - ...ontroller-configmap-proxyheaders_test.yaml | 27 - .../tests/controller-configmap_test.yaml | 31 - .../tests/controller-daemonset_test.yaml | 172 --- .../tests/controller-deployment_test.yaml | 191 --- .../tests/controller-hpa_test.yaml | 31 - .../controller-ingressclass-aliases_test.yaml | 110 -- .../tests/controller-ingressclass_test.yaml | 93 -- .../tests/controller-keda_test.yaml | 31 - .../tests/controller-networkpolicy_test.yaml | 23 - .../controller-poddisruptionbudget_test.yaml | 89 -- .../tests/controller-prometheusrule_test.yaml | 17 - .../controller-service-internal_test.yaml | 25 - .../controller-service-metrics_test.yaml | 23 - .../controller-service-webhook_test.yaml | 32 - .../tests/controller-service_test.yaml | 32 - .../tests/controller-servicemonitor_test.yaml | 29 - .../default-backend-deployment_test.yaml | 169 --- ...default-backend-extra-configmaps_test.yaml | 50 - ...ault-backend-poddisruptionbudget_test.yaml | 48 - .../tests/default-backend-service_test.yaml | 32 - charts/ingress-nginx/values.yaml | 1192 ----------------- 204 files changed, 1 insertion(+), 7829 deletions(-) delete mode 100644 charts/ingress-nginx-control-plane.yaml delete mode 100644 charts/ingress-nginx.yaml delete mode 100644 charts/ingress-nginx/.helmignore delete mode 100644 charts/ingress-nginx/Chart.yaml delete mode 100644 charts/ingress-nginx/OWNERS delete mode 100644 charts/ingress-nginx/README.md delete mode 100644 charts/ingress-nginx/README.md.gotmpl delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.10.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.11.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.11.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.11.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.11.3.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.12.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.12.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.13.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.14.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.15.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.16.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.9.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-2.9.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.0.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.10.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.10.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.11.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.11.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.12.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.13.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.14.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.15.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.15.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.16.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.16.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.17.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.18.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.19.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.20.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.20.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.21.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.22.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.23.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.24.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.25.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.26.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.27.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.28.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.29.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.3.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.3.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.30.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.31.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.32.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.33.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.34.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.4.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.5.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.5.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.6.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.7.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.7.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.8.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-3.9.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.10.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.11.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.12.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.13.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.14.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.15.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.18.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.3.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.5.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.6.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.7.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.0.9.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.1.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.1.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.10.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.10.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.10.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.11.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.11.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.11.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.11.3.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.2.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.2.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.3.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.4.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.5.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.6.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.6.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.7.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.7.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.7.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.8.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.8.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.8.2.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.8.3.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.9.0.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart-4.9.1.md delete mode 100644 charts/ingress-nginx/changelog/helm-chart.md.gotmpl delete mode 100644 charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-configmap-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-daemonset-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-deployment-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-hpa-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-ingressclass-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-service-internal-values.yaml delete mode 100644 charts/ingress-nginx/ci/controller-service-values.yaml delete mode 100644 charts/ingress-nginx/ci/deamonset-psp-values.yaml delete mode 100644 charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml delete mode 100644 charts/ingress-nginx/ci/deployment-psp-values.yaml delete mode 100644 charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml delete mode 100644 charts/ingress-nginx/templates/NOTES.txt delete mode 100644 charts/ingress-nginx/templates/_helpers.tpl delete mode 100644 charts/ingress-nginx/templates/_params.tpl delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml delete mode 100644 charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml delete mode 100644 charts/ingress-nginx/templates/clusterrole.yaml delete mode 100644 charts/ingress-nginx/templates/clusterrolebinding.yaml delete mode 100644 charts/ingress-nginx/templates/controller-configmap-addheaders.yaml delete mode 100644 charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml delete mode 100644 charts/ingress-nginx/templates/controller-configmap-tcp.yaml delete mode 100644 charts/ingress-nginx/templates/controller-configmap-udp.yaml delete mode 100644 charts/ingress-nginx/templates/controller-configmap.yaml delete mode 100644 charts/ingress-nginx/templates/controller-daemonset.yaml delete mode 100644 charts/ingress-nginx/templates/controller-deployment.yaml delete mode 100644 charts/ingress-nginx/templates/controller-hpa.yaml delete mode 100644 charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml delete mode 100644 charts/ingress-nginx/templates/controller-ingressclass.yaml delete mode 100644 charts/ingress-nginx/templates/controller-keda.yaml delete mode 100644 charts/ingress-nginx/templates/controller-networkpolicy.yaml delete mode 100644 charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml delete mode 100644 charts/ingress-nginx/templates/controller-prometheusrule.yaml delete mode 100644 charts/ingress-nginx/templates/controller-psp.yaml delete mode 100644 charts/ingress-nginx/templates/controller-role.yaml delete mode 100644 charts/ingress-nginx/templates/controller-rolebinding.yaml delete mode 100644 charts/ingress-nginx/templates/controller-secret.yaml delete mode 100644 charts/ingress-nginx/templates/controller-service-internal.yaml delete mode 100644 charts/ingress-nginx/templates/controller-service-metrics.yaml delete mode 100644 charts/ingress-nginx/templates/controller-service-webhook.yaml delete mode 100644 charts/ingress-nginx/templates/controller-service.yaml delete mode 100644 charts/ingress-nginx/templates/controller-serviceaccount.yaml delete mode 100644 charts/ingress-nginx/templates/controller-servicemonitor.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-deployment.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-hpa.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-networkpolicy.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-psp.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-role.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-rolebinding.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-service.yaml delete mode 100644 charts/ingress-nginx/templates/default-backend-serviceaccount.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml delete mode 100644 charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-configmap_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-daemonset_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-deployment_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-hpa_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-ingressclass_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-keda_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-networkpolicy_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-prometheusrule_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-service-internal_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-service-metrics_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-service-webhook_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-service_test.yaml delete mode 100644 charts/ingress-nginx/tests/controller-servicemonitor_test.yaml delete mode 100644 charts/ingress-nginx/tests/default-backend-deployment_test.yaml delete mode 100644 charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml delete mode 100644 charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml delete mode 100644 charts/ingress-nginx/tests/default-backend-service_test.yaml delete mode 100644 charts/ingress-nginx/values.yaml diff --git a/BUMPING.md b/BUMPING.md index 8656964041..ced3da42bf 100644 --- a/BUMPING.md +++ b/BUMPING.md @@ -70,11 +70,7 @@ REPO_URL=https://grafana.github.io/helm-charts ### ingress-nginx -``` -CHART_NAME=ingress-nginx -REPO_NAME=ingress-nginx -REPO_URL=https://kubernetes.github.io/ingress-nginx -``` +see [nginx-operator](./nginx-operator/BUMPING.md) and [metalk8s-catalog-source](./catalog-source/README.md) set `$VERSION` with the appropriate value. diff --git a/buildchain/buildchain/codegen.py b/buildchain/buildchain/codegen.py index 3ae6071cb0..86685d4fb1 100644 --- a/buildchain/buildchain/codegen.py +++ b/buildchain/buildchain/codegen.py @@ -125,60 +125,6 @@ def codegen_chart_fluent_bit() -> types.TaskDict: } -def codegen_chart_ingress_nginx() -> types.TaskDict: - """Generate the SLS file for NGINX Ingress using the chart render script.""" - chart_dir = constants.CHART_ROOT / "ingress-nginx" - ingress_nginx_namespace = "metalk8s-ingress" - actions = [] - file_dep = list(utils.git_ls(chart_dir)) - file_dep.append(constants.CHART_RENDER_SCRIPT) - - # Workload Plane Ingress - target_sls = ( - constants.ROOT / "salt/metalk8s/addons/nginx-ingress/deployed/chart.sls" - ) - chart_name = "ingress-nginx" - value_file = constants.CHART_ROOT / f"{chart_name}.yaml" - actions.append( - doit.action.CmdAction( - f"{constants.CHART_RENDER_CMD} {chart_name} {value_file} {chart_dir} " - f"--namespace {ingress_nginx_namespace} --remove-manifest ConfigMap " - f"{chart_name}-controller " - f"--output {target_sls}", - cwd=constants.ROOT, - ) - ) - file_dep.append(value_file) - - # Control Plane Ingress - target_sls = ( - constants.ROOT - / "salt/metalk8s/addons/nginx-ingress-control-plane" - / "deployed/chart.sls" - ) - chart_name = "ingress-nginx-control-plane" - value_file = constants.CHART_ROOT / f"{chart_name}.yaml" - actions.append( - doit.action.CmdAction( - f"{constants.CHART_RENDER_CMD} {chart_name} {value_file} {chart_dir} " - f"--namespace {ingress_nginx_namespace} --remove-manifest ConfigMap " - f"{chart_name}-controller " - f"--output {target_sls}", - cwd=constants.ROOT, - ) - ) - file_dep.append(value_file) - - return { - "name": "chart_ingress-nginx", - "title": utils.title_with_subtask_name("CODEGEN"), - "doc": codegen_chart_ingress_nginx.__doc__, - "actions": actions, - "file_dep": file_dep, - "task_dep": ["check_for:tox", "check_for:helm"], - } - - def codegen_chart_kube_prometheus_stack() -> types.TaskDict: """Generate the SLS file for Kube Prometheus Stack using the chart render script.""" target_sls = ( @@ -339,7 +285,6 @@ def codegen_chart_cert_manager() -> types.TaskDict: codegen_metalk8s_operator, codegen_chart_dex, codegen_chart_fluent_bit, - codegen_chart_ingress_nginx, codegen_chart_kube_prometheus_stack, codegen_chart_loki, codegen_chart_prometheus_adapter, diff --git a/charts/ingress-nginx-control-plane.yaml b/charts/ingress-nginx-control-plane.yaml deleted file mode 100644 index 42c22d889c..0000000000 --- a/charts/ingress-nginx-control-plane.yaml +++ /dev/null @@ -1,60 +0,0 @@ -controller: - allowSnippetAnnotations: true - - image: - digest: null - repository: __image__(nginx-ingress-controller) - - electionID: ingress-control-plane-controller-leader - - ingressClassResource: - name: nginx-control-plane - controllerValue: "k8s.io/ingress-nginx-control-plane" - - ingressClass: nginx-control-plane - - admissionWebhooks: - enabled: false - - kind: DaemonSet - - updateStrategy: - type: RollingUpdate - - tolerations: - - key: "node-role.kubernetes.io/bootstrap" - operator: "Exists" - effect: "NoSchedule" - - key: "node-role.kubernetes.io/master" - operator: "Exists" - effect: "NoSchedule" - - key: "node-role.kubernetes.io/infra" - operator: "Exists" - effect: "NoSchedule" - - nodeSelector: - node-role.kubernetes.io/master: '' - - service: - type: ClusterIP - - externalIPs: '__var_tojson__(salt.metalk8s_network.get_control_plane_ingress_external_ips())' - - enableHttp: false - - ports: - https: 8443 - - extraArgs: - default-ssl-certificate: "metalk8s-ingress/ingress-control-plane-default-certificate" - metrics-per-host: false - - metrics: - enabled: true - serviceMonitor: - enabled: true - additionalLabels: - metalk8s.scality.com/monitor: '' - -defaultBackend: - enabled: false diff --git a/charts/ingress-nginx.yaml b/charts/ingress-nginx.yaml deleted file mode 100644 index 16faf24c84..0000000000 --- a/charts/ingress-nginx.yaml +++ /dev/null @@ -1,45 +0,0 @@ -controller: - allowSnippetAnnotations: true - - image: - digest: null - repository: __image__(nginx-ingress-controller) - - hostPort: - enabled: true - - ingressClassResource: - default: true - - watchIngressWithoutClass: true - - admissionWebhooks: - enabled: false - - kind: DaemonSet - - tolerations: - - key: "node-role.kubernetes.io/bootstrap" - operator: "Exists" - effect: "NoSchedule" - - key: "node-role.kubernetes.io/infra" - operator: "Exists" - effect: "NoSchedule" - - service: - type: ClusterIP - - extraArgs: - default-backend-service: metalk8s-ui/metalk8s-ui - default-ssl-certificate: "metalk8s-ingress/ingress-workload-plane-default-certificate" - metrics-per-host: false - - metrics: - enabled: true - serviceMonitor: - enabled: true - additionalLabels: - metalk8s.scality.com/monitor: '' - -defaultBackend: - enabled: false diff --git a/charts/ingress-nginx/.helmignore b/charts/ingress-nginx/.helmignore deleted file mode 100644 index 109b40811c..0000000000 --- a/charts/ingress-nginx/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ -__snapshot__ diff --git a/charts/ingress-nginx/Chart.yaml b/charts/ingress-nginx/Chart.yaml deleted file mode 100644 index 1f0128493d..0000000000 --- a/charts/ingress-nginx/Chart.yaml +++ /dev/null @@ -1,25 +0,0 @@ -annotations: - artifacthub.io/changes: | - - Update Ingress-Nginx version controller-v1.11.3 - artifacthub.io/prerelease: "false" -apiVersion: v2 -appVersion: 1.11.3 -description: Ingress controller for Kubernetes using NGINX as a reverse proxy and - load balancer -home: https://github.com/kubernetes/ingress-nginx -icon: https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Nginx_logo.svg/500px-Nginx_logo.svg.png -keywords: -- ingress -- nginx -kubeVersion: '>=1.21.0-0' -maintainers: -- name: cpanato -- name: Gacko -- name: puerco -- name: rikatz -- name: strongjz -- name: tao12345666333 -name: ingress-nginx -sources: -- https://github.com/kubernetes/ingress-nginx -version: 4.11.3 diff --git a/charts/ingress-nginx/OWNERS b/charts/ingress-nginx/OWNERS deleted file mode 100644 index d588ede681..0000000000 --- a/charts/ingress-nginx/OWNERS +++ /dev/null @@ -1,10 +0,0 @@ -# See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners - -approvers: -- ingress-nginx-helm-maintainers - -reviewers: -- ingress-nginx-helm-reviewers - -labels: -- area/helm diff --git a/charts/ingress-nginx/README.md b/charts/ingress-nginx/README.md deleted file mode 100644 index f70bd0ae68..0000000000 --- a/charts/ingress-nginx/README.md +++ /dev/null @@ -1,559 +0,0 @@ -# ingress-nginx - -[ingress-nginx](https://github.com/kubernetes/ingress-nginx) Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer - -![Version: 4.11.3](https://img.shields.io/badge/Version-4.11.3-informational?style=flat-square) ![AppVersion: 1.11.3](https://img.shields.io/badge/AppVersion-1.11.3-informational?style=flat-square) - -To use, add `ingressClassName: nginx` spec field or the `kubernetes.io/ingress.class: nginx` annotation to your Ingress resources. - -This chart bootstraps an ingress-nginx deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -## Requirements - -Kubernetes: `>=1.21.0-0` - -## Get Repo Info - -```console -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm repo update -``` - -## Install Chart - -**Important:** only helm3 is supported - -```console -helm install [RELEASE_NAME] ingress-nginx/ingress-nginx -``` - -The command deploys ingress-nginx on the Kubernetes cluster in the default configuration. - -_See [configuration](#configuration) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Uninstall Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -## Upgrading Chart - -```console -helm upgrade [RELEASE_NAME] [CHART] --install -``` - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### Migrating from stable/nginx-ingress - -There are two main ways to migrate a release from `stable/nginx-ingress` to `ingress-nginx/ingress-nginx` chart: - -1. For Nginx Ingress controllers used for non-critical services, the easiest method is to [uninstall](#uninstall-chart) the old release and [install](#install-chart) the new one -1. For critical services in production that require zero-downtime, you will want to: - 1. [Install](#install-chart) a second Ingress controller - 1. Redirect your DNS traffic from the old controller to the new controller - 1. Log traffic from both controllers during this changeover - 1. [Uninstall](#uninstall-chart) the old controller once traffic has fully drained from it - -Note that there are some different and upgraded configurations between the two charts, described by Rimas Mocevicius from JFrog in the "Upgrading to ingress-nginx Helm chart" section of [Migrating from Helm chart nginx-ingress to ingress-nginx](https://rimusz.net/migrating-to-ingress-nginx). As the `ingress-nginx/ingress-nginx` chart continues to update, you will want to check current differences by running [helm configuration](#configuration) commands on both charts. - -## Configuration - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: - -```console -helm show values ingress-nginx/ingress-nginx -``` - -### PodDisruptionBudget - -Note that the PodDisruptionBudget resource will only be defined if the replicaCount is greater than one, -else it would make it impossible to evacuate a node. See [gh issue #7127](https://github.com/helm/charts/issues/7127) for more info. - -### Prometheus Metrics - -The Ingress-Nginx Controller can export Prometheus metrics, by setting `controller.metrics.enabled` to `true`. - -You can add Prometheus annotations to the metrics service using `controller.metrics.service.annotations`. -Alternatively, if you use the Prometheus Operator, you can enable ServiceMonitor creation using `controller.metrics.serviceMonitor.enabled`. And set `controller.metrics.serviceMonitor.additionalLabels.release="prometheus"`. "release=prometheus" should match the label configured in the prometheus servicemonitor ( see `kubectl get servicemonitor prometheus-kube-prom-prometheus -oyaml -n prometheus`) - -### ingress-nginx nginx\_status page/stats server - -Previous versions of this chart had a `controller.stats.*` configuration block, which is now obsolete due to the following changes in Ingress-Nginx Controller: - -- In [0.16.1](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0161), the vts (virtual host traffic status) dashboard was removed -- In [0.23.0](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230), the status page at port 18080 is now a unix socket webserver only available at localhost. - You can use `curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status` inside the controller container to access it locally, or use the snippet from [nginx-ingress changelog](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230) to re-enable the http server - -### ExternalDNS Service Configuration - -Add an [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) annotation to the LoadBalancer service: - -```yaml -controller: - service: - annotations: - external-dns.alpha.kubernetes.io/hostname: kubernetes-example.com. -``` - -### AWS L7 ELB with SSL Termination - -Annotate the controller as shown in the [nginx-ingress l7 patch](https://github.com/kubernetes/ingress-nginx/blob/ab3a789caae65eec4ad6e3b46b19750b481b6bce/deploy/aws/l7/service-l7.yaml): - -```yaml -controller: - service: - targetPorts: - http: http - https: http - annotations: - service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX - service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" - service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" - service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600' -``` - -### Additional Internal Load Balancer - -This setup is useful when you need both external and internal load balancers but don't want to have multiple ingress controllers and multiple ingress objects per application. - -By default, the ingress object will point to the external load balancer address, but if correctly configured, you can make use of the internal one if the URL you are looking up resolves to the internal load balancer's URL. - -You'll need to set both the following values: - -`controller.service.internal.enabled` -`controller.service.internal.annotations` - -If one of them is missing the internal load balancer will not be deployed. Example you may have `controller.service.internal.enabled=true` but no annotations set, in this case no action will be taken. - -`controller.service.internal.annotations` varies with the cloud service you're using. - -Example for AWS: - -```yaml -controller: - service: - internal: - enabled: true - annotations: - # Create internal NLB - service.beta.kubernetes.io/aws-load-balancer-scheme: "internal" - # Create internal ELB(Deprecated) - # service.beta.kubernetes.io/aws-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -Example for GCE: - -```yaml -controller: - service: - internal: - enabled: true - annotations: - # Create internal LB. More information: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing - # For GKE versions 1.17 and later - networking.gke.io/load-balancer-type: "Internal" - # For earlier versions - # cloud.google.com/load-balancer-type: "Internal" - - # Any other annotation can be declared here. -``` - -Example for Azure: - -```yaml -controller: - service: - annotations: - # Create internal LB - service.beta.kubernetes.io/azure-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -Example for Oracle Cloud Infrastructure: - -```yaml -controller: - service: - annotations: - # Create internal LB - service.beta.kubernetes.io/oci-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -The load balancer annotations of more cloud service providers can be found: [Internal load balancer](https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer). - -An use case for this scenario is having a split-view DNS setup where the public zone CNAME records point to the external balancer URL while the private zone CNAME records point to the internal balancer URL. This way, you only need one ingress kubernetes object. - -Optionally you can set `controller.service.loadBalancerIP` if you need a static IP for the resulting `LoadBalancer`. - -### Ingress Admission Webhooks - -With nginx-ingress-controller version 0.25+, the Ingress-Nginx Controller pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent bad ingress from being added to the cluster. -**This feature is enabled by default since 0.31.0.** - -With nginx-ingress-controller in 0.25.* work only with kubernetes 1.14+, 0.26 fix [this issue](https://github.com/kubernetes/ingress-nginx/pull/4521) - -#### How the Chart Configures the Hooks -A validating and configuration requires the endpoint to which the request is sent to use TLS. It is possible to set up custom certificates to do this, but in most cases, a self-signed certificate is enough. The setup of this component requires some more complex orchestration when using helm. The steps are created to be idempotent and to allow turning the feature on and off without running into helm quirks. - -1. A pre-install hook provisions a certificate into the same namespace using a format compatible with provisioning using end user certificates. If the certificate already exists, the hook exits. -2. The Ingress-Nginx Controller pod is configured to use a TLS proxy container, which will load that certificate. -3. Validating and Mutating webhook configurations are created in the cluster. -4. A post-install hook reads the CA from the secret created by step 1 and patches the Validating and Mutating webhook configurations. This process will allow a custom CA provisioned by some other process to also be patched into the webhook configurations. The chosen failure policy is also patched into the webhook configurations - -#### Alternatives -It should be possible to use [cert-manager/cert-manager](https://github.com/cert-manager/cert-manager) if a more complete solution is required. - -You can enable automatic self-signed TLS certificate provisioning via cert-manager by setting the `controller.admissionWebhooks.certManager.enabled` value to true. - -Please ensure that cert-manager is correctly installed and configured. - -### Helm Error When Upgrading: spec.clusterIP: Invalid value: "" - -If you are upgrading this chart from a version between 0.31.0 and 1.2.2 then you may get an error like this: - -```console -Error: UPGRADE FAILED: Service "?????-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable -``` - -Detail of how and why are in [this issue](https://github.com/helm/charts/pull/13646) but to resolve this you can set `xxxx.service.omitClusterIP` to `true` where `xxxx` is the service referenced in the error. - -As of version `1.26.0` of this chart, by simply not providing any clusterIP value, `invalid: spec.clusterIP: Invalid value: "": field is immutable` will no longer occur since `clusterIP: ""` will not be rendered. - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| commonLabels | object | `{}` | | -| controller.addHeaders | object | `{}` | Will add custom headers before sending response traffic to the client according to: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers | -| controller.admissionWebhooks.annotations | object | `{}` | | -| controller.admissionWebhooks.certManager.admissionCert.duration | string | `""` | | -| controller.admissionWebhooks.certManager.enabled | bool | `false` | | -| controller.admissionWebhooks.certManager.rootCert.duration | string | `""` | | -| controller.admissionWebhooks.certificate | string | `"/usr/local/certificates/cert"` | | -| controller.admissionWebhooks.createSecretJob.name | string | `"create"` | | -| controller.admissionWebhooks.createSecretJob.resources | object | `{}` | | -| controller.admissionWebhooks.createSecretJob.securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":65532,"seccompProfile":{"type":"RuntimeDefault"}}` | Security context for secret creation containers | -| controller.admissionWebhooks.enabled | bool | `true` | | -| controller.admissionWebhooks.existingPsp | string | `""` | Use an existing PSP instead of creating one | -| controller.admissionWebhooks.extraEnvs | list | `[]` | Additional environment variables to set | -| controller.admissionWebhooks.failurePolicy | string | `"Fail"` | Admission Webhook failure policy to use | -| controller.admissionWebhooks.key | string | `"/usr/local/certificates/key"` | | -| controller.admissionWebhooks.labels | object | `{}` | Labels to be added to admission webhooks | -| controller.admissionWebhooks.name | string | `"admission"` | | -| controller.admissionWebhooks.namespaceSelector | object | `{}` | | -| controller.admissionWebhooks.objectSelector | object | `{}` | | -| controller.admissionWebhooks.patch.enabled | bool | `true` | | -| controller.admissionWebhooks.patch.image.digest | string | `"sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f"` | | -| controller.admissionWebhooks.patch.image.image | string | `"ingress-nginx/kube-webhook-certgen"` | | -| controller.admissionWebhooks.patch.image.pullPolicy | string | `"IfNotPresent"` | | -| controller.admissionWebhooks.patch.image.registry | string | `"registry.k8s.io"` | | -| controller.admissionWebhooks.patch.image.tag | string | `"v1.4.4"` | | -| controller.admissionWebhooks.patch.labels | object | `{}` | Labels to be added to patch job resources | -| controller.admissionWebhooks.patch.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | -| controller.admissionWebhooks.patch.nodeSelector."kubernetes.io/os" | string | `"linux"` | | -| controller.admissionWebhooks.patch.podAnnotations | object | `{}` | | -| controller.admissionWebhooks.patch.priorityClassName | string | `""` | Provide a priority class name to the webhook patching job # | -| controller.admissionWebhooks.patch.rbac | object | `{"create":true}` | Admission webhook patch job RBAC | -| controller.admissionWebhooks.patch.rbac.create | bool | `true` | Create RBAC or not | -| controller.admissionWebhooks.patch.securityContext | object | `{}` | Security context for secret creation & webhook patch pods | -| controller.admissionWebhooks.patch.serviceAccount | object | `{"automountServiceAccountToken":true,"create":true,"name":""}` | Admission webhook patch job service account | -| controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken | bool | `true` | Auto-mount service account token or not | -| controller.admissionWebhooks.patch.serviceAccount.create | bool | `true` | Create a service account or not | -| controller.admissionWebhooks.patch.serviceAccount.name | string | `""` | Custom service account name | -| controller.admissionWebhooks.patch.tolerations | list | `[]` | | -| controller.admissionWebhooks.patchWebhookJob.name | string | `"patch"` | | -| controller.admissionWebhooks.patchWebhookJob.resources | object | `{}` | | -| controller.admissionWebhooks.patchWebhookJob.securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":65532,"seccompProfile":{"type":"RuntimeDefault"}}` | Security context for webhook patch containers | -| controller.admissionWebhooks.port | int | `8443` | | -| controller.admissionWebhooks.service.annotations | object | `{}` | | -| controller.admissionWebhooks.service.externalIPs | list | `[]` | | -| controller.admissionWebhooks.service.loadBalancerSourceRanges | list | `[]` | | -| controller.admissionWebhooks.service.servicePort | int | `443` | | -| controller.admissionWebhooks.service.type | string | `"ClusterIP"` | | -| controller.affinity | object | `{}` | Affinity and anti-affinity rules for server scheduling to nodes # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity # | -| controller.allowSnippetAnnotations | bool | `false` | This configuration defines if Ingress Controller should allow users to set their own *-snippet annotations, otherwise this is forbidden / dropped when users add those annotations. Global snippets in ConfigMap are still respected | -| controller.annotations | object | `{}` | Annotations to be added to the controller Deployment or DaemonSet # | -| controller.autoscaling.annotations | object | `{}` | | -| controller.autoscaling.behavior | object | `{}` | | -| controller.autoscaling.enabled | bool | `false` | | -| controller.autoscaling.maxReplicas | int | `11` | | -| controller.autoscaling.minReplicas | int | `1` | | -| controller.autoscaling.targetCPUUtilizationPercentage | int | `50` | | -| controller.autoscaling.targetMemoryUtilizationPercentage | int | `50` | | -| controller.autoscalingTemplate | list | `[]` | | -| controller.config | object | `{}` | Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ | -| controller.configAnnotations | object | `{}` | Annotations to be added to the controller config configuration configmap. | -| controller.configMapNamespace | string | `""` | Allows customization of the configmap / nginx-configmap namespace; defaults to $(POD_NAMESPACE) | -| controller.containerName | string | `"controller"` | Configures the controller container name | -| controller.containerPort | object | `{"http":80,"https":443}` | Configures the ports that the nginx-controller listens on | -| controller.containerSecurityContext | object | `{}` | Security context for controller containers | -| controller.customTemplate.configMapKey | string | `""` | | -| controller.customTemplate.configMapName | string | `""` | | -| controller.disableLeaderElection | bool | `false` | This configuration disable Nginx Controller Leader Election | -| controller.dnsConfig | object | `{}` | Optionally customize the pod dnsConfig. | -| controller.dnsPolicy | string | `"ClusterFirst"` | Optionally change this to ClusterFirstWithHostNet in case you have 'hostNetwork: true'. By default, while using host network, name resolution uses the host's DNS. If you wish nginx-controller to keep resolving names inside the k8s network, use ClusterFirstWithHostNet. | -| controller.electionID | string | `""` | Election ID to use for status update, by default it uses the controller name combined with a suffix of 'leader' | -| controller.electionTTL | string | `""` | Duration a leader election is valid before it's getting re-elected, e.g. `15s`, `10m` or `1h`. (Default: 30s) | -| controller.enableAnnotationValidations | bool | `false` | | -| controller.enableMimalloc | bool | `true` | Enable mimalloc as a drop-in replacement for malloc. # ref: https://github.com/microsoft/mimalloc # | -| controller.enableTopologyAwareRouting | bool | `false` | This configuration enables Topology Aware Routing feature, used together with service annotation service.kubernetes.io/topology-mode="auto" Defaults to false | -| controller.existingPsp | string | `""` | Use an existing PSP instead of creating one | -| controller.extraArgs | object | `{}` | Additional command line arguments to pass to Ingress-Nginx Controller E.g. to specify the default SSL certificate you can use | -| controller.extraContainers | list | `[]` | Additional containers to be added to the controller pod. See https://github.com/lemonldap-ng-controller/lemonldap-ng-controller as example. | -| controller.extraEnvs | list | `[]` | Additional environment variables to set | -| controller.extraInitContainers | list | `[]` | Containers, which are run before the app containers are started. | -| controller.extraModules | list | `[]` | Modules, which are mounted into the core nginx image. See values.yaml for a sample to add opentelemetry module | -| controller.extraVolumeMounts | list | `[]` | Additional volumeMounts to the controller main container. | -| controller.extraVolumes | list | `[]` | Additional volumes to the controller pod. | -| controller.healthCheckHost | string | `""` | Address to bind the health check endpoint. It is better to set this option to the internal node address if the Ingress-Nginx Controller is running in the `hostNetwork: true` mode. | -| controller.healthCheckPath | string | `"/healthz"` | Path of the health check endpoint. All requests received on the port defined by the healthz-port parameter are forwarded internally to this path. | -| controller.hostAliases | list | `[]` | Optionally customize the pod hostAliases. | -| controller.hostNetwork | bool | `false` | Required for use with CNI based kubernetes installations (such as ones set up by kubeadm), since CNI and hostport don't mix yet. Can be deprecated once https://github.com/kubernetes/kubernetes/issues/23920 is merged | -| controller.hostPort.enabled | bool | `false` | Enable 'hostPort' or not | -| controller.hostPort.ports.http | int | `80` | 'hostPort' http port | -| controller.hostPort.ports.https | int | `443` | 'hostPort' https port | -| controller.hostname | object | `{}` | Optionally customize the pod hostname. | -| controller.image.allowPrivilegeEscalation | bool | `false` | | -| controller.image.chroot | bool | `false` | | -| controller.image.digest | string | `"sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7"` | | -| controller.image.digestChroot | string | `"sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14"` | | -| controller.image.image | string | `"ingress-nginx/controller"` | | -| controller.image.pullPolicy | string | `"IfNotPresent"` | | -| controller.image.readOnlyRootFilesystem | bool | `false` | | -| controller.image.registry | string | `"registry.k8s.io"` | | -| controller.image.runAsNonRoot | bool | `true` | | -| controller.image.runAsUser | int | `101` | | -| controller.image.seccompProfile.type | string | `"RuntimeDefault"` | | -| controller.image.tag | string | `"v1.11.3"` | | -| controller.ingressClass | string | `"nginx"` | For backwards compatibility with ingress.class annotation, use ingressClass. Algorithm is as follows, first ingressClassName is considered, if not present, controller looks for ingress.class annotation | -| controller.ingressClassByName | bool | `false` | Process IngressClass per name (additionally as per spec.controller). | -| controller.ingressClassResource | object | `{"aliases":[],"annotations":{},"controllerValue":"k8s.io/ingress-nginx","default":false,"enabled":true,"name":"nginx","parameters":{}}` | This section refers to the creation of the IngressClass resource. IngressClasses are immutable and cannot be changed after creation. We do not support namespaced IngressClasses, yet, so a ClusterRole and a ClusterRoleBinding is required. | -| controller.ingressClassResource.aliases | list | `[]` | Aliases of this IngressClass. Creates copies with identical settings but the respective alias as name. Useful for development environments with only one Ingress Controller but production-like Ingress resources. `default` gets enabled on the original IngressClass only. | -| controller.ingressClassResource.annotations | object | `{}` | Annotations to be added to the IngressClass resource. | -| controller.ingressClassResource.controllerValue | string | `"k8s.io/ingress-nginx"` | Controller of the IngressClass. An Ingress Controller looks for IngressClasses it should reconcile by this value. This value is also being set as the `--controller-class` argument of this Ingress Controller. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class | -| controller.ingressClassResource.default | bool | `false` | If true, Ingresses without `ingressClassName` get assigned to this IngressClass on creation. Ingress creation gets rejected if there are multiple default IngressClasses. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#default-ingress-class | -| controller.ingressClassResource.enabled | bool | `true` | Create the IngressClass or not | -| controller.ingressClassResource.name | string | `"nginx"` | Name of the IngressClass | -| controller.ingressClassResource.parameters | object | `{}` | A link to a custom resource containing additional configuration for the controller. This is optional if the controller consuming this IngressClass does not require additional parameters. Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class | -| controller.keda.apiVersion | string | `"keda.sh/v1alpha1"` | | -| controller.keda.behavior | object | `{}` | | -| controller.keda.cooldownPeriod | int | `300` | | -| controller.keda.enabled | bool | `false` | | -| controller.keda.maxReplicas | int | `11` | | -| controller.keda.minReplicas | int | `1` | | -| controller.keda.pollingInterval | int | `30` | | -| controller.keda.restoreToOriginalReplicaCount | bool | `false` | | -| controller.keda.scaledObject.annotations | object | `{}` | | -| controller.keda.triggers | list | `[]` | | -| controller.kind | string | `"Deployment"` | Use a `DaemonSet` or `Deployment` | -| controller.labels | object | `{}` | Labels to be added to the controller Deployment or DaemonSet and other resources that do not have option to specify labels # | -| controller.lifecycle | object | `{"preStop":{"exec":{"command":["/wait-shutdown"]}}}` | Improve connection draining when ingress controller pod is deleted using a lifecycle hook: With this new hook, we increased the default terminationGracePeriodSeconds from 30 seconds to 300, allowing the draining of connections up to five minutes. If the active connections end before that, the pod will terminate gracefully at that time. To effectively take advantage of this feature, the Configmap feature worker-shutdown-timeout new value is 240s instead of 10s. # | -| controller.livenessProbe.failureThreshold | int | `5` | | -| controller.livenessProbe.httpGet.path | string | `"/healthz"` | | -| controller.livenessProbe.httpGet.port | int | `10254` | | -| controller.livenessProbe.httpGet.scheme | string | `"HTTP"` | | -| controller.livenessProbe.initialDelaySeconds | int | `10` | | -| controller.livenessProbe.periodSeconds | int | `10` | | -| controller.livenessProbe.successThreshold | int | `1` | | -| controller.livenessProbe.timeoutSeconds | int | `1` | | -| controller.maxmindLicenseKey | string | `""` | Maxmind license key to download GeoLite2 Databases. # https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ | -| controller.metrics.enabled | bool | `false` | | -| controller.metrics.port | int | `10254` | | -| controller.metrics.portName | string | `"metrics"` | | -| controller.metrics.prometheusRule.additionalLabels | object | `{}` | | -| controller.metrics.prometheusRule.enabled | bool | `false` | | -| controller.metrics.prometheusRule.rules | list | `[]` | | -| controller.metrics.service.annotations | object | `{}` | | -| controller.metrics.service.externalIPs | list | `[]` | List of IP addresses at which the stats-exporter service is available # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips # | -| controller.metrics.service.labels | object | `{}` | Labels to be added to the metrics service resource | -| controller.metrics.service.loadBalancerSourceRanges | list | `[]` | | -| controller.metrics.service.servicePort | int | `10254` | | -| controller.metrics.service.type | string | `"ClusterIP"` | | -| controller.metrics.serviceMonitor.additionalLabels | object | `{}` | | -| controller.metrics.serviceMonitor.annotations | object | `{}` | Annotations to be added to the ServiceMonitor. | -| controller.metrics.serviceMonitor.enabled | bool | `false` | | -| controller.metrics.serviceMonitor.metricRelabelings | list | `[]` | | -| controller.metrics.serviceMonitor.namespace | string | `""` | | -| controller.metrics.serviceMonitor.namespaceSelector | object | `{}` | | -| controller.metrics.serviceMonitor.relabelings | list | `[]` | | -| controller.metrics.serviceMonitor.scrapeInterval | string | `"30s"` | | -| controller.metrics.serviceMonitor.targetLabels | list | `[]` | | -| controller.minAvailable | int | `1` | Minimum available pods set in PodDisruptionBudget. Define either 'minAvailable' or 'maxUnavailable', never both. | -| controller.minReadySeconds | int | `0` | `minReadySeconds` to avoid killing pods before we are ready # | -| controller.name | string | `"controller"` | | -| controller.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | -| controller.nodeSelector | object | `{"kubernetes.io/os":"linux"}` | Node labels for controller pod assignment # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ # | -| controller.opentelemetry.containerSecurityContext.allowPrivilegeEscalation | bool | `false` | | -| controller.opentelemetry.containerSecurityContext.capabilities.drop[0] | string | `"ALL"` | | -| controller.opentelemetry.containerSecurityContext.readOnlyRootFilesystem | bool | `true` | | -| controller.opentelemetry.containerSecurityContext.runAsNonRoot | bool | `true` | | -| controller.opentelemetry.containerSecurityContext.runAsUser | int | `65532` | The image's default user, inherited from its base image `cgr.dev/chainguard/static`. | -| controller.opentelemetry.containerSecurityContext.seccompProfile.type | string | `"RuntimeDefault"` | | -| controller.opentelemetry.enabled | bool | `false` | | -| controller.opentelemetry.image.digest | string | `"sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922"` | | -| controller.opentelemetry.image.distroless | bool | `true` | | -| controller.opentelemetry.image.image | string | `"ingress-nginx/opentelemetry-1.25.3"` | | -| controller.opentelemetry.image.registry | string | `"registry.k8s.io"` | | -| controller.opentelemetry.image.tag | string | `"v20240813-b933310d"` | | -| controller.opentelemetry.name | string | `"opentelemetry"` | | -| controller.opentelemetry.resources | object | `{}` | | -| controller.podAnnotations | object | `{}` | Annotations to be added to controller pods # | -| controller.podLabels | object | `{}` | Labels to add to the pod container metadata | -| controller.podSecurityContext | object | `{}` | Security context for controller pods | -| controller.priorityClassName | string | `""` | | -| controller.proxySetHeaders | object | `{}` | Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers | -| controller.publishService | object | `{"enabled":true,"pathOverride":""}` | Allows customization of the source of the IP address or FQDN to report in the ingress status field. By default, it reads the information provided by the service. If disable, the status field reports the IP address of the node or nodes where an ingress controller pod is running. | -| controller.publishService.enabled | bool | `true` | Enable 'publishService' or not | -| controller.publishService.pathOverride | string | `""` | Allows overriding of the publish service to bind to Must be / | -| controller.readinessProbe.failureThreshold | int | `3` | | -| controller.readinessProbe.httpGet.path | string | `"/healthz"` | | -| controller.readinessProbe.httpGet.port | int | `10254` | | -| controller.readinessProbe.httpGet.scheme | string | `"HTTP"` | | -| controller.readinessProbe.initialDelaySeconds | int | `10` | | -| controller.readinessProbe.periodSeconds | int | `10` | | -| controller.readinessProbe.successThreshold | int | `1` | | -| controller.readinessProbe.timeoutSeconds | int | `1` | | -| controller.replicaCount | int | `1` | | -| controller.reportNodeInternalIp | bool | `false` | Bare-metal considerations via the host network https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network Ingress status was blank because there is no Service exposing the Ingress-Nginx Controller in a configuration using the host network, the default --publish-service flag used in standard cloud setups does not apply | -| controller.resources.requests.cpu | string | `"100m"` | | -| controller.resources.requests.memory | string | `"90Mi"` | | -| controller.scope.enabled | bool | `false` | Enable 'scope' or not | -| controller.scope.namespace | string | `""` | Namespace to limit the controller to; defaults to $(POD_NAMESPACE) | -| controller.scope.namespaceSelector | string | `""` | When scope.enabled == false, instead of watching all namespaces, we watching namespaces whose labels only match with namespaceSelector. Format like foo=bar. Defaults to empty, means watching all namespaces. | -| controller.service.annotations | object | `{}` | Annotations to be added to the external controller service. See `controller.service.internal.annotations` for annotations to be added to the internal controller service. | -| controller.service.appProtocol | bool | `true` | Declare the app protocol of the external HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol | -| controller.service.clusterIP | string | `""` | Pre-defined cluster internal IP address of the external controller service. Take care of collisions with existing services. This value is immutable. Set once, it can not be changed without deleting and re-creating the service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address | -| controller.service.enableHttp | bool | `true` | Enable the HTTP listener on both controller services or not. | -| controller.service.enableHttps | bool | `true` | Enable the HTTPS listener on both controller services or not. | -| controller.service.enabled | bool | `true` | Enable controller services or not. This does not influence the creation of either the admission webhook or the metrics service. | -| controller.service.external.enabled | bool | `true` | Enable the external controller service or not. Useful for internal-only deployments. | -| controller.service.externalIPs | list | `[]` | List of node IP addresses at which the external controller service is available. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips | -| controller.service.externalTrafficPolicy | string | `""` | External traffic policy of the external controller service. Set to "Local" to preserve source IP on providers supporting it. Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip | -| controller.service.internal.annotations | object | `{}` | Annotations to be added to the internal controller service. Mandatory for the internal controller service to be created. Varies with the cloud service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer | -| controller.service.internal.appProtocol | bool | `true` | Declare the app protocol of the internal HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol | -| controller.service.internal.clusterIP | string | `""` | Pre-defined cluster internal IP address of the internal controller service. Take care of collisions with existing services. This value is immutable. Set once, it can not be changed without deleting and re-creating the service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address | -| controller.service.internal.enabled | bool | `false` | Enable the internal controller service or not. Remember to configure `controller.service.internal.annotations` when enabling this. | -| controller.service.internal.externalIPs | list | `[]` | List of node IP addresses at which the internal controller service is available. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips | -| controller.service.internal.externalTrafficPolicy | string | `""` | External traffic policy of the internal controller service. Set to "Local" to preserve source IP on providers supporting it. Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip | -| controller.service.internal.ipFamilies | list | `["IPv4"]` | List of IP families (e.g. IPv4, IPv6) assigned to the internal controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | -| controller.service.internal.ipFamilyPolicy | string | `"SingleStack"` | Represents the dual-stack capabilities of the internal controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. Fields `ipFamilies` and `clusterIP` depend on the value of this field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | -| controller.service.internal.loadBalancerClass | string | `""` | Load balancer class of the internal controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class | -| controller.service.internal.loadBalancerIP | string | `""` | Deprecated: Pre-defined IP address of the internal controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer | -| controller.service.internal.loadBalancerSourceRanges | list | `[]` | Restrict access to the internal controller service. Values must be CIDRs. Allows any source address by default. | -| controller.service.internal.nodePorts.http | string | `""` | Node port allocated for the internal HTTP listener. If left empty, the service controller allocates one from the configured node port range. | -| controller.service.internal.nodePorts.https | string | `""` | Node port allocated for the internal HTTPS listener. If left empty, the service controller allocates one from the configured node port range. | -| controller.service.internal.nodePorts.tcp | object | `{}` | Node port mapping for internal TCP listeners. If left empty, the service controller allocates them from the configured node port range. Example: tcp: 8080: 30080 | -| controller.service.internal.nodePorts.udp | object | `{}` | Node port mapping for internal UDP listeners. If left empty, the service controller allocates them from the configured node port range. Example: udp: 53: 30053 | -| controller.service.internal.ports | object | `{}` | | -| controller.service.internal.sessionAffinity | string | `""` | Session affinity of the internal controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity | -| controller.service.internal.targetPorts | object | `{}` | | -| controller.service.internal.type | string | `""` | Type of the internal controller service. Defaults to the value of `controller.service.type`. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types | -| controller.service.ipFamilies | list | `["IPv4"]` | List of IP families (e.g. IPv4, IPv6) assigned to the external controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | -| controller.service.ipFamilyPolicy | string | `"SingleStack"` | Represents the dual-stack capabilities of the external controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. Fields `ipFamilies` and `clusterIP` depend on the value of this field. Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services | -| controller.service.labels | object | `{}` | Labels to be added to both controller services. | -| controller.service.loadBalancerClass | string | `""` | Load balancer class of the external controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class | -| controller.service.loadBalancerIP | string | `""` | Deprecated: Pre-defined IP address of the external controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer | -| controller.service.loadBalancerSourceRanges | list | `[]` | Restrict access to the external controller service. Values must be CIDRs. Allows any source address by default. | -| controller.service.nodePorts.http | string | `""` | Node port allocated for the external HTTP listener. If left empty, the service controller allocates one from the configured node port range. | -| controller.service.nodePorts.https | string | `""` | Node port allocated for the external HTTPS listener. If left empty, the service controller allocates one from the configured node port range. | -| controller.service.nodePorts.tcp | object | `{}` | Node port mapping for external TCP listeners. If left empty, the service controller allocates them from the configured node port range. Example: tcp: 8080: 30080 | -| controller.service.nodePorts.udp | object | `{}` | Node port mapping for external UDP listeners. If left empty, the service controller allocates them from the configured node port range. Example: udp: 53: 30053 | -| controller.service.ports.http | int | `80` | Port the external HTTP listener is published with. | -| controller.service.ports.https | int | `443` | Port the external HTTPS listener is published with. | -| controller.service.sessionAffinity | string | `""` | Session affinity of the external controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity | -| controller.service.targetPorts.http | string | `"http"` | Port of the ingress controller the external HTTP listener is mapped to. | -| controller.service.targetPorts.https | string | `"https"` | Port of the ingress controller the external HTTPS listener is mapped to. | -| controller.service.type | string | `"LoadBalancer"` | Type of the external controller service. Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types | -| controller.shareProcessNamespace | bool | `false` | | -| controller.sysctls | object | `{}` | sysctls for controller pods # Ref: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ | -| controller.tcp.annotations | object | `{}` | Annotations to be added to the tcp config configmap | -| controller.tcp.configMapNamespace | string | `""` | Allows customization of the tcp-services-configmap; defaults to $(POD_NAMESPACE) | -| controller.terminationGracePeriodSeconds | int | `300` | `terminationGracePeriodSeconds` to avoid killing pods before we are ready # wait up to five minutes for the drain of connections # | -| controller.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ # | -| controller.topologySpreadConstraints | list | `[]` | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. # Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ # | -| controller.udp.annotations | object | `{}` | Annotations to be added to the udp config configmap | -| controller.udp.configMapNamespace | string | `""` | Allows customization of the udp-services-configmap; defaults to $(POD_NAMESPACE) | -| controller.updateStrategy | object | `{}` | The update strategy to apply to the Deployment or DaemonSet # | -| controller.watchIngressWithoutClass | bool | `false` | Process Ingress objects without ingressClass annotation/ingressClassName field Overrides value for --watch-ingress-without-class flag of the controller binary Defaults to false | -| defaultBackend.affinity | object | `{}` | Affinity and anti-affinity rules for server scheduling to nodes # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity | -| defaultBackend.autoscaling.annotations | object | `{}` | | -| defaultBackend.autoscaling.enabled | bool | `false` | | -| defaultBackend.autoscaling.maxReplicas | int | `2` | | -| defaultBackend.autoscaling.minReplicas | int | `1` | | -| defaultBackend.autoscaling.targetCPUUtilizationPercentage | int | `50` | | -| defaultBackend.autoscaling.targetMemoryUtilizationPercentage | int | `50` | | -| defaultBackend.containerSecurityContext | object | `{}` | Security context for default backend containers | -| defaultBackend.enabled | bool | `false` | | -| defaultBackend.existingPsp | string | `""` | Use an existing PSP instead of creating one | -| defaultBackend.extraArgs | object | `{}` | | -| defaultBackend.extraConfigMaps | list | `[]` | | -| defaultBackend.extraEnvs | list | `[]` | Additional environment variables to set for defaultBackend pods | -| defaultBackend.extraVolumeMounts | list | `[]` | | -| defaultBackend.extraVolumes | list | `[]` | | -| defaultBackend.image.allowPrivilegeEscalation | bool | `false` | | -| defaultBackend.image.image | string | `"defaultbackend-amd64"` | | -| defaultBackend.image.pullPolicy | string | `"IfNotPresent"` | | -| defaultBackend.image.readOnlyRootFilesystem | bool | `true` | | -| defaultBackend.image.registry | string | `"registry.k8s.io"` | | -| defaultBackend.image.runAsNonRoot | bool | `true` | | -| defaultBackend.image.runAsUser | int | `65534` | | -| defaultBackend.image.seccompProfile.type | string | `"RuntimeDefault"` | | -| defaultBackend.image.tag | string | `"1.5"` | | -| defaultBackend.labels | object | `{}` | Labels to be added to the default backend resources | -| defaultBackend.livenessProbe.failureThreshold | int | `3` | | -| defaultBackend.livenessProbe.initialDelaySeconds | int | `30` | | -| defaultBackend.livenessProbe.periodSeconds | int | `10` | | -| defaultBackend.livenessProbe.successThreshold | int | `1` | | -| defaultBackend.livenessProbe.timeoutSeconds | int | `5` | | -| defaultBackend.minAvailable | int | `1` | Minimum available pods set in PodDisruptionBudget. | -| defaultBackend.minReadySeconds | int | `0` | `minReadySeconds` to avoid killing pods before we are ready # | -| defaultBackend.name | string | `"defaultbackend"` | | -| defaultBackend.networkPolicy.enabled | bool | `false` | Enable 'networkPolicy' or not | -| defaultBackend.nodeSelector | object | `{"kubernetes.io/os":"linux"}` | Node labels for default backend pod assignment # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ # | -| defaultBackend.podAnnotations | object | `{}` | Annotations to be added to default backend pods # | -| defaultBackend.podLabels | object | `{}` | Labels to add to the pod container metadata | -| defaultBackend.podSecurityContext | object | `{}` | Security context for default backend pods | -| defaultBackend.port | int | `8080` | | -| defaultBackend.priorityClassName | string | `""` | | -| defaultBackend.readinessProbe.failureThreshold | int | `6` | | -| defaultBackend.readinessProbe.initialDelaySeconds | int | `0` | | -| defaultBackend.readinessProbe.periodSeconds | int | `5` | | -| defaultBackend.readinessProbe.successThreshold | int | `1` | | -| defaultBackend.readinessProbe.timeoutSeconds | int | `5` | | -| defaultBackend.replicaCount | int | `1` | | -| defaultBackend.resources | object | `{}` | | -| defaultBackend.service.annotations | object | `{}` | | -| defaultBackend.service.externalIPs | list | `[]` | List of IP addresses at which the default backend service is available # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips # | -| defaultBackend.service.loadBalancerSourceRanges | list | `[]` | | -| defaultBackend.service.servicePort | int | `80` | | -| defaultBackend.service.type | string | `"ClusterIP"` | | -| defaultBackend.serviceAccount.automountServiceAccountToken | bool | `true` | | -| defaultBackend.serviceAccount.create | bool | `true` | | -| defaultBackend.serviceAccount.name | string | `""` | | -| defaultBackend.tolerations | list | `[]` | Node tolerations for server scheduling to nodes with taints # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ # | -| defaultBackend.topologySpreadConstraints | list | `[]` | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. Ref.: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ | -| defaultBackend.updateStrategy | object | `{}` | The update strategy to apply to the Deployment or DaemonSet # | -| dhParam | string | `""` | A base64-encoded Diffie-Hellman parameter. This can be generated with: `openssl dhparam 4096 2> /dev/null | base64` # Ref: https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/ssl-dh-param | -| imagePullSecrets | list | `[]` | Optional array of imagePullSecrets containing private registry credentials # Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ | -| namespaceOverride | string | `""` | Override the deployment namespace; defaults to .Release.Namespace | -| podSecurityPolicy.enabled | bool | `false` | | -| portNamePrefix | string | `""` | Prefix for TCP and UDP ports names in ingress controller service # Some cloud providers, like Yandex Cloud may have a requirements for a port name regex to support cloud load balancer integration | -| rbac.create | bool | `true` | | -| rbac.scope | bool | `false` | | -| revisionHistoryLimit | int | `10` | Rollback limit # | -| serviceAccount.annotations | object | `{}` | Annotations for the controller service account | -| serviceAccount.automountServiceAccountToken | bool | `true` | | -| serviceAccount.create | bool | `true` | | -| serviceAccount.name | string | `""` | | -| tcp | object | `{}` | TCP service key-value pairs # Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md # | -| udp | object | `{}` | UDP service key-value pairs # Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md # | diff --git a/charts/ingress-nginx/README.md.gotmpl b/charts/ingress-nginx/README.md.gotmpl deleted file mode 100644 index 17b029bbfa..0000000000 --- a/charts/ingress-nginx/README.md.gotmpl +++ /dev/null @@ -1,229 +0,0 @@ -{{ template "chart.header" . }} -[ingress-nginx](https://github.com/kubernetes/ingress-nginx) Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer - -{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }} - -To use, add `ingressClassName: nginx` spec field or the `kubernetes.io/ingress.class: nginx` annotation to your Ingress resources. - -This chart bootstraps an ingress-nginx deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -{{ template "chart.requirementsSection" . }} - -## Get Repo Info - -```console -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm repo update -``` - -## Install Chart - -**Important:** only helm3 is supported - -```console -helm install [RELEASE_NAME] ingress-nginx/ingress-nginx -``` - -The command deploys ingress-nginx on the Kubernetes cluster in the default configuration. - -_See [configuration](#configuration) below._ - -_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ - -## Uninstall Chart - -```console -helm uninstall [RELEASE_NAME] -``` - -This removes all the Kubernetes components associated with the chart and deletes the release. - -_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ - -## Upgrading Chart - -```console -helm upgrade [RELEASE_NAME] [CHART] --install -``` - -_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ - -### Migrating from stable/nginx-ingress - -There are two main ways to migrate a release from `stable/nginx-ingress` to `ingress-nginx/ingress-nginx` chart: - -1. For Nginx Ingress controllers used for non-critical services, the easiest method is to [uninstall](#uninstall-chart) the old release and [install](#install-chart) the new one -1. For critical services in production that require zero-downtime, you will want to: - 1. [Install](#install-chart) a second Ingress controller - 1. Redirect your DNS traffic from the old controller to the new controller - 1. Log traffic from both controllers during this changeover - 1. [Uninstall](#uninstall-chart) the old controller once traffic has fully drained from it - -Note that there are some different and upgraded configurations between the two charts, described by Rimas Mocevicius from JFrog in the "Upgrading to ingress-nginx Helm chart" section of [Migrating from Helm chart nginx-ingress to ingress-nginx](https://rimusz.net/migrating-to-ingress-nginx). As the `ingress-nginx/ingress-nginx` chart continues to update, you will want to check current differences by running [helm configuration](#configuration) commands on both charts. - -## Configuration - -See [Customizing the Chart Before Installing](https://helm.sh/docs/intro/using_helm/#customizing-the-chart-before-installing). To see all configurable options with detailed comments, visit the chart's [values.yaml](./values.yaml), or run these configuration commands: - -```console -helm show values ingress-nginx/ingress-nginx -``` - -### PodDisruptionBudget - -Note that the PodDisruptionBudget resource will only be defined if the replicaCount is greater than one, -else it would make it impossible to evacuate a node. See [gh issue #7127](https://github.com/helm/charts/issues/7127) for more info. - -### Prometheus Metrics - -The Ingress-Nginx Controller can export Prometheus metrics, by setting `controller.metrics.enabled` to `true`. - -You can add Prometheus annotations to the metrics service using `controller.metrics.service.annotations`. -Alternatively, if you use the Prometheus Operator, you can enable ServiceMonitor creation using `controller.metrics.serviceMonitor.enabled`. And set `controller.metrics.serviceMonitor.additionalLabels.release="prometheus"`. "release=prometheus" should match the label configured in the prometheus servicemonitor ( see `kubectl get servicemonitor prometheus-kube-prom-prometheus -oyaml -n prometheus`) - -### ingress-nginx nginx\_status page/stats server - -Previous versions of this chart had a `controller.stats.*` configuration block, which is now obsolete due to the following changes in Ingress-Nginx Controller: - -- In [0.16.1](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0161), the vts (virtual host traffic status) dashboard was removed -- In [0.23.0](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230), the status page at port 18080 is now a unix socket webserver only available at localhost. - You can use `curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status` inside the controller container to access it locally, or use the snippet from [nginx-ingress changelog](https://github.com/kubernetes/ingress-nginx/blob/main/Changelog.md#0230) to re-enable the http server - -### ExternalDNS Service Configuration - -Add an [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) annotation to the LoadBalancer service: - -```yaml -controller: - service: - annotations: - external-dns.alpha.kubernetes.io/hostname: kubernetes-example.com. -``` - -### AWS L7 ELB with SSL Termination - -Annotate the controller as shown in the [nginx-ingress l7 patch](https://github.com/kubernetes/ingress-nginx/blob/ab3a789caae65eec4ad6e3b46b19750b481b6bce/deploy/aws/l7/service-l7.yaml): - -```yaml -controller: - service: - targetPorts: - http: http - https: http - annotations: - service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX - service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" - service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" - service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600' -``` - -### Additional Internal Load Balancer - -This setup is useful when you need both external and internal load balancers but don't want to have multiple ingress controllers and multiple ingress objects per application. - -By default, the ingress object will point to the external load balancer address, but if correctly configured, you can make use of the internal one if the URL you are looking up resolves to the internal load balancer's URL. - -You'll need to set both the following values: - -`controller.service.internal.enabled` -`controller.service.internal.annotations` - -If one of them is missing the internal load balancer will not be deployed. Example you may have `controller.service.internal.enabled=true` but no annotations set, in this case no action will be taken. - -`controller.service.internal.annotations` varies with the cloud service you're using. - -Example for AWS: - -```yaml -controller: - service: - internal: - enabled: true - annotations: - # Create internal NLB - service.beta.kubernetes.io/aws-load-balancer-scheme: "internal" - # Create internal ELB(Deprecated) - # service.beta.kubernetes.io/aws-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -Example for GCE: - -```yaml -controller: - service: - internal: - enabled: true - annotations: - # Create internal LB. More information: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing - # For GKE versions 1.17 and later - networking.gke.io/load-balancer-type: "Internal" - # For earlier versions - # cloud.google.com/load-balancer-type: "Internal" - - # Any other annotation can be declared here. -``` - -Example for Azure: - -```yaml -controller: - service: - annotations: - # Create internal LB - service.beta.kubernetes.io/azure-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -Example for Oracle Cloud Infrastructure: - -```yaml -controller: - service: - annotations: - # Create internal LB - service.beta.kubernetes.io/oci-load-balancer-internal: "true" - # Any other annotation can be declared here. -``` - -The load balancer annotations of more cloud service providers can be found: [Internal load balancer](https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer). - -An use case for this scenario is having a split-view DNS setup where the public zone CNAME records point to the external balancer URL while the private zone CNAME records point to the internal balancer URL. This way, you only need one ingress kubernetes object. - -Optionally you can set `controller.service.loadBalancerIP` if you need a static IP for the resulting `LoadBalancer`. - -### Ingress Admission Webhooks - -With nginx-ingress-controller version 0.25+, the Ingress-Nginx Controller pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent bad ingress from being added to the cluster. -**This feature is enabled by default since 0.31.0.** - -With nginx-ingress-controller in 0.25.* work only with kubernetes 1.14+, 0.26 fix [this issue](https://github.com/kubernetes/ingress-nginx/pull/4521) - -#### How the Chart Configures the Hooks -A validating and configuration requires the endpoint to which the request is sent to use TLS. It is possible to set up custom certificates to do this, but in most cases, a self-signed certificate is enough. The setup of this component requires some more complex orchestration when using helm. The steps are created to be idempotent and to allow turning the feature on and off without running into helm quirks. - -1. A pre-install hook provisions a certificate into the same namespace using a format compatible with provisioning using end user certificates. If the certificate already exists, the hook exits. -2. The Ingress-Nginx Controller pod is configured to use a TLS proxy container, which will load that certificate. -3. Validating and Mutating webhook configurations are created in the cluster. -4. A post-install hook reads the CA from the secret created by step 1 and patches the Validating and Mutating webhook configurations. This process will allow a custom CA provisioned by some other process to also be patched into the webhook configurations. The chosen failure policy is also patched into the webhook configurations - -#### Alternatives -It should be possible to use [cert-manager/cert-manager](https://github.com/cert-manager/cert-manager) if a more complete solution is required. - -You can enable automatic self-signed TLS certificate provisioning via cert-manager by setting the `controller.admissionWebhooks.certManager.enabled` value to true. - -Please ensure that cert-manager is correctly installed and configured. - -### Helm Error When Upgrading: spec.clusterIP: Invalid value: "" - -If you are upgrading this chart from a version between 0.31.0 and 1.2.2 then you may get an error like this: - -```console -Error: UPGRADE FAILED: Service "?????-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable -``` - -Detail of how and why are in [this issue](https://github.com/helm/charts/pull/13646) but to resolve this you can set `xxxx.service.omitClusterIP` to `true` where `xxxx` is the service referenced in the error. - -As of version `1.26.0` of this chart, by simply not providing any clusterIP value, `invalid: spec.clusterIP: Invalid value: "": field is immutable` will no longer occur since `clusterIP: ""` will not be rendered. - -{{ template "chart.valuesSection" . }} diff --git a/charts/ingress-nginx/changelog/helm-chart-2.10.0.md b/charts/ingress-nginx/changelog/helm-chart-2.10.0.md deleted file mode 100644 index b42d6c28b2..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.10.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.10.0 - -* [#5843](https://github.com/kubernetes/ingress-nginx/pull/5843) Update jettech/kube-webhook-certgen image - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.9.1...ingress-nginx-2.10.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.11.0.md b/charts/ingress-nginx/changelog/helm-chart-2.11.0.md deleted file mode 100644 index e549b3867f..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.11.0.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.11.0 - -* [#5879](https://github.com/kubernetes/ingress-nginx/pull/5879) Update helm chart for v0.34.0 -* [#5671](https://github.com/kubernetes/ingress-nginx/pull/5671) Make liveness probe more fault tolerant than readiness probe - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.10.0...ingress-nginx-2.11.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.11.1.md b/charts/ingress-nginx/changelog/helm-chart-2.11.1.md deleted file mode 100644 index d910d3bf49..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.11.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.11.1 - -* [#5900](https://github.com/kubernetes/ingress-nginx/pull/5900) Release helm chart for v0.34.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.0...ingress-nginx-2.11.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.11.2.md b/charts/ingress-nginx/changelog/helm-chart-2.11.2.md deleted file mode 100644 index 9f7821005d..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.11.2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.11.2 - -* [#5951](https://github.com/kubernetes/ingress-nginx/pull/5951) Bump chart patch version - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.1...ingress-nginx-2.11.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.11.3.md b/charts/ingress-nginx/changelog/helm-chart-2.11.3.md deleted file mode 100644 index 344769163b..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.11.3.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.11.3 - -* [#6038](https://github.com/kubernetes/ingress-nginx/pull/6038) Bump chart version PATCH - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.2...ingress-nginx-2.11.3 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.12.0.md b/charts/ingress-nginx/changelog/helm-chart-2.12.0.md deleted file mode 100644 index 5cb3888aae..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.12.0.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.12.0 - -* [#6039](https://github.com/kubernetes/ingress-nginx/pull/6039) Add configurable serviceMonitor metricRelabelling and targetLabels -* [#6044](https://github.com/kubernetes/ingress-nginx/pull/6044) Fix YAML linting - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.11.3...ingress-nginx-2.12.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.12.1.md b/charts/ingress-nginx/changelog/helm-chart-2.12.1.md deleted file mode 100644 index 94d121db57..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.12.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.12.1 - -* [#6075](https://github.com/kubernetes/ingress-nginx/pull/6075) Sync helm chart affinity examples - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.12.0...ingress-nginx-2.12.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.13.0.md b/charts/ingress-nginx/changelog/helm-chart-2.13.0.md deleted file mode 100644 index 01fe0b15d9..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.13.0.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.13.0 - -* [#6093](https://github.com/kubernetes/ingress-nginx/pull/6093) Release v0.35.0 -* [#6080](https://github.com/kubernetes/ingress-nginx/pull/6080) Switch images to k8s.gcr.io after Vanity Domain Flip - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.12.1...ingress-nginx-2.13.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.14.0.md b/charts/ingress-nginx/changelog/helm-chart-2.14.0.md deleted file mode 100644 index 2fb7a5a767..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.14.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.14.0 - -* [#6104](https://github.com/kubernetes/ingress-nginx/pull/6104) Misc fixes for nginx-ingress chart for better keel and prometheus-operator integration - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.13.0...ingress-nginx-2.14.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.15.0.md b/charts/ingress-nginx/changelog/helm-chart-2.15.0.md deleted file mode 100644 index 543a55927e..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.15.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.15.0 - -* [#6087](https://github.com/kubernetes/ingress-nginx/pull/6087) Adding parameter for externalTrafficPolicy in internal controller service spec - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.14.0...ingress-nginx-2.15.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.16.0.md b/charts/ingress-nginx/changelog/helm-chart-2.16.0.md deleted file mode 100644 index 996f4489eb..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.16.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.16.0 - -* [#6154](https://github.com/kubernetes/ingress-nginx/pull/6154) add `topologySpreadConstraint` to controller - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.15.0...ingress-nginx-2.16.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.9.0.md b/charts/ingress-nginx/changelog/helm-chart-2.9.0.md deleted file mode 100644 index 11c5f5fedf..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.9.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.9.0 - -* [#5795](https://github.com/kubernetes/ingress-nginx/pull/5795) Use fully qualified images to avoid cri-o issues - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-TODO...ingress-nginx-2.9.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-2.9.1.md b/charts/ingress-nginx/changelog/helm-chart-2.9.1.md deleted file mode 100644 index 7d4314d9c6..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-2.9.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 2.9.1 - -* [#5823](https://github.com/kubernetes/ingress-nginx/pull/5823) Add quoting to sysctls because numeric values need to be presented as strings (#5823) - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.9.0...ingress-nginx-2.9.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.0.0.md b/charts/ingress-nginx/changelog/helm-chart-3.0.0.md deleted file mode 100644 index a7d50ee3a3..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.0.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.0.0 - -* [#6167](https://github.com/kubernetes/ingress-nginx/pull/6167) Update chart requirements - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-2.16.0...ingress-nginx-3.0.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.10.0.md b/charts/ingress-nginx/changelog/helm-chart-3.10.0.md deleted file mode 100644 index 3369bed032..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.10.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.10.0 - -* Fix routing regression introduced in 0.41.0 with PathType Exact - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.9.0...ingress-nginx-3.10.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.10.1.md b/charts/ingress-nginx/changelog/helm-chart-3.10.1.md deleted file mode 100644 index 6ff682e528..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.10.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.10.1 - -* Fix regression introduced in 0.41.0 with external authentication - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.10.0...ingress-nginx-3.10.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.11.0.md b/charts/ingress-nginx/changelog/helm-chart-3.11.0.md deleted file mode 100644 index 69ba5506b5..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.11.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.11.0 - -* Support Keda Autoscaling - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.10.1...ingress-nginx-3.11.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.11.1.md b/charts/ingress-nginx/changelog/helm-chart-3.11.1.md deleted file mode 100644 index 4e81f4b418..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.11.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.11.1 - -* [#6505](https://github.com/kubernetes/ingress-nginx/pull/6505) Reorder HPA resource list to work with GitOps tooling - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.11.0...ingress-nginx-3.11.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.12.0.md b/charts/ingress-nginx/changelog/helm-chart-3.12.0.md deleted file mode 100644 index 41b9744de6..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.12.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.12.0 - -* [#6514](https://github.com/kubernetes/ingress-nginx/pull/6514) Remove helm2 support and update docs - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.11.1...ingress-nginx-3.12.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.13.0.md b/charts/ingress-nginx/changelog/helm-chart-3.13.0.md deleted file mode 100644 index 0855a79139..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.13.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.13.0 - -* [#6544](https://github.com/kubernetes/ingress-nginx/pull/6544) Fix default backend HPA name variable - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.12.0...ingress-nginx-3.13.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.14.0.md b/charts/ingress-nginx/changelog/helm-chart-3.14.0.md deleted file mode 100644 index e07880bf49..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.14.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.14.0 - -* [#6469](https://github.com/kubernetes/ingress-nginx/pull/6469) Allow custom service names for controller and backend - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.13.0...ingress-nginx-3.14.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.15.0.md b/charts/ingress-nginx/changelog/helm-chart-3.15.0.md deleted file mode 100644 index 3053a3548f..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.15.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.15.0 - -* [#6586](https://github.com/kubernetes/ingress-nginx/pull/6586) Fix 'maxmindLicenseKey' location in values.yaml - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.14.0...ingress-nginx-3.15.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.15.1.md b/charts/ingress-nginx/changelog/helm-chart-3.15.1.md deleted file mode 100644 index f11ee0a764..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.15.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.15.1 - -* Fix chart-releaser action - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.15.0...ingress-nginx-3.15.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.16.0.md b/charts/ingress-nginx/changelog/helm-chart-3.16.0.md deleted file mode 100644 index fba30b1711..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.16.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.16.0 - -* [#6646](https://github.com/kubernetes/ingress-nginx/pull/6646) Added LoadBalancerIP value for internal service - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.15.1...helm-chart-3.16.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.16.1.md b/charts/ingress-nginx/changelog/helm-chart-3.16.1.md deleted file mode 100644 index 650d1b8fad..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.16.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.16.1 - -* Fix chart-releaser action - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.16.0...helm-chart-3.16.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.17.0.md b/charts/ingress-nginx/changelog/helm-chart-3.17.0.md deleted file mode 100644 index 175c7a2647..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.17.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.17.0 - -* Update ingress-nginx v0.42.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.16.1...helm-chart-3.17.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.18.0.md b/charts/ingress-nginx/changelog/helm-chart-3.18.0.md deleted file mode 100644 index 31b815e4ea..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.18.0.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.18.0 - -* [#6688](https://github.com/kubernetes/ingress-nginx/pull/6688) Allow volume-type emptyDir in controller podsecuritypolicy -* [#6691](https://github.com/kubernetes/ingress-nginx/pull/6691) Improve parsing of helm parameters - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.17.0...helm-chart-3.18.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.19.0.md b/charts/ingress-nginx/changelog/helm-chart-3.19.0.md deleted file mode 100644 index 0970bf02ca..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.19.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.19.0 - -* Update ingress-nginx v0.43.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.18.0...helm-chart-3.19.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.20.0.md b/charts/ingress-nginx/changelog/helm-chart-3.20.0.md deleted file mode 100644 index 4b81ae42f6..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.20.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.20.0 - -* [#6730](https://github.com/kubernetes/ingress-nginx/pull/6730) Do not create HPA for defaultBackend if not enabled. - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.19.0...helm-chart-3.20.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.20.1.md b/charts/ingress-nginx/changelog/helm-chart-3.20.1.md deleted file mode 100644 index 952bf2bd3e..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.20.1.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.20.1 - -* Do not create KEDA in case of DaemonSets. -* Fix KEDA v2 definition - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.20.0...helm-chart-3.20.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.21.0.md b/charts/ingress-nginx/changelog/helm-chart-3.21.0.md deleted file mode 100644 index 25edbefd92..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.21.0.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.21.0 - -* [#6783](https://github.com/kubernetes/ingress-nginx/pull/6783) Add custom annotations to ScaledObject -* [#6761](https://github.com/kubernetes/ingress-nginx/pull/6761) Adding quotes in the serviceAccount name in Helm values -* [#6767](https://github.com/kubernetes/ingress-nginx/pull/6767) Remove ClusterRole when scope option is enabled -* [#6785](https://github.com/kubernetes/ingress-nginx/pull/6785) Update kube-webhook-certgen image to v1.5.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.20.1...helm-chart-3.21.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.22.0.md b/charts/ingress-nginx/changelog/helm-chart-3.22.0.md deleted file mode 100644 index 147d66421e..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.22.0.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.22.0 - -* [#6802](https://github.com/kubernetes/ingress-nginx/pull/6802) Add value for configuring a custom Diffie-Hellman parameters file -* [#6815](https://github.com/kubernetes/ingress-nginx/pull/6815) Allow use of numeric namespaces in helm chart - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.21.0...helm-chart-3.22.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.23.0.md b/charts/ingress-nginx/changelog/helm-chart-3.23.0.md deleted file mode 100644 index 5dcb50fa82..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.23.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.23.0 - -* Update ingress-nginx v0.44.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.22.0...helm-chart-3.23.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.24.0.md b/charts/ingress-nginx/changelog/helm-chart-3.24.0.md deleted file mode 100644 index d7db808b12..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.24.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.24.0 - -* [#6908](https://github.com/kubernetes/ingress-nginx/pull/6908) Add volumes to default-backend deployment - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.23.0...helm-chart-3.24.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.25.0.md b/charts/ingress-nginx/changelog/helm-chart-3.25.0.md deleted file mode 100644 index f9679a1242..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.25.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.25.0 - -* [#6957](https://github.com/kubernetes/ingress-nginx/pull/6957) Add ability to specify automountServiceAccountToken - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.24.0...helm-chart-3.25.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.26.0.md b/charts/ingress-nginx/changelog/helm-chart-3.26.0.md deleted file mode 100644 index 0c3a1df685..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.26.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.26.0 - -* [#6979](https://github.com/kubernetes/ingress-nginx/pull/6979) Changed servicePort value for metrics - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.25.0...helm-chart-3.26.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.27.0.md b/charts/ingress-nginx/changelog/helm-chart-3.27.0.md deleted file mode 100644 index 8113d7b9b6..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.27.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.27.0 - -* Update ingress-nginx v0.45.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.26.0...helm-chart-3.27.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.28.0.md b/charts/ingress-nginx/changelog/helm-chart-3.28.0.md deleted file mode 100644 index eee0ccbec8..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.28.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.28.0 - -* [#6900](https://github.com/kubernetes/ingress-nginx/pull/6900) Support existing PSPs - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.27.0...helm-chart-3.28.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.29.0.md b/charts/ingress-nginx/changelog/helm-chart-3.29.0.md deleted file mode 100644 index f0fabdce19..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.29.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.29.0 - -* [#6945](https://github.com/kubernetes/ingress-nginx/pull/7020) Add option to specify job label for ServiceMonitor - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.28.0...helm-chart-3.29.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.3.0.md b/charts/ingress-nginx/changelog/helm-chart-3.3.0.md deleted file mode 100644 index 09fab3756b..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.3.0.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.3.0 - -* [#6203](https://github.com/kubernetes/ingress-nginx/pull/6203) Refactor parsing of key values -* [#6162](https://github.com/kubernetes/ingress-nginx/pull/6162) Add helm chart options to expose metrics service as NodePort -* [#6180](https://github.com/kubernetes/ingress-nginx/pull/6180) Fix helm chart admissionReviewVersions regression -* [#6169](https://github.com/kubernetes/ingress-nginx/pull/6169) Fix Typo in example prometheus rules - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.0.0...ingress-nginx-3.3.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.3.1.md b/charts/ingress-nginx/changelog/helm-chart-3.3.1.md deleted file mode 100644 index 81f44fdbd7..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.3.1.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.3.1 - -* [#6259](https://github.com/kubernetes/ingress-nginx/pull/6259) Release helm chart -* [#6258](https://github.com/kubernetes/ingress-nginx/pull/6258) Fix chart markdown link -* [#6253](https://github.com/kubernetes/ingress-nginx/pull/6253) Release v0.40.0 -* [#6233](https://github.com/kubernetes/ingress-nginx/pull/6233) Add admission controller e2e test - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.3.0...ingress-nginx-3.3.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.30.0.md b/charts/ingress-nginx/changelog/helm-chart-3.30.0.md deleted file mode 100644 index 77ad6b41bb..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.30.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.30.0 - -* [#7092](https://github.com/kubernetes/ingress-nginx/pull/7092) Removes the possibility of using localhost in ExternalNames as endpoints - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.29.0...helm-chart-3.30.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.31.0.md b/charts/ingress-nginx/changelog/helm-chart-3.31.0.md deleted file mode 100644 index bc07fed767..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.31.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.31.0 - -* [7137] https://github.com/kubernetes/ingress-nginx/pull/7137 Add support for custom probes - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.30.0...helm-chart-3.31.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.32.0.md b/charts/ingress-nginx/changelog/helm-chart-3.32.0.md deleted file mode 100644 index 68f7ed6b24..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.32.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.32.0 - -* [7117] https://github.com/kubernetes/ingress-nginx/pull/7117 Add annotations for HPA - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.31.0...helm-chart-3.32.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.33.0.md b/charts/ingress-nginx/changelog/helm-chart-3.33.0.md deleted file mode 100644 index b56c5fc1e3..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.33.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.33.0 - -* [7164] https://github.com/kubernetes/ingress-nginx/pull/7164 Update nginx to v1.20.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.32.0...helm-chart-3.33.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.34.0.md b/charts/ingress-nginx/changelog/helm-chart-3.34.0.md deleted file mode 100644 index a28cd0282a..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.34.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.34.0 - -* [7256] https://github.com/kubernetes/ingress-nginx/pull/7256 Add namespace field in the namespace scoped resource templates - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.33.0...helm-chart-3.34.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.4.0.md b/charts/ingress-nginx/changelog/helm-chart-3.4.0.md deleted file mode 100644 index 3b4ca93537..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.4.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.4.0 - -* [#6268](https://github.com/kubernetes/ingress-nginx/pull/6268) Update to 0.40.2 in helm chart #6288 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.3.1...ingress-nginx-3.4.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.5.0.md b/charts/ingress-nginx/changelog/helm-chart-3.5.0.md deleted file mode 100644 index 44991b3bb6..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.5.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.5.0 - -* [#6260](https://github.com/kubernetes/ingress-nginx/pull/6260) Allow Helm Chart to customize admission webhook's annotations, timeoutSeconds, namespaceSelector, objectSelector and cert files locations - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.4.0...ingress-nginx-3.5.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.5.1.md b/charts/ingress-nginx/changelog/helm-chart-3.5.1.md deleted file mode 100644 index 740f00c458..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.5.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.5.1 - -* [#6299](https://github.com/kubernetes/ingress-nginx/pull/6299) Fix helm chart release - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.5.0...ingress-nginx-3.5.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.6.0.md b/charts/ingress-nginx/changelog/helm-chart-3.6.0.md deleted file mode 100644 index 4af7f11a17..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.6.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.6.0 - -* [#6305](https://github.com/kubernetes/ingress-nginx/pull/6305) Add default linux nodeSelector - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.5.1...ingress-nginx-3.6.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.7.0.md b/charts/ingress-nginx/changelog/helm-chart-3.7.0.md deleted file mode 100644 index a6b12994b8..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.7.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.7.0 - -* [#6316](https://github.com/kubernetes/ingress-nginx/pull/6316) Numerals in podAnnotations in quotes [#6315](https://github.com/kubernetes/ingress-nginx/issues/6315) - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.6.0...ingress-nginx-3.7.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.7.1.md b/charts/ingress-nginx/changelog/helm-chart-3.7.1.md deleted file mode 100644 index 6ba12df913..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.7.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.7.1 - -* [#6326](https://github.com/kubernetes/ingress-nginx/pull/6326) Fix liveness and readiness probe path in daemonset chart - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.7.0...ingress-nginx-3.7.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.8.0.md b/charts/ingress-nginx/changelog/helm-chart-3.8.0.md deleted file mode 100644 index 8df250a982..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.8.0.md +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.8.0 - -* [#6395](https://github.com/kubernetes/ingress-nginx/pull/6395) Update jettech/kube-webhook-certgen image -* [#6377](https://github.com/kubernetes/ingress-nginx/pull/6377) Added loadBalancerSourceRanges for internal lbs -* [#6356](https://github.com/kubernetes/ingress-nginx/pull/6356) Add securitycontext settings on defaultbackend -* [#6401](https://github.com/kubernetes/ingress-nginx/pull/6401) Fix controller service annotations -* [#6403](https://github.com/kubernetes/ingress-nginx/pull/6403) Initial helm chart changelog - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.7.1...ingress-nginx-3.8.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-3.9.0.md b/charts/ingress-nginx/changelog/helm-chart-3.9.0.md deleted file mode 100644 index e8c9def514..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-3.9.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 3.9.0 - -* [#6423](https://github.com/kubernetes/ingress-nginx/pull/6423) Add Default backend HPA autoscaling - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/ingress-nginx-3.8.0...ingress-nginx-3.9.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.1.md b/charts/ingress-nginx/changelog/helm-chart-4.0.1.md deleted file mode 100644 index 7a187b350f..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.1 - -* [7535] https://github.com/kubernetes/ingress-nginx/pull/7535 Release v1.0.0 ingress-nginx - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-3.34.0...helm-chart-4.0.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.10.md b/charts/ingress-nginx/changelog/helm-chart-4.0.10.md deleted file mode 100644 index c5d651670b..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.10.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.10 - -* [7964] https://github.com/kubernetes/ingress-nginx/pull/7964 Update controller version to v1.1.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.9...helm-chart-4.0.10 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.11.md b/charts/ingress-nginx/changelog/helm-chart-4.0.11.md deleted file mode 100644 index 5541823555..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.11.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.11 - -* [7873] https://github.com/kubernetes/ingress-nginx/pull/7873 Makes the [appProtocol](https://kubernetes.io/docs/concepts/services-networking/_print/#application-protocol) field optional. - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.10...helm-chart-4.0.11 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.12.md b/charts/ingress-nginx/changelog/helm-chart-4.0.12.md deleted file mode 100644 index 320f6f5462..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.12.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.12 - -* [7978] https://github.com/kubernetes/ingress-nginx/pull/7979 Support custom annotations in admissions Jobs - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.11...helm-chart-4.0.12 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.13.md b/charts/ingress-nginx/changelog/helm-chart-4.0.13.md deleted file mode 100644 index edd922814c..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.13.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.13 - -* [8008] https://github.com/kubernetes/ingress-nginx/pull/8008 Add relabelings in controller-servicemonitor.yaml - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.12...helm-chart-4.0.13 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.14.md b/charts/ingress-nginx/changelog/helm-chart-4.0.14.md deleted file mode 100644 index e927010392..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.14.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.14 - -* [8061] https://github.com/kubernetes/ingress-nginx/pull/8061 Using helm-docs to populate values table in README.md - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.13...helm-chart-4.0.14 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.15.md b/charts/ingress-nginx/changelog/helm-chart-4.0.15.md deleted file mode 100644 index d3d14a98d7..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.15.md +++ /dev/null @@ -1,43 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.15 - -* [8120] https://github.com/kubernetes/ingress-nginx/pull/8120 Update go in runner and release v1.1.1 -* [8119] https://github.com/kubernetes/ingress-nginx/pull/8119 Update to go v1.17.6 -* [8118] https://github.com/kubernetes/ingress-nginx/pull/8118 Remove deprecated libraries, update other libs -* [8117] https://github.com/kubernetes/ingress-nginx/pull/8117 Fix codegen errors -* [8115] https://github.com/kubernetes/ingress-nginx/pull/8115 chart/ghaction: set the correct permission to have access to push a release -* [8098] https://github.com/kubernetes/ingress-nginx/pull/8098 generating SHA for CA only certs in backend_ssl.go + comparison of P… -* [8088] https://github.com/kubernetes/ingress-nginx/pull/8088 Fix Edit this page link to use main branch -* [8072] https://github.com/kubernetes/ingress-nginx/pull/8072 Expose GeoIP2 Continent code as variable -* [8061] https://github.com/kubernetes/ingress-nginx/pull/8061 docs(charts): using helm-docs for chart -* [8058] https://github.com/kubernetes/ingress-nginx/pull/8058 Bump github.com/spf13/cobra from 1.2.1 to 1.3.0 -* [8054] https://github.com/kubernetes/ingress-nginx/pull/8054 Bump google.golang.org/grpc from 1.41.0 to 1.43.0 -* [8051] https://github.com/kubernetes/ingress-nginx/pull/8051 align bug report with feature request regarding kind documentation -* [8046] https://github.com/kubernetes/ingress-nginx/pull/8046 Report expired certificates (#8045) -* [8044] https://github.com/kubernetes/ingress-nginx/pull/8044 remove G109 check till gosec resolves issues -* [8042] https://github.com/kubernetes/ingress-nginx/pull/8042 docs_multiple_instances_one_cluster_ticket_7543 -* [8041] https://github.com/kubernetes/ingress-nginx/pull/8041 docs: fix typo'd executable name -* [8035] https://github.com/kubernetes/ingress-nginx/pull/8035 Comment busy owners -* [8029] https://github.com/kubernetes/ingress-nginx/pull/8029 Add stream-snippet as a ConfigMap and Annotation option -* [8023] https://github.com/kubernetes/ingress-nginx/pull/8023 fix nginx compilation flags -* [8021] https://github.com/kubernetes/ingress-nginx/pull/8021 Disable default modsecurity_rules_file if modsecurity-snippet is specified -* [8019] https://github.com/kubernetes/ingress-nginx/pull/8019 Revise main documentation page -* [8018] https://github.com/kubernetes/ingress-nginx/pull/8018 Preserve order of plugin invocation -* [8015] https://github.com/kubernetes/ingress-nginx/pull/8015 Add newline indenting to admission webhook annotations -* [8014] https://github.com/kubernetes/ingress-nginx/pull/8014 Add link to example error page manifest in docs -* [8009] https://github.com/kubernetes/ingress-nginx/pull/8009 Fix spelling in documentation and top-level files -* [8008] https://github.com/kubernetes/ingress-nginx/pull/8008 Add relabelings in controller-servicemonitor.yaml -* [8003] https://github.com/kubernetes/ingress-nginx/pull/8003 Minor improvements (formatting, consistency) in install guide -* [8001] https://github.com/kubernetes/ingress-nginx/pull/8001 fix: go-grpc Dockerfile -* [7999] https://github.com/kubernetes/ingress-nginx/pull/7999 images: use k8s-staging-test-infra/gcb-docker-gcloud -* [7996] https://github.com/kubernetes/ingress-nginx/pull/7996 doc: improvement -* [7983] https://github.com/kubernetes/ingress-nginx/pull/7983 Fix a couple of misspellings in the annotations documentation. -* [7979] https://github.com/kubernetes/ingress-nginx/pull/7979 allow set annotations for admission Jobs -* [7977] https://github.com/kubernetes/ingress-nginx/pull/7977 Add ssl_reject_handshake to default server -* [7975] https://github.com/kubernetes/ingress-nginx/pull/7975 add legacy version update v0.50.0 to main changelog -* [7972] https://github.com/kubernetes/ingress-nginx/pull/7972 updated service upstream definition - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.14...helm-chart-4.0.15 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.18.md b/charts/ingress-nginx/changelog/helm-chart-4.0.18.md deleted file mode 100644 index 30a8f75c11..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.18.md +++ /dev/null @@ -1,40 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.18 - -* [8291](https://github.com/kubernetes/ingress-nginx/pull/8291) remove git tag env from cloud build -* [8286](https://github.com/kubernetes/ingress-nginx/pull/8286) Fix OpenTelemetry sidecar image build -* [8277](https://github.com/kubernetes/ingress-nginx/pull/8277) Add OpenSSF Best practices badge -* [8273](https://github.com/kubernetes/ingress-nginx/pull/8273) Issue#8241 -* [8267](https://github.com/kubernetes/ingress-nginx/pull/8267) Add fsGroup value to admission-webhooks/job-patch charts -* [8262](https://github.com/kubernetes/ingress-nginx/pull/8262) Updated confusing error -* [8256](https://github.com/kubernetes/ingress-nginx/pull/8256) fix: deny locations with invalid auth-url annotation -* [8253](https://github.com/kubernetes/ingress-nginx/pull/8253) Add a certificate info metric -* [8236](https://github.com/kubernetes/ingress-nginx/pull/8236) webhook: remove useless code. -* [8227](https://github.com/kubernetes/ingress-nginx/pull/8227) Update libraries in webhook image -* [8225](https://github.com/kubernetes/ingress-nginx/pull/8225) fix inconsistent-label-cardinality for prometheus metrics: nginx_ingress_controller_requests -* [8221](https://github.com/kubernetes/ingress-nginx/pull/8221) Do not validate ingresses with unknown ingress class in admission webhook endpoint -* [8210](https://github.com/kubernetes/ingress-nginx/pull/8210) Bump github.com/prometheus/client_golang from 1.11.0 to 1.12.1 -* [8209](https://github.com/kubernetes/ingress-nginx/pull/8209) Bump google.golang.org/grpc from 1.43.0 to 1.44.0 -* [8204](https://github.com/kubernetes/ingress-nginx/pull/8204) Add Artifact Hub lint -* [8203](https://github.com/kubernetes/ingress-nginx/pull/8203) Fix Indentation of example and link to cert-manager tutorial -* [8201](https://github.com/kubernetes/ingress-nginx/pull/8201) feat(metrics): add path and method labels to requests countera -* [8199](https://github.com/kubernetes/ingress-nginx/pull/8199) use functional options to reduce number of methods creating an EchoDeployment -* [8196](https://github.com/kubernetes/ingress-nginx/pull/8196) docs: fix inconsistent controller annotation -* [8191](https://github.com/kubernetes/ingress-nginx/pull/8191) Using Go install for misspell -* [8186](https://github.com/kubernetes/ingress-nginx/pull/8186) prometheus+grafana using servicemonitor -* [8185](https://github.com/kubernetes/ingress-nginx/pull/8185) Append elements on match, instead of removing for cors-annotations -* [8179](https://github.com/kubernetes/ingress-nginx/pull/8179) Bump github.com/opencontainers/runc from 1.0.3 to 1.1.0 -* [8173](https://github.com/kubernetes/ingress-nginx/pull/8173) Adding annotations to the controller service account -* [8163](https://github.com/kubernetes/ingress-nginx/pull/8163) Update the $req_id placeholder description -* [8162](https://github.com/kubernetes/ingress-nginx/pull/8162) Versioned static manifests -* [8159](https://github.com/kubernetes/ingress-nginx/pull/8159) Adding some geoip variables and default values -* [8155](https://github.com/kubernetes/ingress-nginx/pull/8155) #7271 feat: avoid-pdb-creation-when-default-backend-disabled-and-replicas-gt-1 -* [8151](https://github.com/kubernetes/ingress-nginx/pull/8151) Automatically generate helm docs -* [8143](https://github.com/kubernetes/ingress-nginx/pull/8143) Allow to configure delay before controller exits -* [8136](https://github.com/kubernetes/ingress-nginx/pull/8136) add ingressClass option to helm chart - back compatibility with ingress.class annotations -* [8126](https://github.com/kubernetes/ingress-nginx/pull/8126) Example for JWT - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.15...helm-chart-4.0.18 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.2.md b/charts/ingress-nginx/changelog/helm-chart-4.0.2.md deleted file mode 100644 index 9dbd003a99..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.2 - -* [7681] https://github.com/kubernetes/ingress-nginx/pull/7681 Release v1.0.1 of ingress-nginx - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.1...helm-chart-4.0.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.3.md b/charts/ingress-nginx/changelog/helm-chart-4.0.3.md deleted file mode 100644 index 09b89f66cb..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.3.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.3 - -* [7707] https://github.com/kubernetes/ingress-nginx/pull/7707 Release v1.0.2 of ingress-nginx - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.2...helm-chart-4.0.3 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.5.md b/charts/ingress-nginx/changelog/helm-chart-4.0.5.md deleted file mode 100644 index be67704baf..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.5.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.5 - -* [7740] https://github.com/kubernetes/ingress-nginx/pull/7740 Release v1.0.3 of ingress-nginx - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.3...helm-chart-4.0.5 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.6.md b/charts/ingress-nginx/changelog/helm-chart-4.0.6.md deleted file mode 100644 index 25276e2be5..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.6.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.6 - -* [7804] https://github.com/kubernetes/ingress-nginx/pull/7804 Release v1.0.4 of ingress-nginx -* [7651] https://github.com/kubernetes/ingress-nginx/pull/7651 Support ipFamilyPolicy and ipFamilies fields in Helm Chart -* [7798] https://github.com/kubernetes/ingress-nginx/pull/7798 Exoscale: use HTTP Healthcheck mode -* [7793] https://github.com/kubernetes/ingress-nginx/pull/7793 Update kube-webhook-certgen to v1.1.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.5...helm-chart-4.0.6 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.7.md b/charts/ingress-nginx/changelog/helm-chart-4.0.7.md deleted file mode 100644 index 50fd9227c9..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.7.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.7 - -* [7923] https://github.com/kubernetes/ingress-nginx/pull/7923 Release v1.0.5 of ingress-nginx -* [7806] https://github.com/kubernetes/ingress-nginx/pull/7806 Choice option for internal/external loadbalancer type service - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.6...helm-chart-4.0.7 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.0.9.md b/charts/ingress-nginx/changelog/helm-chart-4.0.9.md deleted file mode 100644 index f2f725c933..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.0.9.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.0.9 - -* [6992] https://github.com/kubernetes/ingress-nginx/pull/6992 Add ability to specify labels for all resources - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.7...helm-chart-4.0.9 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.1.0.md b/charts/ingress-nginx/changelog/helm-chart-4.1.0.md deleted file mode 100644 index 24aaf49aed..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.1.0.md +++ /dev/null @@ -1,21 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.1.0 - -* [8481](https://github.com/kubernetes/ingress-nginx/pull/8481) Fix log creation in chroot script -* [8479](https://github.com/kubernetes/ingress-nginx/pull/8479) changed nginx base img tag to img built with alpine3.14.6 -* [8478](https://github.com/kubernetes/ingress-nginx/pull/8478) update base images and protobuf gomod -* [8468](https://github.com/kubernetes/ingress-nginx/pull/8468) Fallback to ngx.var.scheme for redirectScheme with use-forward-headers when X-Forwarded-Proto is empty -* [8456](https://github.com/kubernetes/ingress-nginx/pull/8456) Implement object deep inspector -* [8455](https://github.com/kubernetes/ingress-nginx/pull/8455) Update dependencies -* [8454](https://github.com/kubernetes/ingress-nginx/pull/8454) Update index.md -* [8447](https://github.com/kubernetes/ingress-nginx/pull/8447) typo fixing -* [8446](https://github.com/kubernetes/ingress-nginx/pull/8446) Fix suggested annotation-value-word-blocklist -* [8444](https://github.com/kubernetes/ingress-nginx/pull/8444) replace deprecated topology key in example with current one -* [8443](https://github.com/kubernetes/ingress-nginx/pull/8443) Add dependency review enforcement -* [8434](https://github.com/kubernetes/ingress-nginx/pull/8434) added new auth-tls-match-cn annotation -* [8426](https://github.com/kubernetes/ingress-nginx/pull/8426) Bump github.com/prometheus/common from 0.32.1 to 0.33.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.0.18...helm-chart-4.1.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.1.2.md b/charts/ingress-nginx/changelog/helm-chart-4.1.2.md deleted file mode 100644 index 20618557fc..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.1.2.md +++ /dev/null @@ -1,11 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.1.2 - -* [8587](https://github.com/kubernetes/ingress-nginx/pull/8587) Add CAP_SYS_CHROOT to DS/PSP when needed -* [8458](https://github.com/kubernetes/ingress-nginx/pull/8458) Add portNamePrefix Helm chart parameter -* [8522](https://github.com/kubernetes/ingress-nginx/pull/8522) Add documentation for controller.service.loadBalancerIP in Helm chart - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.1.0...helm-chart-4.1.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.10.0.md b/charts/ingress-nginx/changelog/helm-chart-4.10.0.md deleted file mode 100644 index a1f1847ec7..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.10.0.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.10.0 - -* - "Update Ingress-Nginx version controller-v1.10.0" - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.9.1...helm-chart-4.10.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.10.1.md b/charts/ingress-nginx/changelog/helm-chart-4.10.1.md deleted file mode 100644 index 3a28de00c9..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.10.1.md +++ /dev/null @@ -1,11 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.10.1 - -* - "update post submit helm ci and clean up (#11221)" -* - "refactor helm ci tests part I (#11188)" -* - "Update Ingress-Nginx version controller-v1.10.1" - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.0...helm-chart-4.10.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.10.2.md b/charts/ingress-nginx/changelog/helm-chart-4.10.2.md deleted file mode 100644 index 399bd98d61..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.10.2.md +++ /dev/null @@ -1,18 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.10.2 - -* Chores: Align security contacts & chart maintainers to actual owners. (#11480) -* Fix helm install on cloud provider admonition block (#11412) -* edited helm-install tips (#11411) -* added info for aws helm install (#11410) -* add workflow to helm release and update ct for branch (#11317) -* Merge pull request #11277 from strongjz/chart-1.10.1 (#11314) -* release helm chart from release branch (#11278) -* update post submit helm ci and clean up (#11221) -* refactor helm ci tests part I (#11188) -* Update Ingress-Nginx version controller-v1.10.2 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.1...helm-chart-4.10.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.11.0.md b/charts/ingress-nginx/changelog/helm-chart-4.11.0.md deleted file mode 100644 index 64108c04e8..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.11.0.md +++ /dev/null @@ -1,18 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.11.0 - -* Chores: Align security contacts & chart maintainers to actual owners. (#11465) -* Merge pull request #11277 from strongjz/chart-1.10.1 (#11415) -* Fix helm install on cloud provider admonition block (#11394) -* edited helm-install tips (#11393) -* added info for aws helm install (#11390) -* add workflow to helm release and update ct for branch (#11378) -* release helm chart from release branch (#11276) -* update post submit helm ci and clean up (#11220) -* refactor helm ci tests part I (#11178) -* Update Ingress-Nginx version controller-v1.11.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.10.2...helm-chart-4.11.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.11.1.md b/charts/ingress-nginx/changelog/helm-chart-4.11.1.md deleted file mode 100644 index 281513e5f9..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.11.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.11.1 - -* Update Ingress-Nginx version controller-v1.11.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.0...helm-chart-4.11.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.11.2.md b/charts/ingress-nginx/changelog/helm-chart-4.11.2.md deleted file mode 100644 index c7645a5b6f..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.11.2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.11.2 - -* Update Ingress-Nginx version controller-v1.11.2 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.1...helm-chart-4.11.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.11.3.md b/charts/ingress-nginx/changelog/helm-chart-4.11.3.md deleted file mode 100644 index 18ec6ba82c..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.11.3.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.11.3 - -* Update Ingress-Nginx version controller-v1.11.3 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.11.2...helm-chart-4.11.3 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.2.0.md b/charts/ingress-nginx/changelog/helm-chart-4.2.0.md deleted file mode 100644 index 2074a0953b..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.2.0.md +++ /dev/null @@ -1,47 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.2.0 - -* Support for Kubernetes v1.19.0 was removed -* [8810](https://github.com/kubernetes/ingress-nginx/pull/8810) Prepare for v1.3.0 -* [8808](https://github.com/kubernetes/ingress-nginx/pull/8808) revert arch var name -* [8805](https://github.com/kubernetes/ingress-nginx/pull/8805) Bump k8s.io/klog/v2 from 2.60.1 to 2.70.1 -* [8803](https://github.com/kubernetes/ingress-nginx/pull/8803) Update to nginx base with alpine v3.16 -* [8802](https://github.com/kubernetes/ingress-nginx/pull/8802) chore: start v1.3.0 release process -* [8798](https://github.com/kubernetes/ingress-nginx/pull/8798) Add v1.24.0 to test matrix -* [8796](https://github.com/kubernetes/ingress-nginx/pull/8796) fix: add MAC_OS variable for static-check -* [8793](https://github.com/kubernetes/ingress-nginx/pull/8793) changed to alpine-v3.16 -* [8781](https://github.com/kubernetes/ingress-nginx/pull/8781) Bump github.com/stretchr/testify from 1.7.5 to 1.8.0 -* [8778](https://github.com/kubernetes/ingress-nginx/pull/8778) chore: remove stable.txt from release process -* [8775](https://github.com/kubernetes/ingress-nginx/pull/8775) Remove stable -* [8773](https://github.com/kubernetes/ingress-nginx/pull/8773) Bump github/codeql-action from 2.1.14 to 2.1.15 -* [8772](https://github.com/kubernetes/ingress-nginx/pull/8772) Bump ossf/scorecard-action from 1.1.1 to 1.1.2 -* [8771](https://github.com/kubernetes/ingress-nginx/pull/8771) fix bullet md format -* [8770](https://github.com/kubernetes/ingress-nginx/pull/8770) Add condition for monitoring.coreos.com/v1 API -* [8769](https://github.com/kubernetes/ingress-nginx/pull/8769) Fix typos and add links to developer guide -* [8767](https://github.com/kubernetes/ingress-nginx/pull/8767) change v1.2.0 to v1.2.1 in deploy doc URLs -* [8765](https://github.com/kubernetes/ingress-nginx/pull/8765) Bump github/codeql-action from 1.0.26 to 2.1.14 -* [8752](https://github.com/kubernetes/ingress-nginx/pull/8752) Bump github.com/spf13/cobra from 1.4.0 to 1.5.0 -* [8751](https://github.com/kubernetes/ingress-nginx/pull/8751) Bump github.com/stretchr/testify from 1.7.2 to 1.7.5 -* [8750](https://github.com/kubernetes/ingress-nginx/pull/8750) added announcement -* [8740](https://github.com/kubernetes/ingress-nginx/pull/8740) change sha e2etestrunner and echoserver -* [8738](https://github.com/kubernetes/ingress-nginx/pull/8738) Update docs to make it easier for noobs to follow step by step -* [8737](https://github.com/kubernetes/ingress-nginx/pull/8737) updated baseimage sha -* [8736](https://github.com/kubernetes/ingress-nginx/pull/8736) set ld-musl-path -* [8733](https://github.com/kubernetes/ingress-nginx/pull/8733) feat: migrate leaderelection lock to leases -* [8726](https://github.com/kubernetes/ingress-nginx/pull/8726) prometheus metric: upstream_latency_seconds -* [8720](https://github.com/kubernetes/ingress-nginx/pull/8720) Ci pin deps -* [8719](https://github.com/kubernetes/ingress-nginx/pull/8719) Working OpenTelemetry sidecar (base nginx image) -* [8714](https://github.com/kubernetes/ingress-nginx/pull/8714) Create Openssf scorecard -* [8708](https://github.com/kubernetes/ingress-nginx/pull/8708) Bump github.com/prometheus/common from 0.34.0 to 0.35.0 -* [8703](https://github.com/kubernetes/ingress-nginx/pull/8703) Bump actions/dependency-review-action from 1 to 2 -* [8701](https://github.com/kubernetes/ingress-nginx/pull/8701) Fix several typos -* [8699](https://github.com/kubernetes/ingress-nginx/pull/8699) fix the gosec test and a make target for it -* [8698](https://github.com/kubernetes/ingress-nginx/pull/8698) Bump actions/upload-artifact from 2.3.1 to 3.1.0 -* [8697](https://github.com/kubernetes/ingress-nginx/pull/8697) Bump actions/setup-go from 2.2.0 to 3.2.0 -* [8695](https://github.com/kubernetes/ingress-nginx/pull/8695) Bump actions/download-artifact from 2 to 3 -* [8694](https://github.com/kubernetes/ingress-nginx/pull/8694) Bump crazy-max/ghaction-docker-buildx from 1.6.2 to 3.3.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.1.2...helm-chart-4.2.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.2.1.md b/charts/ingress-nginx/changelog/helm-chart-4.2.1.md deleted file mode 100644 index 7965bb1c26..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.2.1.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.2.1 - -* The sha of kube-webhook-certgen image & the opentelemetry image, in values file, was changed to new images built on alpine-v3.16.1 -* [8896](https://github.com/kubernetes/ingress-nginx/pull/8896) updated to new images built today - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.2.0...helm-chart-4.2.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.3.0.md b/charts/ingress-nginx/changelog/helm-chart-4.3.0.md deleted file mode 100644 index f9dca22d9f..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.3.0.md +++ /dev/null @@ -1,14 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.3.0 - -* Support for Kubernetes v.1.25.0 was added and support for endpoint slices -* Support for Kubernetes v1.20.0 and v1.21.0 was removed -* [8890](https://github.com/kubernetes/ingress-nginx/pull/8890) migrate to endpointslices -* [9059](https://github.com/kubernetes/ingress-nginx/pull/9059) kubewebhookcertgen sha change after go1191 -* [9046](https://github.com/kubernetes/ingress-nginx/pull/9046) Parameterize metrics port name -* [9104](https://github.com/kubernetes/ingress-nginx/pull/9104) Fix yaml formatting error with multiple annotations - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.2.1...helm-chart-4.3.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.4.0.md b/charts/ingress-nginx/changelog/helm-chart-4.4.0.md deleted file mode 100644 index 20f9e23360..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.4.0.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.4.0 - -* Adding support for disabling liveness and readiness probes to the Helm chart by @njegosrailic in https://github.com/kubernetes/ingress-nginx/pull/9238 -* add:(admission-webhooks) ability to set securityContext by @ybelMekk in https://github.com/kubernetes/ingress-nginx/pull/9186 -* #7652 - Updated Helm chart to use the fullname for the electionID if not specified. by @FutureMatt in https://github.com/kubernetes/ingress-nginx/pull/9133 -* Rename controller-wehbooks-networkpolicy.yaml. by @Gacko in https://github.com/kubernetes/ingress-nginx/pull/9123 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.3.0...helm-chart-4.4.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.5.2.md b/charts/ingress-nginx/changelog/helm-chart-4.5.2.md deleted file mode 100644 index b6d8a3b0c3..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.5.2.md +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.5.2 - -* add lint on chart before release (#9570) -* ci: remove setup-helm step (#9404) -* feat(helm): Optionally use cert-manager instead admission patch (#9279) -* run helm release on main only and when the chart/value changes only (#9290) -* Update Ingress-Nginx version controller-v1.6.4 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.4.3...helm-chart-4.5.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.6.0.md b/charts/ingress-nginx/changelog/helm-chart-4.6.0.md deleted file mode 100644 index 469aaba8cf..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.6.0.md +++ /dev/null @@ -1,24 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.5.3 - -* docs(helm): fix value key in readme for enabling certManager (#9640) -* Upgrade alpine 3.17.2 -* Upgrade golang 1.20 -* Drop testing/support for Kubernetes 1.23 -* docs(helm): fix value key in readme for enabling certManager (#9640) -* Update Ingress-Nginx version controller-v1.7.0 -* feat: OpenTelemetry module integration (#9062) -* canary-weight-total annotation ignored in rule backends (#9729) -* fix controller psp's volume config (#9740) -* Fix several Helm YAML issues with extraModules and extraInitContainers (#9709) -* Chart: Drop `controller.headers`, rework DH param secret. (#9659) -* Deployment/DaemonSet: Label pods using `ingress-nginx.labels`. (#9732) -* HPA: autoscaling/v2beta1 deprecated, bump apiVersion to v2 for defaultBackend (#9731) -* Fix incorrect annotation name in upstream hashing configuration (#9617) - -* Update Ingress-Nginx version controller-v1.7.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.5.2...helm-chart-4.6.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.6.1.md b/charts/ingress-nginx/changelog/helm-chart-4.6.1.md deleted file mode 100644 index 57d99b8dbf..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.6.1.md +++ /dev/null @@ -1,11 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.6.1 - -* [helm] Support custom port configuration for internal service (#9846) -* Adding resource type to default HPA configuration to resolve issues with Terraform helm chart usage (#9803) -* Update Ingress-Nginx version controller-v1.7.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.6.0...helm-chart-4.6.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.7.0.md b/charts/ingress-nginx/changelog/helm-chart-4.7.0.md deleted file mode 100644 index 9d5407053e..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.7.0.md +++ /dev/null @@ -1,14 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.7.0 - -* helm: Fix opentelemetry module installation for daemonset (#9792) -* Update charts/* to keep project name display aligned (#9931) -* HPA: Use capabilities & align manifests. (#9521) -* PodDisruptionBudget spec logic update (#9904) -* add option for annotations in PodDisruptionBudget (#9843) -* Update Ingress-Nginx version controller-v1.8.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.6.1...helm-chart-4.7.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.7.1.md b/charts/ingress-nginx/changelog/helm-chart-4.7.1.md deleted file mode 100644 index 4d69a71173..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.7.1.md +++ /dev/null @@ -1,12 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.7.1 - -* Added a doc line to the missing helm value service.internal.loadBalancerIP (#9406) -* feat(helm): Add loadBalancerClass (#9562) -* added helmshowvalues example (#10019) -* Update Ingress-Nginx version controller-v1.8.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.0...helm-chart-4.7.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.7.2.md b/charts/ingress-nginx/changelog/helm-chart-4.7.2.md deleted file mode 100644 index 57b17b9824..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.7.2.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.7.2 - -* Update Ingress-Nginx version controller-v1.8.2 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.1...helm-chart-4.7.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md b/charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md deleted file mode 100644 index 9072a75b49..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.8.0-beta.0.md +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.8.0-beta.0 - -* ci(helm): fix Helm Chart release action 422 error (#10237) -* helm: Use .Release.Namespace as default for ServiceMonitor namespace (#10249) -* [helm] configure allow to configure hostAliases (#10180) -* [helm] pass service annotations through helm tpl engine (#10084) -* Update Ingress-Nginx version controller-v1.9.0-beta.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.2...helm-chart-4.8.0-beta.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.8.0.md b/charts/ingress-nginx/changelog/helm-chart-4.8.0.md deleted file mode 100644 index af8f1241f5..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.8.0.md +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.8.0 - -* ci(helm): fix Helm Chart release action 422 error (#10237) -* helm: Use .Release.Namespace as default for ServiceMonitor namespace (#10249) -* [helm] configure allow to configure hostAliases (#10180) -* [helm] pass service annotations through helm tpl engine (#10084) -* Update Ingress-Nginx version controller-v1.9.0 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.7.2...helm-chart-4.8.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.8.1.md b/charts/ingress-nginx/changelog/helm-chart-4.8.1.md deleted file mode 100644 index 53a4493de1..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.8.1.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.8.1 - -* Update Ingress-Nginx version controller-v1.9.1 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.0...helm-chart-4.8.1 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.8.2.md b/charts/ingress-nginx/changelog/helm-chart-4.8.2.md deleted file mode 100644 index 9957c1a85c..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.8.2.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.8.2 - -* update nginx base, httpbun, e2e, helm webhook cert gen (#10506) -* Update Ingress-Nginx version controller-v1.9.3 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.1...helm-chart-4.8.2 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.8.3.md b/charts/ingress-nginx/changelog/helm-chart-4.8.3.md deleted file mode 100644 index b8d4d56b33..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.8.3.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.8.3 - -* Update Ingress-Nginx version controller-v1.9.4 - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.2...helm-chart-4.8.3 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.9.0.md b/charts/ingress-nginx/changelog/helm-chart-4.9.0.md deleted file mode 100644 index 5c7729866d..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.9.0.md +++ /dev/null @@ -1,13 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.9.0 - -* - "Add controller.metrics.serviceMonitor.annotations in Helm chart" -* - "fix(labels): use complete labels variable on default-backend deployment" -* - "chart: allow setting allocateLoadBalancerNodePorts (#10693)" -* - "[release-1.9] feat(helm): add documentation about metric args (#10695)" -* - "Update Ingress-Nginx version controller-v1.9.5" - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.8.3...helm-chart-4.9.0 diff --git a/charts/ingress-nginx/changelog/helm-chart-4.9.1.md b/charts/ingress-nginx/changelog/helm-chart-4.9.1.md deleted file mode 100644 index c6120e736b..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart-4.9.1.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### 4.9.1 - -* - "update web hook cert gen to latest release v20231226-1a7112e06" -* - "Update Ingress-Nginx version controller-v1.9.6" - -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-4.9.0...helm-chart-4.9.1 diff --git a/charts/ingress-nginx/changelog/helm-chart.md.gotmpl b/charts/ingress-nginx/changelog/helm-chart.md.gotmpl deleted file mode 100644 index ef5add55dc..0000000000 --- a/charts/ingress-nginx/changelog/helm-chart.md.gotmpl +++ /dev/null @@ -1,11 +0,0 @@ -# Changelog - -This file documents all notable changes to [ingress-nginx](https://github.com/kubernetes/ingress-nginx) Helm Chart. The release numbering uses [semantic versioning](http://semver.org). - -### {{ .NewHelmChartVersion }} -{{ with .HelmUpdates }} -{{- range . }} -* {{ . }} -{{- end }} -{{ end }} -**Full Changelog**: https://github.com/kubernetes/ingress-nginx/compare/helm-chart-{{ .PreviousHelmChartVersion }}...helm-chart-{{ .NewHelmChartVersion }} diff --git a/charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml b/charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml deleted file mode 100644 index 7eafd0c5be..0000000000 --- a/charts/ingress-nginx/ci/admission-webhooks-cert-manager-values.yaml +++ /dev/null @@ -1,12 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - admissionWebhooks: - certManager: - enabled: true diff --git a/charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml b/charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml deleted file mode 100644 index 460a610bac..0000000000 --- a/charts/ingress-nginx/ci/controller-configmap-addheaders-values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - addHeaders: - X-Frame-Options: deny diff --git a/charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml b/charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml deleted file mode 100644 index e23a13c0c6..0000000000 --- a/charts/ingress-nginx/ci/controller-configmap-proxyheaders-values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - proxySetHeaders: - X-Forwarded-Proto: https diff --git a/charts/ingress-nginx/ci/controller-configmap-values.yaml b/charts/ingress-nginx/ci/controller-configmap-values.yaml deleted file mode 100644 index a7029895ca..0000000000 --- a/charts/ingress-nginx/ci/controller-configmap-values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - config: - use-proxy-protocol: "true" diff --git a/charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml b/charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml deleted file mode 100644 index edf12e77ed..0000000000 --- a/charts/ingress-nginx/ci/controller-daemonset-extra-modules-values.yaml +++ /dev/null @@ -1,30 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: DaemonSet - - extraModules: - - name: opentelemetry - image: - registry: registry.k8s.io - image: ingress-nginx/opentelemetry-1.25.3 - tag: v20240813-b933310d - digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 - distroless: true - containerSecurityContext: - runAsNonRoot: true - runAsUser: 65532 - runAsGroup: 65532 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true diff --git a/charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml b/charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml deleted file mode 100644 index 7a98580cd7..0000000000 --- a/charts/ingress-nginx/ci/controller-daemonset-metrics-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: DaemonSet - - metrics: - enabled: true diff --git a/charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml b/charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml deleted file mode 100644 index 179ab2a85a..0000000000 --- a/charts/ingress-nginx/ci/controller-daemonset-opentelemetry-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: DaemonSet - - opentelemetry: - enabled: true diff --git a/charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml b/charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml deleted file mode 100644 index 405992ef30..0000000000 --- a/charts/ingress-nginx/ci/controller-daemonset-podannotations-values.yaml +++ /dev/null @@ -1,16 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: DaemonSet - - podAnnotations: - prometheus.io/scrape: "true" - prometheus.io/port: "10254" - prometheus.io/scheme: http - prometheus.io/path: /metrics diff --git a/charts/ingress-nginx/ci/controller-daemonset-values.yaml b/charts/ingress-nginx/ci/controller-daemonset-values.yaml deleted file mode 100644 index d34025c80f..0000000000 --- a/charts/ingress-nginx/ci/controller-daemonset-values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: DaemonSet diff --git a/charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml b/charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml deleted file mode 100644 index d4083cc375..0000000000 --- a/charts/ingress-nginx/ci/controller-deployment-extra-modules-values.yaml +++ /dev/null @@ -1,30 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: Deployment - - extraModules: - - name: opentelemetry - image: - registry: registry.k8s.io - image: ingress-nginx/opentelemetry-1.25.3 - tag: v20240813-b933310d - digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 - distroless: true - containerSecurityContext: - runAsNonRoot: true - runAsUser: 65532 - runAsGroup: 65532 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true diff --git a/charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml b/charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml deleted file mode 100644 index 9c95d347c4..0000000000 --- a/charts/ingress-nginx/ci/controller-deployment-metrics-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: Deployment - - metrics: - enabled: true diff --git a/charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml b/charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml deleted file mode 100644 index 9443ddefcc..0000000000 --- a/charts/ingress-nginx/ci/controller-deployment-opentelemetry-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: Deployment - - opentelemetry: - enabled: true diff --git a/charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml b/charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml deleted file mode 100644 index cf1f2611e6..0000000000 --- a/charts/ingress-nginx/ci/controller-deployment-podannotations-values.yaml +++ /dev/null @@ -1,16 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: Deployment - - podAnnotations: - prometheus.io/scrape: "true" - prometheus.io/port: "10254" - prometheus.io/scheme: http - prometheus.io/path: /metrics diff --git a/charts/ingress-nginx/ci/controller-deployment-values.yaml b/charts/ingress-nginx/ci/controller-deployment-values.yaml deleted file mode 100644 index 1b092dc0c1..0000000000 --- a/charts/ingress-nginx/ci/controller-deployment-values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - kind: Deployment diff --git a/charts/ingress-nginx/ci/controller-hpa-values.yaml b/charts/ingress-nginx/ci/controller-hpa-values.yaml deleted file mode 100644 index 54a0d2f75a..0000000000 --- a/charts/ingress-nginx/ci/controller-hpa-values.yaml +++ /dev/null @@ -1,18 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - autoscaling: - enabled: true - behavior: - scaleDown: - stabilizationWindowSeconds: 300 - policies: - - type: Pods - value: 1 - periodSeconds: 180 diff --git a/charts/ingress-nginx/ci/controller-ingressclass-values.yaml b/charts/ingress-nginx/ci/controller-ingressclass-values.yaml deleted file mode 100644 index c06429f975..0000000000 --- a/charts/ingress-nginx/ci/controller-ingressclass-values.yaml +++ /dev/null @@ -1,15 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - ingressClassResource: - name: custom-nginx - default: true - controllerValue: k8s.io/custom-nginx - - watchIngressWithoutClass: true diff --git a/charts/ingress-nginx/ci/controller-service-internal-values.yaml b/charts/ingress-nginx/ci/controller-service-internal-values.yaml deleted file mode 100644 index 11108fbce9..0000000000 --- a/charts/ingress-nginx/ci/controller-service-internal-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: ClusterIP - - internal: - enabled: true - annotations: - service.beta.kubernetes.io/aws-load-balancer-internal: "true" diff --git a/charts/ingress-nginx/ci/controller-service-values.yaml b/charts/ingress-nginx/ci/controller-service-values.yaml deleted file mode 100644 index 9039368c28..0000000000 --- a/charts/ingress-nginx/ci/controller-service-values.yaml +++ /dev/null @@ -1,22 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - - service: - type: NodePort - - nodePorts: - tcp: - 9000: 30090 - udp: - 9001: 30091 - -portNamePrefix: port - -tcp: - 9000: default/test:8080 - -udp: - 9001: default/test:8080 diff --git a/charts/ingress-nginx/ci/deamonset-psp-values.yaml b/charts/ingress-nginx/ci/deamonset-psp-values.yaml deleted file mode 100644 index 8026a6356f..0000000000 --- a/charts/ingress-nginx/ci/deamonset-psp-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - kind: DaemonSet - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - admissionWebhooks: - enabled: false - service: - type: ClusterIP - -podSecurityPolicy: - enabled: true diff --git a/charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml b/charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml deleted file mode 100644 index fccdb134cf..0000000000 --- a/charts/ingress-nginx/ci/deamonset-webhook-and-psp-values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -controller: - kind: DaemonSet - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - admissionWebhooks: - enabled: true - service: - type: ClusterIP - -podSecurityPolicy: - enabled: true diff --git a/charts/ingress-nginx/ci/deployment-psp-values.yaml b/charts/ingress-nginx/ci/deployment-psp-values.yaml deleted file mode 100644 index 2f332a7b20..0000000000 --- a/charts/ingress-nginx/ci/deployment-psp-values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - service: - type: ClusterIP - -podSecurityPolicy: - enabled: true diff --git a/charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml b/charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml deleted file mode 100644 index 6195bb3391..0000000000 --- a/charts/ingress-nginx/ci/deployment-webhook-and-psp-values.yaml +++ /dev/null @@ -1,12 +0,0 @@ -controller: - image: - repository: ingress-controller/controller - tag: 1.0.0-dev - digest: null - admissionWebhooks: - enabled: true - service: - type: ClusterIP - -podSecurityPolicy: - enabled: true diff --git a/charts/ingress-nginx/templates/NOTES.txt b/charts/ingress-nginx/templates/NOTES.txt deleted file mode 100644 index f4923007e7..0000000000 --- a/charts/ingress-nginx/templates/NOTES.txt +++ /dev/null @@ -1,73 +0,0 @@ -The ingress-nginx controller has been installed. - -{{- if contains "NodePort" .Values.controller.service.type }} -Get the application URL by running these commands: - -{{- if (not (empty .Values.controller.service.nodePorts.http)) }} - export HTTP_NODE_PORT={{ .Values.controller.service.nodePorts.http }} -{{- else }} - export HTTP_NODE_PORT=$(kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output jsonpath="{.spec.ports[0].nodePort}") -{{- end }} -{{- if (not (empty .Values.controller.service.nodePorts.https)) }} - export HTTPS_NODE_PORT={{ .Values.controller.service.nodePorts.https }} -{{- else }} - export HTTPS_NODE_PORT=$(kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output jsonpath="{.spec.ports[1].nodePort}") -{{- end }} - export NODE_IP="$(kubectl get nodes --output jsonpath="{.items[0].status.addresses[1].address}")" - - echo "Visit http://${NODE_IP}:${HTTP_NODE_PORT} to access your application via HTTP." - echo "Visit https://${NODE_IP}:${HTTPS_NODE_PORT} to access your application via HTTPS." -{{- else if contains "LoadBalancer" .Values.controller.service.type }} -It may take a few minutes for the load balancer IP to be available. -You can watch the status by running 'kubectl get service --namespace {{ include "ingress-nginx.namespace" . }} {{ include "ingress-nginx.controller.fullname" . }} --output wide --watch' -{{- else if contains "ClusterIP" .Values.controller.service.type }} -Get the application URL by running these commands: - export POD_NAME="$(kubectl get pods --namespace {{ include "ingress-nginx.namespace" . }} --selector app.kubernetes.io/name={{ include "ingress-nginx.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=controller --output jsonpath="{.items[0].metadata.name}")" - kubectl port-forward --namespace {{ include "ingress-nginx.namespace" . }} "${POD_NAME}" 8080:80 - echo "Visit http://127.0.0.1:8080 to access your application." -{{- end }} - -An example Ingress that makes use of the controller: - -{{- $isV1 := semverCompare ">=1" .Chart.AppVersion}} - apiVersion: networking.k8s.io/v1 - kind: Ingress - metadata: - name: example - namespace: foo - {{- if eq $isV1 false }} - annotations: - kubernetes.io/ingress.class: {{ .Values.controller.ingressClass }} - {{- end }} - spec: - {{- if $isV1 }} - ingressClassName: {{ .Values.controller.ingressClassResource.name }} - {{- end }} - rules: - - host: www.example.com - http: - paths: - - pathType: Prefix - backend: - service: - name: exampleService - port: - number: 80 - path: / - # This section is only required if TLS is to be enabled for the Ingress - tls: - - hosts: - - www.example.com - secretName: example-tls - -If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: - - apiVersion: v1 - kind: Secret - metadata: - name: example-tls - namespace: foo - data: - tls.crt: - tls.key: - type: kubernetes.io/tls diff --git a/charts/ingress-nginx/templates/_helpers.tpl b/charts/ingress-nginx/templates/_helpers.tpl deleted file mode 100644 index 24cfd14ad9..0000000000 --- a/charts/ingress-nginx/templates/_helpers.tpl +++ /dev/null @@ -1,272 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "ingress-nginx.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "ingress-nginx.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Expand the namespace of the release. -Allows overriding it for multi-namespace deployments in combined charts. -*/}} -{{- define "ingress-nginx.namespace" -}} -{{- default .Release.Namespace .Values.namespaceOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Controller container security context. -*/}} -{{- define "ingress-nginx.controller.containerSecurityContext" -}} -{{- if .Values.controller.containerSecurityContext -}} -{{- toYaml .Values.controller.containerSecurityContext -}} -{{- else -}} -runAsNonRoot: {{ .Values.controller.image.runAsNonRoot }} -runAsUser: {{ .Values.controller.image.runAsUser }} -allowPrivilegeEscalation: {{ or .Values.controller.image.allowPrivilegeEscalation .Values.controller.image.chroot }} -{{- if .Values.controller.image.seccompProfile }} -seccompProfile: {{ toYaml .Values.controller.image.seccompProfile | nindent 2 }} -{{- end }} -capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - {{- if .Values.controller.image.chroot }} - {{- if .Values.controller.image.seccompProfile }} - - SYS_ADMIN - {{- end }} - - SYS_CHROOT - {{- end }} -readOnlyRootFilesystem: {{ .Values.controller.image.readOnlyRootFilesystem }} -{{- end -}} -{{- end -}} - -{{/* -Get specific image -*/}} -{{- define "ingress-nginx.image" -}} -{{- if .chroot -}} -{{- printf "%s-chroot" .image -}} -{{- else -}} -{{- printf "%s" .image -}} -{{- end }} -{{- end -}} - -{{/* -Get specific image digest -*/}} -{{- define "ingress-nginx.imageDigest" -}} -{{- if .chroot -}} -{{- if .digestChroot -}} -{{- printf "@%s" .digestChroot -}} -{{- end }} -{{- else -}} -{{ if .digest -}} -{{- printf "@%s" .digest -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified controller name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.controller.fullname" -}} -{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.controller.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Construct a unique electionID. -Users can provide an override for an explicit electionID if they want via `.Values.controller.electionID` -*/}} -{{- define "ingress-nginx.controller.electionID" -}} -{{- $defElectionID := printf "%s-leader" (include "ingress-nginx.fullname" .) -}} -{{- $electionID := default $defElectionID .Values.controller.electionID -}} -{{- print $electionID -}} -{{- end -}} - -{{/* -Construct the path for the publish-service. - -By convention this will simply use the / to match the name of the -service generated. - -Users can provide an override for an explicit service they want bound via `.Values.controller.publishService.pathOverride` -*/}} -{{- define "ingress-nginx.controller.publishServicePath" -}} -{{- $defServiceName := printf "%s/%s" "$(POD_NAMESPACE)" (include "ingress-nginx.controller.fullname" .) -}} -{{- $servicePath := default $defServiceName .Values.controller.publishService.pathOverride }} -{{- print $servicePath | trimSuffix "-" -}} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "ingress-nginx.labels" -}} -helm.sh/chart: {{ include "ingress-nginx.chart" . }} -{{ include "ingress-nginx.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/part-of: {{ template "ingress-nginx.name" . }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- if .Values.commonLabels}} -{{ toYaml .Values.commonLabels }} -{{- end }} -{{- end -}} - -{{/* -Selector labels -*/}} -{{- define "ingress-nginx.selectorLabels" -}} -app.kubernetes.io/name: {{ include "ingress-nginx.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end -}} - -{{/* -Create the name of the controller service account to use -*/}} -{{- define "ingress-nginx.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "ingress-nginx.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified admission webhook name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.admissionWebhooks.fullname" -}} -{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.controller.admissionWebhooks.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the admission webhook patch job service account to use -*/}} -{{- define "ingress-nginx.admissionWebhooks.patch.serviceAccountName" -}} -{{- if .Values.controller.admissionWebhooks.patch.serviceAccount.create -}} - {{ default (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.patch.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.controller.admissionWebhooks.patch.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create a default fully qualified admission webhook secret creation job name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.admissionWebhooks.createSecretJob.fullname" -}} -{{- printf "%s-%s" (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.createSecretJob.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified admission webhook patch job name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" -}} -{{- printf "%s-%s" (include "ingress-nginx.admissionWebhooks.fullname" .) .Values.controller.admissionWebhooks.patchWebhookJob.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified default backend name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "ingress-nginx.defaultBackend.fullname" -}} -{{- printf "%s-%s" (include "ingress-nginx.fullname" .) .Values.defaultBackend.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the default backend service account to use -*/}} -{{- define "ingress-nginx.defaultBackend.serviceAccountName" -}} -{{- if .Values.defaultBackend.serviceAccount.create -}} - {{ default (printf "%s-backend" (include "ingress-nginx.fullname" .)) .Values.defaultBackend.serviceAccount.name }} -{{- else -}} - {{ default "default-backend" .Values.defaultBackend.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Default backend container security context. -*/}} -{{- define "ingress-nginx.defaultBackend.containerSecurityContext" -}} -{{- if .Values.defaultBackend.containerSecurityContext -}} -{{- toYaml .Values.defaultBackend.containerSecurityContext -}} -{{- else -}} -runAsNonRoot: {{ .Values.defaultBackend.image.runAsNonRoot }} -runAsUser: {{ .Values.defaultBackend.image.runAsUser }} -allowPrivilegeEscalation: {{ .Values.defaultBackend.image.allowPrivilegeEscalation }} -{{- if .Values.defaultBackend.image.seccompProfile }} -seccompProfile: {{ toYaml .Values.defaultBackend.image.seccompProfile | nindent 2 }} -{{- end }} -capabilities: - drop: - - ALL -readOnlyRootFilesystem: {{ .Values.defaultBackend.image.readOnlyRootFilesystem }} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiGroup for PodSecurityPolicy. -*/}} -{{- define "podSecurityPolicy.apiGroup" -}} -{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy" -}} -{{- else -}} -{{- print "extensions" -}} -{{- end -}} -{{- end -}} - -{{/* -Extra modules. -*/}} -{{- define "extraModules" -}} -- name: {{ .name }} - {{- with .image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} - command: - {{- if .distroless }} - - /init_module - {{- else }} - - sh - - -c - - /usr/local/bin/init_module.sh - {{- end }} - {{- end }} - {{- if .containerSecurityContext }} - securityContext: {{ toYaml .containerSecurityContext | nindent 4 }} - {{- end }} - {{- if .resources }} - resources: {{ toYaml .resources | nindent 4 }} - {{- end }} - volumeMounts: - - name: modules - mountPath: /modules_mount -{{- end -}} diff --git a/charts/ingress-nginx/templates/_params.tpl b/charts/ingress-nginx/templates/_params.tpl deleted file mode 100644 index 48569a8b0c..0000000000 --- a/charts/ingress-nginx/templates/_params.tpl +++ /dev/null @@ -1,77 +0,0 @@ -{{- define "ingress-nginx.params" -}} -- /nginx-ingress-controller -{{- if .Values.controller.enableAnnotationValidations }} -- --enable-annotation-validation=true -{{- end }} -{{- if .Values.defaultBackend.enabled }} -- --default-backend-service=$(POD_NAMESPACE)/{{ include "ingress-nginx.defaultBackend.fullname" . }} -{{- end }} -{{- if and .Values.controller.publishService.enabled .Values.controller.service.enabled }} -{{- if .Values.controller.service.external.enabled }} -- --publish-service={{ template "ingress-nginx.controller.publishServicePath" . }} -{{- else if .Values.controller.service.internal.enabled }} -- --publish-service={{ template "ingress-nginx.controller.publishServicePath" . }}-internal -{{- end }} -{{- end }} -- --election-id={{ include "ingress-nginx.controller.electionID" . }} -- --controller-class={{ .Values.controller.ingressClassResource.controllerValue }} -{{- if .Values.controller.ingressClass }} -- --ingress-class={{ .Values.controller.ingressClass }} -{{- end }} -- --configmap={{ default "$(POD_NAMESPACE)" .Values.controller.configMapNamespace }}/{{ include "ingress-nginx.controller.fullname" . }} -{{- if .Values.tcp }} -- --tcp-services-configmap={{ default "$(POD_NAMESPACE)" .Values.controller.tcp.configMapNamespace }}/{{ include "ingress-nginx.fullname" . }}-tcp -{{- end }} -{{- if .Values.udp }} -- --udp-services-configmap={{ default "$(POD_NAMESPACE)" .Values.controller.udp.configMapNamespace }}/{{ include "ingress-nginx.fullname" . }}-udp -{{- end }} -{{- if .Values.controller.scope.enabled }} -- --watch-namespace={{ default "$(POD_NAMESPACE)" .Values.controller.scope.namespace }} -{{- end }} -{{- if and (not .Values.controller.scope.enabled) .Values.controller.scope.namespaceSelector }} -- --watch-namespace-selector={{ .Values.controller.scope.namespaceSelector }} -{{- end }} -{{- if and .Values.controller.reportNodeInternalIp .Values.controller.hostNetwork }} -- --report-node-internal-ip-address={{ .Values.controller.reportNodeInternalIp }} -{{- end }} -{{- if .Values.controller.admissionWebhooks.enabled }} -- --validating-webhook=:{{ .Values.controller.admissionWebhooks.port }} -- --validating-webhook-certificate={{ .Values.controller.admissionWebhooks.certificate }} -- --validating-webhook-key={{ .Values.controller.admissionWebhooks.key }} -{{- end }} -{{- if .Values.controller.maxmindLicenseKey }} -- --maxmind-license-key={{ .Values.controller.maxmindLicenseKey }} -{{- end }} -{{- if .Values.controller.healthCheckHost }} -- --healthz-host={{ .Values.controller.healthCheckHost }} -{{- end }} -{{- if not (eq .Values.controller.healthCheckPath "/healthz") }} -- --health-check-path={{ .Values.controller.healthCheckPath }} -{{- end }} -{{- if .Values.controller.ingressClassByName }} -- --ingress-class-by-name=true -{{- end }} -{{- if .Values.controller.watchIngressWithoutClass }} -- --watch-ingress-without-class=true -{{- end }} -{{- if not .Values.controller.metrics.enabled }} -- --enable-metrics={{ .Values.controller.metrics.enabled }} -{{- end }} -{{- if .Values.controller.enableTopologyAwareRouting }} -- --enable-topology-aware-routing=true -{{- end }} -{{- if .Values.controller.disableLeaderElection }} -- --disable-leader-election=true -{{- end }} -{{- if .Values.controller.electionTTL }} -- --election-ttl={{ .Values.controller.electionTTL }} -{{- end }} -{{- range $key, $value := .Values.controller.extraArgs }} -{{- /* Accept keys without values or with false as value */}} -{{- if eq ($value | quote | len) 2 }} -- --{{ $key }} -{{- else }} -- --{{ $key }}={{ $value }} -{{- end }} -{{- end }} -{{- end -}} diff --git a/charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml b/charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml deleted file mode 100644 index db2946c3d1..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/cert-manager.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.certManager.enabled -}} -{{- if not .Values.controller.admissionWebhooks.certManager.issuerRef -}} -# Create a selfsigned Issuer, in order to create a root CA certificate for -# signing webhook serving certificates -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ include "ingress-nginx.fullname" . }}-self-signed-issuer - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - selfSigned: {} ---- -# Generate a CA Certificate used to sign certificates for the webhook -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ include "ingress-nginx.fullname" . }}-root-cert - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - secretName: {{ include "ingress-nginx.fullname" . }}-root-cert - duration: {{ .Values.controller.admissionWebhooks.certManager.rootCert.duration | default "43800h0m0s" | quote }} - issuerRef: - name: {{ include "ingress-nginx.fullname" . }}-self-signed-issuer - commonName: "ca.webhook.ingress-nginx" - isCA: true - subject: - organizations: - - ingress-nginx ---- -# Create an Issuer that uses the above generated CA certificate to issue certs -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: {{ include "ingress-nginx.fullname" . }}-root-issuer - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - ca: - secretName: {{ include "ingress-nginx.fullname" . }}-root-cert -{{- end }} ---- -# generate a server certificate for the apiservices to use -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - duration: {{ .Values.controller.admissionWebhooks.certManager.admissionCert.duration | default "8760h0m0s" | quote }} - issuerRef: - {{- if .Values.controller.admissionWebhooks.certManager.issuerRef }} - {{- toYaml .Values.controller.admissionWebhooks.certManager.issuerRef | nindent 4 }} - {{- else }} - name: {{ include "ingress-nginx.fullname" . }}-root-issuer - {{- end }} - dnsNames: - - {{ include "ingress-nginx.controller.fullname" . }}-admission - - {{ include "ingress-nginx.controller.fullname" . }}-admission.{{ include "ingress-nginx.namespace" . }} - - {{ include "ingress-nginx.controller.fullname" . }}-admission.{{ include "ingress-nginx.namespace" . }}.svc - subject: - organizations: - - ingress-nginx-admission -{{- end -}} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml deleted file mode 100644 index a21848201b..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -rules: - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - get - - update -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] - resources: ['podsecuritypolicies'] - verbs: ['use'] - {{- with .Values.controller.admissionWebhooks.existingPsp }} - resourceNames: [{{ . }}] - {{- else }} - resourceNames: [{{ include "ingress-nginx.admissionWebhooks.fullname" . }}] - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml deleted file mode 100644 index b893884335..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml deleted file mode 100644 index 176616467c..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml +++ /dev/null @@ -1,79 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.createSecretJob.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - {{- with .Values.controller.admissionWebhooks.annotations }} - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} - # Alpha feature since k8s 1.12 - ttlSecondsAfterFinished: 0 -{{- end }} - template: - metadata: - name: {{ include "ingress-nginx.admissionWebhooks.createSecretJob.fullname" . }} - {{- if .Values.controller.admissionWebhooks.patch.podAnnotations }} - annotations: {{ toYaml .Values.controller.admissionWebhooks.patch.podAnnotations | nindent 8 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 8 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }} - priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} - {{- end }} - containers: - - name: create - {{- with .Values.controller.admissionWebhooks.patch.image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} - {{- end }} - imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.image.pullPolicy }} - args: - - create - - --host={{ include "ingress-nginx.controller.fullname" . }}-admission,{{ include "ingress-nginx.controller.fullname" . }}-admission.$(POD_NAMESPACE).svc - - --namespace=$(POD_NAMESPACE) - - --secret-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if .Values.controller.admissionWebhooks.extraEnvs }} - {{- toYaml .Values.controller.admissionWebhooks.extraEnvs | nindent 12 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.createSecretJob.securityContext }} - securityContext: {{ toYaml .Values.controller.admissionWebhooks.createSecretJob.securityContext | nindent 12 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.createSecretJob.resources }} - resources: {{ toYaml .Values.controller.admissionWebhooks.createSecretJob.resources | nindent 12 }} - {{- end }} - restartPolicy: OnFailure - serviceAccountName: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} - {{- if .Values.controller.admissionWebhooks.patch.nodeSelector }} - nodeSelector: {{ toYaml .Values.controller.admissionWebhooks.patch.nodeSelector | nindent 8 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patch.tolerations }} - tolerations: {{ toYaml .Values.controller.admissionWebhooks.patch.tolerations | nindent 8 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patch.securityContext }} - securityContext: {{ toYaml .Values.controller.admissionWebhooks.patch.securityContext | nindent 8 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml deleted file mode 100644 index f7d44a24db..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml +++ /dev/null @@ -1,81 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - {{- with .Values.controller.admissionWebhooks.annotations }} - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }} - # Alpha feature since k8s 1.12 - ttlSecondsAfterFinished: 0 -{{- end }} - template: - metadata: - name: {{ include "ingress-nginx.admissionWebhooks.patchWebhookJob.fullname" . }} - {{- if .Values.controller.admissionWebhooks.patch.podAnnotations }} - annotations: {{ toYaml .Values.controller.admissionWebhooks.patch.podAnnotations | nindent 8 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 8 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }} - priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} - {{- end }} - containers: - - name: patch - {{- with .Values.controller.admissionWebhooks.patch.image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} - {{- end }} - imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.image.pullPolicy }} - args: - - patch - - --webhook-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} - - --namespace=$(POD_NAMESPACE) - - --patch-mutating=false - - --secret-name={{ include "ingress-nginx.admissionWebhooks.fullname" . }} - - --patch-failure-policy={{ .Values.controller.admissionWebhooks.failurePolicy }} - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if .Values.controller.admissionWebhooks.extraEnvs }} - {{- toYaml .Values.controller.admissionWebhooks.extraEnvs | nindent 12 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patchWebhookJob.securityContext }} - securityContext: {{ toYaml .Values.controller.admissionWebhooks.patchWebhookJob.securityContext | nindent 12 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patchWebhookJob.resources }} - resources: {{ toYaml .Values.controller.admissionWebhooks.patchWebhookJob.resources | nindent 12 }} - {{- end }} - restartPolicy: OnFailure - serviceAccountName: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} - {{- if .Values.controller.admissionWebhooks.patch.nodeSelector }} - nodeSelector: {{ toYaml .Values.controller.admissionWebhooks.patch.nodeSelector | nindent 8 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patch.tolerations }} - tolerations: {{ toYaml .Values.controller.admissionWebhooks.patch.tolerations | nindent 8 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.patch.securityContext }} - securityContext: {{ toYaml .Values.controller.admissionWebhooks.patch.securityContext | nindent 8 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml deleted file mode 100644 index a8f38df96f..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/networkpolicy.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.networkPolicy.enabled (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - podSelector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: admission-webhook - policyTypes: - - Ingress - - Egress - egress: - - {} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml deleted file mode 100644 index 8e5dc72ac4..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/psp.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} -{{- if and .Values.podSecurityPolicy.enabled .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled (empty .Values.controller.admissionWebhooks.existingPsp) -}} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - privileged: false - hostPID: false - hostIPC: false - hostNetwork: false - volumes: - - configMap - - downwardAPI - - emptyDir - - secret - - projected - fsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: true - runAsUser: - rule: MustRunAsNonRoot - runAsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - supplementalGroups: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - seLinux: - rule: RunAsAny -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml deleted file mode 100644 index c4b23aa082..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -rules: - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - create -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml deleted file mode 100644 index 425e8d8218..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.rbac.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml b/charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml deleted file mode 100644 index 52f94dcce7..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.controller.admissionWebhooks.patch.serviceAccount.create (not .Values.controller.admissionWebhooks.certManager.enabled) -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "ingress-nginx.admissionWebhooks.patch.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - annotations: - "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade - "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.patch.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken }} -{{- end }} diff --git a/charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml b/charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml deleted file mode 100644 index 0949cea75a..0000000000 --- a/charts/ingress-nginx/templates/admission-webhooks/validating-webhook.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{- if .Values.controller.admissionWebhooks.enabled -}} -# before changing this value, check the required kubernetes version -# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - {{- if .Values.controller.admissionWebhooks.certManager.enabled }} - certmanager.k8s.io/inject-ca-from: {{ printf "%s/%s" (include "ingress-nginx.namespace" .) (include "ingress-nginx.admissionWebhooks.fullname" .) | quote }} - cert-manager.io/inject-ca-from: {{ printf "%s/%s" (include "ingress-nginx.namespace" .) (include "ingress-nginx.admissionWebhooks.fullname" .) | quote }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.annotations }} - {{- toYaml .Values.controller.admissionWebhooks.annotations | nindent 4 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: admission-webhook - {{- with .Values.controller.admissionWebhooks.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} -webhooks: - - name: validate.nginx.ingress.kubernetes.io - matchPolicy: Equivalent - rules: - - apiGroups: - - networking.k8s.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - ingresses - failurePolicy: {{ .Values.controller.admissionWebhooks.failurePolicy | default "Fail" }} - sideEffects: None - admissionReviewVersions: - - v1 - clientConfig: - service: - name: {{ include "ingress-nginx.controller.fullname" . }}-admission - namespace: {{ include "ingress-nginx.namespace" . }} - port: {{ .Values.controller.admissionWebhooks.service.servicePort }} - path: /networking/v1/ingresses - {{- if .Values.controller.admissionWebhooks.timeoutSeconds }} - timeoutSeconds: {{ .Values.controller.admissionWebhooks.timeoutSeconds }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.namespaceSelector }} - namespaceSelector: {{ toYaml .Values.controller.admissionWebhooks.namespaceSelector | nindent 6 }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.objectSelector }} - objectSelector: {{ toYaml .Values.controller.admissionWebhooks.objectSelector | nindent 6 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/clusterrole.yaml b/charts/ingress-nginx/templates/clusterrole.yaml deleted file mode 100644 index 51bc5002cc..0000000000 --- a/charts/ingress-nginx/templates/clusterrole.yaml +++ /dev/null @@ -1,102 +0,0 @@ -{{- if .Values.rbac.create }} - -{{- if and .Values.rbac.scope (not .Values.controller.scope.enabled) -}} - {{ required "Invalid configuration: 'rbac.scope' should be equal to 'controller.scope.enabled' (true/false)." (index (dict) ".") }} -{{- end }} - -{{- if not .Values.rbac.scope -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }} -rules: - - apiGroups: - - "" - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets -{{- if not .Values.controller.scope.enabled }} - - namespaces -{{- end}} - verbs: - - list - - watch - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - list - - watch -{{- if and .Values.controller.scope.enabled .Values.controller.scope.namespace }} - - apiGroups: - - "" - resources: - - namespaces - resourceNames: - - "{{ .Values.controller.scope.namespace }}" - verbs: - - get -{{- end }} - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch - - apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get -{{- end }} - -{{- end }} diff --git a/charts/ingress-nginx/templates/clusterrolebinding.yaml b/charts/ingress-nginx/templates/clusterrolebinding.yaml deleted file mode 100644 index 8f91aac807..0000000000 --- a/charts/ingress-nginx/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.rbac.create (not .Values.rbac.scope) -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ include "ingress-nginx.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "ingress-nginx.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-configmap-addheaders.yaml b/charts/ingress-nginx/templates/controller-configmap-addheaders.yaml deleted file mode 100644 index 4e4bd1310a..0000000000 --- a/charts/ingress-nginx/templates/controller-configmap-addheaders.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.controller.addHeaders -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }}-custom-add-headers - namespace: {{ include "ingress-nginx.namespace" . }} -data: {{ toYaml .Values.controller.addHeaders | nindent 2 }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml b/charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml deleted file mode 100644 index 0a22600db2..0000000000 --- a/charts/ingress-nginx/templates/controller-configmap-proxyheaders.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.controller.proxySetHeaders -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }}-custom-proxy-headers - namespace: {{ include "ingress-nginx.namespace" . }} -data: {{ toYaml .Values.controller.proxySetHeaders | nindent 2 }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-configmap-tcp.yaml b/charts/ingress-nginx/templates/controller-configmap-tcp.yaml deleted file mode 100644 index 131a9ad510..0000000000 --- a/charts/ingress-nginx/templates/controller-configmap-tcp.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.tcp -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if .Values.controller.tcp.annotations }} - annotations: {{ toYaml .Values.controller.tcp.annotations | nindent 4 }} -{{- end }} - name: {{ include "ingress-nginx.fullname" . }}-tcp - namespace: {{ include "ingress-nginx.namespace" . }} -data: {{ tpl (toYaml .Values.tcp) . | nindent 2 }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-configmap-udp.yaml b/charts/ingress-nginx/templates/controller-configmap-udp.yaml deleted file mode 100644 index 7137da9ad2..0000000000 --- a/charts/ingress-nginx/templates/controller-configmap-udp.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.udp -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if .Values.controller.udp.annotations }} - annotations: {{ toYaml .Values.controller.udp.annotations | nindent 4 }} -{{- end }} - name: {{ include "ingress-nginx.fullname" . }}-udp - namespace: {{ include "ingress-nginx.namespace" . }} -data: {{ tpl (toYaml .Values.udp) . | nindent 2 }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-configmap.yaml b/charts/ingress-nginx/templates/controller-configmap.yaml deleted file mode 100644 index 22080d115f..0000000000 --- a/charts/ingress-nginx/templates/controller-configmap.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -{{- if .Values.controller.configAnnotations }} - annotations: {{ toYaml .Values.controller.configAnnotations | nindent 4 }} -{{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -data: - allow-snippet-annotations: "{{ .Values.controller.allowSnippetAnnotations }}" -{{- if .Values.controller.addHeaders }} - add-headers: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.fullname" . }}-custom-add-headers -{{- end }} -{{- if .Values.controller.proxySetHeaders }} - proxy-set-headers: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.fullname" . }}-custom-proxy-headers -{{- end }} -{{- if .Values.dhParam }} - ssl-dh-param: {{ include "ingress-nginx.namespace" . }}/{{ include "ingress-nginx.controller.fullname" . }} -{{- end }} -{{- range $key, $value := .Values.controller.config }} - {{- $key | nindent 2 }}: {{ tpl (toString $value) $ | quote }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-daemonset.yaml b/charts/ingress-nginx/templates/controller-daemonset.yaml deleted file mode 100644 index fcc633d3d4..0000000000 --- a/charts/ingress-nginx/templates/controller-daemonset.yaml +++ /dev/null @@ -1,242 +0,0 @@ -{{- if eq .Values.controller.kind "DaemonSet" -}} -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - {{- if .Values.controller.annotations }} - annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: controller - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - {{- if .Values.controller.updateStrategy }} - updateStrategy: {{ toYaml .Values.controller.updateStrategy | nindent 4 }} - {{- end }} - minReadySeconds: {{ .Values.controller.minReadySeconds }} - template: - metadata: - {{- if .Values.controller.podAnnotations }} - annotations: - {{- range $key, $value := .Values.controller.podAnnotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 8 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.controller.podLabels }} - {{- toYaml .Values.controller.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.controller.dnsConfig }} - dnsConfig: {{ toYaml .Values.controller.dnsConfig | nindent 8 }} - {{- end }} - {{- if .Values.controller.hostAliases }} - hostAliases: {{ tpl (toYaml .Values.controller.hostAliases) $ | nindent 8 }} - {{- end }} - {{- if .Values.controller.hostname }} - hostname: {{ toYaml .Values.controller.hostname | nindent 8 }} - {{- end }} - dnsPolicy: {{ .Values.controller.dnsPolicy }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} - {{- end }} - {{- if .Values.controller.priorityClassName }} - priorityClassName: {{ .Values.controller.priorityClassName | quote }} - {{- end }} - {{- if or .Values.controller.podSecurityContext .Values.controller.sysctls }} - securityContext: - {{- if .Values.controller.podSecurityContext }} - {{- toYaml .Values.controller.podSecurityContext | nindent 8 }} - {{- end }} - {{- if .Values.controller.sysctls }} - sysctls: - {{- range $sysctl, $value := .Values.controller.sysctls }} - - name: {{ $sysctl | quote }} - value: {{ $value | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.controller.shareProcessNamespace }} - shareProcessNamespace: {{ .Values.controller.shareProcessNamespace }} - {{- end }} - containers: - - name: {{ .Values.controller.containerName }} - {{- with .Values.controller.image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ include "ingress-nginx.image" . }}{{ end }}:{{ .tag }}{{ include "ingress-nginx.imageDigest" . }} - {{- end }} - imagePullPolicy: {{ .Values.controller.image.pullPolicy }} - {{- if .Values.controller.lifecycle }} - lifecycle: {{ toYaml .Values.controller.lifecycle | nindent 12 }} - {{- end }} - args: {{ include "ingress-nginx.params" . | nindent 12 }} - securityContext: {{ include "ingress-nginx.controller.containerSecurityContext" . | nindent 12 }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if .Values.controller.enableMimalloc }} - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - {{- end }} - {{- if .Values.controller.extraEnvs }} - {{- toYaml .Values.controller.extraEnvs | nindent 12 }} - {{- end }} - {{- if .Values.controller.startupProbe }} - startupProbe: {{ toYaml .Values.controller.startupProbe | nindent 12 }} - {{- end }} - {{- if .Values.controller.livenessProbe }} - livenessProbe: {{ toYaml .Values.controller.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.controller.readinessProbe }} - readinessProbe: {{ toYaml .Values.controller.readinessProbe | nindent 12 }} - {{- end }} - ports: - {{- range $key, $value := .Values.controller.containerPort }} - - name: {{ $key }} - containerPort: {{ $value }} - protocol: TCP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ index $.Values.controller.hostPort.ports $key | default $value }} - {{- end }} - {{- end }} - {{- if .Values.controller.metrics.enabled }} - - name: {{ .Values.controller.metrics.portName }} - containerPort: {{ .Values.controller.metrics.port }} - protocol: TCP - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook - containerPort: {{ .Values.controller.admissionWebhooks.port }} - protocol: TCP - {{- end }} - {{- range $key, $value := .Values.tcp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - containerPort: {{ $key }} - protocol: TCP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ $key }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.udp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - containerPort: {{ $key }} - protocol: UDP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ $key }} - {{- end }} - {{- end }} - {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - volumeMounts: - {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - - name: modules - {{- if .Values.controller.image.chroot }} - mountPath: /chroot/modules_mount - {{- else }} - mountPath: /modules_mount - {{- end }} - {{- end }} - {{- if .Values.controller.customTemplate.configMapName }} - - mountPath: /etc/nginx/template - name: nginx-template-volume - readOnly: true - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook-cert - mountPath: /usr/local/certificates/ - readOnly: true - {{- end }} - {{- if .Values.controller.extraVolumeMounts }} - {{- toYaml .Values.controller.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.controller.resources }} - resources: {{ toYaml .Values.controller.resources | nindent 12 }} - {{- end }} - {{- if .Values.controller.extraContainers }} - {{- toYaml .Values.controller.extraContainers | nindent 8 }} - {{- end }} - {{- if (or .Values.controller.extraInitContainers .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - initContainers: - {{- if .Values.controller.extraInitContainers }} - {{- toYaml .Values.controller.extraInitContainers | nindent 8 }} - {{- end }} - {{- if .Values.controller.extraModules }} - {{- range .Values.controller.extraModules }} - {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} - {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.controller.opentelemetry.enabled }} - {{- with .Values.controller.opentelemetry }} - {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} - {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.controller.hostNetwork }} - hostNetwork: {{ .Values.controller.hostNetwork }} - {{- end }} - {{- if .Values.controller.nodeSelector }} - nodeSelector: {{ toYaml .Values.controller.nodeSelector | nindent 8 }} - {{- end }} - {{- if .Values.controller.tolerations }} - tolerations: {{ toYaml .Values.controller.tolerations | nindent 8 }} - {{- end }} - {{- if .Values.controller.affinity }} - affinity: {{ tpl (toYaml .Values.controller.affinity) $ | nindent 8 }} - {{- end }} - {{- if .Values.controller.topologySpreadConstraints }} - topologySpreadConstraints: {{ tpl (toYaml .Values.controller.topologySpreadConstraints) $ | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "ingress-nginx.serviceAccountName" . }} - terminationGracePeriodSeconds: {{ .Values.controller.terminationGracePeriodSeconds }} - {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - volumes: - {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled)}} - - name: modules - emptyDir: {} - {{- end }} - {{- if .Values.controller.customTemplate.configMapName }} - - name: nginx-template-volume - configMap: - name: {{ .Values.controller.customTemplate.configMapName }} - items: - - key: {{ .Values.controller.customTemplate.configMapKey }} - path: nginx.tmpl - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook-cert - secret: - secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - {{- if .Values.controller.admissionWebhooks.certManager.enabled }} - items: - - key: tls.crt - path: cert - - key: tls.key - path: key - {{- end }} - {{- end }} - {{- if .Values.controller.extraVolumes }} - {{ toYaml .Values.controller.extraVolumes | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-deployment.yaml b/charts/ingress-nginx/templates/controller-deployment.yaml deleted file mode 100644 index 5211acd0b2..0000000000 --- a/charts/ingress-nginx/templates/controller-deployment.yaml +++ /dev/null @@ -1,245 +0,0 @@ -{{- if eq .Values.controller.kind "Deployment" -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - {{- if .Values.controller.annotations }} - annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: controller - {{- if eq .Values.controller.autoscaling.enabled .Values.controller.keda.enabled }} - replicas: {{ .Values.controller.replicaCount }} - {{- end }} - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - {{- if .Values.controller.updateStrategy }} - strategy: {{ toYaml .Values.controller.updateStrategy | nindent 4 }} - {{- end }} - minReadySeconds: {{ .Values.controller.minReadySeconds }} - template: - metadata: - {{- if .Values.controller.podAnnotations }} - annotations: - {{- range $key, $value := .Values.controller.podAnnotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 8 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.controller.podLabels }} - {{- toYaml .Values.controller.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.controller.dnsConfig }} - dnsConfig: {{ toYaml .Values.controller.dnsConfig | nindent 8 }} - {{- end }} - {{- if .Values.controller.hostAliases }} - hostAliases: {{ tpl (toYaml .Values.controller.hostAliases) $ | nindent 8 }} - {{- end }} - {{- if .Values.controller.hostname }} - hostname: {{ toYaml .Values.controller.hostname | nindent 8 }} - {{- end }} - dnsPolicy: {{ .Values.controller.dnsPolicy }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} - {{- end }} - {{- if .Values.controller.priorityClassName }} - priorityClassName: {{ .Values.controller.priorityClassName | quote }} - {{- end }} - {{- if or .Values.controller.podSecurityContext .Values.controller.sysctls }} - securityContext: - {{- if .Values.controller.podSecurityContext }} - {{- toYaml .Values.controller.podSecurityContext | nindent 8 }} - {{- end }} - {{- if .Values.controller.sysctls }} - sysctls: - {{- range $sysctl, $value := .Values.controller.sysctls }} - - name: {{ $sysctl | quote }} - value: {{ $value | quote }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.controller.shareProcessNamespace }} - shareProcessNamespace: {{ .Values.controller.shareProcessNamespace }} - {{- end }} - containers: - - name: {{ .Values.controller.containerName }} - {{- with .Values.controller.image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ include "ingress-nginx.image" . }}{{ end }}:{{ .tag }}{{ include "ingress-nginx.imageDigest" . }} - {{- end }} - imagePullPolicy: {{ .Values.controller.image.pullPolicy }} - {{- if .Values.controller.lifecycle }} - lifecycle: {{ toYaml .Values.controller.lifecycle | nindent 12 }} - {{- end }} - args: {{ include "ingress-nginx.params" . | nindent 12 }} - securityContext: {{ include "ingress-nginx.controller.containerSecurityContext" . | nindent 12 }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - {{- if .Values.controller.enableMimalloc }} - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - {{- end }} - {{- if .Values.controller.extraEnvs }} - {{- toYaml .Values.controller.extraEnvs | nindent 12 }} - {{- end }} - {{- if .Values.controller.startupProbe }} - startupProbe: {{ toYaml .Values.controller.startupProbe | nindent 12 }} - {{- end }} - {{- if .Values.controller.livenessProbe }} - livenessProbe: {{ toYaml .Values.controller.livenessProbe | nindent 12 }} - {{- end }} - {{- if .Values.controller.readinessProbe }} - readinessProbe: {{ toYaml .Values.controller.readinessProbe | nindent 12 }} - {{- end }} - ports: - {{- range $key, $value := .Values.controller.containerPort }} - - name: {{ $key }} - containerPort: {{ $value }} - protocol: TCP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ index $.Values.controller.hostPort.ports $key | default $value }} - {{- end }} - {{- end }} - {{- if .Values.controller.metrics.enabled }} - - name: {{ .Values.controller.metrics.portName }} - containerPort: {{ .Values.controller.metrics.port }} - protocol: TCP - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook - containerPort: {{ .Values.controller.admissionWebhooks.port }} - protocol: TCP - {{- end }} - {{- range $key, $value := .Values.tcp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - containerPort: {{ $key }} - protocol: TCP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ $key }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.udp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - containerPort: {{ $key }} - protocol: UDP - {{- if $.Values.controller.hostPort.enabled }} - hostPort: {{ $key }} - {{- end }} - {{- end }} - {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - volumeMounts: - {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - - name: modules - {{- if .Values.controller.image.chroot }} - mountPath: /chroot/modules_mount - {{- else }} - mountPath: /modules_mount - {{- end }} - {{- end }} - {{- if .Values.controller.customTemplate.configMapName }} - - mountPath: /etc/nginx/template - name: nginx-template-volume - readOnly: true - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook-cert - mountPath: /usr/local/certificates/ - readOnly: true - {{- end }} - {{- if .Values.controller.extraVolumeMounts }} - {{- toYaml .Values.controller.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- end }} - {{- if .Values.controller.resources }} - resources: {{ toYaml .Values.controller.resources | nindent 12 }} - {{- end }} - {{- if .Values.controller.extraContainers }} - {{- toYaml .Values.controller.extraContainers | nindent 8 }} - {{- end }} - {{- if (or .Values.controller.extraInitContainers .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - initContainers: - {{- if .Values.controller.extraInitContainers }} - {{- toYaml .Values.controller.extraInitContainers | nindent 8 }} - {{- end }} - {{- if .Values.controller.extraModules }} - {{- range .Values.controller.extraModules }} - {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} - {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} - {{- end }} - {{- end }} - {{- if .Values.controller.opentelemetry.enabled }} - {{- with .Values.controller.opentelemetry }} - {{- $containerSecurityContext := .containerSecurityContext | default $.Values.controller.containerSecurityContext }} - {{- include "extraModules" (dict "name" .name "image" .image "containerSecurityContext" $containerSecurityContext "resources" .resources) | nindent 8 }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.controller.hostNetwork }} - hostNetwork: {{ .Values.controller.hostNetwork }} - {{- end }} - {{- if .Values.controller.nodeSelector }} - nodeSelector: {{ toYaml .Values.controller.nodeSelector | nindent 8 }} - {{- end }} - {{- if .Values.controller.tolerations }} - tolerations: {{ toYaml .Values.controller.tolerations | nindent 8 }} - {{- end }} - {{- if .Values.controller.affinity }} - affinity: {{ tpl (toYaml .Values.controller.affinity) $ | nindent 8 }} - {{- end }} - {{- if .Values.controller.topologySpreadConstraints }} - topologySpreadConstraints: {{ tpl (toYaml .Values.controller.topologySpreadConstraints) $ | nindent 8 }} - {{- end }} - serviceAccountName: {{ template "ingress-nginx.serviceAccountName" . }} - terminationGracePeriodSeconds: {{ .Values.controller.terminationGracePeriodSeconds }} - {{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes .Values.controller.extraModules .Values.controller.opentelemetry.enabled) }} - volumes: - {{- if (or .Values.controller.extraModules .Values.controller.opentelemetry.enabled)}} - - name: modules - emptyDir: {} - {{- end }} - {{- if .Values.controller.customTemplate.configMapName }} - - name: nginx-template-volume - configMap: - name: {{ .Values.controller.customTemplate.configMapName }} - items: - - key: {{ .Values.controller.customTemplate.configMapKey }} - path: nginx.tmpl - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - name: webhook-cert - secret: - secretName: {{ include "ingress-nginx.admissionWebhooks.fullname" . }} - {{- if .Values.controller.admissionWebhooks.certManager.enabled }} - items: - - key: tls.crt - path: cert - - key: tls.key - path: key - {{- end }} - {{- end }} - {{- if .Values.controller.extraVolumes }} - {{ toYaml .Values.controller.extraVolumes | nindent 8 }} - {{- end }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-hpa.yaml b/charts/ingress-nginx/templates/controller-hpa.yaml deleted file mode 100644 index ec9ad73801..0000000000 --- a/charts/ingress-nginx/templates/controller-hpa.yaml +++ /dev/null @@ -1,47 +0,0 @@ -{{- if and (eq .Values.controller.kind "Deployment") .Values.controller.autoscaling.enabled (not .Values.controller.keda.enabled) -}} -apiVersion: {{ ternary "autoscaling/v2" "autoscaling/v2beta2" (.Capabilities.APIVersions.Has "autoscaling/v2") }} -kind: HorizontalPodAutoscaler -metadata: - {{- with .Values.controller.autoscaling.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "ingress-nginx.controller.fullname" . }} - minReplicas: {{ .Values.controller.autoscaling.minReplicas }} - maxReplicas: {{ .Values.controller.autoscaling.maxReplicas }} - metrics: - {{- with .Values.controller.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ . }} - {{- end }} - {{- with .Values.controller.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ . }} - {{- end }} - {{- with .Values.controller.autoscalingTemplate }} - {{- toYaml . | nindent 2 }} - {{- end }} - {{- with .Values.controller.autoscaling.behavior }} - behavior: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml b/charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml deleted file mode 100644 index ffe22310c6..0000000000 --- a/charts/ingress-nginx/templates/controller-ingressclass-aliases.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.controller.ingressClassResource.enabled -}} -{{- range .Values.controller.ingressClassResource.aliases }} ---- -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - labels: - {{- include "ingress-nginx.labels" $ | nindent 4 }} - app.kubernetes.io/component: controller - {{- with $.Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ . }} - {{- if $.Values.controller.ingressClassResource.annotations }} - annotations: {{ toYaml $.Values.controller.ingressClassResource.annotations | nindent 4 }} - {{- end }} -spec: - controller: {{ $.Values.controller.ingressClassResource.controllerValue }} - {{- with $.Values.controller.ingressClassResource.parameters }} - parameters: {{ toYaml . | nindent 4 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-ingressclass.yaml b/charts/ingress-nginx/templates/controller-ingressclass.yaml deleted file mode 100644 index 98479a529e..0000000000 --- a/charts/ingress-nginx/templates/controller-ingressclass.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.controller.ingressClassResource.enabled -}} -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ .Values.controller.ingressClassResource.name }} - {{- if or .Values.controller.ingressClassResource.default .Values.controller.ingressClassResource.annotations }} - annotations: - {{- if .Values.controller.ingressClassResource.default }} - ingressclass.kubernetes.io/is-default-class: "true" - {{- end }} - {{- if .Values.controller.ingressClassResource.annotations }} - {{- toYaml .Values.controller.ingressClassResource.annotations | nindent 4 }} - {{- end }} - {{- end }} -spec: - controller: {{ .Values.controller.ingressClassResource.controllerValue }} - {{- with .Values.controller.ingressClassResource.parameters }} - parameters: {{ toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-keda.yaml b/charts/ingress-nginx/templates/controller-keda.yaml deleted file mode 100644 index 24d30fa0a0..0000000000 --- a/charts/ingress-nginx/templates/controller-keda.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{- if and (eq .Values.controller.kind "Deployment") .Values.controller.keda.enabled (not .Values.controller.autoscaling.enabled) -}} -apiVersion: {{ .Values.controller.keda.apiVersion }} -kind: ScaledObject -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - {{- if .Values.controller.keda.scaledObject.annotations }} - annotations: {{ toYaml .Values.controller.keda.scaledObject.annotations | nindent 4 }} - {{- end }} -spec: - scaleTargetRef: -{{- if eq .Values.controller.keda.apiVersion "keda.k8s.io/v1alpha1" }} - deploymentName: {{ include "ingress-nginx.controller.fullname" . }} -{{- else if eq .Values.controller.keda.apiVersion "keda.sh/v1alpha1" }} - name: {{ include "ingress-nginx.controller.fullname" . }} -{{- end }} - pollingInterval: {{ .Values.controller.keda.pollingInterval }} - cooldownPeriod: {{ .Values.controller.keda.cooldownPeriod }} - minReplicaCount: {{ .Values.controller.keda.minReplicas }} - maxReplicaCount: {{ .Values.controller.keda.maxReplicas }} -{{- with .Values.controller.keda.fallback }} - fallback: - failureThreshold: {{ .failureThreshold | default 3 }} - replicas: {{ .replicas | default $.Values.controller.keda.maxReplicas }} -{{- end }} - triggers: -{{- with .Values.controller.keda.triggers }} -{{ toYaml . | indent 2 }} -{{ end }} - advanced: - restoreToOriginalReplicaCount: {{ .Values.controller.keda.restoreToOriginalReplicaCount }} -{{- if .Values.controller.keda.behavior }} - horizontalPodAutoscalerConfig: - behavior: -{{ with .Values.controller.keda.behavior -}} -{{ toYaml . | indent 8 }} -{{ end }} - -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-networkpolicy.yaml b/charts/ingress-nginx/templates/controller-networkpolicy.yaml deleted file mode 100644 index e68f9916de..0000000000 --- a/charts/ingress-nginx/templates/controller-networkpolicy.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- if .Values.controller.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - podSelector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: controller - policyTypes: - - Ingress - - Egress - ingress: - - ports: - {{- range $key, $value := .Values.controller.containerPort }} - - protocol: TCP - port: {{ $value }} - {{- end }} - {{- if .Values.controller.metrics.enabled }} - - protocol: TCP - port: {{ .Values.controller.metrics.port }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - - protocol: TCP - port: {{ .Values.controller.admissionWebhooks.port }} - {{- end }} - {{- range $key, $value := .Values.tcp }} - - protocol: TCP - port: {{ $key }} - {{- end }} - {{- range $key, $value := .Values.udp }} - - protocol: UDP - port: {{ $key }} - {{- end }} - egress: - - {} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml b/charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml deleted file mode 100644 index 8e0181f9f1..0000000000 --- a/charts/ingress-nginx/templates/controller-poddisruptionbudget.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# PDB is not supported for DaemonSets. -# https://github.com/kubernetes/kubernetes/issues/108124 -{{- if eq .Values.controller.kind "Deployment" }} -{{- $replicas := .Values.controller.replicaCount }} -{{- if and .Values.controller.autoscaling.enabled (not .Values.controller.keda.enabled) }} -{{- $replicas = .Values.controller.autoscaling.minReplicas }} -{{- else if and .Values.controller.keda.enabled (not .Values.controller.autoscaling.enabled) }} -{{- $replicas = .Values.controller.keda.minReplicas }} -{{- end }} -{{- if gt ($replicas | int) 1 }} -apiVersion: {{ ternary "policy/v1" "policy/v1beta1" (semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version) }} -kind: PodDisruptionBudget -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - {{- if .Values.controller.annotations }} - annotations: {{ toYaml .Values.controller.annotations | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: controller - {{- if and .Values.controller.minAvailable (not (hasKey .Values.controller "maxUnavailable")) }} - minAvailable: {{ .Values.controller.minAvailable }} - {{- else if .Values.controller.maxUnavailable }} - maxUnavailable: {{ .Values.controller.maxUnavailable }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-prometheusrule.yaml b/charts/ingress-nginx/templates/controller-prometheusrule.yaml deleted file mode 100644 index 41684c3708..0000000000 --- a/charts/ingress-nginx/templates/controller-prometheusrule.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.prometheusRule.enabled -}} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ include "ingress-nginx.controller.fullname" . }} -{{- if .Values.controller.metrics.prometheusRule.namespace }} - namespace: {{ .Values.controller.metrics.prometheusRule.namespace }} -{{- else }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- if .Values.controller.metrics.prometheusRule.additionalLabels }} - {{- toYaml .Values.controller.metrics.prometheusRule.additionalLabels | nindent 4 }} - {{- end }} -spec: -{{- if .Values.controller.metrics.prometheusRule.rules }} - groups: - - name: {{ template "ingress-nginx.name" . }} - rules: {{- toYaml .Values.controller.metrics.prometheusRule.rules | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-psp.yaml b/charts/ingress-nginx/templates/controller-psp.yaml deleted file mode 100644 index aad1d27361..0000000000 --- a/charts/ingress-nginx/templates/controller-psp.yaml +++ /dev/null @@ -1,100 +0,0 @@ -{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} -{{- if and .Values.podSecurityPolicy.enabled (empty .Values.controller.existingPsp) -}} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "ingress-nginx.fullname" . }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - privileged: false - hostPID: false - hostIPC: false - hostNetwork: {{ .Values.controller.hostNetwork }} -{{- if or .Values.controller.hostNetwork .Values.controller.hostPort.enabled }} - hostPorts: - {{- if .Values.controller.hostNetwork }} - {{- range $key, $value := .Values.controller.containerPort }} - # controller.containerPort.{{ $key }} - - min: {{ $value }} - max: {{ $value }} - {{- end }} - {{- else if .Values.controller.hostPort.enabled }} - {{- range $key, $value := .Values.controller.hostPort.ports }} - # controller.hostPort.ports.{{ $key }} - - min: {{ $value }} - max: {{ $value }} - {{- end }} - {{- end }} - {{- if .Values.controller.metrics.enabled }} - # controller.metrics.port - - min: {{ .Values.controller.metrics.port }} - max: {{ .Values.controller.metrics.port }} - {{- end }} - {{- if .Values.controller.admissionWebhooks.enabled }} - # controller.admissionWebhooks.port - - min: {{ .Values.controller.admissionWebhooks.port }} - max: {{ .Values.controller.admissionWebhooks.port }} - {{- end }} - {{- range $key, $value := .Values.tcp }} - # tcp.{{ $key }} - - min: {{ $key }} - max: {{ $key }} - {{- end }} - {{- range $key, $value := .Values.udp }} - # udp.{{ $key }} - - min: {{ $key }} - max: {{ $key }} - {{- end }} -{{- end }} - volumes: - - configMap - - downwardAPI - - emptyDir - - secret - - projected - fsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - runAsUser: - rule: MustRunAsNonRoot - runAsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - supplementalGroups: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - allowPrivilegeEscalation: {{ or .Values.controller.image.allowPrivilegeEscalation .Values.controller.image.chroot }} - requiredDropCapabilities: - - ALL - allowedCapabilities: - - NET_BIND_SERVICE - {{- if .Values.controller.image.chroot }} - {{- if .Values.controller.image.seccompProfile }} - - SYS_ADMIN - {{- end }} - - SYS_CHROOT - {{- end }} - seLinux: - rule: RunAsAny -{{- if .Values.controller.sysctls }} - allowedUnsafeSysctls: - {{- range $sysctl, $value := .Values.controller.sysctls }} - - {{ $sysctl }} - {{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-role.yaml b/charts/ingress-nginx/templates/controller-role.yaml deleted file mode 100644 index a94b399782..0000000000 --- a/charts/ingress-nginx/templates/controller-role.yaml +++ /dev/null @@ -1,104 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -rules: - - apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - apiGroups: - - "" - resources: - - configmaps - - pods - - secrets - - endpoints - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - # Omit Ingress status permissions if `--update-status` is disabled. - {{- if ne (index .Values.controller.extraArgs "update-status") "false" }} - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - {{- end }} - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch - - apiGroups: - - coordination.k8s.io - resources: - - leases - resourceNames: - - {{ include "ingress-nginx.controller.electionID" . }} - verbs: - - get - - update - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - list - - watch - - get -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] - resources: ['podsecuritypolicies'] - verbs: ['use'] - {{- with .Values.controller.existingPsp }} - resourceNames: [{{ . }}] - {{- else }} - resourceNames: [{{ include "ingress-nginx.fullname" . }}] - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-rolebinding.yaml b/charts/ingress-nginx/templates/controller-rolebinding.yaml deleted file mode 100644 index 153430aa2c..0000000000 --- a/charts/ingress-nginx/templates/controller-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "ingress-nginx.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "ingress-nginx.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-secret.yaml b/charts/ingress-nginx/templates/controller-secret.yaml deleted file mode 100644 index f20f53469c..0000000000 --- a/charts/ingress-nginx/templates/controller-secret.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.dhParam -}} -apiVersion: v1 -kind: Secret -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -data: - dhparam.pem: {{ .Values.dhParam }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-service-internal.yaml b/charts/ingress-nginx/templates/controller-service-internal.yaml deleted file mode 100644 index 6d0b47caf6..0000000000 --- a/charts/ingress-nginx/templates/controller-service-internal.yaml +++ /dev/null @@ -1,105 +0,0 @@ -{{- if and .Values.controller.service.enabled .Values.controller.service.internal.enabled .Values.controller.service.internal.annotations -}} -apiVersion: v1 -kind: Service -metadata: - annotations: - {{- range $key, $value := .Values.controller.service.internal.annotations }} - {{ $key }}: {{ tpl ($value | toString) $ | quote }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- if .Values.controller.service.labels }} - {{- toYaml .Values.controller.service.labels | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }}-internal - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - type: {{ .Values.controller.service.internal.type | default .Values.controller.service.type }} -{{- if .Values.controller.service.internal.clusterIP }} - clusterIP: {{ .Values.controller.service.internal.clusterIP }} -{{- end }} -{{- if .Values.controller.service.internal.externalIPs }} - externalIPs: {{ toYaml .Values.controller.service.internal.externalIPs | nindent 4 }} -{{- end }} -{{- if .Values.controller.service.internal.loadBalancerIP }} - loadBalancerIP: {{ .Values.controller.service.internal.loadBalancerIP }} -{{- end }} -{{- if .Values.controller.service.internal.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ toYaml .Values.controller.service.internal.loadBalancerSourceRanges | nindent 4 }} -{{- end }} -{{- if .Values.controller.service.internal.loadBalancerClass }} - loadBalancerClass: {{ .Values.controller.service.internal.loadBalancerClass }} -{{- end }} -{{- if hasKey .Values.controller.service.internal "allocateLoadBalancerNodePorts" }} - allocateLoadBalancerNodePorts: {{ .Values.controller.service.internal.allocateLoadBalancerNodePorts }} -{{- end }} -{{- if .Values.controller.service.internal.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.controller.service.internal.externalTrafficPolicy }} -{{- end }} -{{- if .Values.controller.service.internal.sessionAffinity }} - sessionAffinity: {{ .Values.controller.service.internal.sessionAffinity }} -{{- end }} -{{- if .Values.controller.service.internal.healthCheckNodePort }} - healthCheckNodePort: {{ .Values.controller.service.internal.healthCheckNodePort }} -{{- end }} -{{- if semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version -}} -{{- if .Values.controller.service.internal.ipFamilyPolicy }} - ipFamilyPolicy: {{ .Values.controller.service.internal.ipFamilyPolicy }} -{{- end }} -{{- if .Values.controller.service.internal.ipFamilies }} - ipFamilies: {{ toYaml .Values.controller.service.internal.ipFamilies | nindent 4 }} -{{- end }} -{{- end }} - ports: - {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }} - {{- if .Values.controller.service.enableHttp }} - - name: http - port: {{ .Values.controller.service.internal.ports.http | default .Values.controller.service.ports.http }} - protocol: TCP - targetPort: {{ .Values.controller.service.internal.targetPorts.http | default .Values.controller.service.targetPorts.http }} - {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.internal.appProtocol) }} - appProtocol: http - {{- end }} - {{- if (and $setNodePorts (not (empty .Values.controller.service.internal.nodePorts.http))) }} - nodePort: {{ .Values.controller.service.internal.nodePorts.http }} - {{- end }} - {{- end }} - {{- if .Values.controller.service.enableHttps }} - - name: https - port: {{ .Values.controller.service.internal.ports.https | default .Values.controller.service.ports.https }} - protocol: TCP - targetPort: {{ .Values.controller.service.internal.targetPorts.https | default .Values.controller.service.targetPorts.https }} - {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.internal.appProtocol) }} - appProtocol: https - {{- end }} - {{- if (and $setNodePorts (not (empty .Values.controller.service.internal.nodePorts.https))) }} - nodePort: {{ .Values.controller.service.internal.nodePorts.https }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.tcp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - port: {{ $key }} - protocol: TCP - targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - {{- if $.Values.controller.service.internal.nodePorts.tcp }} - {{- if index $.Values.controller.service.internal.nodePorts.tcp $key }} - nodePort: {{ index $.Values.controller.service.internal.nodePorts.tcp $key }} - {{- end }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.udp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - port: {{ $key }} - protocol: UDP - targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - {{- if $.Values.controller.service.internal.nodePorts.udp }} - {{- if index $.Values.controller.service.internal.nodePorts.udp $key }} - nodePort: {{ index $.Values.controller.service.internal.nodePorts.udp $key }} - {{- end }} - {{- end }} - {{- end }} - selector: - {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: controller -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-service-metrics.yaml b/charts/ingress-nginx/templates/controller-service-metrics.yaml deleted file mode 100644 index 7c153295fd..0000000000 --- a/charts/ingress-nginx/templates/controller-service-metrics.yaml +++ /dev/null @@ -1,45 +0,0 @@ -{{- if .Values.controller.metrics.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.controller.metrics.service.annotations }} - annotations: {{ toYaml .Values.controller.metrics.service.annotations | nindent 4 }} -{{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- if .Values.controller.metrics.service.labels }} - {{- toYaml .Values.controller.metrics.service.labels | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }}-metrics - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - type: {{ .Values.controller.metrics.service.type }} -{{- if .Values.controller.metrics.service.clusterIP }} - clusterIP: {{ .Values.controller.metrics.service.clusterIP }} -{{- end }} -{{- if .Values.controller.metrics.service.externalIPs }} - externalIPs: {{ toYaml .Values.controller.metrics.service.externalIPs | nindent 4 }} -{{- end }} -{{- if .Values.controller.metrics.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.controller.metrics.service.loadBalancerIP }} -{{- end }} -{{- if .Values.controller.metrics.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ toYaml .Values.controller.metrics.service.loadBalancerSourceRanges | nindent 4 }} -{{- end }} -{{- if .Values.controller.metrics.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.controller.metrics.service.externalTrafficPolicy }} -{{- end }} - ports: - - name: {{ .Values.controller.metrics.portName }} - port: {{ .Values.controller.metrics.service.servicePort }} - protocol: TCP - targetPort: {{ .Values.controller.metrics.portName }} - {{- $setNodePorts := (or (eq .Values.controller.metrics.service.type "NodePort") (eq .Values.controller.metrics.service.type "LoadBalancer")) }} - {{- if (and $setNodePorts (not (empty .Values.controller.metrics.service.nodePort))) }} - nodePort: {{ .Values.controller.metrics.service.nodePort }} - {{- end }} - selector: - {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: controller -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-service-webhook.yaml b/charts/ingress-nginx/templates/controller-service-webhook.yaml deleted file mode 100644 index 67aac0d9a2..0000000000 --- a/charts/ingress-nginx/templates/controller-service-webhook.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if .Values.controller.admissionWebhooks.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.controller.admissionWebhooks.service.annotations }} - annotations: {{ toYaml .Values.controller.admissionWebhooks.service.annotations | nindent 4 }} -{{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }}-admission - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - type: {{ .Values.controller.admissionWebhooks.service.type }} -{{- if .Values.controller.admissionWebhooks.service.clusterIP }} - clusterIP: {{ .Values.controller.admissionWebhooks.service.clusterIP }} -{{- end }} -{{- if .Values.controller.admissionWebhooks.service.externalIPs }} - externalIPs: {{ toYaml .Values.controller.admissionWebhooks.service.externalIPs | nindent 4 }} -{{- end }} -{{- if .Values.controller.admissionWebhooks.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.controller.admissionWebhooks.service.loadBalancerIP }} -{{- end }} -{{- if .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ toYaml .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges | nindent 4 }} -{{- end }} - ports: - - name: https-webhook - port: {{ .Values.controller.admissionWebhooks.service.servicePort }} - targetPort: webhook - {{- if semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} - appProtocol: https - {{- end }} - selector: - {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: controller -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-service.yaml b/charts/ingress-nginx/templates/controller-service.yaml deleted file mode 100644 index cb78a7035f..0000000000 --- a/charts/ingress-nginx/templates/controller-service.yaml +++ /dev/null @@ -1,105 +0,0 @@ -{{- if and .Values.controller.service.enabled .Values.controller.service.external.enabled -}} -apiVersion: v1 -kind: Service -metadata: - annotations: - {{- range $key, $value := .Values.controller.service.annotations }} - {{ $key }}: {{ tpl ($value | toString) $ | quote }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- if .Values.controller.service.labels }} - {{- toYaml .Values.controller.service.labels | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.controller.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - type: {{ .Values.controller.service.type }} -{{- if .Values.controller.service.clusterIP }} - clusterIP: {{ .Values.controller.service.clusterIP }} -{{- end }} -{{- if .Values.controller.service.externalIPs }} - externalIPs: {{ toYaml .Values.controller.service.externalIPs | nindent 4 }} -{{- end }} -{{- if .Values.controller.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.controller.service.loadBalancerIP }} -{{- end }} -{{- if .Values.controller.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ toYaml .Values.controller.service.loadBalancerSourceRanges | nindent 4 }} -{{- end }} -{{- if .Values.controller.service.loadBalancerClass }} - loadBalancerClass: {{ .Values.controller.service.loadBalancerClass }} -{{- end }} -{{- if hasKey .Values.controller.service "allocateLoadBalancerNodePorts" }} - allocateLoadBalancerNodePorts: {{ .Values.controller.service.allocateLoadBalancerNodePorts }} -{{- end }} -{{- if .Values.controller.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.controller.service.externalTrafficPolicy }} -{{- end }} -{{- if .Values.controller.service.sessionAffinity }} - sessionAffinity: {{ .Values.controller.service.sessionAffinity }} -{{- end }} -{{- if .Values.controller.service.healthCheckNodePort }} - healthCheckNodePort: {{ .Values.controller.service.healthCheckNodePort }} -{{- end }} -{{- if semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version -}} -{{- if .Values.controller.service.ipFamilyPolicy }} - ipFamilyPolicy: {{ .Values.controller.service.ipFamilyPolicy }} -{{- end }} -{{- if .Values.controller.service.ipFamilies }} - ipFamilies: {{ toYaml .Values.controller.service.ipFamilies | nindent 4 }} -{{- end }} -{{- end }} - ports: - {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }} - {{- if .Values.controller.service.enableHttp }} - - name: http - port: {{ .Values.controller.service.ports.http }} - protocol: TCP - targetPort: {{ .Values.controller.service.targetPorts.http }} - {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.appProtocol) }} - appProtocol: http - {{- end }} - {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.http))) }} - nodePort: {{ .Values.controller.service.nodePorts.http }} - {{- end }} - {{- end }} - {{- if .Values.controller.service.enableHttps }} - - name: https - port: {{ .Values.controller.service.ports.https }} - protocol: TCP - targetPort: {{ .Values.controller.service.targetPorts.https }} - {{- if and (semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version) (.Values.controller.service.appProtocol) }} - appProtocol: https - {{- end }} - {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.https))) }} - nodePort: {{ .Values.controller.service.nodePorts.https }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.tcp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - port: {{ $key }} - protocol: TCP - targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-tcp - {{- if $.Values.controller.service.nodePorts.tcp }} - {{- if index $.Values.controller.service.nodePorts.tcp $key }} - nodePort: {{ index $.Values.controller.service.nodePorts.tcp $key }} - {{- end }} - {{- end }} - {{- end }} - {{- range $key, $value := .Values.udp }} - - name: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - port: {{ $key }} - protocol: UDP - targetPort: {{ if $.Values.portNamePrefix }}{{ $.Values.portNamePrefix }}-{{ end }}{{ $key }}-udp - {{- if $.Values.controller.service.nodePorts.udp }} - {{- if index $.Values.controller.service.nodePorts.udp $key }} - nodePort: {{ index $.Values.controller.service.nodePorts.udp $key }} - {{- end }} - {{- end }} - {{- end }} - selector: - {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: controller -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-serviceaccount.yaml b/charts/ingress-nginx/templates/controller-serviceaccount.yaml deleted file mode 100644 index df83de3d08..0000000000 --- a/charts/ingress-nginx/templates/controller-serviceaccount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if or .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- with .Values.controller.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ template "ingress-nginx.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} - {{- if .Values.serviceAccount.annotations }} - annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} - {{- end }} -automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} diff --git a/charts/ingress-nginx/templates/controller-servicemonitor.yaml b/charts/ingress-nginx/templates/controller-servicemonitor.yaml deleted file mode 100644 index 62301da454..0000000000 --- a/charts/ingress-nginx/templates/controller-servicemonitor.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.serviceMonitor.enabled -}} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "ingress-nginx.controller.fullname" . }} -{{- if .Values.controller.metrics.serviceMonitor.namespace }} - namespace: {{ .Values.controller.metrics.serviceMonitor.namespace }} -{{- else }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: controller - {{- if .Values.controller.metrics.serviceMonitor.additionalLabels }} - {{- toYaml .Values.controller.metrics.serviceMonitor.additionalLabels | nindent 4 }} - {{- end }} - {{- if .Values.controller.metrics.serviceMonitor.annotations }} - annotations: {{ toYaml .Values.controller.metrics.serviceMonitor.annotations | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: {{ .Values.controller.metrics.portName }} - interval: {{ .Values.controller.metrics.serviceMonitor.scrapeInterval }} - {{- if .Values.controller.metrics.serviceMonitor.honorLabels }} - honorLabels: true - {{- end }} - {{- if .Values.controller.metrics.serviceMonitor.relabelings }} - relabelings: {{ toYaml .Values.controller.metrics.serviceMonitor.relabelings | nindent 8 }} - {{- end }} - {{- if .Values.controller.metrics.serviceMonitor.metricRelabelings }} - metricRelabelings: {{ toYaml .Values.controller.metrics.serviceMonitor.metricRelabelings | nindent 8 }} - {{- end }} -{{- if .Values.controller.metrics.serviceMonitor.jobLabel }} - jobLabel: {{ .Values.controller.metrics.serviceMonitor.jobLabel | quote }} -{{- end }} -{{- if .Values.controller.metrics.serviceMonitor.namespaceSelector }} - namespaceSelector: {{ toYaml .Values.controller.metrics.serviceMonitor.namespaceSelector | nindent 4 }} -{{- else }} - namespaceSelector: - matchNames: - - {{ include "ingress-nginx.namespace" . }} -{{- end }} -{{- if .Values.controller.metrics.serviceMonitor.targetLabels }} - targetLabels: - {{- range .Values.controller.metrics.serviceMonitor.targetLabels }} - - {{ . }} - {{- end }} -{{- end }} - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: controller -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-deployment.yaml b/charts/ingress-nginx/templates/default-backend-deployment.yaml deleted file mode 100644 index 6755e23783..0000000000 --- a/charts/ingress-nginx/templates/default-backend-deployment.yaml +++ /dev/null @@ -1,119 +0,0 @@ -{{- if .Values.defaultBackend.enabled -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: default-backend -{{- if not .Values.defaultBackend.autoscaling.enabled }} - replicas: {{ .Values.defaultBackend.replicaCount }} -{{- end }} - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - {{- if .Values.defaultBackend.updateStrategy }} - strategy: - {{ toYaml .Values.defaultBackend.updateStrategy | nindent 4 }} - {{- end }} - minReadySeconds: {{ .Values.defaultBackend.minReadySeconds }} - template: - metadata: - {{- if .Values.defaultBackend.podAnnotations }} - annotations: {{ toYaml .Values.defaultBackend.podAnnotations | nindent 8 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 8 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.defaultBackend.podLabels }} - {{- toYaml .Values.defaultBackend.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.imagePullSecrets }} - imagePullSecrets: {{ toYaml .Values.imagePullSecrets | nindent 8 }} - {{- end }} - {{- if .Values.defaultBackend.priorityClassName }} - priorityClassName: {{ .Values.defaultBackend.priorityClassName }} - {{- end }} - {{- if .Values.defaultBackend.podSecurityContext }} - securityContext: {{ toYaml .Values.defaultBackend.podSecurityContext | nindent 8 }} - {{- end }} - containers: - - name: {{ template "ingress-nginx.name" . }}-default-backend - {{- with .Values.defaultBackend.image }} - image: {{ if .repository }}{{ .repository }}{{ else }}{{ .registry }}/{{ .image }}{{ end }}:{{ .tag }}{{ if .digest }}@{{ .digest }}{{ end }} - {{- end }} - imagePullPolicy: {{ .Values.defaultBackend.image.pullPolicy }} - {{- if .Values.defaultBackend.extraArgs }} - args: - {{- range $key, $value := .Values.defaultBackend.extraArgs }} - {{- /* Accept keys without values or with false as value */}} - {{- if eq ($value | quote | len) 2 }} - - --{{ $key }} - {{- else }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- end }} - {{- end }} - securityContext: {{ include "ingress-nginx.defaultBackend.containerSecurityContext" . | nindent 12 }} - {{- if .Values.defaultBackend.extraEnvs }} - env: {{ toYaml .Values.defaultBackend.extraEnvs | nindent 12 }} - {{- end }} - livenessProbe: - httpGet: - path: /healthz - port: {{ .Values.defaultBackend.port }} - scheme: HTTP - initialDelaySeconds: {{ .Values.defaultBackend.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.defaultBackend.livenessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.defaultBackend.livenessProbe.timeoutSeconds }} - successThreshold: {{ .Values.defaultBackend.livenessProbe.successThreshold }} - failureThreshold: {{ .Values.defaultBackend.livenessProbe.failureThreshold }} - readinessProbe: - httpGet: - path: /healthz - port: {{ .Values.defaultBackend.port }} - scheme: HTTP - initialDelaySeconds: {{ .Values.defaultBackend.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.defaultBackend.readinessProbe.periodSeconds }} - timeoutSeconds: {{ .Values.defaultBackend.readinessProbe.timeoutSeconds }} - successThreshold: {{ .Values.defaultBackend.readinessProbe.successThreshold }} - failureThreshold: {{ .Values.defaultBackend.readinessProbe.failureThreshold }} - ports: - - name: http - containerPort: {{ .Values.defaultBackend.port }} - protocol: TCP - {{- if .Values.defaultBackend.extraVolumeMounts }} - volumeMounts: {{- toYaml .Values.defaultBackend.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.defaultBackend.resources }} - resources: {{ toYaml .Values.defaultBackend.resources | nindent 12 }} - {{- end }} - {{- if .Values.defaultBackend.nodeSelector }} - nodeSelector: {{ toYaml .Values.defaultBackend.nodeSelector | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "ingress-nginx.defaultBackend.serviceAccountName" . }} - {{- if .Values.defaultBackend.tolerations }} - tolerations: {{ toYaml .Values.defaultBackend.tolerations | nindent 8 }} - {{- end }} - {{- if .Values.defaultBackend.affinity }} - affinity: {{ tpl (toYaml .Values.defaultBackend.affinity) $ | nindent 8 }} - {{- end }} - {{- if .Values.defaultBackend.topologySpreadConstraints }} - topologySpreadConstraints: {{ tpl (toYaml .Values.defaultBackend.topologySpreadConstraints) $ | nindent 8 }} - {{- end }} - terminationGracePeriodSeconds: 60 - {{- if .Values.defaultBackend.extraVolumes }} - volumes: {{ toYaml .Values.defaultBackend.extraVolumes | nindent 8 }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml b/charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml deleted file mode 100644 index 9af56cf388..0000000000 --- a/charts/ingress-nginx/templates/default-backend-extra-configmaps.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if .Values.defaultBackend.enabled }} -{{- range .Values.defaultBackend.extraConfigMaps }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "ingress-nginx.labels" $ | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with $.Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - {{- with .labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ .name }} - namespace: {{ include "ingress-nginx.namespace" $ }} -data: - {{- with .data }} - {{- toYaml . | nindent 2 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-hpa.yaml b/charts/ingress-nginx/templates/default-backend-hpa.yaml deleted file mode 100644 index 49bcdcfdc3..0000000000 --- a/charts/ingress-nginx/templates/default-backend-hpa.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.autoscaling.enabled }} -apiVersion: {{ ternary "autoscaling/v2" "autoscaling/v2beta2" (.Capabilities.APIVersions.Has "autoscaling/v2") }} -kind: HorizontalPodAutoscaler -metadata: - {{- with .Values.defaultBackend.autoscaling.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - minReplicas: {{ .Values.defaultBackend.autoscaling.minReplicas }} - maxReplicas: {{ .Values.defaultBackend.autoscaling.maxReplicas }} - metrics: - {{- with .Values.defaultBackend.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ . }} - {{- end }} - {{- with .Values.defaultBackend.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ . }} - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-networkpolicy.yaml b/charts/ingress-nginx/templates/default-backend-networkpolicy.yaml deleted file mode 100644 index 90b3c2ba02..0000000000 --- a/charts/ingress-nginx/templates/default-backend-networkpolicy.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.networkPolicy.enabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - podSelector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: default-backend - policyTypes: - - Ingress - - Egress - ingress: - - ports: - - protocol: TCP - port: {{ .Values.defaultBackend.port }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml b/charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml deleted file mode 100644 index c8363fd4b4..0000000000 --- a/charts/ingress-nginx/templates/default-backend-poddisruptionbudget.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.defaultBackend.enabled -}} -{{- $replicas := .Values.defaultBackend.replicaCount }} -{{- if .Values.defaultBackend.autoscaling.enabled }} -{{- $replicas = .Values.defaultBackend.autoscaling.minReplicas }} -{{- end }} -{{- if gt ($replicas | int) 1 }} -apiVersion: {{ ternary "policy/v1" "policy/v1beta1" (semverCompare ">=1.21.0-0" .Capabilities.KubeVersion.Version) }} -kind: PodDisruptionBudget -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - selector: - matchLabels: - {{- include "ingress-nginx.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: default-backend - minAvailable: {{ .Values.defaultBackend.minAvailable }} -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-psp.yaml b/charts/ingress-nginx/templates/default-backend-psp.yaml deleted file mode 100644 index 4241091091..0000000000 --- a/charts/ingress-nginx/templates/default-backend-psp.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{- if (semverCompare "<1.25.0-0" .Capabilities.KubeVersion.Version) }} -{{- if and .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled (empty .Values.defaultBackend.existingPsp) -}} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ include "ingress-nginx.fullname" . }}-backend - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*" - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - privileged: false - hostPID: false - hostIPC: false - hostNetwork: false - volumes: - - configMap - - downwardAPI - - emptyDir - - secret - - projected - fsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - readOnlyRootFilesystem: true - runAsUser: - rule: MustRunAsNonRoot - runAsGroup: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - supplementalGroups: - rule: MustRunAs - ranges: - - min: 1 - max: 65535 - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - seLinux: - rule: RunAsAny -{{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-role.yaml b/charts/ingress-nginx/templates/default-backend-role.yaml deleted file mode 100644 index dd7868aa0e..0000000000 --- a/charts/ingress-nginx/templates/default-backend-role.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }}-backend - namespace: {{ include "ingress-nginx.namespace" . }} -rules: - - apiGroups: [{{ template "podSecurityPolicy.apiGroup" . }}] - resources: ['podsecuritypolicies'] - verbs: ['use'] - {{- with .Values.defaultBackend.existingPsp }} - resourceNames: [{{ . }}] - {{- else }} - resourceNames: [{{ include "ingress-nginx.fullname" . }}-backend] - {{- end }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-rolebinding.yaml b/charts/ingress-nginx/templates/default-backend-rolebinding.yaml deleted file mode 100644 index 3203b6f575..0000000000 --- a/charts/ingress-nginx/templates/default-backend-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.fullname" . }}-backend - namespace: {{ include "ingress-nginx.namespace" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ include "ingress-nginx.fullname" . }}-backend -subjects: - - kind: ServiceAccount - name: {{ template "ingress-nginx.defaultBackend.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-service.yaml b/charts/ingress-nginx/templates/default-backend-service.yaml deleted file mode 100644 index 65b6b8362c..0000000000 --- a/charts/ingress-nginx/templates/default-backend-service.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{- if .Values.defaultBackend.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.defaultBackend.service.annotations }} - annotations: {{ toYaml .Values.defaultBackend.service.annotations | nindent 4 }} -{{- end }} - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.fullname" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -spec: - type: {{ .Values.defaultBackend.service.type }} -{{- if .Values.defaultBackend.service.clusterIP }} - clusterIP: {{ .Values.defaultBackend.service.clusterIP }} -{{- end }} -{{- if .Values.defaultBackend.service.externalIPs }} - externalIPs: {{ toYaml .Values.defaultBackend.service.externalIPs | nindent 4 }} -{{- end }} -{{- if .Values.defaultBackend.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.defaultBackend.service.loadBalancerIP }} -{{- end }} -{{- if .Values.defaultBackend.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: {{ toYaml .Values.defaultBackend.service.loadBalancerSourceRanges | nindent 4 }} -{{- end }} - ports: - - name: http - port: {{ .Values.defaultBackend.service.servicePort }} - protocol: TCP - targetPort: http - {{- if semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} - appProtocol: http - {{- end }} - selector: - {{- include "ingress-nginx.selectorLabels" . | nindent 4 }} - app.kubernetes.io/component: default-backend -{{- end }} diff --git a/charts/ingress-nginx/templates/default-backend-serviceaccount.yaml b/charts/ingress-nginx/templates/default-backend-serviceaccount.yaml deleted file mode 100644 index 6fd2d62343..0000000000 --- a/charts/ingress-nginx/templates/default-backend-serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "ingress-nginx.labels" . | nindent 4 }} - app.kubernetes.io/component: default-backend - {{- with .Values.defaultBackend.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} - name: {{ include "ingress-nginx.defaultBackend.serviceAccountName" . }} - namespace: {{ include "ingress-nginx.namespace" . }} -automountServiceAccountToken: {{ .Values.defaultBackend.serviceAccount.automountServiceAccountToken }} -{{- end }} diff --git a/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml deleted file mode 100644 index d7a8b88528..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrole_test.yaml +++ /dev/null @@ -1,11 +0,0 @@ -suite: Admission Webhooks > Patch Job > ClusterRole -templates: - - admission-webhooks/job-patch/clusterrole.yaml - -tests: - - it: should not create a ClusterRole if `controller.admissionWebhooks.patch.rbac.create` is false - set: - controller.admissionWebhooks.patch.rbac.create: false - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml deleted file mode 100644 index d7c3266d21..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/job-patch/clusterrolebinding_test.yaml +++ /dev/null @@ -1,11 +0,0 @@ -suite: Admission Webhooks > Patch Job > ClusterRoleBinding -templates: - - admission-webhooks/job-patch/clusterrolebinding.yaml - -tests: - - it: should not create a ClusterRoleBinding if `controller.admissionWebhooks.patch.rbac.create` is false - set: - controller.admissionWebhooks.patch.rbac.create: false - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml deleted file mode 100644 index a236f3d7b5..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/job-patch/role_test.yaml +++ /dev/null @@ -1,11 +0,0 @@ -suite: Admission Webhooks > Patch Job > Role -templates: - - admission-webhooks/job-patch/role.yaml - -tests: - - it: should not create a Role if `controller.admissionWebhooks.patch.rbac.create` is false - set: - controller.admissionWebhooks.patch.rbac.create: false - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml deleted file mode 100644 index 74abaa163b..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/job-patch/rolebinding_test.yaml +++ /dev/null @@ -1,11 +0,0 @@ -suite: Admission Webhooks > Patch Job > RoleBinding -templates: - - admission-webhooks/job-patch/rolebinding.yaml - -tests: - - it: should not create a RoleBinding if `controller.admissionWebhooks.patch.rbac.create` is false - set: - controller.admissionWebhooks.patch.rbac.create: false - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml deleted file mode 100644 index 7c30d1e660..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/job-patch/serviceaccount_test.yaml +++ /dev/null @@ -1,47 +0,0 @@ -suite: Admission Webhooks > Patch Job > ServiceAccount -templates: - - admission-webhooks/job-patch/serviceaccount.yaml - -tests: - - it: should not create a ServiceAccount if `controller.admissionWebhooks.patch.serviceAccount.create` is false - set: - controller.admissionWebhooks.patch.serviceAccount.create: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a ServiceAccount if `controller.admissionWebhooks.patch.serviceAccount.create` is true - set: - controller.admissionWebhooks.patch.serviceAccount.create: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: ingress-nginx-admission - - - it: should create a ServiceAccount with specified name if `controller.admissionWebhooks.patch.serviceAccount.name` is set - set: - controller.admissionWebhooks.patch.serviceAccount.name: ingress-nginx-admission-test-sa - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: ingress-nginx-admission-test-sa - - - it: should create a ServiceAccount with token auto-mounting disabled if `controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken` is false - set: - controller.admissionWebhooks.patch.serviceAccount.automountServiceAccountToken: false - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ServiceAccount - - equal: - path: automountServiceAccountToken - value: false diff --git a/charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml b/charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml deleted file mode 100644 index b9d6d780bb..0000000000 --- a/charts/ingress-nginx/tests/admission-webhooks/validating-webhook_test.yaml +++ /dev/null @@ -1,32 +0,0 @@ -suite: Admission Webhooks > ValidatingWebhookConfiguration -templates: - - admission-webhooks/validating-webhook.yaml - -tests: - - it: should not create a ValidatingWebhookConfiguration if `controller.admissionWebhooks.enabled` is false - set: - controller.admissionWebhooks.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a ValidatingWebhookConfiguration if `controller.admissionWebhooks.enabled` is true - set: - controller.admissionWebhooks.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ValidatingWebhookConfiguration - - equal: - path: metadata.name - value: RELEASE-NAME-admission - - - it: should create a ValidatingWebhookConfiguration with a custom port if `controller.admissionWebhooks.service.servicePort` is set - set: - controller.admissionWebhooks.enabled: true - controller.admissionWebhooks.service.servicePort: 9443 - asserts: - - equal: - path: webhooks[0].clientConfig.service.port - value: 9443 diff --git a/charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml b/charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml deleted file mode 100644 index e831d50c03..0000000000 --- a/charts/ingress-nginx/tests/controller-configmap-addheaders_test.yaml +++ /dev/null @@ -1,27 +0,0 @@ -suite: Controller > ConfigMap > Add Headers -templates: - - controller-configmap-addheaders.yaml - -tests: - - it: should not create a ConfigMap if `controller.addHeaders` is not set - set: - controller.addHeaders: null - asserts: - - hasDocuments: - count: 0 - - - it: should create a ConfigMap if `controller.addHeaders` is set - set: - controller.addHeaders: - X-Another-Custom-Header: Value - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ConfigMap - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-custom-add-headers - - equal: - path: data.X-Another-Custom-Header - value: Value diff --git a/charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml b/charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml deleted file mode 100644 index 0634a3739a..0000000000 --- a/charts/ingress-nginx/tests/controller-configmap-proxyheaders_test.yaml +++ /dev/null @@ -1,27 +0,0 @@ -suite: Controller > ConfigMap > Proxy Headers -templates: - - controller-configmap-proxyheaders.yaml - -tests: - - it: should not create a ConfigMap if `controller.proxySetHeaders` is not set - set: - controller.proxySetHeaders: null - asserts: - - hasDocuments: - count: 0 - - - it: should create a ConfigMap if `controller.proxySetHeaders` is set - set: - controller.proxySetHeaders: - X-Custom-Header: Value - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ConfigMap - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-custom-proxy-headers - - equal: - path: data.X-Custom-Header - value: Value diff --git a/charts/ingress-nginx/tests/controller-configmap_test.yaml b/charts/ingress-nginx/tests/controller-configmap_test.yaml deleted file mode 100644 index 168b657d6b..0000000000 --- a/charts/ingress-nginx/tests/controller-configmap_test.yaml +++ /dev/null @@ -1,31 +0,0 @@ -suite: Controller > ConfigMap -templates: - - controller-configmap.yaml - -tests: - - it: should create a ConfigMap - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ConfigMap - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should create a ConfigMap with templated values if `controller.config` contains templates - set: - controller.config: - template: "test.{{ .Release.Namespace }}.svc.kubernetes.local" - integer: 12345 - boolean: true - asserts: - - equal: - path: data.template - value: test.NAMESPACE.svc.kubernetes.local - - equal: - path: data.integer - value: "12345" - - equal: - path: data.boolean - value: "true" diff --git a/charts/ingress-nginx/tests/controller-daemonset_test.yaml b/charts/ingress-nginx/tests/controller-daemonset_test.yaml deleted file mode 100644 index 81d067bb5f..0000000000 --- a/charts/ingress-nginx/tests/controller-daemonset_test.yaml +++ /dev/null @@ -1,172 +0,0 @@ -suite: Controller > DaemonSet -templates: - - controller-daemonset.yaml - -tests: - - it: should create a DaemonSet if `controller.kind` is "DaemonSet" - set: - controller.kind: DaemonSet - asserts: - - hasDocuments: - count: 1 - - isKind: - of: DaemonSet - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should create a DaemonSet with argument `--enable-metrics=false` if `controller.metrics.enabled` is false - set: - controller.kind: DaemonSet - controller.metrics.enabled: false - asserts: - - contains: - path: spec.template.spec.containers[0].args - content: --enable-metrics=false - - - it: should create a DaemonSet without argument `--enable-metrics=false` if `controller.metrics.enabled` is true - set: - controller.kind: DaemonSet - controller.metrics.enabled: true - asserts: - - notContains: - path: spec.template.spec.containers[0].args - content: --enable-metrics=false - - - it: should create a DaemonSet with argument `--controller-class=k8s.io/ingress-nginx-internal` if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" - set: - controller.kind: DaemonSet - controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal - asserts: - - contains: - path: spec.template.spec.containers[0].args - content: --controller-class=k8s.io/ingress-nginx-internal - - - it: should create a DaemonSet with resource limits if `controller.resources.limits` is set - set: - controller.kind: DaemonSet - controller.resources.limits.cpu: 500m - controller.resources.limits.memory: 512Mi - asserts: - - equal: - path: spec.template.spec.containers[0].resources.limits.cpu - value: 500m - - equal: - path: spec.template.spec.containers[0].resources.limits.memory - value: 512Mi - - - it: should create a DaemonSet with topology spread constraints if `controller.topologySpreadConstraints` is set - set: - controller.kind: DaemonSet - controller.topologySpreadConstraints: - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: controller - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: controller - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - asserts: - - equal: - path: spec.template.spec.topologySpreadConstraints - value: - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: controller - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: controller - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - - it: should create a DaemonSet with affinity if `controller.affinity` is set - set: - controller.kind: DaemonSet - controller.affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - '{{ include "ingress-nginx.name" . }}' - - key: app.kubernetes.io/instance - operator: In - values: - - '{{ .Release.Name }}' - - key: app.kubernetes.io/component - operator: In - values: - - controller - topologyKey: kubernetes.io/hostname - asserts: - - equal: - path: spec.template.spec.affinity - value: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - ingress-nginx - - key: app.kubernetes.io/instance - operator: In - values: - - RELEASE-NAME - - key: app.kubernetes.io/component - operator: In - values: - - controller - topologyKey: kubernetes.io/hostname - - - it: should create a DaemonSet with a custom registry if `controller.image.registry` is set - set: - controller.kind: DaemonSet - controller.image.registry: custom.registry.io - controller.image.tag: v1.0.0-dev - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: custom.registry.io/ingress-nginx/controller:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a DaemonSet with a custom image if `controller.image.image` is set - set: - controller.kind: DaemonSet - controller.image.image: custom-repo/custom-image - controller.image.tag: v1.0.0-dev - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a DaemonSet with a custom tag if `controller.image.tag` is set - set: - controller.kind: DaemonSet - controller.image.tag: custom-tag - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/ingress-nginx/controller:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/charts/ingress-nginx/tests/controller-deployment_test.yaml b/charts/ingress-nginx/tests/controller-deployment_test.yaml deleted file mode 100644 index 382aecd710..0000000000 --- a/charts/ingress-nginx/tests/controller-deployment_test.yaml +++ /dev/null @@ -1,191 +0,0 @@ -suite: Controller > Deployment -templates: - - controller-deployment.yaml - -tests: - - it: should create a Deployment - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Deployment - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should create a Deployment with 3 replicas if `controller.replicaCount` is 3 - set: - controller.replicaCount: 3 - asserts: - - equal: - path: spec.replicas - value: 3 - - - it: should create a Deployment without replicas if `controller.autoscaling.enabled` is true - set: - controller.autoscaling.enabled: true - asserts: - - notExists: - path: spec.replicas - - - it: should create a Deployment without replicas if `controller.keda.enabled` is true - set: - controller.keda.enabled: true - asserts: - - notExists: - path: spec.replicas - - - it: should create a Deployment with replicas if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true - set: - controller.autoscaling.enabled: true - controller.keda.enabled: true - asserts: - - exists: - path: spec.replicas - - - it: should create a Deployment with argument `--enable-metrics=false` if `controller.metrics.enabled` is false - set: - controller.metrics.enabled: false - asserts: - - contains: - path: spec.template.spec.containers[0].args - content: --enable-metrics=false - - - it: should create a Deployment without argument `--enable-metrics=false` if `controller.metrics.enabled` is true - set: - controller.metrics.enabled: true - asserts: - - notContains: - path: spec.template.spec.containers[0].args - content: --enable-metrics=false - - - it: should create a Deployment with argument `--controller-class=k8s.io/ingress-nginx-internal` if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" - set: - controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal - asserts: - - contains: - path: spec.template.spec.containers[0].args - content: --controller-class=k8s.io/ingress-nginx-internal - - - it: should create a Deployment with resource limits if `controller.resources.limits` is set - set: - controller.resources.limits.cpu: 500m - controller.resources.limits.memory: 512Mi - asserts: - - equal: - path: spec.template.spec.containers[0].resources.limits.cpu - value: 500m - - equal: - path: spec.template.spec.containers[0].resources.limits.memory - value: 512Mi - - - it: should create a Deployment with topology spread constraints if `controller.topologySpreadConstraints` is set - set: - controller.topologySpreadConstraints: - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: controller - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: controller - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - asserts: - - equal: - path: spec.template.spec.topologySpreadConstraints - value: - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: controller - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: controller - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - - it: should create a Deployment with affinity if `controller.affinity` is set - set: - controller.affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - '{{ include "ingress-nginx.name" . }}' - - key: app.kubernetes.io/instance - operator: In - values: - - '{{ .Release.Name }}' - - key: app.kubernetes.io/component - operator: In - values: - - controller - topologyKey: kubernetes.io/hostname - asserts: - - equal: - path: spec.template.spec.affinity - value: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - ingress-nginx - - key: app.kubernetes.io/instance - operator: In - values: - - RELEASE-NAME - - key: app.kubernetes.io/component - operator: In - values: - - controller - topologyKey: kubernetes.io/hostname - - - it: should create a Deployment with a custom registry if `controller.image.registry` is set - set: - controller.image.registry: custom.registry.io - controller.image.tag: v1.0.0-dev - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: custom.registry.io/ingress-nginx/controller:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a Deployment with a custom image if `controller.image.image` is set - set: - controller.image.image: custom-repo/custom-image - controller.image.tag: v1.0.0-dev - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a Deployment with a custom tag if `controller.image.tag` is set - set: - controller.image.tag: custom-tag - controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/ingress-nginx/controller:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/charts/ingress-nginx/tests/controller-hpa_test.yaml b/charts/ingress-nginx/tests/controller-hpa_test.yaml deleted file mode 100644 index 869d3a690e..0000000000 --- a/charts/ingress-nginx/tests/controller-hpa_test.yaml +++ /dev/null @@ -1,31 +0,0 @@ -suite: Controller > HPA -templates: - - controller-hpa.yaml - -tests: - - it: should create an HPA if `controller.autoscaling.enabled` is true - set: - controller.autoscaling.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: HorizontalPodAutoscaler - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should not create an HPA if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true - set: - controller.autoscaling.enabled: true - controller.keda.enabled: true - asserts: - - hasDocuments: - count: 0 - - - it: should not create an HPA if `controller.kind` is "DaemonSet" - set: - controller.kind: DaemonSet - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml b/charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml deleted file mode 100644 index 9a4a576b78..0000000000 --- a/charts/ingress-nginx/tests/controller-ingressclass-aliases_test.yaml +++ /dev/null @@ -1,110 +0,0 @@ -suite: Controller > IngressClass > Aliases -templates: - - controller-ingressclass-aliases.yaml - -tests: - - it: should not create IngressClass aliases - asserts: - - hasDocuments: - count: 0 - - - it: should create an IngressClass alias with name "nginx-alias" if `controller.ingressClassResource.aliases` is set - set: - controller.ingressClassResource.aliases: - - nginx-alias - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-alias - - - it: should create an IngressClass alias without annotation `ingressclass.kubernetes.io/is-default-class` if `controller.ingressClassResource.default` is true - set: - controller.ingressClassResource.aliases: - - nginx-alias - controller.ingressClassResource.default: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-alias - - notExists: - path: metadata.annotations["ingressclass.kubernetes.io/is-default-class"] - - - it: should create an IngressClass alias with annotations if `controller.ingressClassResource.annotations` is set - set: - controller.ingressClassResource.aliases: - - nginx-alias - controller.ingressClassResource.annotations: - my-fancy-annotation: has-a-value - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-alias - - equal: - path: metadata.annotations.my-fancy-annotation - value: has-a-value - - - it: should create an IngressClass alias with controller "k8s.io/ingress-nginx-internal" if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" - set: - controller.ingressClassResource.aliases: - - nginx-alias - controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-alias - - equal: - path: spec.controller - value: k8s.io/ingress-nginx-internal - - - it: should create an IngressClass alias with parameters if `controller.ingressClassResource.parameters` is set - set: - controller.ingressClassResource.aliases: - - nginx-alias - controller.ingressClassResource.parameters: - apiGroup: k8s.example.com - kind: IngressParameters - name: external-lb - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-alias - - equal: - path: spec.parameters - value: - apiGroup: k8s.example.com - kind: IngressParameters - name: external-lb - - - it: should create two IngressClass aliases if `controller.ingressClassResource.aliases` has two elements - set: - controller.ingressClassResource.aliases: - - nginx-alias-1 - - nginx-alias-2 - asserts: - - hasDocuments: - count: 2 - - isKind: - of: IngressClass - - matchRegex: - path: metadata.name - pattern: nginx-alias-(1|2) diff --git a/charts/ingress-nginx/tests/controller-ingressclass_test.yaml b/charts/ingress-nginx/tests/controller-ingressclass_test.yaml deleted file mode 100644 index b3384af32c..0000000000 --- a/charts/ingress-nginx/tests/controller-ingressclass_test.yaml +++ /dev/null @@ -1,93 +0,0 @@ -suite: Controller > IngressClass -templates: - - controller-ingressclass.yaml - -tests: - - it: should create an IngressClass - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx - - - it: should create an IngressClass with name "nginx-internal" if `controller.ingressClassResource.name` is "nginx-internal" - set: - controller.ingressClassResource.name: nginx-internal - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx-internal - - - it: "should create an IngressClass with annotation `ingressclass.kubernetes.io/is-default-class: \"true\"` if `controller.ingressClassResource.default` is true" - set: - controller.ingressClassResource.default: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx - - equal: - path: metadata.annotations["ingressclass.kubernetes.io/is-default-class"] - value: "true" - - - it: should create an IngressClass with annotations if `controller.ingressClassResource.annotations` is set - set: - controller.ingressClassResource.annotations: - my-fancy-annotation: has-a-value - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx - - equal: - path: metadata.annotations.my-fancy-annotation - value: has-a-value - - - it: should create an IngressClass with controller "k8s.io/ingress-nginx-internal" if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal" - set: - controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx - - equal: - path: spec.controller - value: k8s.io/ingress-nginx-internal - - - it: should create an IngressClass with parameters if `controller.ingressClassResource.parameters` is set - set: - controller.ingressClassResource.parameters: - apiGroup: k8s.example.com - kind: IngressParameters - name: external-lb - asserts: - - hasDocuments: - count: 1 - - isKind: - of: IngressClass - - equal: - path: metadata.name - value: nginx - - equal: - path: spec.parameters - value: - apiGroup: k8s.example.com - kind: IngressParameters - name: external-lb diff --git a/charts/ingress-nginx/tests/controller-keda_test.yaml b/charts/ingress-nginx/tests/controller-keda_test.yaml deleted file mode 100644 index 800283483b..0000000000 --- a/charts/ingress-nginx/tests/controller-keda_test.yaml +++ /dev/null @@ -1,31 +0,0 @@ -suite: Controller > KEDA -templates: - - controller-keda.yaml - -tests: - - it: should create a ScaledObject if `controller.keda.enabled` is true - set: - controller.keda.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ScaledObject - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should not create a ScaledObject if `controller.keda.enabled` is true and `controller.autoscaling.enabled` is true - set: - controller.keda.enabled: true - controller.autoscaling.enabled: true - asserts: - - hasDocuments: - count: 0 - - - it: should not create a ScaledObject if `controller.kind` is "DaemonSet" - set: - controller.kind: DaemonSet - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/controller-networkpolicy_test.yaml b/charts/ingress-nginx/tests/controller-networkpolicy_test.yaml deleted file mode 100644 index 5de12e9c4b..0000000000 --- a/charts/ingress-nginx/tests/controller-networkpolicy_test.yaml +++ /dev/null @@ -1,23 +0,0 @@ -suite: Controller > NetworkPolicy -templates: - - controller-networkpolicy.yaml - -tests: - - it: should not create a NetworkPolicy if `controller.networkPolicy.enabled` is false - set: - controller.networkPolicy.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a NetworkPolicy if `controller.networkPolicy.enabled` is true - set: - controller.networkPolicy.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: NetworkPolicy - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller diff --git a/charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml b/charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml deleted file mode 100644 index f215f35207..0000000000 --- a/charts/ingress-nginx/tests/controller-poddisruptionbudget_test.yaml +++ /dev/null @@ -1,89 +0,0 @@ -suite: Controller > PodDisruptionBudget -templates: - - controller-poddisruptionbudget.yaml - -tests: - - it: should create a PodDisruptionBudget if `controller.replicaCount` is greater than 1 - set: - controller.replicaCount: 2 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should not create a PodDisruptionBudget if `controller.replicaCount` is less than or equal 1 - set: - controller.replicaCount: 1 - asserts: - - hasDocuments: - count: 0 - - - it: should create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.autoscaling.minReplicas` is greater than 1 - set: - controller.autoscaling.enabled: true - controller.autoscaling.minReplicas: 2 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should not create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.autoscaling.minReplicas` is less than or equal 1 - set: - controller.autoscaling.enabled: true - controller.autoscaling.minReplicas: 1 - asserts: - - hasDocuments: - count: 0 - - - it: should create a PodDisruptionBudget if `controller.keda.enabled` is true and `controller.keda.minReplicas` is greater than 1 - set: - controller.keda.enabled: true - controller.keda.minReplicas: 2 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should not create a PodDisruptionBudget if `controller.keda.enabled` is true and `controller.keda.minReplicas` is less than or equal 1 - set: - controller.keda.enabled: true - controller.keda.minReplicas: 1 - asserts: - - hasDocuments: - count: 0 - - - it: should not create a PodDisruptionBudget if `controller.autoscaling.enabled` is true and `controller.keda.enabled` is true - set: - controller.autoscaling.enabled: true - controller.keda.enabled: true - asserts: - - hasDocuments: - count: 0 - - - it: should create a PodDisruptionBudget without `minAvailable` and with `maxUnavailable` if `controller.minAvailable` and `controller.maxUnavailable` are set - set: - controller.replicaCount: 2 - controller.minAvailable: 1 - controller.maxUnavailable: 1 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - notExists: - path: spec.minAvailable - - equal: - path: spec.maxUnavailable - value: 1 diff --git a/charts/ingress-nginx/tests/controller-prometheusrule_test.yaml b/charts/ingress-nginx/tests/controller-prometheusrule_test.yaml deleted file mode 100644 index d60a98315f..0000000000 --- a/charts/ingress-nginx/tests/controller-prometheusrule_test.yaml +++ /dev/null @@ -1,17 +0,0 @@ -suite: Controller > PrometheusRule -templates: - - controller-prometheusrule.yaml - -tests: - - it: should create a PrometheusRule if `controller.metrics.prometheusRule.enabled` is true - set: - controller.metrics.enabled: true - controller.metrics.prometheusRule.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PrometheusRule - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller diff --git a/charts/ingress-nginx/tests/controller-service-internal_test.yaml b/charts/ingress-nginx/tests/controller-service-internal_test.yaml deleted file mode 100644 index 5465e1a2b8..0000000000 --- a/charts/ingress-nginx/tests/controller-service-internal_test.yaml +++ /dev/null @@ -1,25 +0,0 @@ -suite: Controller > Service > Internal -templates: - - controller-service-internal.yaml - -tests: - - it: should not create an internal Service if `controller.service.internal.enabled` is false - set: - controller.service.internal.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create an internal Service if `controller.service.internal.enabled` is true and `controller.service.internal.annotations` are set - set: - controller.service.internal.enabled: true - controller.service.internal.annotations: - test.annotation: "true" - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Service - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller-internal diff --git a/charts/ingress-nginx/tests/controller-service-metrics_test.yaml b/charts/ingress-nginx/tests/controller-service-metrics_test.yaml deleted file mode 100644 index afdb940464..0000000000 --- a/charts/ingress-nginx/tests/controller-service-metrics_test.yaml +++ /dev/null @@ -1,23 +0,0 @@ -suite: Controller > Service > Metrics -templates: - - controller-service-metrics.yaml - -tests: - - it: should not create a metrics Service if `controller.metrics.enabled` is false - set: - controller.metrics.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a metrics Service if `controller.metrics.enabled` is true - set: - controller.metrics.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Service - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller-metrics diff --git a/charts/ingress-nginx/tests/controller-service-webhook_test.yaml b/charts/ingress-nginx/tests/controller-service-webhook_test.yaml deleted file mode 100644 index 1c759edbe6..0000000000 --- a/charts/ingress-nginx/tests/controller-service-webhook_test.yaml +++ /dev/null @@ -1,32 +0,0 @@ -suite: Controller > Service > Webhook -templates: - - controller-service-webhook.yaml - -tests: - - it: should not create a webhook Service if `controller.admissionWebhooks.enabled` is false - set: - controller.admissionWebhooks.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a webhook Service if `controller.admissionWebhooks.enabled` is true - set: - controller.admissionWebhooks.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Service - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller-admission - - - it: should create a webhook Service with a custom port if `controller.admissionWebhooks.service.servicePort` is set - set: - controller.admissionWebhooks.enabled: true - controller.admissionWebhooks.service.servicePort: 9443 - asserts: - - equal: - path: spec.ports[0].port - value: 9443 diff --git a/charts/ingress-nginx/tests/controller-service_test.yaml b/charts/ingress-nginx/tests/controller-service_test.yaml deleted file mode 100644 index 10574f227d..0000000000 --- a/charts/ingress-nginx/tests/controller-service_test.yaml +++ /dev/null @@ -1,32 +0,0 @@ -suite: Controller > Service -templates: - - controller-service.yaml - -tests: - - it: should not create a Service if `controller.service.external.enabled` is false - set: - controller.service.external.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a Service if `controller.service.external.enabled` is true - set: - controller.service.external.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Service - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should create a Service of type "NodePort" if `controller.service.external.enabled` is true and `controller.service.type` is "NodePort" - set: - controller.service.external.enabled: true - controller.service.type: NodePort - asserts: - - equal: - path: spec.type - value: NodePort diff --git a/charts/ingress-nginx/tests/controller-servicemonitor_test.yaml b/charts/ingress-nginx/tests/controller-servicemonitor_test.yaml deleted file mode 100644 index 310097c1a2..0000000000 --- a/charts/ingress-nginx/tests/controller-servicemonitor_test.yaml +++ /dev/null @@ -1,29 +0,0 @@ -suite: Controller > ServiceMonitor -templates: - - controller-servicemonitor.yaml - -tests: - - it: should create a ServiceMonitor if `controller.metrics.serviceMonitor.enabled` is true - set: - controller.metrics.enabled: true - controller.metrics.serviceMonitor.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ServiceMonitor - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-controller - - - it: should create a ServiceMonitor with annotations if `controller.metrics.serviceMonitor.annotations` is set - set: - controller.metrics.enabled: true - controller.metrics.serviceMonitor.enabled: true - controller.metrics.serviceMonitor.annotations: - my-little-annotation: test-value - asserts: - - equal: - path: metadata.annotations - value: - my-little-annotation: test-value diff --git a/charts/ingress-nginx/tests/default-backend-deployment_test.yaml b/charts/ingress-nginx/tests/default-backend-deployment_test.yaml deleted file mode 100644 index 4ba4b03d3e..0000000000 --- a/charts/ingress-nginx/tests/default-backend-deployment_test.yaml +++ /dev/null @@ -1,169 +0,0 @@ -suite: Default Backend > Deployment -templates: - - default-backend-deployment.yaml - -tests: - - it: should not create a Deployment if `defaultBackend.enabled` is false - set: - defaultBackend.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a Deployment if `defaultBackend.enabled` is true - set: - defaultBackend.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Deployment - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-defaultbackend - - - it: should create a Deployment with 3 replicas if `defaultBackend.replicaCount` is 3 - set: - defaultBackend.enabled: true - defaultBackend.replicaCount: 3 - asserts: - - equal: - path: spec.replicas - value: 3 - - - it: should create a Deployment without replicas if `defaultBackend.autoscaling.enabled` is true - set: - defaultBackend.enabled: true - defaultBackend.autoscaling.enabled: true - asserts: - - notExists: - path: spec.replicas - - - it: should create a Deployment with resource limits if `defaultBackend.resources.limits` is set - set: - defaultBackend.enabled: true - defaultBackend.resources.limits.cpu: 500m - defaultBackend.resources.limits.memory: 512Mi - asserts: - - equal: - path: spec.template.spec.containers[0].resources.limits.cpu - value: 500m - - equal: - path: spec.template.spec.containers[0].resources.limits.memory - value: 512Mi - - - it: should create a Deployment with topology spread constraints if `defaultBackend.topologySpreadConstraints` is set - set: - defaultBackend.enabled: true - defaultBackend.topologySpreadConstraints: - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: default-backend - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - app.kubernetes.io/instance: '{{ .Release.Name }}' - app.kubernetes.io/component: default-backend - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - asserts: - - equal: - path: spec.template.spec.topologySpreadConstraints - value: - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: default-backend - topologyKey: topology.kubernetes.io/zone - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - labelSelector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: RELEASE-NAME - app.kubernetes.io/component: default-backend - topologyKey: kubernetes.io/hostname - maxSkew: 1 - whenUnsatisfiable: ScheduleAnyway - - - it: should create a Deployment with affinity if `defaultBackend.affinity` is set - set: - defaultBackend.enabled: true - defaultBackend.affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - '{{ include "ingress-nginx.name" . }}' - - key: app.kubernetes.io/instance - operator: In - values: - - '{{ .Release.Name }}' - - key: app.kubernetes.io/component - operator: In - values: - - default-backend - topologyKey: kubernetes.io/hostname - asserts: - - equal: - path: spec.template.spec.affinity - value: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app.kubernetes.io/name - operator: In - values: - - ingress-nginx - - key: app.kubernetes.io/instance - operator: In - values: - - RELEASE-NAME - - key: app.kubernetes.io/component - operator: In - values: - - default-backend - topologyKey: kubernetes.io/hostname - - - it: should create a Deployment with a custom registry if `defaultBackend.image.registry` is set - set: - defaultBackend.enabled: true - defaultBackend.image.registry: custom.registry.io - defaultBackend.image.tag: v1.0.0-dev - defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: custom.registry.io/defaultbackend-amd64:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a Deployment with a custom image if `defaultBackend.image.image` is set - set: - defaultBackend.enabled: true - defaultBackend.image.image: custom-repo/custom-image - defaultBackend.image.tag: v1.0.0-dev - defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - - - it: should create a Deployment with a custom tag if `defaultBackend.image.tag` is set - set: - defaultBackend.enabled: true - defaultBackend.image.tag: custom-tag - defaultBackend.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: registry.k8s.io/defaultbackend-amd64:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd diff --git a/charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml b/charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml deleted file mode 100644 index aa600e7493..0000000000 --- a/charts/ingress-nginx/tests/default-backend-extra-configmaps_test.yaml +++ /dev/null @@ -1,50 +0,0 @@ -suite: Default Backend > Extra ConfigMaps -templates: - - default-backend-extra-configmaps.yaml - -tests: - - it: should not create a ConfigMap if `defaultBackend.extraConfigMaps` is empty - set: - defaultBackend.enabled: true - defaultBackend.extraConfigMaps: [] - asserts: - - hasDocuments: - count: 0 - - - it: should create one ConfigMap if `defaultBackend.extraConfigMaps` has one element - set: - defaultBackend.enabled: true - defaultBackend.extraConfigMaps: - - name: my-configmap-1 - data: - key1: value1 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: ConfigMap - - equal: - path: metadata.name - value: my-configmap-1 - - equal: - path: data.key1 - value: value1 - - - it: should create two ConfigMaps if `defaultBackend.extraConfigMaps` has two elements - set: - defaultBackend.enabled: true - defaultBackend.extraConfigMaps: - - name: my-configmap-1 - data: - key1: value1 - - name: my-configmap-2 - data: - key2: value2 - asserts: - - hasDocuments: - count: 2 - - isKind: - of: ConfigMap - - matchRegex: - path: metadata.name - pattern: my-configmap-(1|2) diff --git a/charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml b/charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml deleted file mode 100644 index 0958018620..0000000000 --- a/charts/ingress-nginx/tests/default-backend-poddisruptionbudget_test.yaml +++ /dev/null @@ -1,48 +0,0 @@ -suite: Default Backend > PodDisruptionBudget -templates: - - default-backend-poddisruptionbudget.yaml - -tests: - - it: should create a PodDisruptionBudget if `defaultBackend.replicaCount` is greater than 1 - set: - defaultBackend.enabled: true - defaultBackend.replicaCount: 2 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-defaultbackend - - - it: should not create a PodDisruptionBudget if `defaultBackend.replicaCount` is less than or equal 1 - set: - defaultBackend.enabled: true - defaultBackend.replicaCount: 1 - asserts: - - hasDocuments: - count: 0 - - - it: should create a PodDisruptionBudget if `defaultBackend.autoscaling.enabled` is true and `defaultBackend.autoscaling.minReplicas` is greater than 1 - set: - defaultBackend.enabled: true - defaultBackend.autoscaling.enabled: true - defaultBackend.autoscaling.minReplicas: 2 - asserts: - - hasDocuments: - count: 1 - - isKind: - of: PodDisruptionBudget - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-defaultbackend - - - it: should not create a PodDisruptionBudget if `defaultBackend.autoscaling.enabled` is true and `defaultBackend.autoscaling.minReplicas` is less than or equal 1 - set: - defaultBackend.enabled: true - defaultBackend.autoscaling.enabled: true - defaultBackend.autoscaling.minReplicas: 1 - asserts: - - hasDocuments: - count: 0 diff --git a/charts/ingress-nginx/tests/default-backend-service_test.yaml b/charts/ingress-nginx/tests/default-backend-service_test.yaml deleted file mode 100644 index f16904f9f0..0000000000 --- a/charts/ingress-nginx/tests/default-backend-service_test.yaml +++ /dev/null @@ -1,32 +0,0 @@ -suite: Default Backend > Service -templates: - - default-backend-service.yaml - -tests: - - it: should not create a Service if `defaultBackend.enabled` is false - set: - defaultBackend.enabled: false - asserts: - - hasDocuments: - count: 0 - - - it: should create a Service if `defaultBackend.enabled` is true - set: - defaultBackend.enabled: true - asserts: - - hasDocuments: - count: 1 - - isKind: - of: Service - - equal: - path: metadata.name - value: RELEASE-NAME-ingress-nginx-defaultbackend - - - it: should create a Service with port 80 if `defaultBackend.service.port` is 80 - set: - defaultBackend.enabled: true - defaultBackend.service.port: 80 - asserts: - - equal: - path: spec.ports[0].port - value: 80 diff --git a/charts/ingress-nginx/values.yaml b/charts/ingress-nginx/values.yaml deleted file mode 100644 index f42a6821dc..0000000000 --- a/charts/ingress-nginx/values.yaml +++ /dev/null @@ -1,1192 +0,0 @@ -## nginx configuration -## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/index.md -## - -## Overrides for generated resource names -# See templates/_helpers.tpl -# nameOverride: -# fullnameOverride: - -# -- Override the deployment namespace; defaults to .Release.Namespace -namespaceOverride: "" -## Labels to apply to all resources -## -commonLabels: {} -# scmhash: abc123 -# myLabel: aakkmd - -controller: - name: controller - enableAnnotationValidations: false - image: - ## Keep false as default for now! - chroot: false - registry: registry.k8s.io - image: ingress-nginx/controller - ## for backwards compatibility consider setting the full image url via the repository value below - ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail - ## repository: - tag: "v1.11.3" - digest: sha256:d56f135b6462cfc476447cfe564b83a45e8bb7da2774963b00d12161112270b7 - digestChroot: sha256:22701f0fc0f2dd209ef782f4e281bfe2d8cccd50ededa00aec88e0cdbe7edd14 - pullPolicy: IfNotPresent - runAsNonRoot: true - # www-data -> uid 101 - runAsUser: 101 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - readOnlyRootFilesystem: false - # -- Use an existing PSP instead of creating one - existingPsp: "" - # -- Configures the controller container name - containerName: controller - # -- Configures the ports that the nginx-controller listens on - containerPort: - http: 80 - https: 443 - # -- Global configuration passed to the ConfigMap consumed by the controller. Values may contain Helm templates. - # Ref.: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/ - config: {} - # -- Annotations to be added to the controller config configuration configmap. - configAnnotations: {} - # -- Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/custom-headers - proxySetHeaders: {} - # -- Will add custom headers before sending response traffic to the client according to: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers - addHeaders: {} - # -- Optionally customize the pod dnsConfig. - dnsConfig: {} - # -- Optionally customize the pod hostAliases. - hostAliases: [] - # - ip: 127.0.0.1 - # hostnames: - # - foo.local - # - bar.local - # - ip: 10.1.2.3 - # hostnames: - # - foo.remote - # - bar.remote - # -- Optionally customize the pod hostname. - hostname: {} - # -- Optionally change this to ClusterFirstWithHostNet in case you have 'hostNetwork: true'. - # By default, while using host network, name resolution uses the host's DNS. If you wish nginx-controller - # to keep resolving names inside the k8s network, use ClusterFirstWithHostNet. - dnsPolicy: ClusterFirst - # -- Bare-metal considerations via the host network https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network - # Ingress status was blank because there is no Service exposing the Ingress-Nginx Controller in a configuration using the host network, the default --publish-service flag used in standard cloud setups does not apply - reportNodeInternalIp: false - # -- Process Ingress objects without ingressClass annotation/ingressClassName field - # Overrides value for --watch-ingress-without-class flag of the controller binary - # Defaults to false - watchIngressWithoutClass: false - # -- Process IngressClass per name (additionally as per spec.controller). - ingressClassByName: false - # -- This configuration enables Topology Aware Routing feature, used together with service annotation service.kubernetes.io/topology-mode="auto" - # Defaults to false - enableTopologyAwareRouting: false - # -- This configuration disable Nginx Controller Leader Election - disableLeaderElection: false - # -- Duration a leader election is valid before it's getting re-elected, e.g. `15s`, `10m` or `1h`. (Default: 30s) - electionTTL: "" - # -- This configuration defines if Ingress Controller should allow users to set - # their own *-snippet annotations, otherwise this is forbidden / dropped - # when users add those annotations. - # Global snippets in ConfigMap are still respected - allowSnippetAnnotations: false - # -- Required for use with CNI based kubernetes installations (such as ones set up by kubeadm), - # since CNI and hostport don't mix yet. Can be deprecated once https://github.com/kubernetes/kubernetes/issues/23920 - # is merged - hostNetwork: false - ## Use host ports 80 and 443 - ## Disabled by default - hostPort: - # -- Enable 'hostPort' or not - enabled: false - ports: - # -- 'hostPort' http port - http: 80 - # -- 'hostPort' https port - https: 443 - # NetworkPolicy for controller component. - networkPolicy: - # -- Enable 'networkPolicy' or not - enabled: false - # -- Election ID to use for status update, by default it uses the controller name combined with a suffix of 'leader' - electionID: "" - # -- This section refers to the creation of the IngressClass resource. - # IngressClasses are immutable and cannot be changed after creation. - # We do not support namespaced IngressClasses, yet, so a ClusterRole and a ClusterRoleBinding is required. - ingressClassResource: - # -- Name of the IngressClass - name: nginx - # -- Create the IngressClass or not - enabled: true - # -- If true, Ingresses without `ingressClassName` get assigned to this IngressClass on creation. - # Ingress creation gets rejected if there are multiple default IngressClasses. - # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#default-ingress-class - default: false - # -- Annotations to be added to the IngressClass resource. - annotations: {} - # -- Controller of the IngressClass. An Ingress Controller looks for IngressClasses it should reconcile by this value. - # This value is also being set as the `--controller-class` argument of this Ingress Controller. - # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class - controllerValue: k8s.io/ingress-nginx - # -- Aliases of this IngressClass. Creates copies with identical settings but the respective alias as name. - # Useful for development environments with only one Ingress Controller but production-like Ingress resources. - # `default` gets enabled on the original IngressClass only. - aliases: [] - # aliases: - # - nginx-alias-1 - # - nginx-alias-2 - # -- A link to a custom resource containing additional configuration for the controller. - # This is optional if the controller consuming this IngressClass does not require additional parameters. - # Ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class - parameters: {} - # parameters: - # apiGroup: k8s.example.com - # kind: IngressParameters - # name: external-lb - # -- For backwards compatibility with ingress.class annotation, use ingressClass. - # Algorithm is as follows, first ingressClassName is considered, if not present, controller looks for ingress.class annotation - ingressClass: nginx - # -- Labels to add to the pod container metadata - podLabels: {} - # key: value - - # -- Security context for controller pods - podSecurityContext: {} - # -- sysctls for controller pods - ## Ref: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ - sysctls: {} - # sysctls: - # "net.core.somaxconn": "8192" - # -- Security context for controller containers - containerSecurityContext: {} - # -- Allows customization of the source of the IP address or FQDN to report - # in the ingress status field. By default, it reads the information provided - # by the service. If disable, the status field reports the IP address of the - # node or nodes where an ingress controller pod is running. - publishService: - # -- Enable 'publishService' or not - enabled: true - # -- Allows overriding of the publish service to bind to - # Must be / - pathOverride: "" - # Limit the scope of the controller to a specific namespace - scope: - # -- Enable 'scope' or not - enabled: false - # -- Namespace to limit the controller to; defaults to $(POD_NAMESPACE) - namespace: "" - # -- When scope.enabled == false, instead of watching all namespaces, we watching namespaces whose labels - # only match with namespaceSelector. Format like foo=bar. Defaults to empty, means watching all namespaces. - namespaceSelector: "" - # -- Allows customization of the configmap / nginx-configmap namespace; defaults to $(POD_NAMESPACE) - configMapNamespace: "" - tcp: - # -- Allows customization of the tcp-services-configmap; defaults to $(POD_NAMESPACE) - configMapNamespace: "" - # -- Annotations to be added to the tcp config configmap - annotations: {} - udp: - # -- Allows customization of the udp-services-configmap; defaults to $(POD_NAMESPACE) - configMapNamespace: "" - # -- Annotations to be added to the udp config configmap - annotations: {} - # -- Maxmind license key to download GeoLite2 Databases. - ## https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/ - maxmindLicenseKey: "" - # -- Additional command line arguments to pass to Ingress-Nginx Controller - # E.g. to specify the default SSL certificate you can use - extraArgs: {} - ## extraArgs: - ## default-ssl-certificate: "/" - ## time-buckets: "0.005,0.01,0.025,0.05,0.1,0.25,0.5,1,2.5,5,10" - ## length-buckets: "10,20,30,40,50,60,70,80,90,100" - ## size-buckets: "10,100,1000,10000,100000,1e+06,1e+07" - - # -- Additional environment variables to set - extraEnvs: [] - # extraEnvs: - # - name: FOO - # valueFrom: - # secretKeyRef: - # key: FOO - # name: secret-resource - - # -- Use a `DaemonSet` or `Deployment` - kind: Deployment - # -- Annotations to be added to the controller Deployment or DaemonSet - ## - annotations: {} - # keel.sh/pollSchedule: "@every 60m" - - # -- Labels to be added to the controller Deployment or DaemonSet and other resources that do not have option to specify labels - ## - labels: {} - # keel.sh/policy: patch - # keel.sh/trigger: poll - - # -- The update strategy to apply to the Deployment or DaemonSet - ## - updateStrategy: {} - # rollingUpdate: - # maxUnavailable: 1 - # type: RollingUpdate - - # -- `minReadySeconds` to avoid killing pods before we are ready - ## - minReadySeconds: 0 - # -- Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - # -- Affinity and anti-affinity rules for server scheduling to nodes - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - ## - affinity: {} - # # An example of preferred pod anti-affinity, weight is in the range 1-100 - # podAntiAffinity: - # preferredDuringSchedulingIgnoredDuringExecution: - # - weight: 100 - # podAffinityTerm: - # labelSelector: - # matchExpressions: - # - key: app.kubernetes.io/name - # operator: In - # values: - # - '{{ include "ingress-nginx.name" . }}' - # - key: app.kubernetes.io/instance - # operator: In - # values: - # - '{{ .Release.Name }}' - # - key: app.kubernetes.io/component - # operator: In - # values: - # - controller - # topologyKey: kubernetes.io/hostname - - # # An example of required pod anti-affinity - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchExpressions: - # - key: app.kubernetes.io/name - # operator: In - # values: - # - '{{ include "ingress-nginx.name" . }}' - # - key: app.kubernetes.io/instance - # operator: In - # values: - # - '{{ .Release.Name }}' - # - key: app.kubernetes.io/component - # operator: In - # values: - # - controller - # topologyKey: kubernetes.io/hostname - - # -- Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - ## - topologySpreadConstraints: [] - # - labelSelector: - # matchLabels: - # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - # app.kubernetes.io/instance: '{{ .Release.Name }}' - # app.kubernetes.io/component: controller - # topologyKey: topology.kubernetes.io/zone - # maxSkew: 1 - # whenUnsatisfiable: ScheduleAnyway - # - labelSelector: - # matchLabels: - # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - # app.kubernetes.io/instance: '{{ .Release.Name }}' - # app.kubernetes.io/component: controller - # topologyKey: kubernetes.io/hostname - # maxSkew: 1 - # whenUnsatisfiable: ScheduleAnyway - - # -- `terminationGracePeriodSeconds` to avoid killing pods before we are ready - ## wait up to five minutes for the drain of connections - ## - terminationGracePeriodSeconds: 300 - # -- Node labels for controller pod assignment - ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: - kubernetes.io/os: linux - ## Liveness and readiness probe values - ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes - ## - ## startupProbe: - ## httpGet: - ## # should match container.healthCheckPath - ## path: "/healthz" - ## port: 10254 - ## scheme: HTTP - ## initialDelaySeconds: 5 - ## periodSeconds: 5 - ## timeoutSeconds: 2 - ## successThreshold: 1 - ## failureThreshold: 5 - livenessProbe: - httpGet: - # should match container.healthCheckPath - path: "/healthz" - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 5 - readinessProbe: - httpGet: - # should match container.healthCheckPath - path: "/healthz" - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - # -- Path of the health check endpoint. All requests received on the port defined by - # the healthz-port parameter are forwarded internally to this path. - healthCheckPath: "/healthz" - # -- Address to bind the health check endpoint. - # It is better to set this option to the internal node address - # if the Ingress-Nginx Controller is running in the `hostNetwork: true` mode. - healthCheckHost: "" - # -- Annotations to be added to controller pods - ## - podAnnotations: {} - replicaCount: 1 - # -- Minimum available pods set in PodDisruptionBudget. - # Define either 'minAvailable' or 'maxUnavailable', never both. - minAvailable: 1 - # -- Maximum unavailable pods set in PodDisruptionBudget. If set, 'minAvailable' is ignored. - # maxUnavailable: 1 - - ## Define requests resources to avoid probe issues due to CPU utilization in busy nodes - ## ref: https://github.com/kubernetes/ingress-nginx/issues/4735#issuecomment-551204903 - ## Ideally, there should be no limits. - ## https://engineering.indeedblog.com/blog/2019/12/cpu-throttling-regression-fix/ - resources: - ## limits: - ## cpu: 100m - ## memory: 90Mi - requests: - cpu: 100m - memory: 90Mi - # Mutually exclusive with keda autoscaling - autoscaling: - enabled: false - annotations: {} - minReplicas: 1 - maxReplicas: 11 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - behavior: {} - # scaleDown: - # stabilizationWindowSeconds: 300 - # policies: - # - type: Pods - # value: 1 - # periodSeconds: 180 - # scaleUp: - # stabilizationWindowSeconds: 300 - # policies: - # - type: Pods - # value: 2 - # periodSeconds: 60 - autoscalingTemplate: [] - # Custom or additional autoscaling metrics - # ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#support-for-custom-metrics - # - type: Pods - # pods: - # metric: - # name: nginx_ingress_controller_nginx_process_requests_total - # target: - # type: AverageValue - # averageValue: 10000m - - # Mutually exclusive with hpa autoscaling - keda: - apiVersion: "keda.sh/v1alpha1" - ## apiVersion changes with keda 1.x vs 2.x - ## 2.x = keda.sh/v1alpha1 - ## 1.x = keda.k8s.io/v1alpha1 - enabled: false - minReplicas: 1 - maxReplicas: 11 - pollingInterval: 30 - cooldownPeriod: 300 - # fallback: - # failureThreshold: 3 - # replicas: 11 - restoreToOriginalReplicaCount: false - scaledObject: - annotations: {} - # Custom annotations for ScaledObject resource - # annotations: - # key: value - triggers: [] - # - type: prometheus - # metadata: - # serverAddress: http://:9090 - # metricName: http_requests_total - # threshold: '100' - # query: sum(rate(http_requests_total{deployment="my-deployment"}[2m])) - - behavior: {} - # scaleDown: - # stabilizationWindowSeconds: 300 - # policies: - # - type: Pods - # value: 1 - # periodSeconds: 180 - # scaleUp: - # stabilizationWindowSeconds: 300 - # policies: - # - type: Pods - # value: 2 - # periodSeconds: 60 - # -- Enable mimalloc as a drop-in replacement for malloc. - ## ref: https://github.com/microsoft/mimalloc - ## - enableMimalloc: true - ## Override NGINX template - customTemplate: - configMapName: "" - configMapKey: "" - service: - # -- Enable controller services or not. This does not influence the creation of either the admission webhook or the metrics service. - enabled: true - external: - # -- Enable the external controller service or not. Useful for internal-only deployments. - enabled: true - # -- Annotations to be added to the external controller service. See `controller.service.internal.annotations` for annotations to be added to the internal controller service. - annotations: {} - # -- Labels to be added to both controller services. - labels: {} - # -- Type of the external controller service. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types - type: LoadBalancer - # -- Pre-defined cluster internal IP address of the external controller service. Take care of collisions with existing services. - # This value is immutable. Set once, it can not be changed without deleting and re-creating the service. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address - clusterIP: "" - # -- List of node IP addresses at which the external controller service is available. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips - externalIPs: [] - # -- Deprecated: Pre-defined IP address of the external controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer - loadBalancerIP: "" - # -- Restrict access to the external controller service. Values must be CIDRs. Allows any source address by default. - loadBalancerSourceRanges: [] - # -- Load balancer class of the external controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class - loadBalancerClass: "" - # -- Enable node port allocation for the external controller service or not. Applies to type `LoadBalancer` only. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-nodeport-allocation - # allocateLoadBalancerNodePorts: true - - # -- External traffic policy of the external controller service. Set to "Local" to preserve source IP on providers supporting it. - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - externalTrafficPolicy: "" - # -- Session affinity of the external controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". - # Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity - sessionAffinity: "" - # -- Specifies the health check node port (numeric port number) for the external controller service. - # If not specified, the service controller allocates a port from your cluster's node port range. - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - # healthCheckNodePort: 0 - - # -- Represents the dual-stack capabilities of the external controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. - # Fields `ipFamilies` and `clusterIP` depend on the value of this field. - # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services - ipFamilyPolicy: SingleStack - # -- List of IP families (e.g. IPv4, IPv6) assigned to the external controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. - # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services - ipFamilies: - - IPv4 - # -- Enable the HTTP listener on both controller services or not. - enableHttp: true - # -- Enable the HTTPS listener on both controller services or not. - enableHttps: true - ports: - # -- Port the external HTTP listener is published with. - http: 80 - # -- Port the external HTTPS listener is published with. - https: 443 - targetPorts: - # -- Port of the ingress controller the external HTTP listener is mapped to. - http: http - # -- Port of the ingress controller the external HTTPS listener is mapped to. - https: https - # -- Declare the app protocol of the external HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol - appProtocol: true - nodePorts: - # -- Node port allocated for the external HTTP listener. If left empty, the service controller allocates one from the configured node port range. - http: "" - # -- Node port allocated for the external HTTPS listener. If left empty, the service controller allocates one from the configured node port range. - https: "" - # -- Node port mapping for external TCP listeners. If left empty, the service controller allocates them from the configured node port range. - # Example: - # tcp: - # 8080: 30080 - tcp: {} - # -- Node port mapping for external UDP listeners. If left empty, the service controller allocates them from the configured node port range. - # Example: - # udp: - # 53: 30053 - udp: {} - internal: - # -- Enable the internal controller service or not. Remember to configure `controller.service.internal.annotations` when enabling this. - enabled: false - # -- Annotations to be added to the internal controller service. Mandatory for the internal controller service to be created. Varies with the cloud service. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer - annotations: {} - # -- Type of the internal controller service. - # Defaults to the value of `controller.service.type`. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types - type: "" - # -- Pre-defined cluster internal IP address of the internal controller service. Take care of collisions with existing services. - # This value is immutable. Set once, it can not be changed without deleting and re-creating the service. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address - clusterIP: "" - # -- List of node IP addresses at which the internal controller service is available. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips - externalIPs: [] - # -- Deprecated: Pre-defined IP address of the internal controller service. Used by cloud providers to connect the resulting load balancer service to a pre-existing static IP. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer - loadBalancerIP: "" - # -- Restrict access to the internal controller service. Values must be CIDRs. Allows any source address by default. - loadBalancerSourceRanges: [] - # -- Load balancer class of the internal controller service. Used by cloud providers to select a load balancer implementation other than the cloud provider default. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-class - loadBalancerClass: "" - # -- Enable node port allocation for the internal controller service or not. Applies to type `LoadBalancer` only. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#load-balancer-nodeport-allocation - # allocateLoadBalancerNodePorts: true - - # -- External traffic policy of the internal controller service. Set to "Local" to preserve source IP on providers supporting it. - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - externalTrafficPolicy: "" - # -- Session affinity of the internal controller service. Must be either "None" or "ClientIP" if set. Defaults to "None". - # Ref: https://kubernetes.io/docs/reference/networking/virtual-ips/#session-affinity - sessionAffinity: "" - # -- Specifies the health check node port (numeric port number) for the internal controller service. - # If not specified, the service controller allocates a port from your cluster's node port range. - # Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip - # healthCheckNodePort: 0 - - # -- Represents the dual-stack capabilities of the internal controller service. Possible values are SingleStack, PreferDualStack or RequireDualStack. - # Fields `ipFamilies` and `clusterIP` depend on the value of this field. - # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services - ipFamilyPolicy: SingleStack - # -- List of IP families (e.g. IPv4, IPv6) assigned to the internal controller service. This field is usually assigned automatically based on cluster configuration and the `ipFamilyPolicy` field. - # Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services - ipFamilies: - - IPv4 - ports: {} - # -- Port the internal HTTP listener is published with. - # Defaults to the value of `controller.service.ports.http`. - # http: 80 - # -- Port the internal HTTPS listener is published with. - # Defaults to the value of `controller.service.ports.https`. - # https: 443 - - targetPorts: {} - # -- Port of the ingress controller the internal HTTP listener is mapped to. - # Defaults to the value of `controller.service.targetPorts.http`. - # http: http - # -- Port of the ingress controller the internal HTTPS listener is mapped to. - # Defaults to the value of `controller.service.targetPorts.https`. - # https: https - - # -- Declare the app protocol of the internal HTTP and HTTPS listeners or not. Supersedes provider-specific annotations for declaring the backend protocol. - # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol - appProtocol: true - nodePorts: - # -- Node port allocated for the internal HTTP listener. If left empty, the service controller allocates one from the configured node port range. - http: "" - # -- Node port allocated for the internal HTTPS listener. If left empty, the service controller allocates one from the configured node port range. - https: "" - # -- Node port mapping for internal TCP listeners. If left empty, the service controller allocates them from the configured node port range. - # Example: - # tcp: - # 8080: 30080 - tcp: {} - # -- Node port mapping for internal UDP listeners. If left empty, the service controller allocates them from the configured node port range. - # Example: - # udp: - # 53: 30053 - udp: {} - # shareProcessNamespace enables process namespace sharing within the pod. - # This can be used for example to signal log rotation using `kill -USR1` from a sidecar. - shareProcessNamespace: false - # -- Additional containers to be added to the controller pod. - # See https://github.com/lemonldap-ng-controller/lemonldap-ng-controller as example. - extraContainers: [] - # - name: my-sidecar - # image: nginx:latest - # - name: lemonldap-ng-controller - # image: lemonldapng/lemonldap-ng-controller:0.2.0 - # args: - # - /lemonldap-ng-controller - # - --alsologtostderr - # - --configmap=$(POD_NAMESPACE)/lemonldap-ng-configuration - # env: - # - name: POD_NAME - # valueFrom: - # fieldRef: - # fieldPath: metadata.name - # - name: POD_NAMESPACE - # valueFrom: - # fieldRef: - # fieldPath: metadata.namespace - # volumeMounts: - # - name: copy-portal-skins - # mountPath: /srv/var/lib/lemonldap-ng/portal/skins - - # -- Additional volumeMounts to the controller main container. - extraVolumeMounts: [] - # - name: copy-portal-skins - # mountPath: /var/lib/lemonldap-ng/portal/skins - - # -- Additional volumes to the controller pod. - extraVolumes: [] - # - name: copy-portal-skins - # emptyDir: {} - - # -- Containers, which are run before the app containers are started. - extraInitContainers: [] - # - name: init-myservice - # image: busybox - # command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] - - # -- Modules, which are mounted into the core nginx image. See values.yaml for a sample to add opentelemetry module - extraModules: [] - # - name: mytestmodule - # image: - # registry: registry.k8s.io - # image: ingress-nginx/mytestmodule - # ## for backwards compatibility consider setting the full image url via the repository value below - # ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail - # ## repository: - # tag: "v1.0.0" - # digest: "" - # distroless: false - # containerSecurityContext: - # runAsNonRoot: true - # runAsUser: - # allowPrivilegeEscalation: false - # seccompProfile: - # type: RuntimeDefault - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # resources: {} - # - # The image must contain a `/usr/local/bin/init_module.sh` executable, which - # will be executed as initContainers, to move its config files within the - # mounted volume. - - opentelemetry: - enabled: false - name: opentelemetry - image: - registry: registry.k8s.io - image: ingress-nginx/opentelemetry-1.25.3 - ## for backwards compatibility consider setting the full image url via the repository value below - ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail - ## repository: - tag: v20240813-b933310d - digest: sha256:f7604ac0547ed64d79b98d92133234e66c2c8aade3c1f4809fed5eec1fb7f922 - distroless: true - containerSecurityContext: - runAsNonRoot: true - # -- The image's default user, inherited from its base image `cgr.dev/chainguard/static`. - runAsUser: 65532 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - resources: {} - admissionWebhooks: - name: admission - annotations: {} - # ignore-check.kube-linter.io/no-read-only-rootfs: "This deployment needs write access to root filesystem". - - ## Additional annotations to the admission webhooks. - ## These annotations will be added to the ValidatingWebhookConfiguration and - ## the Jobs Spec of the admission webhooks. - enabled: true - # -- Additional environment variables to set - extraEnvs: [] - # extraEnvs: - # - name: FOO - # valueFrom: - # secretKeyRef: - # key: FOO - # name: secret-resource - # -- Admission Webhook failure policy to use - failurePolicy: Fail - # timeoutSeconds: 10 - port: 8443 - certificate: "/usr/local/certificates/cert" - key: "/usr/local/certificates/key" - namespaceSelector: {} - objectSelector: {} - # -- Labels to be added to admission webhooks - labels: {} - # -- Use an existing PSP instead of creating one - existingPsp: "" - service: - annotations: {} - # clusterIP: "" - externalIPs: [] - # loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 443 - type: ClusterIP - createSecretJob: - name: create - # -- Security context for secret creation containers - securityContext: - runAsNonRoot: true - runAsUser: 65532 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - resources: {} - # limits: - # cpu: 10m - # memory: 20Mi - # requests: - # cpu: 10m - # memory: 20Mi - patchWebhookJob: - name: patch - # -- Security context for webhook patch containers - securityContext: - runAsNonRoot: true - runAsUser: 65532 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - resources: {} - patch: - enabled: true - image: - registry: registry.k8s.io - image: ingress-nginx/kube-webhook-certgen - ## for backwards compatibility consider setting the full image url via the repository value below - ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail - ## repository: - tag: v1.4.4 - digest: sha256:a9f03b34a3cbfbb26d103a14046ab2c5130a80c3d69d526ff8063d2b37b9fd3f - pullPolicy: IfNotPresent - # -- Provide a priority class name to the webhook patching job - ## - priorityClassName: "" - podAnnotations: {} - # NetworkPolicy for webhook patch - networkPolicy: - # -- Enable 'networkPolicy' or not - enabled: false - nodeSelector: - kubernetes.io/os: linux - tolerations: [] - # -- Labels to be added to patch job resources - labels: {} - # -- Security context for secret creation & webhook patch pods - securityContext: {} - # -- Admission webhook patch job RBAC - rbac: - # -- Create RBAC or not - create: true - # -- Admission webhook patch job service account - serviceAccount: - # -- Create a service account or not - create: true - # -- Custom service account name - name: "" - # -- Auto-mount service account token or not - automountServiceAccountToken: true - # Use certmanager to generate webhook certs - certManager: - enabled: false - # self-signed root certificate - rootCert: - # default to be 5y - duration: "" - admissionCert: - # default to be 1y - duration: "" - # issuerRef: - # name: "issuer" - # kind: "ClusterIssuer" - metrics: - port: 10254 - portName: metrics - # if this port is changed, change healthz-port: in extraArgs: accordingly - enabled: false - service: - annotations: {} - # prometheus.io/scrape: "true" - # prometheus.io/port: "10254" - # -- Labels to be added to the metrics service resource - labels: {} - # clusterIP: "" - - # -- List of IP addresses at which the stats-exporter service is available - ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips - ## - externalIPs: [] - # loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 10254 - type: ClusterIP - # externalTrafficPolicy: "" - # nodePort: "" - serviceMonitor: - enabled: false - additionalLabels: {} - # -- Annotations to be added to the ServiceMonitor. - annotations: {} - ## The label to use to retrieve the job name from. - ## jobLabel: "app.kubernetes.io/name" - namespace: "" - namespaceSelector: {} - ## Default: scrape .Release.Namespace or namespaceOverride only - ## To scrape all, use the following: - ## namespaceSelector: - ## any: true - scrapeInterval: 30s - # honorLabels: true - targetLabels: [] - relabelings: [] - metricRelabelings: [] - prometheusRule: - enabled: false - additionalLabels: {} - # namespace: "" - rules: [] - # # These are just examples rules, please adapt them to your needs - # - alert: NGINXConfigFailed - # expr: count(nginx_ingress_controller_config_last_reload_successful == 0) > 0 - # for: 1s - # labels: - # severity: critical - # annotations: - # description: bad ingress config - nginx config test failed - # summary: uninstall the latest ingress changes to allow config reloads to resume - # # By default a fake self-signed certificate is generated as default and - # # it is fine if it expires. If `--default-ssl-certificate` flag is used - # # and a valid certificate passed please do not filter for `host` label! - # # (i.e. delete `{host!="_"}` so also the default SSL certificate is - # # checked for expiration) - # - alert: NGINXCertificateExpiry - # expr: (avg(nginx_ingress_controller_ssl_expire_time_seconds{host!="_"}) by (host) - time()) < 604800 - # for: 1s - # labels: - # severity: critical - # annotations: - # description: ssl certificate(s) will expire in less then a week - # summary: renew expiring certificates to avoid downtime - # - alert: NGINXTooMany500s - # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5 - # for: 1m - # labels: - # severity: warning - # annotations: - # description: Too many 5XXs - # summary: More than 5% of all requests returned 5XX, this requires your attention - # - alert: NGINXTooMany400s - # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5 - # for: 1m - # labels: - # severity: warning - # annotations: - # description: Too many 4XXs - # summary: More than 5% of all requests returned 4XX, this requires your attention - # -- Improve connection draining when ingress controller pod is deleted using a lifecycle hook: - # With this new hook, we increased the default terminationGracePeriodSeconds from 30 seconds - # to 300, allowing the draining of connections up to five minutes. - # If the active connections end before that, the pod will terminate gracefully at that time. - # To effectively take advantage of this feature, the Configmap feature - # worker-shutdown-timeout new value is 240s instead of 10s. - ## - lifecycle: - preStop: - exec: - command: - - /wait-shutdown - priorityClassName: "" -# -- Rollback limit -## -revisionHistoryLimit: 10 -## Default 404 backend -## -defaultBackend: - ## - enabled: false - name: defaultbackend - image: - registry: registry.k8s.io - image: defaultbackend-amd64 - ## for backwards compatibility consider setting the full image url via the repository value below - ## use *either* current default registry/image or repository format or installing chart by providing the values.yaml will fail - ## repository: - tag: "1.5" - pullPolicy: IfNotPresent - runAsNonRoot: true - # nobody user -> uid 65534 - runAsUser: 65534 - allowPrivilegeEscalation: false - seccompProfile: - type: RuntimeDefault - readOnlyRootFilesystem: true - # -- Use an existing PSP instead of creating one - existingPsp: "" - extraArgs: {} - serviceAccount: - create: true - name: "" - automountServiceAccountToken: true - # -- Additional environment variables to set for defaultBackend pods - extraEnvs: [] - port: 8080 - ## Readiness and liveness probes for default backend - ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ - ## - livenessProbe: - failureThreshold: 3 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - failureThreshold: 6 - initialDelaySeconds: 0 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - # -- The update strategy to apply to the Deployment or DaemonSet - ## - updateStrategy: {} - # rollingUpdate: - # maxUnavailable: 1 - # type: RollingUpdate - - # -- `minReadySeconds` to avoid killing pods before we are ready - ## - minReadySeconds: 0 - # -- Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - # -- Affinity and anti-affinity rules for server scheduling to nodes - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity - affinity: {} - # # An example of preferred pod anti-affinity, weight is in the range 1-100 - # podAntiAffinity: - # preferredDuringSchedulingIgnoredDuringExecution: - # - weight: 100 - # podAffinityTerm: - # labelSelector: - # matchExpressions: - # - key: app.kubernetes.io/name - # operator: In - # values: - # - '{{ include "ingress-nginx.name" . }}' - # - key: app.kubernetes.io/instance - # operator: In - # values: - # - '{{ .Release.Name }}' - # - key: app.kubernetes.io/component - # operator: In - # values: - # - default-backend - # topologyKey: kubernetes.io/hostname - - # # An example of required pod anti-affinity - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchExpressions: - # - key: app.kubernetes.io/name - # operator: In - # values: - # - '{{ include "ingress-nginx.name" . }}' - # - key: app.kubernetes.io/instance - # operator: In - # values: - # - '{{ .Release.Name }}' - # - key: app.kubernetes.io/component - # operator: In - # values: - # - default-backend - # topologyKey: kubernetes.io/hostname - - # -- Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. - # Ref.: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ - topologySpreadConstraints: [] - # - labelSelector: - # matchLabels: - # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - # app.kubernetes.io/instance: '{{ .Release.Name }}' - # app.kubernetes.io/component: default-backend - # topologyKey: topology.kubernetes.io/zone - # maxSkew: 1 - # whenUnsatisfiable: ScheduleAnyway - # - labelSelector: - # matchLabels: - # app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}' - # app.kubernetes.io/instance: '{{ .Release.Name }}' - # app.kubernetes.io/component: default-backend - # topologyKey: kubernetes.io/hostname - # maxSkew: 1 - # whenUnsatisfiable: ScheduleAnyway - # -- Security context for default backend pods - podSecurityContext: {} - # -- Security context for default backend containers - containerSecurityContext: {} - # -- Labels to add to the pod container metadata - podLabels: {} - # key: value - - # -- Node labels for default backend pod assignment - ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ - ## - nodeSelector: - kubernetes.io/os: linux - # -- Annotations to be added to default backend pods - ## - podAnnotations: {} - replicaCount: 1 - # -- Minimum available pods set in PodDisruptionBudget. - minAvailable: 1 - resources: {} - # limits: - # cpu: 10m - # memory: 20Mi - # requests: - # cpu: 10m - # memory: 20Mi - - extraVolumeMounts: [] - ## Additional volumeMounts to the default backend container. - # - name: copy-portal-skins - # mountPath: /var/lib/lemonldap-ng/portal/skins - - extraVolumes: [] - ## Additional volumes to the default backend pod. - # - name: copy-portal-skins - # emptyDir: {} - - extraConfigMaps: [] - ## Additional configmaps to the default backend pod. - # - name: my-extra-configmap-1 - # labels: - # type: config-1 - # data: - # extra_file_1.html: | - # - # - name: my-extra-configmap-2 - # labels: - # type: config-2 - # data: - # extra_file_2.html: | - # - - autoscaling: - annotations: {} - enabled: false - minReplicas: 1 - maxReplicas: 2 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - # NetworkPolicy for default backend component. - networkPolicy: - # -- Enable 'networkPolicy' or not - enabled: false - service: - annotations: {} - # clusterIP: "" - - # -- List of IP addresses at which the default backend service is available - ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips - ## - externalIPs: [] - # loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - type: ClusterIP - priorityClassName: "" - # -- Labels to be added to the default backend resources - labels: {} -## Enable RBAC as per https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/rbac.md and https://github.com/kubernetes/ingress-nginx/issues/266 -rbac: - create: true - scope: false -## If true, create & use Pod Security Policy resources -## https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -podSecurityPolicy: - enabled: false -serviceAccount: - create: true - name: "" - automountServiceAccountToken: true - # -- Annotations for the controller service account - annotations: {} -# -- Optional array of imagePullSecrets containing private registry credentials -## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ -imagePullSecrets: [] -# - name: secretName - -# -- TCP service key-value pairs -## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md -## -tcp: {} -# "8080": "default/example-tcp-svc:9000" - -# -- UDP service key-value pairs -## Ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md -## -udp: {} -# "53": "kube-system/kube-dns:53" - -# -- Prefix for TCP and UDP ports names in ingress controller service -## Some cloud providers, like Yandex Cloud may have a requirements for a port name regex to support cloud load balancer integration -portNamePrefix: "" -# -- (string) A base64-encoded Diffie-Hellman parameter. -# This can be generated with: `openssl dhparam 4096 2> /dev/null | base64` -## Ref: https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples/customization/ssl-dh-param -dhParam: "" From 327db38553e7eb9e2ab8718efd0be8fb92ddee50 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 17:51:46 +0100 Subject: [PATCH 20/33] olm sanity tests --- tests/post/features/sanity.feature | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/post/features/sanity.feature b/tests/post/features/sanity.feature index 0f8bf17226..066c9fdce8 100644 --- a/tests/post/features/sanity.feature +++ b/tests/post/features/sanity.feature @@ -45,6 +45,8 @@ Feature: Cluster Sanity Checks | metalk8s-certs | cert-manager | | metalk8s-certs | cert-manager-cainjector | | metalk8s-certs | cert-manager-webhook | + | olmv1-system | catalogd-controller-manager | + | olmv1-system | operator-controller-controller-manager | Scenario Outline: DaemonSet has desired Pods ready Then the DaemonSet in the namespace has all desired Pods ready From dce0bce1b0c138b5be227e6ef5bc64114e53d49d Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 17:53:39 +0100 Subject: [PATCH 21/33] nginx-operator sanity tests --- tests/post/features/sanity.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/post/features/sanity.feature b/tests/post/features/sanity.feature index 066c9fdce8..91393ea13a 100644 --- a/tests/post/features/sanity.feature +++ b/tests/post/features/sanity.feature @@ -47,6 +47,7 @@ Feature: Cluster Sanity Checks | metalk8s-certs | cert-manager-webhook | | olmv1-system | catalogd-controller-manager | | olmv1-system | operator-controller-controller-manager | + | nginx-operator | nginx-operator-controller-manager | Scenario Outline: DaemonSet has desired Pods ready Then the DaemonSet in the namespace has all desired Pods ready From 6d5d733170f619cb2d65ce66b9dc6c58705f399e Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 9 Jan 2025 17:56:00 +0100 Subject: [PATCH 22/33] install only metalk8s catalog source --- .../addons/olm/catalog/deployed/cluster-catalog.sls | 13 +------------ salt/metalk8s/addons/olm/catalog/deployed/init.sls | 2 +- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls index add9db309a..712ddbdb88 100644 --- a/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls +++ b/salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls @@ -1,17 +1,6 @@ #!jinja | metalk8s_kubernetes {%- from "metalk8s/repo/macro.sls" import build_image_name with context %} ---- -apiVersion: olm.operatorframework.io/v1 -kind: ClusterCatalog -metadata: - name: operatorhubio -spec: - source: - type: Image - image: - ref: quay.io/operatorhubio/catalog:latest - pollIntervalMinutes: 10 --- apiVersion: olm.operatorframework.io/v1 kind: ClusterCatalog @@ -22,4 +11,4 @@ spec: type: Image image: ref: {{ build_image_name("metalk8s-catalog-source") }} - pollIntervalMinutes: 10 + pollIntervalMinutes: 30 diff --git a/salt/metalk8s/addons/olm/catalog/deployed/init.sls b/salt/metalk8s/addons/olm/catalog/deployed/init.sls index bfe50aa903..6249e687f8 100644 --- a/salt/metalk8s/addons/olm/catalog/deployed/init.sls +++ b/salt/metalk8s/addons/olm/catalog/deployed/init.sls @@ -5,7 +5,7 @@ include: Wait for Cluster Catalog to be Serving: test.configurable_test_state: - changes: False - - result: __slot__:salt:metalk8s_olm.check_clustercatalog_serving("operatorhubio") + - result: __slot__:salt:metalk8s_olm.check_clustercatalog_serving("metalk8s-catalog-source") - comment: Wait for ClusterCatalog to be Ready - retry: attempts: 30 From 5c5419be3b4091d37f4185794d890bdff793c6e8 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 14 Jan 2025 11:59:37 +0100 Subject: [PATCH 23/33] buildchain: generate olm manifests manually --- buildchain/buildchain/codegen.py | 21 ++++ buildchain/buildchain/constants.py | 3 + olm/.gitignore | 1 + olm/render.py | 148 +++++++++++++++++++++++++++++ tox.ini | 11 +++ 5 files changed, 184 insertions(+) create mode 100644 olm/.gitignore create mode 100755 olm/render.py diff --git a/buildchain/buildchain/codegen.py b/buildchain/buildchain/codegen.py index 86685d4fb1..faa9455cbb 100644 --- a/buildchain/buildchain/codegen.py +++ b/buildchain/buildchain/codegen.py @@ -278,6 +278,26 @@ def codegen_chart_cert_manager() -> types.TaskDict: "task_dep": ["check_for:tox", "check_for:helm"], } +def codegen_olm() -> types.TaskDict: + """Generate the SLS file for OLMv1 using the OLM render script.""" + target_sls = constants.ROOT / "salt/metalk8s/addons/olm/deployed/chart.sls" + cmd = ( + f"{constants.OLM_RENDER_CMD} " + f"--output {target_sls}" + ) + + file_dep = [ constants.OLM_RENDER_SCRIPT ] + + return { + "name": "olm", + "title": utils.title_with_subtask_name("CODEGEN"), + "doc": codegen_olm.__doc__, + "actions": [doit.action.CmdAction(cmd, cwd=constants.ROOT)], + "file_dep": file_dep, + "task_dep": ["check_for:tox"], + } + + # List of available code generation tasks. CODEGEN: Tuple[Callable[[], types.TaskDict], ...] = ( @@ -290,6 +310,7 @@ def codegen_chart_cert_manager() -> types.TaskDict: codegen_chart_prometheus_adapter, codegen_chart_thanos, codegen_chart_cert_manager, + codegen_olm, ) diff --git a/buildchain/buildchain/constants.py b/buildchain/buildchain/constants.py index 151abebc71..fbc95f17fe 100644 --- a/buildchain/buildchain/constants.py +++ b/buildchain/buildchain/constants.py @@ -89,6 +89,8 @@ CHART_ROOT: Path = ROOT / "charts" CHART_RENDER_SCRIPT: Path = CHART_ROOT / "render.py" +OLM_RENDER_SCRIPT: Path = ROOT / "olm/render.py" + # }}} # Vagrant parameters {{{ @@ -158,6 +160,7 @@ def git_ref() -> Optional[str]: ] CHART_RENDER_CMD: str = f"tox -e chart-render -- --kube-version {versions.K8S_VERSION}" +OLM_RENDER_CMD: str = f"tox -e olm-render -- -v v{versions.OLM_VERSION}" # For mypy, see `--no-implicit-reexport` documentation. __all__ = ["ROOT"] diff --git a/olm/.gitignore b/olm/.gitignore new file mode 100644 index 0000000000..1e82fc7deb --- /dev/null +++ b/olm/.gitignore @@ -0,0 +1 @@ +*.yaml diff --git a/olm/render.py b/olm/render.py new file mode 100755 index 0000000000..4a112539fd --- /dev/null +++ b/olm/render.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python + +""" +This script downloads operator controller and catalogd manifests and `renders` them into a useable +salt chart. + +To do so, it: + - downloads manifests from github releases (optional) + - merges duplicate objects + - adds appropriate labels + - changes names and namespaces of cert-manager resources + - swaps image values +""" + +import argparse +import io +import pathlib +import re +import requests +import sys +import yaml + +CONTROLLER_MANIFEST_URL = "https://github.com/operator-framework/operator-controller/releases/download/{version}/operator-controller.yaml" + +CATALOGD_MANIFEST_URL = "https://github.com/operator-framework/catalogd/releases/download/{version}/catalogd.yaml" + +START_BLOCK = """ +#!jinja | metalk8s_kubernetes + +{{%- from "metalk8s/map.jinja" import repo with context %}} +{{%- from "metalk8s/repo/macro.sls" import build_image_name with context %}} + +{{% raw %}} +""" + +END_BLOCK = """ +{{% endraw %}} +""" + +class DownloadError(Exception): + pass + +def semver_regex_type(value): + pat = re.compile(r"^v\d+\.\d+\.\d+$") + if not pat.match(value): + raise argparse.ArgumentTypeError("invalid value, must be ~v1.1.2") + return value + +def download_source_manifest(version): + controller_response = requests.get(CONTROLLER_MANIFEST_URL.format(version=version)) + catalogd_response = requests.get(CATALOGD_MANIFEST_URL.format(version=version)) + if controller_response.status_code == 200 and catalogd_response.status_code == 200: + return controller_response.content, catalogd_response.content + raise DownloadError("Problem fetching catalogd or operator controller manifests") + +""" +Merge source manifests on top of destination +""" +def merge(source, destination): + def _dict_merge(src, dst): + for k, v in src.items(): + if k in dst and isinstance(dst[k], dict) and isinstance(v, dict): + _dict_merge(dst[k], v) + else: + dst[k] = v + to_add = [] + # check for each doc in source + for sdoc in source: + # does it exist in the destination docs ? + found = False + for ddoc in destination: + if ddoc['kind'] == sdoc['kind'] and ddoc['metadata']['name'] == sdoc['metadata']['name']: + found = True + _dict_merge(sdoc, ddoc) + if not found: + to_add.append(sdoc) + source.extend(to_add) + return source + +def add_labels(manifest, version): + for doc in manifest: + doc['metadata'].setdefault('labels', {}).update({ + "app.kubernetes.io/instance": "olm", + "app.kubernetes.io/managed-by": "salt", + "app.kubernetes.io/part-of": "metalk8s", + "app.kubernetes.io/version": str(version), + "heritage": "metalk8s", + }) + return manifest + +def fixup_certmanager(manifest): + for doc in manifest: + if doc['apiVersion'] == "cert-manager.io/v1" and \ + doc['metadata'].get('namespace') == 'cert-manager': + doc['metadata']['namespace'] = 'metalk8s-certs' + return manifest + +def render(manifest): + out = START_BLOCK + stream = io.StringIO() + yaml.safe_dump_all( + manifest, + stream, + default_flow_style=False, + ) + stream.seek(0) + out += re.sub( + r"image: quay.io/operator-framework/(?P.*):(?P.*)", + r'image: {% endraw -%}{{ build_image_name("\g", False) }}{%- raw %}:\g', + stream.read(), + ) + out += END_BLOCK + return out + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-v', '--version', type=semver_regex_type) + parser.add_argument('-o', '--output', type=pathlib.Path) + args = parser.parse_args() + + # 1 - download the manifests + controller_manifest, catalogd_manifest = download_source_manifest(version=args.version) + + # 1.5 - interpret yaml + controller = list(yaml.safe_load_all(controller_manifest)) + catalogd = list(yaml.safe_load_all(catalogd_manifest)) + + # 2 - merge manifests + manifest = merge(catalogd, controller) + + # 3- add labels where needed + manifest = add_labels(manifest, args.version) + + # 4- Fix cert-manager objects + manifest = fixup_certmanager(manifest) + + # 5- render yaml with new images + rendered = render(manifest) + + if args.output: + with open(args.output, "w") as fd: + fd.write(rendered) + else: + sys.stdout.write(rendered) + + +if __name__ == "__main__": + main() diff --git a/tox.ini b/tox.ini index 9d0879097d..8c7d6bb1ed 100644 --- a/tox.ini +++ b/tox.ini @@ -143,6 +143,17 @@ deps = commands = {toxinidir}/charts/render.py {posargs} +[testenv:olm-render] +description = + Run the olm render script +allowlist_externals = + {toxinidir}/olm/render.py +deps = + pyyaml + requests +commands = + {toxinidir}/olm/render.py {posargs} + [testenv:tests] description = Run tests suite remotely (uses local Vagrant configuration by default). From 0195d1db6212c510984e454f7a6686c40dec799a Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 14 Jan 2025 14:58:15 +0100 Subject: [PATCH 24/33] buildchain, salt: bump OLMv1, generate sls --- buildchain/buildchain/constants.py | 8 - buildchain/buildchain/image.py | 3 - buildchain/buildchain/versions.py | 11 +- .../addons/nginx-operator/deployed/init.sls | 2 +- .../addons/olm/catalog/deployed/init.sls | 2 +- .../addons/olm/catalogd/deployed/catalogd.sls | 182 -- .../addons/olm/catalogd/deployed/cert.sls | 21 - .../addons/olm/catalogd/deployed/crds.sls | 443 ---- .../addons/olm/catalogd/deployed/init.sls | 24 - .../addons/olm/catalogd/deployed/rbac.sls | 167 -- .../addons/olm/catalogd/deployed/webhook.sls | 37 - .../addons/olm/common/deployed/cert.sls | 38 - .../addons/olm/common/deployed/init.sls | 9 - .../addons/olm/common/deployed/namespace.sls | 13 - salt/metalk8s/addons/olm/deployed/chart.sls | 2067 +++++++++++++++++ .../deployed/init.sls | 25 +- .../olm/operator-controller/deployed/cert.sls | 20 - .../olm/operator-controller/deployed/crds.sls | 591 ----- .../deployed/operator-controller.sls | 148 -- .../olm/operator-controller/deployed/rbac.sls | 261 --- salt/metalk8s/deployed/init.sls | 3 +- 21 files changed, 2087 insertions(+), 1988 deletions(-) delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/cert.sls delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/crds.sls delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/init.sls delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls delete mode 100644 salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls delete mode 100644 salt/metalk8s/addons/olm/common/deployed/cert.sls delete mode 100644 salt/metalk8s/addons/olm/common/deployed/init.sls delete mode 100644 salt/metalk8s/addons/olm/common/deployed/namespace.sls create mode 100644 salt/metalk8s/addons/olm/deployed/chart.sls rename salt/metalk8s/addons/olm/{operator-controller => }/deployed/init.sls (52%) delete mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls delete mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls delete mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls delete mode 100644 salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls diff --git a/buildchain/buildchain/constants.py b/buildchain/buildchain/constants.py index fbc95f17fe..5e5caeefc9 100644 --- a/buildchain/buildchain/constants.py +++ b/buildchain/buildchain/constants.py @@ -33,14 +33,6 @@ THANOS_REPOSITORY: str = "quay.io/thanos" CERT_MANAGER_REPOSITORY: str = "quay.io/jetstack" OPERATOR_FRAMEWORK_REPOSITORYT: str = "quay.io/operator-framework" -# this repository will disappear in early 2025, -# for now it is used by OLMv1 but most likely they will -# stop using it after they upgrade their version of `kubebuilder` -# cf. https://github.com/kubernetes-sigs/kubebuilder/discussions/3907 -# cf. https://github.com/operator-framework/catalogd/pull/460 -# therefore if you see this comment later in 2025, -# you may not be able to build this. sorry. -KUBE_BUILDER_REPOSITORY: str = "gcr.io/kubebuilder" # Paths {{{ diff --git a/buildchain/buildchain/image.py b/buildchain/buildchain/image.py index 90d9852e6c..125bdfe302 100644 --- a/buildchain/buildchain/image.py +++ b/buildchain/buildchain/image.py @@ -222,9 +222,6 @@ def _local_image(name: str, **kwargs: Any) -> targets.LocalImage: "operator-controller", "opm" ], - constants.KUBE_BUILDER_REPOSITORY: [ - "kube-rbac-proxy", - ], } REMOTE_NAMES: Dict[str, str] = { diff --git a/buildchain/buildchain/versions.py b/buildchain/buildchain/versions.py index 5e21876e85..c4804f1ea1 100644 --- a/buildchain/buildchain/versions.py +++ b/buildchain/buildchain/versions.py @@ -33,7 +33,7 @@ CONTAINERD_RELEASE: str = "1" SOSREPORT_RELEASE: str = "2" -OLM_VERSION: str = "1.0.0" +OLM_VERSION: str = "1.1.0" def load_version_information() -> None: @@ -231,17 +231,12 @@ def _version_prefix(version: str, prefix: str = "v") -> str: Image( name="catalogd", version=_version_prefix(OLM_VERSION), - digest="sha256:f74153f1e83cf3066f6ba1179fa09466e6b1defcbaf628c42c02aca500acd73d", + digest="sha256:95477a136772765fa2cfb02a6e5fb52bcc167ef7b5333f9e238b0b13b9e72f7b", ), Image( name="operator-controller", version=_version_prefix(OLM_VERSION), - digest="sha256:a07181e9c9ce02eb7b5c9f12e3fce58bec416b05adbe946982a8273d3ffbc4d3", - ), - Image( - name="kube-rbac-proxy", - version="v0.15.0", - digest="sha256:d8cc6ffb98190e8dd403bfe67ddcb454e6127d32b87acc237b3e5240f70a20fb", + digest="sha256:6272919257e695fcdadf0b57cc0a272084ebf2caca7571e2e5d79d6a56a788fa", ), # Local images Image( diff --git a/salt/metalk8s/addons/nginx-operator/deployed/init.sls b/salt/metalk8s/addons/nginx-operator/deployed/init.sls index 6773ddc3c9..217b8c3cdf 100644 --- a/salt/metalk8s/addons/nginx-operator/deployed/init.sls +++ b/salt/metalk8s/addons/nginx-operator/deployed/init.sls @@ -1,5 +1,5 @@ include: - - ...olm.operator-controller.deployed + - ...olm.deployed - .namespace - .rbac - .clusterextension diff --git a/salt/metalk8s/addons/olm/catalog/deployed/init.sls b/salt/metalk8s/addons/olm/catalog/deployed/init.sls index 6249e687f8..8715250b0a 100644 --- a/salt/metalk8s/addons/olm/catalog/deployed/init.sls +++ b/salt/metalk8s/addons/olm/catalog/deployed/init.sls @@ -1,5 +1,5 @@ include: - - ...operator-controller.deployed + - ...deployed - .cluster-catalog Wait for Cluster Catalog to be Serving: diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls b/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls deleted file mode 100644 index 32870f1f70..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls +++ /dev/null @@ -1,182 +0,0 @@ -#!jinja | metalk8s_kubernetes -{%- from "metalk8s/map.jinja" import repo with context %} -{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} - ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-service - namespace: olmv1-system -spec: - ports: - - name: https - port: 443 - protocol: TCP - targetPort: 8443 - - name: webhook - port: 9443 - protocol: TCP - targetPort: 9443 - - name: metrics - port: 7443 - protocol: TCP - targetPort: 7443 - selector: - control-plane: catalogd-controller-manager ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: registries-conf - namespace: olmv1-system -data: - registries.conf: | - [[registry]] - prefix = "{{ repo.registry_endpoint }}" - insecure = true - location = "{{ repo.registry_endpoint }}:80" - [[registry]] - prefix = "registry.metalk8s.lan" - insecure = true - location = "{{ repo.registry_endpoint }}:80" ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - kubectl.kubernetes.io/default-logs-container: manager - labels: - control-plane: catalogd-controller-manager - name: catalogd-controller-manager - namespace: olmv1-system -spec: - minReadySeconds: 5 - replicas: 1 - selector: - matchLabels: - control-plane: catalogd-controller-manager - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: catalogd-controller-manager - spec: - nodeSelector: - kubernetes.io/os: linux - node-role.kubernetes.io/infra: "" - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/bootstrap - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/infra - operator: Exists - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: In - values: - - amd64 - - arm64 - - ppc64le - - s390x - - key: kubernetes.io/os - operator: In - values: - - linux - containers: - - args: - - --secure-listen-address=0.0.0.0:7443 - - --http2-disable - - --upstream=http://127.0.0.1:8080/ - - --logtostderr=true - image: {{ build_image_name("kube-rbac-proxy") }} - name: kube-rbac-proxy - ports: - - containerPort: 7443 - name: https - protocol: TCP - resources: - requests: - cpu: 5m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationMessagePolicy: FallbackToLogsOnError - - args: - - --leader-elect - - --metrics-bind-address=127.0.0.1:8080 - - --external-address=catalogd-service.olmv1-system.svc - - --tls-cert=/var/certs/tls.crt - - --tls-key=/var/certs/tls.key - - --ca-certs-dir=/var/ca-certs - command: - - ./manager - image: {{ build_image_name("catalogd") }} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - name: manager - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - requests: - cpu: 100m - memory: 200Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationMessagePolicy: FallbackToLogsOnError - volumeMounts: - - mountPath: /etc/containers/ - name: registries-conf - - mountPath: /var/cache/ - name: cache - - mountPath: /var/certs - name: catalogserver-certs - - mountPath: /var/ca-certs/ - name: olmv1-certificate - readOnly: true - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - serviceAccountName: catalogd-controller-manager - terminationGracePeriodSeconds: 10 - volumes: - - name: registries-conf - configMap: - name: registries-conf - - emptyDir: {} - name: cache - - name: catalogserver-certs - secret: - secretName: catalogd-service-cert-v1.0.0 - - name: olmv1-certificate - secret: - items: - - key: ca.crt - path: olm-ca.crt - optional: false - secretName: catalogd-service-cert-v1.0.0 diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls b/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls deleted file mode 100644 index 8b6df873a4..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/cert.sls +++ /dev/null @@ -1,21 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: catalogd-service-cert - namespace: olmv1-system -spec: - dnsNames: - - localhost - - catalogd-service.olmv1-system.svc - - catalogd-service.olmv1-system.svc.cluster.local - issuerRef: - group: cert-manager.io - kind: ClusterIssuer - name: olmv1-ca - privateKey: - algorithm: ECDSA - size: 256 - secretName: catalogd-service-cert-v1.0.0 diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls b/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls deleted file mode 100644 index eb4a451d96..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/crds.sls +++ /dev/null @@ -1,443 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.16.1 - name: clustercatalogs.olm.operatorframework.io -spec: - group: olm.operatorframework.io - names: - kind: ClusterCatalog - listKind: ClusterCatalogList - plural: clustercatalogs - singular: clustercatalog - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .status.lastUnpacked - name: LastUnpacked - type: date - - jsonPath: .status.conditions[?(@.type=="Serving")].status - name: Serving - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: |- - ClusterCatalog enables users to make File-Based Catalog (FBC) catalog data available to the cluster. - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: |- - spec is the desired state of the ClusterCatalog. - spec is required. - The controller will work to ensure that the desired - catalog is unpacked and served over the catalog content HTTP server. - properties: - availabilityMode: - default: Available - description: |- - availabilityMode allows users to define how the ClusterCatalog is made available to clients on the cluster. - availabilityMode is optional. - - Allowed values are "Available" and "Unavailable" and omitted. - - When omitted, the default value is "Available". - - When set to "Available", the catalog contents will be unpacked and served over the catalog content HTTP server. - Setting the availabilityMode to "Available" tells clients that they should consider this ClusterCatalog - and its contents as usable. - - When set to "Unavailable", the catalog contents will no longer be served over the catalog content HTTP server. - When set to this availabilityMode it should be interpreted the same as the ClusterCatalog not existing. - Setting the availabilityMode to "Unavailable" can be useful in scenarios where a user may not want - to delete the ClusterCatalog all together, but would still like it to be treated as if it doesn't exist. - enum: - - Unavailable - - Available - type: string - priority: - default: 0 - description: |- - priority allows the user to define a priority for a ClusterCatalog. - priority is optional. - - A ClusterCatalog's priority is used by clients as a tie-breaker between ClusterCatalogs that meet the client's requirements. - A higher number means higher priority. - - It is up to clients to decide how to handle scenarios where multiple ClusterCatalogs with the same priority meet their requirements. - When deciding how to break the tie in this scenario, it is recommended that clients prompt their users for additional input. - - When omitted, the default priority is 0 because that is the zero value of integers. - - Negative numbers can be used to specify a priority lower than the default. - Positive numbers can be used to specify a priority higher than the default. - - The lowest possible value is -2147483648. - The highest possible value is 2147483647. - format: int32 - type: integer - source: - description: |- - source allows a user to define the source of a catalog. - A "catalog" contains information on content that can be installed on a cluster. - Providing a catalog source makes the contents of the catalog discoverable and usable by - other on-cluster components. - These on-cluster components may do a variety of things with this information, such as - presenting the content in a GUI dashboard or installing content from the catalog on the cluster. - The catalog source must contain catalog metadata in the File-Based Catalog (FBC) format. - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs. - source is a required field. - - Below is a minimal example of a ClusterCatalogSpec that sources a catalog from an image: - - source: - type: Image - image: - ref: quay.io/operatorhubio/catalog:latest - properties: - image: - description: |- - image is used to configure how catalog contents are sourced from an OCI image. - This field is required when type is Image, and forbidden otherwise. - properties: - pollIntervalMinutes: - description: |- - pollIntervalMinutes allows the user to set the interval, in minutes, at which the image source should be polled for new content. - pollIntervalMinutes is optional. - pollIntervalMinutes can not be specified when ref is a digest-based reference. - - When omitted, the image will not be polled for new content. - minimum: 1 - type: integer - ref: - description: |- - ref allows users to define the reference to a container image containing Catalog contents. - ref is required. - ref can not be more than 1000 characters. - - A reference can be broken down into 3 parts - the domain, name, and identifier. - - The domain is typically the registry where an image is located. - It must be alphanumeric characters (lowercase and uppercase) separated by the "." character. - Hyphenation is allowed, but the domain must start and end with alphanumeric characters. - Specifying a port to use is also allowed by adding the ":" character followed by numeric values. - The port must be the last value in the domain. - Some examples of valid domain values are "registry.mydomain.io", "quay.io", "my-registry.io:8080". - - The name is typically the repository in the registry where an image is located. - It must contain lowercase alphanumeric characters separated only by the ".", "_", "__", "-" characters. - Multiple names can be concatenated with the "/" character. - The domain and name are combined using the "/" character. - Some examples of valid name values are "operatorhubio/catalog", "catalog", "my-catalog.prod". - An example of the domain and name parts of a reference being combined is "quay.io/operatorhubio/catalog". - - The identifier is typically the tag or digest for an image reference and is present at the end of the reference. - It starts with a separator character used to distinguish the end of the name and beginning of the identifier. - For a digest-based reference, the "@" character is the separator. - For a tag-based reference, the ":" character is the separator. - An identifier is required in the reference. - - Digest-based references must contain an algorithm reference immediately after the "@" separator. - The algorithm reference must be followed by the ":" character and an encoded string. - The algorithm must start with an uppercase or lowercase alpha character followed by alphanumeric characters and may contain the "-", "_", "+", and "." characters. - Some examples of valid algorithm values are "sha256", "sha256+b64u", "multihash+base58". - The encoded string following the algorithm must be hex digits (a-f, A-F, 0-9) and must be a minimum of 32 characters. - - Tag-based references must begin with a word character (alphanumeric + "_") followed by word characters or ".", and "-" characters. - The tag must not be longer than 127 characters. - - An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" - An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest" - maxLength: 1000 - type: string - x-kubernetes-validations: - - message: must start with a valid domain. valid domains must - be alphanumeric characters (lowercase and uppercase) separated - by the "." character. - rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') - - message: a valid name is required. valid names must contain - lowercase alphanumeric characters separated only by the - ".", "_", "__", "-" characters. - rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') - != "" - - message: must end with a digest or a tag - rule: self.find('(@.*:)') != "" || self.find(':.*$') != - "" - - message: tag is invalid. the tag must not be more than 127 - characters - rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') - != "" ? self.find('':.*$'').substring(1).size() <= 127 - : true) : true' - - message: tag is invalid. valid tags must begin with a word - character (alphanumeric + "_") followed by word characters - or ".", and "-" characters - rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') - != "" ? self.find('':.*$'').matches('':[\\w][\\w.-]*$'') - : true) : true' - - message: digest algorithm is not valid. valid algorithms - must start with an uppercase or lowercase alpha character - followed by alphanumeric characters and may contain the - "-", "_", "+", and "." characters. - rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') - : true' - - message: digest is not valid. the encoded string must be - at least 32 characters - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() - >= 32 : true' - - message: digest is not valid. the encoded string must only - contain hex characters (A-F, a-f, 0-9) - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') - : true' - required: - - ref - type: object - x-kubernetes-validations: - - message: cannot specify pollIntervalMinutes while using digest-based - image - rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) - : true' - type: - description: |- - type is a reference to the type of source the catalog is sourced from. - type is required. - - The only allowed value is "Image". - - When set to "Image", the ClusterCatalog content will be sourced from an OCI image. - When using an image source, the image field must be set and must be the only field defined for this type. - enum: - - Image - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: image is required when source type is Image, and forbidden - otherwise - rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) - : !has(self.image)' - required: - - source - type: object - status: - description: |- - status contains information about the state of the ClusterCatalog such as: - - Whether or not the catalog contents are being served via the catalog content HTTP server - - Whether or not the ClusterCatalog is progressing to a new state - - A reference to the source from which the catalog contents were retrieved - properties: - conditions: - description: |- - conditions is a representation of the current state for this ClusterCatalog. - - The current condition types are Serving and Progressing. - - The Serving condition is used to represent whether or not the contents of the catalog is being served via the HTTP(S) web server. - When it has a status of True and a reason of Available, the contents of the catalog are being served. - When it has a status of False and a reason of Unavailable, the contents of the catalog are not being served because the contents are not yet available. - When it has a status of False and a reason of UserSpecifiedUnavailable, the contents of the catalog are not being served because the catalog has been intentionally marked as unavailable. - - The Progressing condition is used to represent whether or not the ClusterCatalog is progressing or is ready to progress towards a new state. - When it has a status of True and a reason of Retrying, there was an error in the progression of the ClusterCatalog that may be resolved on subsequent reconciliation attempts. - When it has a status of True and a reason of Succeeded, the ClusterCatalog has successfully progressed to a new state and is ready to continue progressing. - When it has a status of False and a reason of Blocked, there was an error in the progression of the ClusterCatalog that requires manual intervention for recovery. - - In the case that the Serving condition is True with reason Available and Progressing is True with reason Retrying, the previously fetched - catalog contents are still being served via the HTTP(S) web server while we are progressing towards serving a new version of the catalog - contents. This could occur when we've initially fetched the latest contents from the source for this catalog and when polling for changes - to the contents we identify that there are updates to the contents. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastUnpacked: - description: |- - lastUnpacked represents the last time the contents of the - catalog were extracted from their source format. As an example, - when using an Image source, the OCI image will be pulled and the - image layers written to a file-system backed cache. We refer to the - act of this extraction from the source format as "unpacking". - format: date-time - type: string - resolvedSource: - description: resolvedSource contains information about the resolved - source based on the source type. - properties: - image: - description: |- - image is a field containing resolution information for a catalog sourced from an image. - This field must be set when type is Image, and forbidden otherwise. - properties: - ref: - description: |- - ref contains the resolved image digest-based reference. - The digest format is used so users can use other tooling to fetch the exact - OCI manifests that were used to extract the catalog contents. - maxLength: 1000 - type: string - x-kubernetes-validations: - - message: must start with a valid domain. valid domains must - be alphanumeric characters (lowercase and uppercase) separated - by the "." character. - rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') - - message: a valid name is required. valid names must contain - lowercase alphanumeric characters separated only by the - ".", "_", "__", "-" characters. - rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') - != "" - - message: must end with a digest - rule: self.find('(@.*:)') != "" - - message: digest algorithm is not valid. valid algorithms - must start with an uppercase or lowercase alpha character - followed by alphanumeric characters and may contain the - "-", "_", "+", and "." characters. - rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') - : true' - - message: digest is not valid. the encoded string must be - at least 32 characters - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() - >= 32 : true' - - message: digest is not valid. the encoded string must only - contain hex characters (A-F, a-f, 0-9) - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') - : true' - required: - - ref - type: object - type: - description: |- - type is a reference to the type of source the catalog is sourced from. - type is required. - - The only allowed value is "Image". - - When set to "Image", information about the resolved image source will be set in the 'image' field. - enum: - - Image - type: string - required: - - image - - type - type: object - x-kubernetes-validations: - - message: image is required when source type is Image, and forbidden - otherwise - rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) - : !has(self.image)' - urls: - description: urls contains the URLs that can be used to access the - catalog. - properties: - base: - description: |- - base is a cluster-internal URL that provides endpoints for - accessing the content of the catalog. - - It is expected that clients append the path for the endpoint they wish - to access. - - Currently, only a single endpoint is served and is accessible at the path - /api/v1. - - The endpoints served for the v1 API are: - - /all - this endpoint returns the entirety of the catalog contents in the FBC format - - As the needs of users and clients of the evolve, new endpoints may be added. - maxLength: 525 - type: string - x-kubernetes-validations: - - message: must be a valid URL - rule: isURL(self) - - message: scheme must be either http or https - rule: 'isURL(self) ? (url(self).getScheme() == "http" || url(self).getScheme() - == "https") : true' - required: - - base - type: object - type: object - required: - - metadata - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/init.sls b/salt/metalk8s/addons/olm/catalogd/deployed/init.sls deleted file mode 100644 index 635b3b8363..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/init.sls +++ /dev/null @@ -1,24 +0,0 @@ -include: - - ...common.deployed - - .crds - - .rbac - - .cert - - .catalogd - - .webhook - -Wait for the Catalogd Controller Manager deployment to be Ready: - test.configurable_test_state: - - changes: False - - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( - apiVersion=apps/v1, kind=Deployment, - name=catalogd-controller-manager, namespace=olmv1-system) - - comment: Wait for the Catalog Operator to be Ready - - retry: - attempts: 30 - - require: - - test: Deploy common OLMv1 components - - sls: metalk8s.addons.olm.catalogd.deployed.crds - - sls: metalk8s.addons.olm.catalogd.deployed.rbac - - sls: metalk8s.addons.olm.catalogd.deployed.cert - - sls: metalk8s.addons.olm.catalogd.deployed.catalogd - - sls: metalk8s.addons.olm.catalogd.deployed.webhook diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls b/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls deleted file mode 100644 index bb1bfd88c6..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls +++ /dev/null @@ -1,167 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-leader-election-role - namespace: olmv1-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: catalogd-manager-role -rules: -- apiGroups: - - olm.operatorframework.io - resources: - - clustercatalogs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - olm.operatorframework.io - resources: - - clustercatalogs/finalizers - verbs: - - update -- apiGroups: - - olm.operatorframework.io - resources: - - clustercatalogs/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-metrics-reader -rules: -- nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-proxy-role -rules: -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-leader-election-rolebinding - namespace: olmv1-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: catalogd-leader-election-role -subjects: -- kind: ServiceAccount - name: catalogd-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: catalogd-manager-role -subjects: -- kind: ServiceAccount - name: catalogd-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: catalogd - app.kubernetes.io/part-of: olm - name: catalogd-proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: catalogd-proxy-role -subjects: -- kind: ServiceAccount - name: catalogd-controller-manager - namespace: olmv1-system diff --git a/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls b/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls deleted file mode 100644 index cca8bb25dc..0000000000 --- a/salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls +++ /dev/null @@ -1,37 +0,0 @@ -#!jinja | metalk8s_kubernetes - -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from-secret: metalk8s-certs/olmv1-ca - name: catalogd-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: catalogd-service - namespace: olmv1-system - path: /mutate-olm-operatorframework-io-v1-clustercatalog - port: 9443 - failurePolicy: Fail - matchConditions: - - expression: '''name'' in object.metadata && (!has(object.metadata.labels) || !(''olm.operatorframework.io/metadata.name'' - in object.metadata.labels) || object.metadata.labels[''olm.operatorframework.io/metadata.name''] - != object.metadata.name)' - name: MissingOrIncorrectMetadataNameLabel - name: inject-metadata-name.olm.operatorframework.io - rules: - - apiGroups: - - olm.operatorframework.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - clustercatalogs - sideEffects: None - timeoutSeconds: 10 - diff --git a/salt/metalk8s/addons/olm/common/deployed/cert.sls b/salt/metalk8s/addons/olm/common/deployed/cert.sls deleted file mode 100644 index 9df69f8655..0000000000 --- a/salt/metalk8s/addons/olm/common/deployed/cert.sls +++ /dev/null @@ -1,38 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: olmv1-ca - namespace: metalk8s-certs -spec: - commonName: olmv1-ca - isCA: true - issuerRef: - group: cert-manager.io - kind: Issuer - name: self-sign-issuer - privateKey: - algorithm: ECDSA - size: 256 - secretName: olmv1-ca - secretTemplate: - annotations: - cert-manager.io/allow-direct-injection: "true" ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: olmv1-ca -spec: - ca: - secretName: olmv1-ca ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: self-sign-issuer - namespace: metalk8s-certs -spec: - selfSigned: {} diff --git a/salt/metalk8s/addons/olm/common/deployed/init.sls b/salt/metalk8s/addons/olm/common/deployed/init.sls deleted file mode 100644 index badf177810..0000000000 --- a/salt/metalk8s/addons/olm/common/deployed/init.sls +++ /dev/null @@ -1,9 +0,0 @@ -include: - - .namespace - - .cert - -Deploy common OLMv1 components: - test.succeed_without_changes: - - require: - - sls: metalk8s.addons.olm.common.deployed.namespace - - sls: metalk8s.addons.olm.common.deployed.cert diff --git a/salt/metalk8s/addons/olm/common/deployed/namespace.sls b/salt/metalk8s/addons/olm/common/deployed/namespace.sls deleted file mode 100644 index e4a33bfdd8..0000000000 --- a/salt/metalk8s/addons/olm/common/deployed/namespace.sls +++ /dev/null @@ -1,13 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - app.kubernetes.io/part-of: olm - pod-security.kubernetes.io/enforce: baseline - pod-security.kubernetes.io/enforce-version: latest - name: olmv1-system - annotations: - scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/bootstrap"}, {"operator": "Exists", "effect": "NoSchedule", "key": "node-role.kubernetes.io/infra"}]' diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls new file mode 100644 index 0000000000..02a9fabf41 --- /dev/null +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -0,0 +1,2067 @@ + +#!jinja | metalk8s_kubernetes + +{{%- from "metalk8s/map.jinja" import repo with context %}} +{{%- from "metalk8s/repo/macro.sls" import build_image_name with context %}} + +{{% raw %}} +apiVersion: v1 +kind: Namespace +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + pod-security.kubernetes.io/enforce: baseline + pod-security.kubernetes.io/enforce-version: latest + name: olmv1-system +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: clustercatalogs.olm.operatorframework.io +spec: + group: olm.operatorframework.io + names: + kind: ClusterCatalog + listKind: ClusterCatalogList + plural: clustercatalogs + singular: clustercatalog + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .status.lastUnpacked + name: LastUnpacked + type: date + - jsonPath: .status.conditions[?(@.type=="Serving")].status + name: Serving + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: 'ClusterCatalog enables users to make File-Based Catalog (FBC) + catalog data available to the cluster. + + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs' + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. + + Servers should convert recognized schemas to the latest internal value, + and + + may reject unrecognized values. + + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. + + Servers may infer this from the endpoint the client submits requests + to. + + Cannot be updated. + + In CamelCase. + + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: 'spec is the desired state of the ClusterCatalog. + + spec is required. + + The controller will work to ensure that the desired + + catalog is unpacked and served over the catalog content HTTP server.' + properties: + availabilityMode: + default: Available + description: 'availabilityMode allows users to define how the ClusterCatalog + is made available to clients on the cluster. + + availabilityMode is optional. + + + Allowed values are "Available" and "Unavailable" and omitted. + + + When omitted, the default value is "Available". + + + When set to "Available", the catalog contents will be unpacked and + served over the catalog content HTTP server. + + Setting the availabilityMode to "Available" tells clients that they + should consider this ClusterCatalog + + and its contents as usable. + + + When set to "Unavailable", the catalog contents will no longer be + served over the catalog content HTTP server. + + When set to this availabilityMode it should be interpreted the same + as the ClusterCatalog not existing. + + Setting the availabilityMode to "Unavailable" can be useful in scenarios + where a user may not want + + to delete the ClusterCatalog all together, but would still like + it to be treated as if it doesn''t exist.' + enum: + - Unavailable + - Available + type: string + priority: + default: 0 + description: 'priority allows the user to define a priority for a + ClusterCatalog. + + priority is optional. + + + A ClusterCatalog''s priority is used by clients as a tie-breaker + between ClusterCatalogs that meet the client''s requirements. + + A higher number means higher priority. + + + It is up to clients to decide how to handle scenarios where multiple + ClusterCatalogs with the same priority meet their requirements. + + When deciding how to break the tie in this scenario, it is recommended + that clients prompt their users for additional input. + + + When omitted, the default priority is 0 because that is the zero + value of integers. + + + Negative numbers can be used to specify a priority lower than the + default. + + Positive numbers can be used to specify a priority higher than the + default. + + + The lowest possible value is -2147483648. + + The highest possible value is 2147483647.' + format: int32 + type: integer + source: + description: "source allows a user to define the source of a catalog.\n\ + A \"catalog\" contains information on content that can be installed\ + \ on a cluster.\nProviding a catalog source makes the contents of\ + \ the catalog discoverable and usable by\nother on-cluster components.\n\ + These on-cluster components may do a variety of things with this\ + \ information, such as\npresenting the content in a GUI dashboard\ + \ or installing content from the catalog on the cluster.\nThe catalog\ + \ source must contain catalog metadata in the File-Based Catalog\ + \ (FBC) format.\nFor more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs.\n\ + source is a required field.\n\nBelow is a minimal example of a ClusterCatalogSpec\ + \ that sources a catalog from an image:\n\n source:\n type: Image\n\ + \ image:\n ref: quay.io/operatorhubio/catalog:latest" + properties: + image: + description: 'image is used to configure how catalog contents + are sourced from an OCI image. + + This field is required when type is Image, and forbidden otherwise.' + properties: + pollIntervalMinutes: + description: 'pollIntervalMinutes allows the user to set the + interval, in minutes, at which the image source should be + polled for new content. + + pollIntervalMinutes is optional. + + pollIntervalMinutes can not be specified when ref is a digest-based + reference. + + + When omitted, the image will not be polled for new content.' + minimum: 1 + type: integer + ref: + description: 'ref allows users to define the reference to + a container image containing Catalog contents. + + ref is required. + + ref can not be more than 1000 characters. + + + A reference can be broken down into 3 parts - the domain, + name, and identifier. + + + The domain is typically the registry where an image is located. + + It must be alphanumeric characters (lowercase and uppercase) + separated by the "." character. + + Hyphenation is allowed, but the domain must start and end + with alphanumeric characters. + + Specifying a port to use is also allowed by adding the ":" + character followed by numeric values. + + The port must be the last value in the domain. + + Some examples of valid domain values are "registry.mydomain.io", + "quay.io", "my-registry.io:8080". + + + The name is typically the repository in the registry where + an image is located. + + It must contain lowercase alphanumeric characters separated + only by the ".", "_", "__", "-" characters. + + Multiple names can be concatenated with the "/" character. + + The domain and name are combined using the "/" character. + + Some examples of valid name values are "operatorhubio/catalog", + "catalog", "my-catalog.prod". + + An example of the domain and name parts of a reference being + combined is "quay.io/operatorhubio/catalog". + + + The identifier is typically the tag or digest for an image + reference and is present at the end of the reference. + + It starts with a separator character used to distinguish + the end of the name and beginning of the identifier. + + For a digest-based reference, the "@" character is the separator. + + For a tag-based reference, the ":" character is the separator. + + An identifier is required in the reference. + + + Digest-based references must contain an algorithm reference + immediately after the "@" separator. + + The algorithm reference must be followed by the ":" character + and an encoded string. + + The algorithm must start with an uppercase or lowercase + alpha character followed by alphanumeric characters and + may contain the "-", "_", "+", and "." characters. + + Some examples of valid algorithm values are "sha256", "sha256+b64u", + "multihash+base58". + + The encoded string following the algorithm must be hex digits + (a-f, A-F, 0-9) and must be a minimum of 32 characters. + + + Tag-based references must begin with a word character (alphanumeric + + "_") followed by word characters or ".", and "-" characters. + + The tag must not be longer than 127 characters. + + + An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" + + An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest"' + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest or a tag + rule: self.find('(@.*:)') != "" || self.find(':.*$') != + "" + - message: tag is invalid. the tag must not be more than 127 + characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').substring(1).size() <= 127 + : true) : true' + - message: tag is invalid. valid tags must begin with a word + character (alphanumeric + "_") followed by word characters + or ".", and "-" characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').matches('':[\\w][\\w.-]*$'') + : true) : true' + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + x-kubernetes-validations: + - message: cannot specify pollIntervalMinutes while using digest-based + image + rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) + : true' + type: + description: 'type is a reference to the type of source the catalog + is sourced from. + + type is required. + + + The only allowed value is "Image". + + + When set to "Image", the ClusterCatalog content will be sourced + from an OCI image. + + When using an image source, the image field must be set and + must be the only field defined for this type.' + enum: + - Image + type: string + required: + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + required: + - source + type: object + status: + description: "status contains information about the state of the ClusterCatalog\ + \ such as:\n - Whether or not the catalog contents are being served\ + \ via the catalog content HTTP server\n - Whether or not the ClusterCatalog\ + \ is progressing to a new state\n - A reference to the source from\ + \ which the catalog contents were retrieved" + properties: + conditions: + description: 'conditions is a representation of the current state + for this ClusterCatalog. + + + The current condition types are Serving and Progressing. + + + The Serving condition is used to represent whether or not the contents + of the catalog is being served via the HTTP(S) web server. + + When it has a status of True and a reason of Available, the contents + of the catalog are being served. + + When it has a status of False and a reason of Unavailable, the contents + of the catalog are not being served because the contents are not + yet available. + + When it has a status of False and a reason of UserSpecifiedUnavailable, + the contents of the catalog are not being served because the catalog + has been intentionally marked as unavailable. + + + The Progressing condition is used to represent whether or not the + ClusterCatalog is progressing or is ready to progress towards a + new state. + + When it has a status of True and a reason of Retrying, there was + an error in the progression of the ClusterCatalog that may be resolved + on subsequent reconciliation attempts. + + When it has a status of True and a reason of Succeeded, the ClusterCatalog + has successfully progressed to a new state and is ready to continue + progressing. + + When it has a status of False and a reason of Blocked, there was + an error in the progression of the ClusterCatalog that requires + manual intervention for recovery. + + + In the case that the Serving condition is True with reason Available + and Progressing is True with reason Retrying, the previously fetched + + catalog contents are still being served via the HTTP(S) web server + while we are progressing towards serving a new version of the catalog + + contents. This could occur when we''ve initially fetched the latest + contents from the source for this catalog and when polling for changes + + to the contents we identify that there are updates to the contents.' + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: 'lastTransitionTime is the last time the condition + transitioned from one status to another. + + This should be when the underlying condition changed. If + that is not known, then using the time when the API field + changed is acceptable.' + format: date-time + type: string + message: + description: 'message is a human readable message indicating + details about the transition. + + This may be an empty string.' + maxLength: 32768 + type: string + observedGeneration: + description: 'observedGeneration represents the .metadata.generation + that the condition was set based upon. + + For instance, if .metadata.generation is currently 12, but + the .status.conditions[x].observedGeneration is 9, the condition + is out of date + + with respect to the current state of the instance.' + format: int64 + minimum: 0 + type: integer + reason: + description: 'reason contains a programmatic identifier indicating + the reason for the condition''s last transition. + + Producers of specific condition types may define expected + values and meanings for this field, + + and whether the values are considered a guaranteed API. + + The value should be a CamelCase string. + + This field may not be empty.' + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - 'True' + - 'False' + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + lastUnpacked: + description: 'lastUnpacked represents the last time the contents of + the + + catalog were extracted from their source format. As an example, + + when using an Image source, the OCI image will be pulled and the + + image layers written to a file-system backed cache. We refer to + the + + act of this extraction from the source format as "unpacking".' + format: date-time + type: string + resolvedSource: + description: resolvedSource contains information about the resolved + source based on the source type. + properties: + image: + description: 'image is a field containing resolution information + for a catalog sourced from an image. + + This field must be set when type is Image, and forbidden otherwise.' + properties: + ref: + description: 'ref contains the resolved image digest-based + reference. + + The digest format is used so users can use other tooling + to fetch the exact + + OCI manifests that were used to extract the catalog contents.' + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest + rule: self.find('(@.*:)') != "" + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + type: + description: 'type is a reference to the type of source the catalog + is sourced from. + + type is required. + + + The only allowed value is "Image". + + + When set to "Image", information about the resolved image source + will be set in the ''image'' field.' + enum: + - Image + type: string + required: + - image + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + urls: + description: urls contains the URLs that can be used to access the + catalog. + properties: + base: + description: "base is a cluster-internal URL that provides endpoints\ + \ for\naccessing the content of the catalog.\n\nIt is expected\ + \ that clients append the path for the endpoint they wish\n\ + to access.\n\nCurrently, only a single endpoint is served and\ + \ is accessible at the path\n/api/v1.\n\nThe endpoints served\ + \ for the v1 API are:\n - /all - this endpoint returns the\ + \ entirety of the catalog contents in the FBC format\n\nAs the\ + \ needs of users and clients of the evolve, new endpoints may\ + \ be added." + maxLength: 525 + type: string + x-kubernetes-validations: + - message: must be a valid URL + rule: isURL(self) + - message: scheme must be either http or https + rule: 'isURL(self) ? (url(self).getScheme() == "http" || url(self).getScheme() + == "https") : true' + required: + - base + type: object + type: object + required: + - metadata + - spec + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-leader-election-role + namespace: olmv1-system +rules: +- apiGroups: + - '' + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - '' + resources: + - events + verbs: + - create + - patch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-manager-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/finalizers + verbs: + - update +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/status + verbs: + - get + - patch + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-leader-election-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: catalogd-leader-election-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-manager-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-proxy-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-service + namespace: olmv1-system +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 8443 + - name: webhook + port: 9443 + protocol: TCP + targetPort: 9443 + - name: metrics + port: 7443 + protocol: TCP + targetPort: 7443 + selector: + control-plane: catalogd-controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kubectl.kubernetes.io/default-logs-container: manager + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + control-plane: catalogd-controller-manager + heritage: metalk8s + name: catalogd-controller-manager + namespace: olmv1-system +spec: + minReadySeconds: 5 + replicas: 1 + selector: + matchLabels: + control-plane: catalogd-controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: catalogd-controller-manager + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --leader-elect + - --metrics-bind-address=:7443 + - --external-address=catalogd-service.olmv1-system.svc + - --tls-cert=/var/certs/tls.crt + - --tls-key=/var/certs/tls.key + - --ca-certs-dir=/var/ca-certs + command: + - ./manager + image: {% endraw -%}{{ build_image_name("catalogd", False) }}{%- raw %}:v1.1.0 + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 200Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/cache/ + name: cache + - mountPath: /var/certs + name: catalogserver-certs + - mountPath: /var/ca-certs/ + name: olmv1-certificate + readOnly: true + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: catalogd-controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - emptyDir: {} + name: cache + - name: catalogserver-certs + secret: + secretName: catalogd-service-cert-v1.1.0 + - name: olmv1-certificate + secret: + items: + - key: ca.crt + path: olm-ca.crt + optional: false + secretName: catalogd-service-cert-v1.1.0 +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: olmv1-ca + namespace: metalk8s-certs +spec: + commonName: olmv1-ca + isCA: true + issuerRef: + group: cert-manager.io + kind: Issuer + name: self-sign-issuer + privateKey: + algorithm: ECDSA + size: 256 + secretName: olmv1-ca + secretTemplate: + annotations: + cert-manager.io/allow-direct-injection: 'true' +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-service-cert + namespace: olmv1-system +spec: + dnsNames: + - localhost + - catalogd-service.olmv1-system.svc + - catalogd-service.olmv1-system.svc.cluster.local + issuerRef: + group: cert-manager.io + kind: ClusterIssuer + name: olmv1-ca + privateKey: + algorithm: ECDSA + size: 256 + secretName: catalogd-service-cert-v1.1.0 +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: olmv1-ca +spec: + ca: + secretName: olmv1-ca +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: self-sign-issuer + namespace: metalk8s-certs +spec: + selfSigned: {} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from-secret: cert-manager/olmv1-ca + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-mutating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + clientConfig: + service: + name: catalogd-service + namespace: olmv1-system + path: /mutate-olm-operatorframework-io-v1-clustercatalog + port: 9443 + failurePolicy: Fail + matchConditions: + - expression: '''name'' in object.metadata && (!has(object.metadata.labels) || !(''olm.operatorframework.io/metadata.name'' + in object.metadata.labels) || object.metadata.labels[''olm.operatorframework.io/metadata.name''] + != object.metadata.name)' + name: MissingOrIncorrectMetadataNameLabel + name: inject-metadata-name.olm.operatorframework.io + rules: + - apiGroups: + - olm.operatorframework.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - clustercatalogs + sideEffects: None + timeoutSeconds: 10 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: clustercatalogs.olm.operatorframework.io +spec: + group: olm.operatorframework.io + names: + kind: ClusterCatalog + listKind: ClusterCatalogList + plural: clustercatalogs + singular: clustercatalog + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .status.lastUnpacked + name: LastUnpacked + type: date + - jsonPath: .status.conditions[?(@.type=="Serving")].status + name: Serving + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: 'ClusterCatalog enables users to make File-Based Catalog (FBC) + catalog data available to the cluster. + + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs' + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. + + Servers should convert recognized schemas to the latest internal value, + and + + may reject unrecognized values. + + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. + + Servers may infer this from the endpoint the client submits requests + to. + + Cannot be updated. + + In CamelCase. + + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: 'spec is the desired state of the ClusterCatalog. + + spec is required. + + The controller will work to ensure that the desired + + catalog is unpacked and served over the catalog content HTTP server.' + properties: + availabilityMode: + default: Available + description: 'availabilityMode allows users to define how the ClusterCatalog + is made available to clients on the cluster. + + availabilityMode is optional. + + + Allowed values are "Available" and "Unavailable" and omitted. + + + When omitted, the default value is "Available". + + + When set to "Available", the catalog contents will be unpacked and + served over the catalog content HTTP server. + + Setting the availabilityMode to "Available" tells clients that they + should consider this ClusterCatalog + + and its contents as usable. + + + When set to "Unavailable", the catalog contents will no longer be + served over the catalog content HTTP server. + + When set to this availabilityMode it should be interpreted the same + as the ClusterCatalog not existing. + + Setting the availabilityMode to "Unavailable" can be useful in scenarios + where a user may not want + + to delete the ClusterCatalog all together, but would still like + it to be treated as if it doesn''t exist.' + enum: + - Unavailable + - Available + type: string + priority: + default: 0 + description: 'priority allows the user to define a priority for a + ClusterCatalog. + + priority is optional. + + + A ClusterCatalog''s priority is used by clients as a tie-breaker + between ClusterCatalogs that meet the client''s requirements. + + A higher number means higher priority. + + + It is up to clients to decide how to handle scenarios where multiple + ClusterCatalogs with the same priority meet their requirements. + + When deciding how to break the tie in this scenario, it is recommended + that clients prompt their users for additional input. + + + When omitted, the default priority is 0 because that is the zero + value of integers. + + + Negative numbers can be used to specify a priority lower than the + default. + + Positive numbers can be used to specify a priority higher than the + default. + + + The lowest possible value is -2147483648. + + The highest possible value is 2147483647.' + format: int32 + type: integer + source: + description: "source allows a user to define the source of a catalog.\n\ + A \"catalog\" contains information on content that can be installed\ + \ on a cluster.\nProviding a catalog source makes the contents of\ + \ the catalog discoverable and usable by\nother on-cluster components.\n\ + These on-cluster components may do a variety of things with this\ + \ information, such as\npresenting the content in a GUI dashboard\ + \ or installing content from the catalog on the cluster.\nThe catalog\ + \ source must contain catalog metadata in the File-Based Catalog\ + \ (FBC) format.\nFor more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs.\n\ + source is a required field.\n\nBelow is a minimal example of a ClusterCatalogSpec\ + \ that sources a catalog from an image:\n\n source:\n type: Image\n\ + \ image:\n ref: quay.io/operatorhubio/catalog:latest" + properties: + image: + description: 'image is used to configure how catalog contents + are sourced from an OCI image. + + This field is required when type is Image, and forbidden otherwise.' + properties: + pollIntervalMinutes: + description: 'pollIntervalMinutes allows the user to set the + interval, in minutes, at which the image source should be + polled for new content. + + pollIntervalMinutes is optional. + + pollIntervalMinutes can not be specified when ref is a digest-based + reference. + + + When omitted, the image will not be polled for new content.' + minimum: 1 + type: integer + ref: + description: 'ref allows users to define the reference to + a container image containing Catalog contents. + + ref is required. + + ref can not be more than 1000 characters. + + + A reference can be broken down into 3 parts - the domain, + name, and identifier. + + + The domain is typically the registry where an image is located. + + It must be alphanumeric characters (lowercase and uppercase) + separated by the "." character. + + Hyphenation is allowed, but the domain must start and end + with alphanumeric characters. + + Specifying a port to use is also allowed by adding the ":" + character followed by numeric values. + + The port must be the last value in the domain. + + Some examples of valid domain values are "registry.mydomain.io", + "quay.io", "my-registry.io:8080". + + + The name is typically the repository in the registry where + an image is located. + + It must contain lowercase alphanumeric characters separated + only by the ".", "_", "__", "-" characters. + + Multiple names can be concatenated with the "/" character. + + The domain and name are combined using the "/" character. + + Some examples of valid name values are "operatorhubio/catalog", + "catalog", "my-catalog.prod". + + An example of the domain and name parts of a reference being + combined is "quay.io/operatorhubio/catalog". + + + The identifier is typically the tag or digest for an image + reference and is present at the end of the reference. + + It starts with a separator character used to distinguish + the end of the name and beginning of the identifier. + + For a digest-based reference, the "@" character is the separator. + + For a tag-based reference, the ":" character is the separator. + + An identifier is required in the reference. + + + Digest-based references must contain an algorithm reference + immediately after the "@" separator. + + The algorithm reference must be followed by the ":" character + and an encoded string. + + The algorithm must start with an uppercase or lowercase + alpha character followed by alphanumeric characters and + may contain the "-", "_", "+", and "." characters. + + Some examples of valid algorithm values are "sha256", "sha256+b64u", + "multihash+base58". + + The encoded string following the algorithm must be hex digits + (a-f, A-F, 0-9) and must be a minimum of 32 characters. + + + Tag-based references must begin with a word character (alphanumeric + + "_") followed by word characters or ".", and "-" characters. + + The tag must not be longer than 127 characters. + + + An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" + + An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest"' + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest or a tag + rule: self.find('(@.*:)') != "" || self.find(':.*$') != + "" + - message: tag is invalid. the tag must not be more than 127 + characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').substring(1).size() <= 127 + : true) : true' + - message: tag is invalid. valid tags must begin with a word + character (alphanumeric + "_") followed by word characters + or ".", and "-" characters + rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') + != "" ? self.find('':.*$'').matches('':[\\w][\\w.-]*$'') + : true) : true' + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + x-kubernetes-validations: + - message: cannot specify pollIntervalMinutes while using digest-based + image + rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) + : true' + type: + description: 'type is a reference to the type of source the catalog + is sourced from. + + type is required. + + + The only allowed value is "Image". + + + When set to "Image", the ClusterCatalog content will be sourced + from an OCI image. + + When using an image source, the image field must be set and + must be the only field defined for this type.' + enum: + - Image + type: string + required: + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + required: + - source + type: object + status: + description: "status contains information about the state of the ClusterCatalog\ + \ such as:\n - Whether or not the catalog contents are being served\ + \ via the catalog content HTTP server\n - Whether or not the ClusterCatalog\ + \ is progressing to a new state\n - A reference to the source from\ + \ which the catalog contents were retrieved" + properties: + conditions: + description: 'conditions is a representation of the current state + for this ClusterCatalog. + + + The current condition types are Serving and Progressing. + + + The Serving condition is used to represent whether or not the contents + of the catalog is being served via the HTTP(S) web server. + + When it has a status of True and a reason of Available, the contents + of the catalog are being served. + + When it has a status of False and a reason of Unavailable, the contents + of the catalog are not being served because the contents are not + yet available. + + When it has a status of False and a reason of UserSpecifiedUnavailable, + the contents of the catalog are not being served because the catalog + has been intentionally marked as unavailable. + + + The Progressing condition is used to represent whether or not the + ClusterCatalog is progressing or is ready to progress towards a + new state. + + When it has a status of True and a reason of Retrying, there was + an error in the progression of the ClusterCatalog that may be resolved + on subsequent reconciliation attempts. + + When it has a status of True and a reason of Succeeded, the ClusterCatalog + has successfully progressed to a new state and is ready to continue + progressing. + + When it has a status of False and a reason of Blocked, there was + an error in the progression of the ClusterCatalog that requires + manual intervention for recovery. + + + In the case that the Serving condition is True with reason Available + and Progressing is True with reason Retrying, the previously fetched + + catalog contents are still being served via the HTTP(S) web server + while we are progressing towards serving a new version of the catalog + + contents. This could occur when we''ve initially fetched the latest + contents from the source for this catalog and when polling for changes + + to the contents we identify that there are updates to the contents.' + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: 'lastTransitionTime is the last time the condition + transitioned from one status to another. + + This should be when the underlying condition changed. If + that is not known, then using the time when the API field + changed is acceptable.' + format: date-time + type: string + message: + description: 'message is a human readable message indicating + details about the transition. + + This may be an empty string.' + maxLength: 32768 + type: string + observedGeneration: + description: 'observedGeneration represents the .metadata.generation + that the condition was set based upon. + + For instance, if .metadata.generation is currently 12, but + the .status.conditions[x].observedGeneration is 9, the condition + is out of date + + with respect to the current state of the instance.' + format: int64 + minimum: 0 + type: integer + reason: + description: 'reason contains a programmatic identifier indicating + the reason for the condition''s last transition. + + Producers of specific condition types may define expected + values and meanings for this field, + + and whether the values are considered a guaranteed API. + + The value should be a CamelCase string. + + This field may not be empty.' + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - 'True' + - 'False' + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + lastUnpacked: + description: 'lastUnpacked represents the last time the contents of + the + + catalog were extracted from their source format. As an example, + + when using an Image source, the OCI image will be pulled and the + + image layers written to a file-system backed cache. We refer to + the + + act of this extraction from the source format as "unpacking".' + format: date-time + type: string + resolvedSource: + description: resolvedSource contains information about the resolved + source based on the source type. + properties: + image: + description: 'image is a field containing resolution information + for a catalog sourced from an image. + + This field must be set when type is Image, and forbidden otherwise.' + properties: + ref: + description: 'ref contains the resolved image digest-based + reference. + + The digest format is used so users can use other tooling + to fetch the exact + + OCI manifests that were used to extract the catalog contents.' + maxLength: 1000 + type: string + x-kubernetes-validations: + - message: must start with a valid domain. valid domains must + be alphanumeric characters (lowercase and uppercase) separated + by the "." character. + rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') + - message: a valid name is required. valid names must contain + lowercase alphanumeric characters separated only by the + ".", "_", "__", "-" characters. + rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') + != "" + - message: must end with a digest + rule: self.find('(@.*:)') != "" + - message: digest algorithm is not valid. valid algorithms + must start with an uppercase or lowercase alpha character + followed by alphanumeric characters and may contain the + "-", "_", "+", and "." characters. + rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') + : true' + - message: digest is not valid. the encoded string must be + at least 32 characters + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() + >= 32 : true' + - message: digest is not valid. the encoded string must only + contain hex characters (A-F, a-f, 0-9) + rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') + : true' + required: + - ref + type: object + type: + description: 'type is a reference to the type of source the catalog + is sourced from. + + type is required. + + + The only allowed value is "Image". + + + When set to "Image", information about the resolved image source + will be set in the ''image'' field.' + enum: + - Image + type: string + required: + - image + - type + type: object + x-kubernetes-validations: + - message: image is required when source type is Image, and forbidden + otherwise + rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) + : !has(self.image)' + urls: + description: urls contains the URLs that can be used to access the + catalog. + properties: + base: + description: "base is a cluster-internal URL that provides endpoints\ + \ for\naccessing the content of the catalog.\n\nIt is expected\ + \ that clients append the path for the endpoint they wish\n\ + to access.\n\nCurrently, only a single endpoint is served and\ + \ is accessible at the path\n/api/v1.\n\nThe endpoints served\ + \ for the v1 API are:\n - /all - this endpoint returns the\ + \ entirety of the catalog contents in the FBC format\n\nAs the\ + \ needs of users and clients of the evolve, new endpoints may\ + \ be added." + maxLength: 525 + type: string + x-kubernetes-validations: + - message: must be a valid URL + rule: isURL(self) + - message: scheme must be either http or https + rule: 'isURL(self) ? (url(self).getScheme() == "http" || url(self).getScheme() + == "https") : true' + required: + - base + type: object + type: object + required: + - metadata + - spec + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-leader-election-role + namespace: olmv1-system +rules: +- apiGroups: + - '' + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - '' + resources: + - events + verbs: + - create + - patch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-manager-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/finalizers + verbs: + - update +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs/status + verbs: + - get + - patch + - update +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-metrics-reader +rules: +- nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-leader-election-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: catalogd-leader-election-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-manager-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: catalogd-proxy-role +subjects: +- kind: ServiceAccount + name: catalogd-controller-manager + namespace: olmv1-system +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/name: catalogd + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-service + namespace: olmv1-system +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 8443 + - name: webhook + port: 9443 + protocol: TCP + targetPort: 9443 + - name: metrics + port: 7443 + protocol: TCP + targetPort: 7443 + selector: + control-plane: catalogd-controller-manager +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kubectl.kubernetes.io/default-logs-container: manager + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + control-plane: catalogd-controller-manager + heritage: metalk8s + name: catalogd-controller-manager + namespace: olmv1-system +spec: + minReadySeconds: 5 + replicas: 1 + selector: + matchLabels: + control-plane: catalogd-controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: catalogd-controller-manager + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux + containers: + - args: + - --leader-elect + - --metrics-bind-address=:7443 + - --external-address=catalogd-service.olmv1-system.svc + - --tls-cert=/var/certs/tls.crt + - --tls-key=/var/certs/tls.key + - --ca-certs-dir=/var/ca-certs + command: + - ./manager + image: {% endraw -%}{{ build_image_name("catalogd", False) }}{%- raw %}:v1.1.0 + imagePullPolicy: IfNotPresent + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + name: manager + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 200Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + terminationMessagePolicy: FallbackToLogsOnError + volumeMounts: + - mountPath: /var/cache/ + name: cache + - mountPath: /var/certs + name: catalogserver-certs + - mountPath: /var/ca-certs/ + name: olmv1-certificate + readOnly: true + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: catalogd-controller-manager + terminationGracePeriodSeconds: 10 + volumes: + - emptyDir: {} + name: cache + - name: catalogserver-certs + secret: + secretName: catalogd-service-cert-v1.1.0 + - name: olmv1-certificate + secret: + items: + - key: ca.crt + path: olm-ca.crt + optional: false + secretName: catalogd-service-cert-v1.1.0 +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-service-cert + namespace: olmv1-system +spec: + dnsNames: + - localhost + - catalogd-service.olmv1-system.svc + - catalogd-service.olmv1-system.svc.cluster.local + issuerRef: + group: cert-manager.io + kind: ClusterIssuer + name: olmv1-ca + privateKey: + algorithm: ECDSA + size: 256 + secretName: catalogd-service-cert-v1.1.0 +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from-secret: cert-manager/olmv1-ca + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: catalogd-mutating-webhook-configuration +webhooks: +- admissionReviewVersions: + - v1 + clientConfig: + service: + name: catalogd-service + namespace: olmv1-system + path: /mutate-olm-operatorframework-io-v1-clustercatalog + port: 9443 + failurePolicy: Fail + matchConditions: + - expression: '''name'' in object.metadata && (!has(object.metadata.labels) || !(''olm.operatorframework.io/metadata.name'' + in object.metadata.labels) || object.metadata.labels[''olm.operatorframework.io/metadata.name''] + != object.metadata.name)' + name: MissingOrIncorrectMetadataNameLabel + name: inject-metadata-name.olm.operatorframework.io + rules: + - apiGroups: + - olm.operatorframework.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - clustercatalogs + sideEffects: None + timeoutSeconds: 10 + +{{% endraw %}} diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls b/salt/metalk8s/addons/olm/deployed/init.sls similarity index 52% rename from salt/metalk8s/addons/olm/operator-controller/deployed/init.sls rename to salt/metalk8s/addons/olm/deployed/init.sls index 140a7143ce..0be4ca6d08 100644 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/init.sls +++ b/salt/metalk8s/addons/olm/deployed/init.sls @@ -1,10 +1,17 @@ include: - - ...common.deployed - - ...catalogd.deployed - - .crds - - .rbac - - .cert - - .operator-controller + - .chart + +Wait for the Catalogd Controller Manager deployment to be Ready: + test.configurable_test_state: + - changes: False + - result: __slot__:salt:metalk8s_kubernetes.check_object_ready( + apiVersion=apps/v1, kind=Deployment, + name=catalogd-controller-manager, namespace=olmv1-system) + - comment: Wait for the Catalog Operator to be Ready + - retry: + attempts: 30 + - require: + - sls: metalk8s.addons.olm.deployed.chart Wait for the Operator Controller Controller Manager Deployment to be Ready: test.configurable_test_state: @@ -16,9 +23,5 @@ Wait for the Operator Controller Controller Manager Deployment to be Ready: - retry: attempts: 30 - require: - - test: Deploy common OLMv1 components - test: Wait for the Catalogd Controller Manager deployment to be Ready - - sls: metalk8s.addons.olm.operator-controller.deployed.crds - - sls: metalk8s.addons.olm.operator-controller.deployed.rbac - - sls: metalk8s.addons.olm.operator-controller.deployed.cert - - sls: metalk8s.addons.olm.operator-controller.deployed.operator-controller + diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls deleted file mode 100644 index 6757541340..0000000000 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls +++ /dev/null @@ -1,20 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: olmv1-cert - namespace: olmv1-system -spec: - dnsNames: - - operator-controller.olmv1-system.svc - - operator-controller.olmv1-system.svc.cluster.local - issuerRef: - group: cert-manager.io - kind: ClusterIssuer - name: olmv1-ca - privateKey: - algorithm: ECDSA - size: 256 - secretName: olmv1-cert diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls deleted file mode 100644 index cf481587d8..0000000000 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls +++ /dev/null @@ -1,591 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.16.1 - name: clusterextensions.olm.operatorframework.io -spec: - group: olm.operatorframework.io - names: - kind: ClusterExtension - listKind: ClusterExtensionList - plural: clusterextensions - singular: clusterextension - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .status.install.bundle.name - name: Installed Bundle - type: string - - jsonPath: .status.install.bundle.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Installed')].status - name: Installed - type: string - - jsonPath: .status.conditions[?(@.type=='Progressing')].status - name: Progressing - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: ClusterExtension is the Schema for the clusterextensions API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: spec is an optional field that defines the desired state - of the ClusterExtension. - properties: - install: - description: |- - install is an optional field used to configure the installation options - for the ClusterExtension such as the pre-flight check configuration. - properties: - preflight: - description: |- - preflight is an optional field that can be used to configure the checks that are - run before installation or upgrade of the content for the package specified in the packageName field. - - When specified, it replaces the default preflight configuration for install/upgrade actions. - When not specified, the default configuration will be used. - properties: - crdUpgradeSafety: - description: |- - crdUpgradeSafety is used to configure the CRD Upgrade Safety pre-flight - checks that run prior to upgrades of installed content. - - The CRD Upgrade Safety pre-flight check safeguards from unintended - consequences of upgrading a CRD, such as data loss. - properties: - enforcement: - description: |- - enforcement is a required field, used to configure the state of the CRD Upgrade Safety pre-flight check. - - Allowed values are "None" or "Strict". The default value is "Strict". - - When set to "None", the CRD Upgrade Safety pre-flight check will be skipped - when performing an upgrade operation. This should be used with caution as - unintended consequences such as data loss can occur. - - When set to "Strict", the CRD Upgrade Safety pre-flight check will be run when - performing an upgrade operation. - enum: - - None - - Strict - type: string - required: - - enforcement - type: object - required: - - crdUpgradeSafety - type: object - x-kubernetes-validations: - - message: at least one of [crdUpgradeSafety] are required when - preflight is specified - rule: has(self.crdUpgradeSafety) - type: object - x-kubernetes-validations: - - message: at least one of [preflight] are required when install is - specified - rule: has(self.preflight) - namespace: - description: |- - namespace is a reference to a Kubernetes namespace. - This is the namespace in which the provided ServiceAccount must exist. - It also designates the default namespace where namespace-scoped resources - for the extension are applied to the cluster. - Some extensions may contain namespace-scoped resources to be applied in other namespaces. - This namespace must exist. - - namespace is required, immutable, and follows the DNS label standard - as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters or hyphens (-), - start and end with an alphanumeric character, and be no longer than 63 characters - - [RFC 1123]: https://tools.ietf.org/html/rfc1123 - maxLength: 63 - type: string - x-kubernetes-validations: - - message: namespace is immutable - rule: self == oldSelf - - message: namespace must be a valid DNS1123 label - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") - serviceAccount: - description: |- - serviceAccount is a reference to a ServiceAccount used to perform all interactions - with the cluster that are required to manage the extension. - The ServiceAccount must be configured with the necessary permissions to perform these interactions. - The ServiceAccount must exist in the namespace referenced in the spec. - serviceAccount is required. - properties: - name: - description: |- - name is a required, immutable reference to the name of the ServiceAccount - to be used for installation and management of the content for the package - specified in the packageName field. - - This ServiceAccount must exist in the installNamespace. - - name follows the DNS subdomain standard as defined in [RFC 1123]. - It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric character, - and be no longer than 253 characters. - - Some examples of valid values are: - - some-serviceaccount - - 123-serviceaccount - - 1-serviceaccount-2 - - someserviceaccount - - some.serviceaccount - - Some examples of invalid values are: - - -some-serviceaccount - - some-serviceaccount- - - [RFC 1123]: https://tools.ietf.org/html/rfc1123 - maxLength: 253 - type: string - x-kubernetes-validations: - - message: name is immutable - rule: self == oldSelf - - message: name must be a valid DNS1123 subdomain. It must contain - only lowercase alphanumeric characters, hyphens (-) or periods - (.), start and end with an alphanumeric character, and be - no longer than 253 characters - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") - required: - - name - type: object - source: - description: |- - source is a required field which selects the installation source of content - for this ClusterExtension. Selection is performed by setting the sourceType. - - Catalog is currently the only implemented sourceType, and setting the - sourcetype to "Catalog" requires the catalog field to also be defined. - - Below is a minimal example of a source definition (in yaml): - - source: - sourceType: Catalog - catalog: - packageName: example-package - properties: - catalog: - description: |- - catalog is used to configure how information is sourced from a catalog. - This field is required when sourceType is "Catalog", and forbidden otherwise. - properties: - channels: - description: |- - channels is an optional reference to a set of channels belonging to - the package specified in the packageName field. - - A "channel" is a package-author-defined stream of updates for an extension. - - Each channel in the list must follow the DNS subdomain standard - as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric character, - and be no longer than 253 characters. No more than 256 channels can be specified. - - When specified, it is used to constrain the set of installable bundles and - the automated upgrade path. This constraint is an AND operation with the - version field. For example: - - Given channel is set to "foo" - - Given version is set to ">=1.0.0, <1.5.0" - - Only bundles that exist in channel "foo" AND satisfy the version range comparison will be considered installable - - Automatic upgrades will be constrained to upgrade edges defined by the selected channel - - When unspecified, upgrade edges across all channels will be used to identify valid automatic upgrade paths. - - Some examples of valid values are: - - 1.1.x - - alpha - - stable - - stable-v1 - - v1-stable - - dev-preview - - preview - - community - - Some examples of invalid values are: - - -some-channel - - some-channel- - - thisisareallylongchannelnamethatisgreaterthanthemaximumlength - - original_40 - - --default-channel - - [RFC 1123]: https://tools.ietf.org/html/rfc1123 - items: - maxLength: 253 - type: string - x-kubernetes-validations: - - message: channels entries must be valid DNS1123 subdomains - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") - maxItems: 256 - type: array - packageName: - description: |- - packageName is a reference to the name of the package to be installed - and is used to filter the content from catalogs. - - packageName is required, immutable, and follows the DNS subdomain standard - as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric character, - and be no longer than 253 characters. - - Some examples of valid values are: - - some-package - - 123-package - - 1-package-2 - - somepackage - - Some examples of invalid values are: - - -some-package - - some-package- - - thisisareallylongpackagenamethatisgreaterthanthemaximumlength - - some.package - - [RFC 1123]: https://tools.ietf.org/html/rfc1123 - maxLength: 253 - type: string - x-kubernetes-validations: - - message: packageName is immutable - rule: self == oldSelf - - message: packageName must be a valid DNS1123 subdomain. - It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric - character, and be no longer than 253 characters - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") - selector: - description: |- - selector is an optional field that can be used - to filter the set of ClusterCatalogs used in the bundle - selection process. - - When unspecified, all ClusterCatalogs will be used in - the bundle selection process. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - upgradeConstraintPolicy: - default: CatalogProvided - description: |- - upgradeConstraintPolicy is an optional field that controls whether - the upgrade path(s) defined in the catalog are enforced for the package - referenced in the packageName field. - - Allowed values are: "CatalogProvided" or "SelfCertified", or omitted. - - When this field is set to "CatalogProvided", automatic upgrades will only occur - when upgrade constraints specified by the package author are met. - - When this field is set to "SelfCertified", the upgrade constraints specified by - the package author are ignored. This allows for upgrades and downgrades to - any version of the package. This is considered a dangerous operation as it - can lead to unknown and potentially disastrous outcomes, such as data - loss. It is assumed that users have independently verified changes when - using this option. - - When this field is omitted, the default value is "CatalogProvided". - enum: - - CatalogProvided - - SelfCertified - type: string - version: - description: |- - version is an optional semver constraint (a specific version or range of versions). When unspecified, the latest version available will be installed. - - Acceptable version ranges are no longer than 64 characters. - Version ranges are composed of comma- or space-delimited values and one or - more comparison operators, known as comparison strings. Additional - comparison strings can be added using the OR operator (||). - - # Range Comparisons - - To specify a version range, you can use a comparison string like ">=3.0, - <3.6". When specifying a range, automatic updates will occur within that - range. The example comparison string means "install any version greater than - or equal to 3.0.0 but less than 3.6.0.". It also states intent that if any - upgrades are available within the version range after initial installation, - those upgrades should be automatically performed. - - # Pinned Versions - - To specify an exact version to install you can use a version range that - "pins" to a specific version. When pinning to a specific version, no - automatic updates will occur. An example of a pinned version range is - "0.6.0", which means "only install version 0.6.0 and never - upgrade from this version". - - # Basic Comparison Operators - - The basic comparison operators and their meanings are: - - "=", equal (not aliased to an operator) - - "!=", not equal - - "<", less than - - ">", greater than - - ">=", greater than OR equal to - - "<=", less than OR equal to - - # Wildcard Comparisons - - You can use the "x", "X", and "*" characters as wildcard characters in all - comparison operations. Some examples of using the wildcard characters: - - "1.2.x", "1.2.X", and "1.2.*" is equivalent to ">=1.2.0, < 1.3.0" - - ">= 1.2.x", ">= 1.2.X", and ">= 1.2.*" is equivalent to ">= 1.2.0" - - "<= 2.x", "<= 2.X", and "<= 2.*" is equivalent to "< 3" - - "x", "X", and "*" is equivalent to ">= 0.0.0" - - # Patch Release Comparisons - - When you want to specify a minor version up to the next major version you - can use the "~" character to perform patch comparisons. Some examples: - - "~1.2.3" is equivalent to ">=1.2.3, <1.3.0" - - "~1" and "~1.x" is equivalent to ">=1, <2" - - "~2.3" is equivalent to ">=2.3, <2.4" - - "~1.2.x" is equivalent to ">=1.2.0, <1.3.0" - - # Major Release Comparisons - - You can use the "^" character to make major release comparisons after a - stable 1.0.0 version is published. If there is no stable version published, // minor versions define the stability level. Some examples: - - "^1.2.3" is equivalent to ">=1.2.3, <2.0.0" - - "^1.2.x" is equivalent to ">=1.2.0, <2.0.0" - - "^2.3" is equivalent to ">=2.3, <3" - - "^2.x" is equivalent to ">=2.0.0, <3" - - "^0.2.3" is equivalent to ">=0.2.3, <0.3.0" - - "^0.2" is equivalent to ">=0.2.0, <0.3.0" - - "^0.0.3" is equvalent to ">=0.0.3, <0.0.4" - - "^0.0" is equivalent to ">=0.0.0, <0.1.0" - - "^0" is equivalent to ">=0.0.0, <1.0.0" - - # OR Comparisons - You can use the "||" character to represent an OR operation in the version - range. Some examples: - - ">=1.2.3, <2.0.0 || >3.0.0" - - "^0 || ^3 || ^5" - - For more information on semver, please see https://semver.org/ - maxLength: 64 - type: string - x-kubernetes-validations: - - message: invalid version expression - rule: self.matches("^(\\s*(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|[x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*]))?(\\.(0|[1-9]\\d*|x|X|\\*))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)((?:\\s+|,\\s*|\\s*\\|\\|\\s*)(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*))?(\\.(0|[1-9]\\d*|x|X|\\*]))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)*$") - required: - - packageName - type: object - sourceType: - description: |- - sourceType is a required reference to the type of install source. - - Allowed values are "Catalog" - - When this field is set to "Catalog", information for determining the - appropriate bundle of content to install will be fetched from - ClusterCatalog resources existing on the cluster. - When using the Catalog sourceType, the catalog field must also be set. - enum: - - Catalog - type: string - required: - - sourceType - type: object - x-kubernetes-validations: - - message: catalog is required when sourceType is Catalog, and forbidden - otherwise - rule: 'has(self.sourceType) && self.sourceType == ''Catalog'' ? - has(self.catalog) : !has(self.catalog)' - required: - - namespace - - serviceAccount - - source - type: object - status: - description: status is an optional field that defines the observed state - of the ClusterExtension. - properties: - conditions: - description: |- - The set of condition types which apply to all spec.source variations are Installed and Progressing. - - The Installed condition represents whether or not the bundle has been installed for this ClusterExtension. - When Installed is True and the Reason is Succeeded, the bundle has been successfully installed. - When Installed is False and the Reason is Failed, the bundle has failed to install. - - The Progressing condition represents whether or not the ClusterExtension is advancing towards a new state. - When Progressing is True and the Reason is Succeeded, the ClusterExtension is making progress towards a new state. - When Progressing is True and the Reason is Retrying, the ClusterExtension has encountered an error that could be resolved on subsequent reconciliation attempts. - When Progressing is False and the Reason is Blocked, the ClusterExtension has encountered an error that requires manual intervention for recovery. - - When the ClusterExtension is sourced from a catalog, if may also communicate a deprecation condition. - These are indications from a package owner to guide users away from a particular package, channel, or bundle. - BundleDeprecated is set if the requested bundle version is marked deprecated in the catalog. - ChannelDeprecated is set if the requested channel is marked deprecated in the catalog. - PackageDeprecated is set if the requested package is marked deprecated in the catalog. - Deprecated is a rollup condition that is present when any of the deprecated conditions are present. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - install: - description: install is a representation of the current installation - status for this ClusterExtension. - properties: - bundle: - description: |- - bundle is a required field which represents the identifying attributes of a bundle. - - A "bundle" is a versioned set of content that represents the resources that - need to be applied to a cluster to install a package. - properties: - name: - description: |- - name is required and follows the DNS subdomain standard - as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric character, - and be no longer than 253 characters. - type: string - x-kubernetes-validations: - - message: packageName must be a valid DNS1123 subdomain. - It must contain only lowercase alphanumeric characters, - hyphens (-) or periods (.), start and end with an alphanumeric - character, and be no longer than 253 characters - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") - version: - description: |- - version is a required field and is a reference to the version that this bundle represents - version follows the semantic versioning standard as defined in https://semver.org/. - type: string - x-kubernetes-validations: - - message: version must be well-formed semver - rule: self.matches("^([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(-([-0-9A-Za-z]+(\\.[-0-9A-Za-z]+)*))?(\\+([-0-9A-Za-z]+(-\\.[-0-9A-Za-z]+)*))?") - required: - - name - - version - type: object - required: - - bundle - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls deleted file mode 100644 index e45fe602be..0000000000 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls +++ /dev/null @@ -1,148 +0,0 @@ -#!jinja | metalk8s_kubernetes -{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} - ---- -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: operator-controller-controller-manager - name: operator-controller-controller-manager-metrics-service - namespace: olmv1-system -spec: - ports: - - name: https - port: 8443 - protocol: TCP - targetPort: https - selector: - control-plane: operator-controller-controller-manager ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - kubectl.kubernetes.io/default-logs-container: manager - labels: - control-plane: operator-controller-controller-manager - name: operator-controller-controller-manager - namespace: olmv1-system -spec: - replicas: 1 - selector: - matchLabels: - control-plane: operator-controller-controller-manager - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: operator-controller-controller-manager - spec: - nodeSelector: - kubernetes.io/os: linux - node-role.kubernetes.io/infra: "" - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/bootstrap - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/infra - operator: Exists - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: In - values: - - amd64 - - arm64 - - ppc64le - - s390x - - key: kubernetes.io/os - operator: In - values: - - linux - containers: - - args: - - --health-probe-bind-address=:8081 - - --metrics-bind-address=127.0.0.1:8080 - - --leader-elect - - --ca-certs-dir=/var/certs - command: - - /manager - image: {{ build_image_name("operator-controller") }} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - name: manager - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - requests: - cpu: 10m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationMessagePolicy: FallbackToLogsOnError - volumeMounts: - - mountPath: /etc/containers/ - name: registries-conf - - mountPath: /var/cache - name: cache - - mountPath: /var/certs/ - name: olmv1-certificate - readOnly: true - - args: - - --secure-listen-address=0.0.0.0:8443 - - --http2-disable - - --upstream=http://127.0.0.1:8080/ - - --logtostderr=true - image: {{ build_image_name("kube-rbac-proxy") }} - name: kube-rbac-proxy - ports: - - containerPort: 8443 - name: https - protocol: TCP - resources: - requests: - cpu: 5m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationMessagePolicy: FallbackToLogsOnError - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - serviceAccountName: operator-controller-controller-manager - terminationGracePeriodSeconds: 10 - volumes: - - name: registries-conf - configMap: - name: registries-conf - - emptyDir: {} - name: cache - - name: olmv1-certificate - secret: - items: - - key: ca.crt - path: olm-ca.crt - optional: false - secretName: olmv1-cert diff --git a/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls b/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls deleted file mode 100644 index 07cf629a03..0000000000 --- a/salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls +++ /dev/null @@ -1,261 +0,0 @@ -#!jinja | metalk8s_kubernetes - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: operator-controller-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: operator-controller-leader-election-role - namespace: olmv1-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: operator-controller-manager-role - namespace: olmv1-system -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - deletecollection - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-clusterextension-editor-role -rules: -- apiGroups: - - olm.operatorframework.io - resources: - - clusterextensions - verbs: - - create - - delete - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-clusterextension-viewer-role -rules: -- apiGroups: - - olm.operatorframework.io - resources: - - clusterextensions - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-extension-editor-role -rules: -- apiGroups: - - olm.operatorframework.io - resources: - - extensions - verbs: - - create - - delete - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-extension-viewer-role -rules: -- apiGroups: - - olm.operatorframework.io - resources: - - extensions - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-manager-role -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts/token - verbs: - - create -- apiGroups: - - olm.operatorframework.io - resources: - - clustercatalogs - verbs: - - get - - list - - watch -- apiGroups: - - olm.operatorframework.io - resources: - - clusterextensions - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - olm.operatorframework.io - resources: - - clusterextensions/finalizers - verbs: - - update -- apiGroups: - - olm.operatorframework.io - resources: - - clusterextensions/status - verbs: - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-metrics-reader -rules: -- nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: operator-controller-proxy-role -rules: -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: operator-controller-leader-election-rolebinding - namespace: olmv1-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: operator-controller-leader-election-role -subjects: -- kind: ServiceAccount - name: operator-controller-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: operator-controller-manager-rolebinding - namespace: olmv1-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: operator-controller-manager-role -subjects: -- kind: ServiceAccount - name: operator-controller-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: operator-controller-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: operator-controller-manager-role -subjects: -- kind: ServiceAccount - name: operator-controller-controller-manager - namespace: olmv1-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: operator-controller-proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: operator-controller-proxy-role -subjects: -- kind: ServiceAccount - name: operator-controller-controller-manager - namespace: olmv1-system diff --git a/salt/metalk8s/deployed/init.sls b/salt/metalk8s/deployed/init.sls index f24dd4ecc8..93c0433521 100644 --- a/salt/metalk8s/deployed/init.sls +++ b/salt/metalk8s/deployed/init.sls @@ -3,8 +3,7 @@ include: - metalk8s.addons.alert-logger.deployed - metalk8s.addons.prometheus-operator.deployed - metalk8s.addons.cert-manager.deployed - - metalk8s.addons.olm.catalogd.deployed - - metalk8s.addons.olm.operator-controller.deployed + - metalk8s.addons.olm.deployed - metalk8s.addons.olm.catalog.deployed - metalk8s.addons.nginx-operator.deployed - metalk8s.addons.nginx-ingress.deployed From 304f6fd0c8ff5617623b6a4c18ed31adee261777 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 14 Jan 2025 16:19:19 +0100 Subject: [PATCH 25/33] salt, buildchain: fix multiline strings in OLM manifests --- olm/render.py | 25 + salt/metalk8s/addons/olm/deployed/chart.sls | 896 ++++++-------------- 2 files changed, 293 insertions(+), 628 deletions(-) diff --git a/olm/render.py b/olm/render.py index 4a112539fd..f243951ba3 100755 --- a/olm/render.py +++ b/olm/render.py @@ -95,7 +95,32 @@ def fixup_certmanager(manifest): doc['metadata']['namespace'] = 'metalk8s-certs' return manifest +class multiline_string(str): + pass + +def represent_multiline_string(dumper, data): + scalar = yaml.SafeDumper.represent_str(dumper, data) + scalar.style = "|" + return scalar + +yaml.SafeDumper.add_representer(multiline_string, represent_multiline_string) + def render(manifest): + def _fix_strings(obj): + if isinstance(obj, dict): + return dict((k, _fix_strings(v)) for (k, v) in obj.items()) + elif isinstance(obj, list): + return [ _fix_strings(elem) for elem in obj ] + elif isinstance(obj, str): + if "\n" in obj: + value = "\n".join( + line for line in obj.splitlines() if not re.match(r"^\s*$", line) + ) + return multiline_string(value) + return obj + else: + return obj + manifest = _fix_strings(manifest) out = START_BLOCK stream = io.StringIO() yaml.safe_dump_all( diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index 02a9fabf41..dc17850e8b 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -52,241 +52,130 @@ spec: name: v1 schema: openAPIV3Schema: - description: 'ClusterCatalog enables users to make File-Based Catalog (FBC) - catalog data available to the cluster. - - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs' + description: |- + ClusterCatalog enables users to make File-Based Catalog (FBC) catalog data available to the cluster. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. - - Servers should convert recognized schemas to the latest internal value, - and - + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. - - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. - - Servers may infer this from the endpoint the client submits requests - to. - + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. Cannot be updated. - In CamelCase. - - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object spec: - description: 'spec is the desired state of the ClusterCatalog. - + description: |- + spec is the desired state of the ClusterCatalog. spec is required. - The controller will work to ensure that the desired - - catalog is unpacked and served over the catalog content HTTP server.' + catalog is unpacked and served over the catalog content HTTP server. properties: availabilityMode: default: Available - description: 'availabilityMode allows users to define how the ClusterCatalog - is made available to clients on the cluster. - + description: |- + availabilityMode allows users to define how the ClusterCatalog is made available to clients on the cluster. availabilityMode is optional. - - Allowed values are "Available" and "Unavailable" and omitted. - - When omitted, the default value is "Available". - - - When set to "Available", the catalog contents will be unpacked and - served over the catalog content HTTP server. - - Setting the availabilityMode to "Available" tells clients that they - should consider this ClusterCatalog - + When set to "Available", the catalog contents will be unpacked and served over the catalog content HTTP server. + Setting the availabilityMode to "Available" tells clients that they should consider this ClusterCatalog and its contents as usable. - - - When set to "Unavailable", the catalog contents will no longer be - served over the catalog content HTTP server. - - When set to this availabilityMode it should be interpreted the same - as the ClusterCatalog not existing. - - Setting the availabilityMode to "Unavailable" can be useful in scenarios - where a user may not want - - to delete the ClusterCatalog all together, but would still like - it to be treated as if it doesn''t exist.' + When set to "Unavailable", the catalog contents will no longer be served over the catalog content HTTP server. + When set to this availabilityMode it should be interpreted the same as the ClusterCatalog not existing. + Setting the availabilityMode to "Unavailable" can be useful in scenarios where a user may not want + to delete the ClusterCatalog all together, but would still like it to be treated as if it doesn't exist. enum: - Unavailable - Available type: string priority: default: 0 - description: 'priority allows the user to define a priority for a - ClusterCatalog. - + description: |- + priority allows the user to define a priority for a ClusterCatalog. priority is optional. - - - A ClusterCatalog''s priority is used by clients as a tie-breaker - between ClusterCatalogs that meet the client''s requirements. - + A ClusterCatalog's priority is used by clients as a tie-breaker between ClusterCatalogs that meet the client's requirements. A higher number means higher priority. - - - It is up to clients to decide how to handle scenarios where multiple - ClusterCatalogs with the same priority meet their requirements. - - When deciding how to break the tie in this scenario, it is recommended - that clients prompt their users for additional input. - - - When omitted, the default priority is 0 because that is the zero - value of integers. - - - Negative numbers can be used to specify a priority lower than the - default. - - Positive numbers can be used to specify a priority higher than the - default. - - + It is up to clients to decide how to handle scenarios where multiple ClusterCatalogs with the same priority meet their requirements. + When deciding how to break the tie in this scenario, it is recommended that clients prompt their users for additional input. + When omitted, the default priority is 0 because that is the zero value of integers. + Negative numbers can be used to specify a priority lower than the default. + Positive numbers can be used to specify a priority higher than the default. The lowest possible value is -2147483648. - - The highest possible value is 2147483647.' + The highest possible value is 2147483647. format: int32 type: integer source: - description: "source allows a user to define the source of a catalog.\n\ - A \"catalog\" contains information on content that can be installed\ - \ on a cluster.\nProviding a catalog source makes the contents of\ - \ the catalog discoverable and usable by\nother on-cluster components.\n\ - These on-cluster components may do a variety of things with this\ - \ information, such as\npresenting the content in a GUI dashboard\ - \ or installing content from the catalog on the cluster.\nThe catalog\ - \ source must contain catalog metadata in the File-Based Catalog\ - \ (FBC) format.\nFor more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs.\n\ - source is a required field.\n\nBelow is a minimal example of a ClusterCatalogSpec\ - \ that sources a catalog from an image:\n\n source:\n type: Image\n\ - \ image:\n ref: quay.io/operatorhubio/catalog:latest" + description: |- + source allows a user to define the source of a catalog. + A "catalog" contains information on content that can be installed on a cluster. + Providing a catalog source makes the contents of the catalog discoverable and usable by + other on-cluster components. + These on-cluster components may do a variety of things with this information, such as + presenting the content in a GUI dashboard or installing content from the catalog on the cluster. + The catalog source must contain catalog metadata in the File-Based Catalog (FBC) format. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs. + source is a required field. + Below is a minimal example of a ClusterCatalogSpec that sources a catalog from an image: + source: + type: Image + image: + ref: quay.io/operatorhubio/catalog:latest properties: image: - description: 'image is used to configure how catalog contents - are sourced from an OCI image. - - This field is required when type is Image, and forbidden otherwise.' + description: |- + image is used to configure how catalog contents are sourced from an OCI image. + This field is required when type is Image, and forbidden otherwise. properties: pollIntervalMinutes: - description: 'pollIntervalMinutes allows the user to set the - interval, in minutes, at which the image source should be - polled for new content. - + description: |- + pollIntervalMinutes allows the user to set the interval, in minutes, at which the image source should be polled for new content. pollIntervalMinutes is optional. - - pollIntervalMinutes can not be specified when ref is a digest-based - reference. - - - When omitted, the image will not be polled for new content.' + pollIntervalMinutes can not be specified when ref is a digest-based reference. + When omitted, the image will not be polled for new content. minimum: 1 type: integer ref: - description: 'ref allows users to define the reference to - a container image containing Catalog contents. - + description: |- + ref allows users to define the reference to a container image containing Catalog contents. ref is required. - ref can not be more than 1000 characters. - - - A reference can be broken down into 3 parts - the domain, - name, and identifier. - - + A reference can be broken down into 3 parts - the domain, name, and identifier. The domain is typically the registry where an image is located. - - It must be alphanumeric characters (lowercase and uppercase) - separated by the "." character. - - Hyphenation is allowed, but the domain must start and end - with alphanumeric characters. - - Specifying a port to use is also allowed by adding the ":" - character followed by numeric values. - + It must be alphanumeric characters (lowercase and uppercase) separated by the "." character. + Hyphenation is allowed, but the domain must start and end with alphanumeric characters. + Specifying a port to use is also allowed by adding the ":" character followed by numeric values. The port must be the last value in the domain. - - Some examples of valid domain values are "registry.mydomain.io", - "quay.io", "my-registry.io:8080". - - - The name is typically the repository in the registry where - an image is located. - - It must contain lowercase alphanumeric characters separated - only by the ".", "_", "__", "-" characters. - + Some examples of valid domain values are "registry.mydomain.io", "quay.io", "my-registry.io:8080". + The name is typically the repository in the registry where an image is located. + It must contain lowercase alphanumeric characters separated only by the ".", "_", "__", "-" characters. Multiple names can be concatenated with the "/" character. - The domain and name are combined using the "/" character. - - Some examples of valid name values are "operatorhubio/catalog", - "catalog", "my-catalog.prod". - - An example of the domain and name parts of a reference being - combined is "quay.io/operatorhubio/catalog". - - - The identifier is typically the tag or digest for an image - reference and is present at the end of the reference. - - It starts with a separator character used to distinguish - the end of the name and beginning of the identifier. - + Some examples of valid name values are "operatorhubio/catalog", "catalog", "my-catalog.prod". + An example of the domain and name parts of a reference being combined is "quay.io/operatorhubio/catalog". + The identifier is typically the tag or digest for an image reference and is present at the end of the reference. + It starts with a separator character used to distinguish the end of the name and beginning of the identifier. For a digest-based reference, the "@" character is the separator. - For a tag-based reference, the ":" character is the separator. - An identifier is required in the reference. - - - Digest-based references must contain an algorithm reference - immediately after the "@" separator. - - The algorithm reference must be followed by the ":" character - and an encoded string. - - The algorithm must start with an uppercase or lowercase - alpha character followed by alphanumeric characters and - may contain the "-", "_", "+", and "." characters. - - Some examples of valid algorithm values are "sha256", "sha256+b64u", - "multihash+base58". - - The encoded string following the algorithm must be hex digits - (a-f, A-F, 0-9) and must be a minimum of 32 characters. - - - Tag-based references must begin with a word character (alphanumeric - + "_") followed by word characters or ".", and "-" characters. - + Digest-based references must contain an algorithm reference immediately after the "@" separator. + The algorithm reference must be followed by the ":" character and an encoded string. + The algorithm must start with an uppercase or lowercase alpha character followed by alphanumeric characters and may contain the "-", "_", "+", and "." characters. + Some examples of valid algorithm values are "sha256", "sha256+b64u", "multihash+base58". + The encoded string following the algorithm must be hex digits (a-f, A-F, 0-9) and must be a minimum of 32 characters. + Tag-based references must begin with a word character (alphanumeric + "_") followed by word characters or ".", and "-" characters. The tag must not be longer than 127 characters. - - An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" - - An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest"' + An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest" maxLength: 1000 type: string x-kubernetes-validations: @@ -336,20 +225,12 @@ spec: rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) : true' type: - description: 'type is a reference to the type of source the catalog - is sourced from. - + description: |- + type is a reference to the type of source the catalog is sourced from. type is required. - - The only allowed value is "Image". - - - When set to "Image", the ClusterCatalog content will be sourced - from an OCI image. - - When using an image source, the image field must be set and - must be the only field defined for this type.' + When set to "Image", the ClusterCatalog content will be sourced from an OCI image. + When using an image source, the image field must be set and must be the only field defined for this type. enum: - Image type: string @@ -365,106 +246,59 @@ spec: - source type: object status: - description: "status contains information about the state of the ClusterCatalog\ - \ such as:\n - Whether or not the catalog contents are being served\ - \ via the catalog content HTTP server\n - Whether or not the ClusterCatalog\ - \ is progressing to a new state\n - A reference to the source from\ - \ which the catalog contents were retrieved" + description: |- + status contains information about the state of the ClusterCatalog such as: + - Whether or not the catalog contents are being served via the catalog content HTTP server + - Whether or not the ClusterCatalog is progressing to a new state + - A reference to the source from which the catalog contents were retrieved properties: conditions: - description: 'conditions is a representation of the current state - for this ClusterCatalog. - - + description: |- + conditions is a representation of the current state for this ClusterCatalog. The current condition types are Serving and Progressing. - - - The Serving condition is used to represent whether or not the contents - of the catalog is being served via the HTTP(S) web server. - - When it has a status of True and a reason of Available, the contents - of the catalog are being served. - - When it has a status of False and a reason of Unavailable, the contents - of the catalog are not being served because the contents are not - yet available. - - When it has a status of False and a reason of UserSpecifiedUnavailable, - the contents of the catalog are not being served because the catalog - has been intentionally marked as unavailable. - - - The Progressing condition is used to represent whether or not the - ClusterCatalog is progressing or is ready to progress towards a - new state. - - When it has a status of True and a reason of Retrying, there was - an error in the progression of the ClusterCatalog that may be resolved - on subsequent reconciliation attempts. - - When it has a status of True and a reason of Succeeded, the ClusterCatalog - has successfully progressed to a new state and is ready to continue - progressing. - - When it has a status of False and a reason of Blocked, there was - an error in the progression of the ClusterCatalog that requires - manual intervention for recovery. - - - In the case that the Serving condition is True with reason Available - and Progressing is True with reason Retrying, the previously fetched - - catalog contents are still being served via the HTTP(S) web server - while we are progressing towards serving a new version of the catalog - - contents. This could occur when we''ve initially fetched the latest - contents from the source for this catalog and when polling for changes - - to the contents we identify that there are updates to the contents.' + The Serving condition is used to represent whether or not the contents of the catalog is being served via the HTTP(S) web server. + When it has a status of True and a reason of Available, the contents of the catalog are being served. + When it has a status of False and a reason of Unavailable, the contents of the catalog are not being served because the contents are not yet available. + When it has a status of False and a reason of UserSpecifiedUnavailable, the contents of the catalog are not being served because the catalog has been intentionally marked as unavailable. + The Progressing condition is used to represent whether or not the ClusterCatalog is progressing or is ready to progress towards a new state. + When it has a status of True and a reason of Retrying, there was an error in the progression of the ClusterCatalog that may be resolved on subsequent reconciliation attempts. + When it has a status of True and a reason of Succeeded, the ClusterCatalog has successfully progressed to a new state and is ready to continue progressing. + When it has a status of False and a reason of Blocked, there was an error in the progression of the ClusterCatalog that requires manual intervention for recovery. + In the case that the Serving condition is True with reason Available and Progressing is True with reason Retrying, the previously fetched + catalog contents are still being served via the HTTP(S) web server while we are progressing towards serving a new version of the catalog + contents. This could occur when we've initially fetched the latest contents from the source for this catalog and when polling for changes + to the contents we identify that there are updates to the contents. items: description: Condition contains details for one aspect of the current state of this API Resource. properties: lastTransitionTime: - description: 'lastTransitionTime is the last time the condition - transitioned from one status to another. - - This should be when the underlying condition changed. If - that is not known, then using the time when the API field - changed is acceptable.' + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: 'message is a human readable message indicating - details about the transition. - - This may be an empty string.' + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: 'observedGeneration represents the .metadata.generation - that the condition was set based upon. - - For instance, if .metadata.generation is currently 12, but - the .status.conditions[x].observedGeneration is 9, the condition - is out of date - - with respect to the current state of the instance.' + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: 'reason contains a programmatic identifier indicating - the reason for the condition''s last transition. - - Producers of specific condition types may define expected - values and meanings for this field, - + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - - This field may not be empty.' + This field may not be empty. maxLength: 1024 minLength: 1 pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ @@ -493,17 +327,12 @@ spec: - type x-kubernetes-list-type: map lastUnpacked: - description: 'lastUnpacked represents the last time the contents of - the - + description: |- + lastUnpacked represents the last time the contents of the catalog were extracted from their source format. As an example, - when using an Image source, the OCI image will be pulled and the - - image layers written to a file-system backed cache. We refer to - the - - act of this extraction from the source format as "unpacking".' + image layers written to a file-system backed cache. We refer to the + act of this extraction from the source format as "unpacking". format: date-time type: string resolvedSource: @@ -511,19 +340,15 @@ spec: source based on the source type. properties: image: - description: 'image is a field containing resolution information - for a catalog sourced from an image. - - This field must be set when type is Image, and forbidden otherwise.' + description: |- + image is a field containing resolution information for a catalog sourced from an image. + This field must be set when type is Image, and forbidden otherwise. properties: ref: - description: 'ref contains the resolved image digest-based - reference. - - The digest format is used so users can use other tooling - to fetch the exact - - OCI manifests that were used to extract the catalog contents.' + description: |- + ref contains the resolved image digest-based reference. + The digest format is used so users can use other tooling to fetch the exact + OCI manifests that were used to extract the catalog contents. maxLength: 1000 type: string x-kubernetes-validations: @@ -556,17 +381,11 @@ spec: - ref type: object type: - description: 'type is a reference to the type of source the catalog - is sourced from. - + description: |- + type is a reference to the type of source the catalog is sourced from. type is required. - - The only allowed value is "Image". - - - When set to "Image", information about the resolved image source - will be set in the ''image'' field.' + When set to "Image", information about the resolved image source will be set in the 'image' field. enum: - Image type: string @@ -584,15 +403,16 @@ spec: catalog. properties: base: - description: "base is a cluster-internal URL that provides endpoints\ - \ for\naccessing the content of the catalog.\n\nIt is expected\ - \ that clients append the path for the endpoint they wish\n\ - to access.\n\nCurrently, only a single endpoint is served and\ - \ is accessible at the path\n/api/v1.\n\nThe endpoints served\ - \ for the v1 API are:\n - /all - this endpoint returns the\ - \ entirety of the catalog contents in the FBC format\n\nAs the\ - \ needs of users and clients of the evolve, new endpoints may\ - \ be added." + description: |- + base is a cluster-internal URL that provides endpoints for + accessing the content of the catalog. + It is expected that clients append the path for the endpoint they wish + to access. + Currently, only a single endpoint is served and is accessible at the path + /api/v1. + The endpoints served for the v1 API are: + - /all - this endpoint returns the entirety of the catalog contents in the FBC format + As the needs of users and clients of the evolve, new endpoints may be added. maxLength: 525 type: string x-kubernetes-validations: @@ -1102,241 +922,130 @@ spec: name: v1 schema: openAPIV3Schema: - description: 'ClusterCatalog enables users to make File-Based Catalog (FBC) - catalog data available to the cluster. - - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs' + description: |- + ClusterCatalog enables users to make File-Based Catalog (FBC) catalog data available to the cluster. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. - - Servers should convert recognized schemas to the latest internal value, - and - + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. - - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. - - Servers may infer this from the endpoint the client submits requests - to. - + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. Cannot be updated. - In CamelCase. - - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object spec: - description: 'spec is the desired state of the ClusterCatalog. - + description: |- + spec is the desired state of the ClusterCatalog. spec is required. - The controller will work to ensure that the desired - - catalog is unpacked and served over the catalog content HTTP server.' + catalog is unpacked and served over the catalog content HTTP server. properties: availabilityMode: default: Available - description: 'availabilityMode allows users to define how the ClusterCatalog - is made available to clients on the cluster. - + description: |- + availabilityMode allows users to define how the ClusterCatalog is made available to clients on the cluster. availabilityMode is optional. - - Allowed values are "Available" and "Unavailable" and omitted. - - When omitted, the default value is "Available". - - - When set to "Available", the catalog contents will be unpacked and - served over the catalog content HTTP server. - - Setting the availabilityMode to "Available" tells clients that they - should consider this ClusterCatalog - + When set to "Available", the catalog contents will be unpacked and served over the catalog content HTTP server. + Setting the availabilityMode to "Available" tells clients that they should consider this ClusterCatalog and its contents as usable. - - - When set to "Unavailable", the catalog contents will no longer be - served over the catalog content HTTP server. - - When set to this availabilityMode it should be interpreted the same - as the ClusterCatalog not existing. - - Setting the availabilityMode to "Unavailable" can be useful in scenarios - where a user may not want - - to delete the ClusterCatalog all together, but would still like - it to be treated as if it doesn''t exist.' + When set to "Unavailable", the catalog contents will no longer be served over the catalog content HTTP server. + When set to this availabilityMode it should be interpreted the same as the ClusterCatalog not existing. + Setting the availabilityMode to "Unavailable" can be useful in scenarios where a user may not want + to delete the ClusterCatalog all together, but would still like it to be treated as if it doesn't exist. enum: - Unavailable - Available type: string priority: default: 0 - description: 'priority allows the user to define a priority for a - ClusterCatalog. - + description: |- + priority allows the user to define a priority for a ClusterCatalog. priority is optional. - - - A ClusterCatalog''s priority is used by clients as a tie-breaker - between ClusterCatalogs that meet the client''s requirements. - + A ClusterCatalog's priority is used by clients as a tie-breaker between ClusterCatalogs that meet the client's requirements. A higher number means higher priority. - - - It is up to clients to decide how to handle scenarios where multiple - ClusterCatalogs with the same priority meet their requirements. - - When deciding how to break the tie in this scenario, it is recommended - that clients prompt their users for additional input. - - - When omitted, the default priority is 0 because that is the zero - value of integers. - - - Negative numbers can be used to specify a priority lower than the - default. - - Positive numbers can be used to specify a priority higher than the - default. - - + It is up to clients to decide how to handle scenarios where multiple ClusterCatalogs with the same priority meet their requirements. + When deciding how to break the tie in this scenario, it is recommended that clients prompt their users for additional input. + When omitted, the default priority is 0 because that is the zero value of integers. + Negative numbers can be used to specify a priority lower than the default. + Positive numbers can be used to specify a priority higher than the default. The lowest possible value is -2147483648. - - The highest possible value is 2147483647.' + The highest possible value is 2147483647. format: int32 type: integer source: - description: "source allows a user to define the source of a catalog.\n\ - A \"catalog\" contains information on content that can be installed\ - \ on a cluster.\nProviding a catalog source makes the contents of\ - \ the catalog discoverable and usable by\nother on-cluster components.\n\ - These on-cluster components may do a variety of things with this\ - \ information, such as\npresenting the content in a GUI dashboard\ - \ or installing content from the catalog on the cluster.\nThe catalog\ - \ source must contain catalog metadata in the File-Based Catalog\ - \ (FBC) format.\nFor more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs.\n\ - source is a required field.\n\nBelow is a minimal example of a ClusterCatalogSpec\ - \ that sources a catalog from an image:\n\n source:\n type: Image\n\ - \ image:\n ref: quay.io/operatorhubio/catalog:latest" + description: |- + source allows a user to define the source of a catalog. + A "catalog" contains information on content that can be installed on a cluster. + Providing a catalog source makes the contents of the catalog discoverable and usable by + other on-cluster components. + These on-cluster components may do a variety of things with this information, such as + presenting the content in a GUI dashboard or installing content from the catalog on the cluster. + The catalog source must contain catalog metadata in the File-Based Catalog (FBC) format. + For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs. + source is a required field. + Below is a minimal example of a ClusterCatalogSpec that sources a catalog from an image: + source: + type: Image + image: + ref: quay.io/operatorhubio/catalog:latest properties: image: - description: 'image is used to configure how catalog contents - are sourced from an OCI image. - - This field is required when type is Image, and forbidden otherwise.' + description: |- + image is used to configure how catalog contents are sourced from an OCI image. + This field is required when type is Image, and forbidden otherwise. properties: pollIntervalMinutes: - description: 'pollIntervalMinutes allows the user to set the - interval, in minutes, at which the image source should be - polled for new content. - + description: |- + pollIntervalMinutes allows the user to set the interval, in minutes, at which the image source should be polled for new content. pollIntervalMinutes is optional. - - pollIntervalMinutes can not be specified when ref is a digest-based - reference. - - - When omitted, the image will not be polled for new content.' + pollIntervalMinutes can not be specified when ref is a digest-based reference. + When omitted, the image will not be polled for new content. minimum: 1 type: integer ref: - description: 'ref allows users to define the reference to - a container image containing Catalog contents. - + description: |- + ref allows users to define the reference to a container image containing Catalog contents. ref is required. - ref can not be more than 1000 characters. - - - A reference can be broken down into 3 parts - the domain, - name, and identifier. - - + A reference can be broken down into 3 parts - the domain, name, and identifier. The domain is typically the registry where an image is located. - - It must be alphanumeric characters (lowercase and uppercase) - separated by the "." character. - - Hyphenation is allowed, but the domain must start and end - with alphanumeric characters. - - Specifying a port to use is also allowed by adding the ":" - character followed by numeric values. - + It must be alphanumeric characters (lowercase and uppercase) separated by the "." character. + Hyphenation is allowed, but the domain must start and end with alphanumeric characters. + Specifying a port to use is also allowed by adding the ":" character followed by numeric values. The port must be the last value in the domain. - - Some examples of valid domain values are "registry.mydomain.io", - "quay.io", "my-registry.io:8080". - - - The name is typically the repository in the registry where - an image is located. - - It must contain lowercase alphanumeric characters separated - only by the ".", "_", "__", "-" characters. - + Some examples of valid domain values are "registry.mydomain.io", "quay.io", "my-registry.io:8080". + The name is typically the repository in the registry where an image is located. + It must contain lowercase alphanumeric characters separated only by the ".", "_", "__", "-" characters. Multiple names can be concatenated with the "/" character. - The domain and name are combined using the "/" character. - - Some examples of valid name values are "operatorhubio/catalog", - "catalog", "my-catalog.prod". - - An example of the domain and name parts of a reference being - combined is "quay.io/operatorhubio/catalog". - - - The identifier is typically the tag or digest for an image - reference and is present at the end of the reference. - - It starts with a separator character used to distinguish - the end of the name and beginning of the identifier. - + Some examples of valid name values are "operatorhubio/catalog", "catalog", "my-catalog.prod". + An example of the domain and name parts of a reference being combined is "quay.io/operatorhubio/catalog". + The identifier is typically the tag or digest for an image reference and is present at the end of the reference. + It starts with a separator character used to distinguish the end of the name and beginning of the identifier. For a digest-based reference, the "@" character is the separator. - For a tag-based reference, the ":" character is the separator. - An identifier is required in the reference. - - - Digest-based references must contain an algorithm reference - immediately after the "@" separator. - - The algorithm reference must be followed by the ":" character - and an encoded string. - - The algorithm must start with an uppercase or lowercase - alpha character followed by alphanumeric characters and - may contain the "-", "_", "+", and "." characters. - - Some examples of valid algorithm values are "sha256", "sha256+b64u", - "multihash+base58". - - The encoded string following the algorithm must be hex digits - (a-f, A-F, 0-9) and must be a minimum of 32 characters. - - - Tag-based references must begin with a word character (alphanumeric - + "_") followed by word characters or ".", and "-" characters. - + Digest-based references must contain an algorithm reference immediately after the "@" separator. + The algorithm reference must be followed by the ":" character and an encoded string. + The algorithm must start with an uppercase or lowercase alpha character followed by alphanumeric characters and may contain the "-", "_", "+", and "." characters. + Some examples of valid algorithm values are "sha256", "sha256+b64u", "multihash+base58". + The encoded string following the algorithm must be hex digits (a-f, A-F, 0-9) and must be a minimum of 32 characters. + Tag-based references must begin with a word character (alphanumeric + "_") followed by word characters or ".", and "-" characters. The tag must not be longer than 127 characters. - - An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" - - An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest"' + An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest" maxLength: 1000 type: string x-kubernetes-validations: @@ -1386,20 +1095,12 @@ spec: rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) : true' type: - description: 'type is a reference to the type of source the catalog - is sourced from. - + description: |- + type is a reference to the type of source the catalog is sourced from. type is required. - - The only allowed value is "Image". - - - When set to "Image", the ClusterCatalog content will be sourced - from an OCI image. - - When using an image source, the image field must be set and - must be the only field defined for this type.' + When set to "Image", the ClusterCatalog content will be sourced from an OCI image. + When using an image source, the image field must be set and must be the only field defined for this type. enum: - Image type: string @@ -1415,106 +1116,59 @@ spec: - source type: object status: - description: "status contains information about the state of the ClusterCatalog\ - \ such as:\n - Whether or not the catalog contents are being served\ - \ via the catalog content HTTP server\n - Whether or not the ClusterCatalog\ - \ is progressing to a new state\n - A reference to the source from\ - \ which the catalog contents were retrieved" + description: |- + status contains information about the state of the ClusterCatalog such as: + - Whether or not the catalog contents are being served via the catalog content HTTP server + - Whether or not the ClusterCatalog is progressing to a new state + - A reference to the source from which the catalog contents were retrieved properties: conditions: - description: 'conditions is a representation of the current state - for this ClusterCatalog. - - + description: |- + conditions is a representation of the current state for this ClusterCatalog. The current condition types are Serving and Progressing. - - - The Serving condition is used to represent whether or not the contents - of the catalog is being served via the HTTP(S) web server. - - When it has a status of True and a reason of Available, the contents - of the catalog are being served. - - When it has a status of False and a reason of Unavailable, the contents - of the catalog are not being served because the contents are not - yet available. - - When it has a status of False and a reason of UserSpecifiedUnavailable, - the contents of the catalog are not being served because the catalog - has been intentionally marked as unavailable. - - - The Progressing condition is used to represent whether or not the - ClusterCatalog is progressing or is ready to progress towards a - new state. - - When it has a status of True and a reason of Retrying, there was - an error in the progression of the ClusterCatalog that may be resolved - on subsequent reconciliation attempts. - - When it has a status of True and a reason of Succeeded, the ClusterCatalog - has successfully progressed to a new state and is ready to continue - progressing. - - When it has a status of False and a reason of Blocked, there was - an error in the progression of the ClusterCatalog that requires - manual intervention for recovery. - - - In the case that the Serving condition is True with reason Available - and Progressing is True with reason Retrying, the previously fetched - - catalog contents are still being served via the HTTP(S) web server - while we are progressing towards serving a new version of the catalog - - contents. This could occur when we''ve initially fetched the latest - contents from the source for this catalog and when polling for changes - - to the contents we identify that there are updates to the contents.' + The Serving condition is used to represent whether or not the contents of the catalog is being served via the HTTP(S) web server. + When it has a status of True and a reason of Available, the contents of the catalog are being served. + When it has a status of False and a reason of Unavailable, the contents of the catalog are not being served because the contents are not yet available. + When it has a status of False and a reason of UserSpecifiedUnavailable, the contents of the catalog are not being served because the catalog has been intentionally marked as unavailable. + The Progressing condition is used to represent whether or not the ClusterCatalog is progressing or is ready to progress towards a new state. + When it has a status of True and a reason of Retrying, there was an error in the progression of the ClusterCatalog that may be resolved on subsequent reconciliation attempts. + When it has a status of True and a reason of Succeeded, the ClusterCatalog has successfully progressed to a new state and is ready to continue progressing. + When it has a status of False and a reason of Blocked, there was an error in the progression of the ClusterCatalog that requires manual intervention for recovery. + In the case that the Serving condition is True with reason Available and Progressing is True with reason Retrying, the previously fetched + catalog contents are still being served via the HTTP(S) web server while we are progressing towards serving a new version of the catalog + contents. This could occur when we've initially fetched the latest contents from the source for this catalog and when polling for changes + to the contents we identify that there are updates to the contents. items: description: Condition contains details for one aspect of the current state of this API Resource. properties: lastTransitionTime: - description: 'lastTransitionTime is the last time the condition - transitioned from one status to another. - - This should be when the underlying condition changed. If - that is not known, then using the time when the API field - changed is acceptable.' + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. format: date-time type: string message: - description: 'message is a human readable message indicating - details about the transition. - - This may be an empty string.' + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. maxLength: 32768 type: string observedGeneration: - description: 'observedGeneration represents the .metadata.generation - that the condition was set based upon. - - For instance, if .metadata.generation is currently 12, but - the .status.conditions[x].observedGeneration is 9, the condition - is out of date - - with respect to the current state of the instance.' + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. format: int64 minimum: 0 type: integer reason: - description: 'reason contains a programmatic identifier indicating - the reason for the condition''s last transition. - - Producers of specific condition types may define expected - values and meanings for this field, - + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - - This field may not be empty.' + This field may not be empty. maxLength: 1024 minLength: 1 pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ @@ -1543,17 +1197,12 @@ spec: - type x-kubernetes-list-type: map lastUnpacked: - description: 'lastUnpacked represents the last time the contents of - the - + description: |- + lastUnpacked represents the last time the contents of the catalog were extracted from their source format. As an example, - when using an Image source, the OCI image will be pulled and the - - image layers written to a file-system backed cache. We refer to - the - - act of this extraction from the source format as "unpacking".' + image layers written to a file-system backed cache. We refer to the + act of this extraction from the source format as "unpacking". format: date-time type: string resolvedSource: @@ -1561,19 +1210,15 @@ spec: source based on the source type. properties: image: - description: 'image is a field containing resolution information - for a catalog sourced from an image. - - This field must be set when type is Image, and forbidden otherwise.' + description: |- + image is a field containing resolution information for a catalog sourced from an image. + This field must be set when type is Image, and forbidden otherwise. properties: ref: - description: 'ref contains the resolved image digest-based - reference. - - The digest format is used so users can use other tooling - to fetch the exact - - OCI manifests that were used to extract the catalog contents.' + description: |- + ref contains the resolved image digest-based reference. + The digest format is used so users can use other tooling to fetch the exact + OCI manifests that were used to extract the catalog contents. maxLength: 1000 type: string x-kubernetes-validations: @@ -1606,17 +1251,11 @@ spec: - ref type: object type: - description: 'type is a reference to the type of source the catalog - is sourced from. - + description: |- + type is a reference to the type of source the catalog is sourced from. type is required. - - The only allowed value is "Image". - - - When set to "Image", information about the resolved image source - will be set in the ''image'' field.' + When set to "Image", information about the resolved image source will be set in the 'image' field. enum: - Image type: string @@ -1634,15 +1273,16 @@ spec: catalog. properties: base: - description: "base is a cluster-internal URL that provides endpoints\ - \ for\naccessing the content of the catalog.\n\nIt is expected\ - \ that clients append the path for the endpoint they wish\n\ - to access.\n\nCurrently, only a single endpoint is served and\ - \ is accessible at the path\n/api/v1.\n\nThe endpoints served\ - \ for the v1 API are:\n - /all - this endpoint returns the\ - \ entirety of the catalog contents in the FBC format\n\nAs the\ - \ needs of users and clients of the evolve, new endpoints may\ - \ be added." + description: |- + base is a cluster-internal URL that provides endpoints for + accessing the content of the catalog. + It is expected that clients append the path for the endpoint they wish + to access. + Currently, only a single endpoint is served and is accessible at the path + /api/v1. + The endpoints served for the v1 API are: + - /all - this endpoint returns the entirety of the catalog contents in the FBC format + As the needs of users and clients of the evolve, new endpoints may be added. maxLength: 525 type: string x-kubernetes-validations: From 3dd4f768f5bc2bd48ce4d885e0b90a83badf7ddb Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Tue, 14 Jan 2025 16:35:24 +0100 Subject: [PATCH 26/33] fix salt-tree --- buildchain/buildchain/salt_tree.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/buildchain/buildchain/salt_tree.py b/buildchain/buildchain/salt_tree.py index 444450d679..600e978d0c 100644 --- a/buildchain/buildchain/salt_tree.py +++ b/buildchain/buildchain/salt_tree.py @@ -350,22 +350,8 @@ def task(self) -> types.TaskDict: Path("salt/metalk8s/addons/nginx-operator/deployed/rbac.sls"), Path("salt/metalk8s/addons/olm/catalog/deployed/cluster-catalog.sls"), Path("salt/metalk8s/addons/olm/catalog/deployed/init.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/catalogd.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/cert.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/crds.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/init.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/rbac.sls"), - Path("salt/metalk8s/addons/olm/catalogd/deployed/webhook.sls"), - Path("salt/metalk8s/addons/olm/common/deployed/cert.sls"), - Path("salt/metalk8s/addons/olm/common/deployed/init.sls"), - Path("salt/metalk8s/addons/olm/common/deployed/namespace.sls"), - Path("salt/metalk8s/addons/olm/operator-controller/deployed/cert.sls"), - Path("salt/metalk8s/addons/olm/operator-controller/deployed/crds.sls"), - Path("salt/metalk8s/addons/olm/operator-controller/deployed/init.sls"), - Path( - "salt/metalk8s/addons/olm/operator-controller/deployed/operator-controller.sls" - ), - Path("salt/metalk8s/addons/olm/operator-controller/deployed/rbac.sls"), + Path("salt/metalk8s/addons/olm/deployed/chart.sls"), + Path("salt/metalk8s/addons/olm/deployed/init.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/chart.sls"), Path("salt/metalk8s/addons/prometheus-adapter/deployed/init.sls"), Path("salt/metalk8s/addons/prometheus-operator/macros.j2"), From 9d7974f1348ea3dee409651c4411c2a45671e993 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Wed, 15 Jan 2025 09:45:33 +0100 Subject: [PATCH 27/33] fix salt renderer on olm manifest sls --- olm/render.py | 10 +++++----- salt/metalk8s/addons/olm/deployed/chart.sls | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/olm/render.py b/olm/render.py index f243951ba3..a2f1c9850f 100755 --- a/olm/render.py +++ b/olm/render.py @@ -27,14 +27,14 @@ START_BLOCK = """ #!jinja | metalk8s_kubernetes -{{%- from "metalk8s/map.jinja" import repo with context %}} -{{%- from "metalk8s/repo/macro.sls" import build_image_name with context %}} +{%- from "metalk8s/map.jinja" import repo with context %} +{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} -{{% raw %}} +{% raw %} """ END_BLOCK = """ -{{% endraw %}} +{% endraw %} """ class DownloadError(Exception): @@ -121,7 +121,7 @@ def _fix_strings(obj): else: return obj manifest = _fix_strings(manifest) - out = START_BLOCK + out = START_BLOCK.lstrip() stream = io.StringIO() yaml.safe_dump_all( manifest, diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index dc17850e8b..3b8a22c0c2 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -1,10 +1,9 @@ - #!jinja | metalk8s_kubernetes -{{%- from "metalk8s/map.jinja" import repo with context %}} -{{%- from "metalk8s/repo/macro.sls" import build_image_name with context %}} +{%- from "metalk8s/map.jinja" import repo with context %} +{%- from "metalk8s/repo/macro.sls" import build_image_name with context %} -{{% raw %}} +{% raw %} apiVersion: v1 kind: Namespace metadata: @@ -1704,4 +1703,4 @@ webhooks: sideEffects: None timeoutSeconds: 10 -{{% endraw %}} +{% endraw %} From d57aad19376e1e0455f19b06a27241b8f44fac3a Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 16 Jan 2025 10:17:45 +0100 Subject: [PATCH 28/33] fix olm render merge step --- olm/render.py | 38 +- salt/metalk8s/addons/olm/deployed/chart.sls | 1010 ++++++++++++------- 2 files changed, 658 insertions(+), 390 deletions(-) diff --git a/olm/render.py b/olm/render.py index a2f1c9850f..e8d80317f7 100755 --- a/olm/render.py +++ b/olm/render.py @@ -74,8 +74,8 @@ def _dict_merge(src, dst): _dict_merge(sdoc, ddoc) if not found: to_add.append(sdoc) - source.extend(to_add) - return source + destination.extend(to_add) + return destination def add_labels(manifest, version): for doc in manifest: @@ -88,6 +88,33 @@ def add_labels(manifest, version): }) return manifest +def add_tolerations(manifest): + for doc in manifest: + print(f"fixing up {doc['metadata']['name']}") + if doc['kind'] == "Deployment": + doc['spec']['template']['spec'].setdefault('tolerations', []).extend([ + { + "key": "node-role.kubernetes.io/bootstrap", + "operator": "Exists", + "effect": "NoSchedule", + }, + { + "key": "node-role.kubernetes.io/infra", + "operator": "Exists", + "effect": "NoSchedule", + }, + ]) + return manifest + +def add_node_selector(manifest): + for doc in manifest: + if doc['kind'] == "Deployment": + doc['spec']['template']['spec'].setdefault('nodeSelector', {}).update({ + "kubernetes.io/os": "linux", + "node-role.kubernetes.io/infra": "", + }) + return manifest + def fixup_certmanager(manifest): for doc in manifest: if doc['apiVersion'] == "cert-manager.io/v1" and \ @@ -148,13 +175,18 @@ def main(): # 1.5 - interpret yaml controller = list(yaml.safe_load_all(controller_manifest)) + print(len(controller)) catalogd = list(yaml.safe_load_all(catalogd_manifest)) + print(len(catalogd)) # 2 - merge manifests manifest = merge(catalogd, controller) + print(len(manifest)) - # 3- add labels where needed + # 3- add labels, tolerations, nodeSelector manifest = add_labels(manifest, args.version) + manifest = add_tolerations(manifest) + manifest = add_node_selector(manifest) # 4- Fix cert-manager objects manifest = fixup_certmanager(manifest) diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index 3b8a22c0c2..8cf8e76a38 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -28,22 +28,28 @@ metadata: app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: clustercatalogs.olm.operatorframework.io + name: clusterextensions.olm.operatorframework.io spec: group: olm.operatorframework.io names: - kind: ClusterCatalog - listKind: ClusterCatalogList - plural: clustercatalogs - singular: clustercatalog + kind: ClusterExtension + listKind: ClusterExtensionList + plural: clusterextensions + singular: clusterextension scope: Cluster versions: - additionalPrinterColumns: - - jsonPath: .status.lastUnpacked - name: LastUnpacked - type: date - - jsonPath: .status.conditions[?(@.type=="Serving")].status - name: Serving + - jsonPath: .status.install.bundle.name + name: Installed Bundle + type: string + - jsonPath: .status.install.bundle.version + name: Version + type: string + - jsonPath: .status.conditions[?(@.type=='Installed')].status + name: Installed + type: string + - jsonPath: .status.conditions[?(@.type=='Progressing')].status + name: Progressing type: string - jsonPath: .metadata.creationTimestamp name: Age @@ -51,9 +57,7 @@ spec: name: v1 schema: openAPIV3Schema: - description: |- - ClusterCatalog enables users to make File-Based Catalog (FBC) catalog data available to the cluster. - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs + description: ClusterExtension is the Schema for the clusterextensions API properties: apiVersion: description: |- @@ -73,200 +77,386 @@ spec: metadata: type: object spec: - description: |- - spec is the desired state of the ClusterCatalog. - spec is required. - The controller will work to ensure that the desired - catalog is unpacked and served over the catalog content HTTP server. + description: spec is an optional field that defines the desired state + of the ClusterExtension. properties: - availabilityMode: - default: Available + install: description: |- - availabilityMode allows users to define how the ClusterCatalog is made available to clients on the cluster. - availabilityMode is optional. - Allowed values are "Available" and "Unavailable" and omitted. - When omitted, the default value is "Available". - When set to "Available", the catalog contents will be unpacked and served over the catalog content HTTP server. - Setting the availabilityMode to "Available" tells clients that they should consider this ClusterCatalog - and its contents as usable. - When set to "Unavailable", the catalog contents will no longer be served over the catalog content HTTP server. - When set to this availabilityMode it should be interpreted the same as the ClusterCatalog not existing. - Setting the availabilityMode to "Unavailable" can be useful in scenarios where a user may not want - to delete the ClusterCatalog all together, but would still like it to be treated as if it doesn't exist. - enum: - - Unavailable - - Available + install is an optional field used to configure the installation options + for the ClusterExtension such as the pre-flight check configuration. + properties: + preflight: + description: |- + preflight is an optional field that can be used to configure the checks that are + run before installation or upgrade of the content for the package specified in the packageName field. + When specified, it replaces the default preflight configuration for install/upgrade actions. + When not specified, the default configuration will be used. + properties: + crdUpgradeSafety: + description: |- + crdUpgradeSafety is used to configure the CRD Upgrade Safety pre-flight + checks that run prior to upgrades of installed content. + The CRD Upgrade Safety pre-flight check safeguards from unintended + consequences of upgrading a CRD, such as data loss. + properties: + enforcement: + description: |- + enforcement is a required field, used to configure the state of the CRD Upgrade Safety pre-flight check. + Allowed values are "None" or "Strict". The default value is "Strict". + When set to "None", the CRD Upgrade Safety pre-flight check will be skipped + when performing an upgrade operation. This should be used with caution as + unintended consequences such as data loss can occur. + When set to "Strict", the CRD Upgrade Safety pre-flight check will be run when + performing an upgrade operation. + enum: + - None + - Strict + type: string + required: + - enforcement + type: object + required: + - crdUpgradeSafety + type: object + x-kubernetes-validations: + - message: at least one of [crdUpgradeSafety] are required when + preflight is specified + rule: has(self.crdUpgradeSafety) + type: object + x-kubernetes-validations: + - message: at least one of [preflight] are required when install is + specified + rule: has(self.preflight) + namespace: + description: |- + namespace is a reference to a Kubernetes namespace. + This is the namespace in which the provided ServiceAccount must exist. + It also designates the default namespace where namespace-scoped resources + for the extension are applied to the cluster. + Some extensions may contain namespace-scoped resources to be applied in other namespaces. + This namespace must exist. + namespace is required, immutable, and follows the DNS label standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters or hyphens (-), + start and end with an alphanumeric character, and be no longer than 63 characters + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 63 type: string - priority: - default: 0 + x-kubernetes-validations: + - message: namespace is immutable + rule: self == oldSelf + - message: namespace must be a valid DNS1123 label + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") + serviceAccount: description: |- - priority allows the user to define a priority for a ClusterCatalog. - priority is optional. - A ClusterCatalog's priority is used by clients as a tie-breaker between ClusterCatalogs that meet the client's requirements. - A higher number means higher priority. - It is up to clients to decide how to handle scenarios where multiple ClusterCatalogs with the same priority meet their requirements. - When deciding how to break the tie in this scenario, it is recommended that clients prompt their users for additional input. - When omitted, the default priority is 0 because that is the zero value of integers. - Negative numbers can be used to specify a priority lower than the default. - Positive numbers can be used to specify a priority higher than the default. - The lowest possible value is -2147483648. - The highest possible value is 2147483647. - format: int32 - type: integer + serviceAccount is a reference to a ServiceAccount used to perform all interactions + with the cluster that are required to manage the extension. + The ServiceAccount must be configured with the necessary permissions to perform these interactions. + The ServiceAccount must exist in the namespace referenced in the spec. + serviceAccount is required. + properties: + name: + description: |- + name is a required, immutable reference to the name of the ServiceAccount + to be used for installation and management of the content for the package + specified in the packageName field. + This ServiceAccount must exist in the installNamespace. + name follows the DNS subdomain standard as defined in [RFC 1123]. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + Some examples of valid values are: + - some-serviceaccount + - 123-serviceaccount + - 1-serviceaccount-2 + - someserviceaccount + - some.serviceaccount + Some examples of invalid values are: + - -some-serviceaccount + - some-serviceaccount- + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 253 + type: string + x-kubernetes-validations: + - message: name is immutable + rule: self == oldSelf + - message: name must be a valid DNS1123 subdomain. It must contain + only lowercase alphanumeric characters, hyphens (-) or periods + (.), start and end with an alphanumeric character, and be + no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + required: + - name + type: object source: description: |- - source allows a user to define the source of a catalog. - A "catalog" contains information on content that can be installed on a cluster. - Providing a catalog source makes the contents of the catalog discoverable and usable by - other on-cluster components. - These on-cluster components may do a variety of things with this information, such as - presenting the content in a GUI dashboard or installing content from the catalog on the cluster. - The catalog source must contain catalog metadata in the File-Based Catalog (FBC) format. - For more information on FBC, see https://olm.operatorframework.io/docs/reference/file-based-catalogs/#docs. - source is a required field. - Below is a minimal example of a ClusterCatalogSpec that sources a catalog from an image: - source: - type: Image - image: - ref: quay.io/operatorhubio/catalog:latest + source is a required field which selects the installation source of content + for this ClusterExtension. Selection is performed by setting the sourceType. + Catalog is currently the only implemented sourceType, and setting the + sourcetype to "Catalog" requires the catalog field to also be defined. + Below is a minimal example of a source definition (in yaml): + source: + sourceType: Catalog + catalog: + packageName: example-package properties: - image: + catalog: description: |- - image is used to configure how catalog contents are sourced from an OCI image. - This field is required when type is Image, and forbidden otherwise. + catalog is used to configure how information is sourced from a catalog. + This field is required when sourceType is "Catalog", and forbidden otherwise. properties: - pollIntervalMinutes: + channels: description: |- - pollIntervalMinutes allows the user to set the interval, in minutes, at which the image source should be polled for new content. - pollIntervalMinutes is optional. - pollIntervalMinutes can not be specified when ref is a digest-based reference. - When omitted, the image will not be polled for new content. - minimum: 1 - type: integer - ref: + channels is an optional reference to a set of channels belonging to + the package specified in the packageName field. + A "channel" is a package-author-defined stream of updates for an extension. + Each channel in the list must follow the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. No more than 256 channels can be specified. + When specified, it is used to constrain the set of installable bundles and + the automated upgrade path. This constraint is an AND operation with the + version field. For example: + - Given channel is set to "foo" + - Given version is set to ">=1.0.0, <1.5.0" + - Only bundles that exist in channel "foo" AND satisfy the version range comparison will be considered installable + - Automatic upgrades will be constrained to upgrade edges defined by the selected channel + When unspecified, upgrade edges across all channels will be used to identify valid automatic upgrade paths. + Some examples of valid values are: + - 1.1.x + - alpha + - stable + - stable-v1 + - v1-stable + - dev-preview + - preview + - community + Some examples of invalid values are: + - -some-channel + - some-channel- + - thisisareallylongchannelnamethatisgreaterthanthemaximumlength + - original_40 + - --default-channel + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + items: + maxLength: 253 + type: string + x-kubernetes-validations: + - message: channels entries must be valid DNS1123 subdomains + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + maxItems: 256 + type: array + packageName: description: |- - ref allows users to define the reference to a container image containing Catalog contents. - ref is required. - ref can not be more than 1000 characters. - A reference can be broken down into 3 parts - the domain, name, and identifier. - The domain is typically the registry where an image is located. - It must be alphanumeric characters (lowercase and uppercase) separated by the "." character. - Hyphenation is allowed, but the domain must start and end with alphanumeric characters. - Specifying a port to use is also allowed by adding the ":" character followed by numeric values. - The port must be the last value in the domain. - Some examples of valid domain values are "registry.mydomain.io", "quay.io", "my-registry.io:8080". - The name is typically the repository in the registry where an image is located. - It must contain lowercase alphanumeric characters separated only by the ".", "_", "__", "-" characters. - Multiple names can be concatenated with the "/" character. - The domain and name are combined using the "/" character. - Some examples of valid name values are "operatorhubio/catalog", "catalog", "my-catalog.prod". - An example of the domain and name parts of a reference being combined is "quay.io/operatorhubio/catalog". - The identifier is typically the tag or digest for an image reference and is present at the end of the reference. - It starts with a separator character used to distinguish the end of the name and beginning of the identifier. - For a digest-based reference, the "@" character is the separator. - For a tag-based reference, the ":" character is the separator. - An identifier is required in the reference. - Digest-based references must contain an algorithm reference immediately after the "@" separator. - The algorithm reference must be followed by the ":" character and an encoded string. - The algorithm must start with an uppercase or lowercase alpha character followed by alphanumeric characters and may contain the "-", "_", "+", and "." characters. - Some examples of valid algorithm values are "sha256", "sha256+b64u", "multihash+base58". - The encoded string following the algorithm must be hex digits (a-f, A-F, 0-9) and must be a minimum of 32 characters. - Tag-based references must begin with a word character (alphanumeric + "_") followed by word characters or ".", and "-" characters. - The tag must not be longer than 127 characters. - An example of a valid digest-based image reference is "quay.io/operatorhubio/catalog@sha256:200d4ddb2a73594b91358fe6397424e975205bfbe44614f5846033cad64b3f05" - An example of a valid tag-based image reference is "quay.io/operatorhubio/catalog:latest" - maxLength: 1000 + packageName is a reference to the name of the package to be installed + and is used to filter the content from catalogs. + packageName is required, immutable, and follows the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + Some examples of valid values are: + - some-package + - 123-package + - 1-package-2 + - somepackage + Some examples of invalid values are: + - -some-package + - some-package- + - thisisareallylongpackagenamethatisgreaterthanthemaximumlength + - some.package + [RFC 1123]: https://tools.ietf.org/html/rfc1123 + maxLength: 253 type: string x-kubernetes-validations: - - message: must start with a valid domain. valid domains must - be alphanumeric characters (lowercase and uppercase) separated - by the "." character. - rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') - - message: a valid name is required. valid names must contain - lowercase alphanumeric characters separated only by the - ".", "_", "__", "-" characters. - rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') - != "" - - message: must end with a digest or a tag - rule: self.find('(@.*:)') != "" || self.find(':.*$') != - "" - - message: tag is invalid. the tag must not be more than 127 - characters - rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') - != "" ? self.find('':.*$'').substring(1).size() <= 127 - : true) : true' - - message: tag is invalid. valid tags must begin with a word - character (alphanumeric + "_") followed by word characters - or ".", and "-" characters - rule: 'self.find(''(@.*:)'') == "" ? (self.find('':.*$'') - != "" ? self.find('':.*$'').matches('':[\\w][\\w.-]*$'') - : true) : true' - - message: digest algorithm is not valid. valid algorithms - must start with an uppercase or lowercase alpha character - followed by alphanumeric characters and may contain the - "-", "_", "+", and "." characters. - rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') - : true' - - message: digest is not valid. the encoded string must be - at least 32 characters - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() - >= 32 : true' - - message: digest is not valid. the encoded string must only - contain hex characters (A-F, a-f, 0-9) - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') - : true' + - message: packageName is immutable + rule: self == oldSelf + - message: packageName must be a valid DNS1123 subdomain. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric + character, and be no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + selector: + description: |- + selector is an optional field that can be used + to filter the set of ClusterCatalogs used in the bundle + selection process. + When unspecified, all ClusterCatalogs will be used in + the bundle selection process. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + upgradeConstraintPolicy: + default: CatalogProvided + description: |- + upgradeConstraintPolicy is an optional field that controls whether + the upgrade path(s) defined in the catalog are enforced for the package + referenced in the packageName field. + Allowed values are: "CatalogProvided" or "SelfCertified", or omitted. + When this field is set to "CatalogProvided", automatic upgrades will only occur + when upgrade constraints specified by the package author are met. + When this field is set to "SelfCertified", the upgrade constraints specified by + the package author are ignored. This allows for upgrades and downgrades to + any version of the package. This is considered a dangerous operation as it + can lead to unknown and potentially disastrous outcomes, such as data + loss. It is assumed that users have independently verified changes when + using this option. + When this field is omitted, the default value is "CatalogProvided". + enum: + - CatalogProvided + - SelfCertified + type: string + version: + description: |- + version is an optional semver constraint (a specific version or range of versions). When unspecified, the latest version available will be installed. + Acceptable version ranges are no longer than 64 characters. + Version ranges are composed of comma- or space-delimited values and one or + more comparison operators, known as comparison strings. Additional + comparison strings can be added using the OR operator (||). + # Range Comparisons + To specify a version range, you can use a comparison string like ">=3.0, + <3.6". When specifying a range, automatic updates will occur within that + range. The example comparison string means "install any version greater than + or equal to 3.0.0 but less than 3.6.0.". It also states intent that if any + upgrades are available within the version range after initial installation, + those upgrades should be automatically performed. + # Pinned Versions + To specify an exact version to install you can use a version range that + "pins" to a specific version. When pinning to a specific version, no + automatic updates will occur. An example of a pinned version range is + "0.6.0", which means "only install version 0.6.0 and never + upgrade from this version". + # Basic Comparison Operators + The basic comparison operators and their meanings are: + - "=", equal (not aliased to an operator) + - "!=", not equal + - "<", less than + - ">", greater than + - ">=", greater than OR equal to + - "<=", less than OR equal to + # Wildcard Comparisons + You can use the "x", "X", and "*" characters as wildcard characters in all + comparison operations. Some examples of using the wildcard characters: + - "1.2.x", "1.2.X", and "1.2.*" is equivalent to ">=1.2.0, < 1.3.0" + - ">= 1.2.x", ">= 1.2.X", and ">= 1.2.*" is equivalent to ">= 1.2.0" + - "<= 2.x", "<= 2.X", and "<= 2.*" is equivalent to "< 3" + - "x", "X", and "*" is equivalent to ">= 0.0.0" + # Patch Release Comparisons + When you want to specify a minor version up to the next major version you + can use the "~" character to perform patch comparisons. Some examples: + - "~1.2.3" is equivalent to ">=1.2.3, <1.3.0" + - "~1" and "~1.x" is equivalent to ">=1, <2" + - "~2.3" is equivalent to ">=2.3, <2.4" + - "~1.2.x" is equivalent to ">=1.2.0, <1.3.0" + # Major Release Comparisons + You can use the "^" character to make major release comparisons after a + stable 1.0.0 version is published. If there is no stable version published, // minor versions define the stability level. Some examples: + - "^1.2.3" is equivalent to ">=1.2.3, <2.0.0" + - "^1.2.x" is equivalent to ">=1.2.0, <2.0.0" + - "^2.3" is equivalent to ">=2.3, <3" + - "^2.x" is equivalent to ">=2.0.0, <3" + - "^0.2.3" is equivalent to ">=0.2.3, <0.3.0" + - "^0.2" is equivalent to ">=0.2.0, <0.3.0" + - "^0.0.3" is equvalent to ">=0.0.3, <0.0.4" + - "^0.0" is equivalent to ">=0.0.0, <0.1.0" + - "^0" is equivalent to ">=0.0.0, <1.0.0" + # OR Comparisons + You can use the "||" character to represent an OR operation in the version + range. Some examples: + - ">=1.2.3, <2.0.0 || >3.0.0" + - "^0 || ^3 || ^5" + For more information on semver, please see https://semver.org/ + maxLength: 64 + type: string + x-kubernetes-validations: + - message: invalid version expression + rule: self.matches("^(\\s*(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|[x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*]))?(\\.(0|[1-9]\\d*|x|X|\\*))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)((?:\\s+|,\\s*|\\s*\\|\\|\\s*)(=||!=|>|<|>=|=>|<=|=<|~|~>|\\^)\\s*(v?(0|[1-9]\\d*|x|X|\\*])(\\.(0|[1-9]\\d*|x|X|\\*))?(\\.(0|[1-9]\\d*|x|X|\\*]))?(-([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?(\\+([0-9A-Za-z\\-]+(\\.[0-9A-Za-z\\-]+)*))?)\\s*)*$") required: - - ref + - packageName type: object - x-kubernetes-validations: - - message: cannot specify pollIntervalMinutes while using digest-based - image - rule: 'self.ref.find(''(@.*:)'') != "" ? !has(self.pollIntervalMinutes) - : true' - type: + sourceType: description: |- - type is a reference to the type of source the catalog is sourced from. - type is required. - The only allowed value is "Image". - When set to "Image", the ClusterCatalog content will be sourced from an OCI image. - When using an image source, the image field must be set and must be the only field defined for this type. + sourceType is a required reference to the type of install source. + Allowed values are "Catalog" + When this field is set to "Catalog", information for determining the + appropriate bundle of content to install will be fetched from + ClusterCatalog resources existing on the cluster. + When using the Catalog sourceType, the catalog field must also be set. enum: - - Image + - Catalog type: string required: - - type + - sourceType type: object x-kubernetes-validations: - - message: image is required when source type is Image, and forbidden + - message: catalog is required when sourceType is Catalog, and forbidden otherwise - rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) - : !has(self.image)' + rule: 'has(self.sourceType) && self.sourceType == ''Catalog'' ? + has(self.catalog) : !has(self.catalog)' required: + - namespace + - serviceAccount - source type: object status: - description: |- - status contains information about the state of the ClusterCatalog such as: - - Whether or not the catalog contents are being served via the catalog content HTTP server - - Whether or not the ClusterCatalog is progressing to a new state - - A reference to the source from which the catalog contents were retrieved + description: status is an optional field that defines the observed state + of the ClusterExtension. properties: conditions: description: |- - conditions is a representation of the current state for this ClusterCatalog. - The current condition types are Serving and Progressing. - The Serving condition is used to represent whether or not the contents of the catalog is being served via the HTTP(S) web server. - When it has a status of True and a reason of Available, the contents of the catalog are being served. - When it has a status of False and a reason of Unavailable, the contents of the catalog are not being served because the contents are not yet available. - When it has a status of False and a reason of UserSpecifiedUnavailable, the contents of the catalog are not being served because the catalog has been intentionally marked as unavailable. - The Progressing condition is used to represent whether or not the ClusterCatalog is progressing or is ready to progress towards a new state. - When it has a status of True and a reason of Retrying, there was an error in the progression of the ClusterCatalog that may be resolved on subsequent reconciliation attempts. - When it has a status of True and a reason of Succeeded, the ClusterCatalog has successfully progressed to a new state and is ready to continue progressing. - When it has a status of False and a reason of Blocked, there was an error in the progression of the ClusterCatalog that requires manual intervention for recovery. - In the case that the Serving condition is True with reason Available and Progressing is True with reason Retrying, the previously fetched - catalog contents are still being served via the HTTP(S) web server while we are progressing towards serving a new version of the catalog - contents. This could occur when we've initially fetched the latest contents from the source for this catalog and when polling for changes - to the contents we identify that there are updates to the contents. + The set of condition types which apply to all spec.source variations are Installed and Progressing. + The Installed condition represents whether or not the bundle has been installed for this ClusterExtension. + When Installed is True and the Reason is Succeeded, the bundle has been successfully installed. + When Installed is False and the Reason is Failed, the bundle has failed to install. + The Progressing condition represents whether or not the ClusterExtension is advancing towards a new state. + When Progressing is True and the Reason is Succeeded, the ClusterExtension is making progress towards a new state. + When Progressing is True and the Reason is Retrying, the ClusterExtension has encountered an error that could be resolved on subsequent reconciliation attempts. + When Progressing is False and the Reason is Blocked, the ClusterExtension has encountered an error that requires manual intervention for recovery. + When the ClusterExtension is sourced from a catalog, if may also communicate a deprecation condition. + These are indications from a package owner to guide users away from a particular package, channel, or bundle. + BundleDeprecated is set if the requested bundle version is marked deprecated in the catalog. + ChannelDeprecated is set if the requested channel is marked deprecated in the catalog. + PackageDeprecated is set if the requested package is marked deprecated in the catalog. + Deprecated is a rollup condition that is present when any of the deprecated conditions are present. items: description: Condition contains details for one aspect of the current state of this API Resource. @@ -322,111 +512,48 @@ spec: - type type: object type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastUnpacked: - description: |- - lastUnpacked represents the last time the contents of the - catalog were extracted from their source format. As an example, - when using an Image source, the OCI image will be pulled and the - image layers written to a file-system backed cache. We refer to the - act of this extraction from the source format as "unpacking". - format: date-time - type: string - resolvedSource: - description: resolvedSource contains information about the resolved - source based on the source type. - properties: - image: - description: |- - image is a field containing resolution information for a catalog sourced from an image. - This field must be set when type is Image, and forbidden otherwise. - properties: - ref: - description: |- - ref contains the resolved image digest-based reference. - The digest format is used so users can use other tooling to fetch the exact - OCI manifests that were used to extract the catalog contents. - maxLength: 1000 - type: string - x-kubernetes-validations: - - message: must start with a valid domain. valid domains must - be alphanumeric characters (lowercase and uppercase) separated - by the "." character. - rule: self.matches('^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])((\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(:[0-9]+)?\\b') - - message: a valid name is required. valid names must contain - lowercase alphanumeric characters separated only by the - ".", "_", "__", "-" characters. - rule: self.find('(\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?((\\/[a-z0-9]+((([._]|__|[-]*)[a-z0-9]+)+)?)+)?)') - != "" - - message: must end with a digest - rule: self.find('(@.*:)') != "" - - message: digest algorithm is not valid. valid algorithms - must start with an uppercase or lowercase alpha character - followed by alphanumeric characters and may contain the - "-", "_", "+", and "." characters. - rule: 'self.find(''(@.*:)'') != "" ? self.find(''(@.*:)'').matches(''(@[A-Za-z][A-Za-z0-9]*([-_+.][A-Za-z][A-Za-z0-9]*)*[:])'') - : true' - - message: digest is not valid. the encoded string must be - at least 32 characters - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').substring(1).size() - >= 32 : true' - - message: digest is not valid. the encoded string must only - contain hex characters (A-F, a-f, 0-9) - rule: 'self.find(''(@.*:)'') != "" ? self.find('':.*$'').matches('':[0-9A-Fa-f]*$'') - : true' - required: - - ref - type: object - type: - description: |- - type is a reference to the type of source the catalog is sourced from. - type is required. - The only allowed value is "Image". - When set to "Image", information about the resolved image source will be set in the 'image' field. - enum: - - Image - type: string - required: - - image - - type - type: object - x-kubernetes-validations: - - message: image is required when source type is Image, and forbidden - otherwise - rule: 'has(self.type) && self.type == ''Image'' ? has(self.image) - : !has(self.image)' - urls: - description: urls contains the URLs that can be used to access the - catalog. - properties: - base: - description: |- - base is a cluster-internal URL that provides endpoints for - accessing the content of the catalog. - It is expected that clients append the path for the endpoint they wish - to access. - Currently, only a single endpoint is served and is accessible at the path - /api/v1. - The endpoints served for the v1 API are: - - /all - this endpoint returns the entirety of the catalog contents in the FBC format - As the needs of users and clients of the evolve, new endpoints may be added. - maxLength: 525 - type: string - x-kubernetes-validations: - - message: must be a valid URL - rule: isURL(self) - - message: scheme must be either http or https - rule: 'isURL(self) ? (url(self).getScheme() == "http" || url(self).getScheme() - == "https") : true' + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + install: + description: install is a representation of the current installation + status for this ClusterExtension. + properties: + bundle: + description: |- + bundle is a required field which represents the identifying attributes of a bundle. + A "bundle" is a versioned set of content that represents the resources that + need to be applied to a cluster to install a package. + properties: + name: + description: |- + name is required and follows the DNS subdomain standard + as defined in [RFC 1123]. It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric character, + and be no longer than 253 characters. + type: string + x-kubernetes-validations: + - message: packageName must be a valid DNS1123 subdomain. + It must contain only lowercase alphanumeric characters, + hyphens (-) or periods (.), start and end with an alphanumeric + character, and be no longer than 253 characters + rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$") + version: + description: |- + version is a required field and is a reference to the version that this bundle represents + version follows the semantic versioning standard as defined in https://semver.org/. + type: string + x-kubernetes-validations: + - message: version must be well-formed semver + rule: self.matches("^([0-9]+)(\\.[0-9]+)?(\\.[0-9]+)?(-([-0-9A-Za-z]+(\\.[-0-9A-Za-z]+)*))?(\\+([-0-9A-Za-z]+(-\\.[-0-9A-Za-z]+)*))?") + required: + - name + - version + type: object required: - - base + - bundle type: object type: object - required: - - metadata - - spec type: object served: true storage: true @@ -439,11 +566,10 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-controller-manager + name: operator-controller-controller-manager namespace: olmv1-system --- apiVersion: rbac.authorization.k8s.io/v1 @@ -452,11 +578,10 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-leader-election-role + name: operator-controller-leader-election-role namespace: olmv1-system rules: - apiGroups: @@ -492,6 +617,32 @@ rules: - patch --- apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-manager-role + namespace: olmv1-system +rules: +- apiGroups: + - '' + resources: + - secrets + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: @@ -500,12 +651,12 @@ metadata: app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-manager-role + name: operator-controller-clusterextension-editor-role rules: - apiGroups: - olm.operatorframework.io resources: - - clustercatalogs + - clusterextensions verbs: - create - delete @@ -514,18 +665,123 @@ rules: - patch - update - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-clusterextension-viewer-role +rules: - apiGroups: - olm.operatorframework.io resources: - - clustercatalogs/finalizers + - clusterextensions + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-extension-editor-role +rules: +- apiGroups: + - olm.operatorframework.io + resources: + - extensions verbs: + - create + - delete + - get + - list + - patch - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-extension-viewer-role +rules: - apiGroups: - olm.operatorframework.io resources: - - clustercatalogs/status + - extensions + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-manager-role +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get +- apiGroups: + - '' + resources: + - serviceaccounts/token + verbs: + - create +- apiGroups: + - olm.operatorframework.io + resources: + - clustercatalogs + verbs: + - get + - list + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions verbs: - get + - list + - patch + - update + - watch +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions/finalizers + verbs: + - update +- apiGroups: + - olm.operatorframework.io + resources: + - clusterextensions/status + verbs: - patch - update --- @@ -535,11 +791,10 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-metrics-reader + name: operator-controller-metrics-reader rules: - nonResourceURLs: - /metrics @@ -552,11 +807,10 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-proxy-role + name: operator-controller-proxy-role rules: - apiGroups: - authentication.k8s.io @@ -577,19 +831,38 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-leader-election-rolebinding + name: operator-controller-leader-election-rolebinding namespace: olmv1-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role - name: catalogd-leader-election-role + name: operator-controller-leader-election-role subjects: - kind: ServiceAccount - name: catalogd-controller-manager + name: operator-controller-controller-manager + namespace: olmv1-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: olm + app.kubernetes.io/managed-by: salt + app.kubernetes.io/part-of: metalk8s + app.kubernetes.io/version: v1.1.0 + heritage: metalk8s + name: operator-controller-manager-rolebinding + namespace: olmv1-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: operator-controller-manager-role +subjects: +- kind: ServiceAccount + name: operator-controller-controller-manager namespace: olmv1-system --- apiVersion: rbac.authorization.k8s.io/v1 @@ -598,18 +871,17 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-manager-rolebinding + name: operator-controller-manager-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: catalogd-manager-role + name: operator-controller-manager-role subjects: - kind: ServiceAccount - name: catalogd-controller-manager + name: operator-controller-controller-manager namespace: olmv1-system --- apiVersion: rbac.authorization.k8s.io/v1 @@ -618,18 +890,17 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-proxy-rolebinding + name: operator-controller-proxy-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: catalogd-proxy-role + name: operator-controller-proxy-role subjects: - kind: ServiceAccount - name: catalogd-controller-manager + name: operator-controller-controller-manager namespace: olmv1-system --- apiVersion: v1 @@ -638,28 +909,20 @@ metadata: labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt - app.kubernetes.io/name: catalogd app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 + control-plane: operator-controller-controller-manager heritage: metalk8s - name: catalogd-service + name: operator-controller-service namespace: olmv1-system spec: ports: - name: https - port: 443 + port: 8443 protocol: TCP targetPort: 8443 - - name: webhook - port: 9443 - protocol: TCP - targetPort: 9443 - - name: metrics - port: 7443 - protocol: TCP - targetPort: 7443 selector: - control-plane: catalogd-controller-manager + control-plane: operator-controller-controller-manager --- apiVersion: apps/v1 kind: Deployment @@ -671,22 +934,21 @@ metadata: app.kubernetes.io/managed-by: salt app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 - control-plane: catalogd-controller-manager + control-plane: operator-controller-controller-manager heritage: metalk8s - name: catalogd-controller-manager + name: operator-controller-controller-manager namespace: olmv1-system spec: - minReadySeconds: 5 replicas: 1 selector: matchLabels: - control-plane: catalogd-controller-manager + control-plane: operator-controller-controller-manager template: metadata: annotations: kubectl.kubernetes.io/default-container: manager labels: - control-plane: catalogd-controller-manager + control-plane: operator-controller-controller-manager spec: affinity: nodeAffinity: @@ -706,15 +968,15 @@ spec: - linux containers: - args: + - --health-probe-bind-address=:8081 + - --metrics-bind-address=:8443 - --leader-elect - - --metrics-bind-address=:7443 - - --external-address=catalogd-service.olmv1-system.svc - - --tls-cert=/var/certs/tls.crt + - --ca-certs-dir=/var/certs + - --tls-cert=/var/certs/tls.cert - --tls-key=/var/certs/tls.key - - --ca-certs-dir=/var/ca-certs command: - - ./manager - image: {% endraw -%}{{ build_image_name("catalogd", False) }}{%- raw %}:v1.1.0 + - /manager + image: {% endraw -%}{{ build_image_name("operator-controller", False) }}{%- raw %}:v1.1.0 imagePullPolicy: IfNotPresent livenessProbe: httpGet: @@ -731,8 +993,8 @@ spec: periodSeconds: 10 resources: requests: - cpu: 100m - memory: 200Mi + cpu: 10m + memory: 64Mi securityContext: allowPrivilegeEscalation: false capabilities: @@ -740,32 +1002,41 @@ spec: - ALL terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - - mountPath: /var/cache/ + - mountPath: /var/cache name: cache - - mountPath: /var/certs - name: catalogserver-certs - - mountPath: /var/ca-certs/ + - mountPath: /var/certs/ name: olmv1-certificate readOnly: true + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: '' securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault - serviceAccountName: catalogd-controller-manager + serviceAccountName: operator-controller-controller-manager terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists volumes: - emptyDir: {} name: cache - - name: catalogserver-certs - secret: - secretName: catalogd-service-cert-v1.1.0 - name: olmv1-certificate secret: items: - key: ca.crt path: olm-ca.crt + - key: tls.crt + path: tls.cert + - key: tls.key + path: tls.key optional: false - secretName: catalogd-service-cert-v1.1.0 + secretName: olmv1-cert --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -789,9 +1060,6 @@ spec: algorithm: ECDSA size: 256 secretName: olmv1-ca - secretTemplate: - annotations: - cert-manager.io/allow-direct-injection: 'true' --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -802,13 +1070,12 @@ metadata: app.kubernetes.io/part-of: metalk8s app.kubernetes.io/version: v1.1.0 heritage: metalk8s - name: catalogd-service-cert + name: olmv1-cert namespace: olmv1-system spec: dnsNames: - - localhost - - catalogd-service.olmv1-system.svc - - catalogd-service.olmv1-system.svc.cluster.local + - operator-controller-service.olmv1-system.svc + - operator-controller-service.olmv1-system.svc.cluster.local issuerRef: group: cert-manager.io kind: ClusterIssuer @@ -816,7 +1083,7 @@ spec: privateKey: algorithm: ECDSA size: 256 - secretName: catalogd-service-cert-v1.1.0 + secretName: olmv1-cert --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer @@ -846,47 +1113,6 @@ metadata: spec: selfSigned: {} --- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/olmv1-ca - labels: - app.kubernetes.io/instance: olm - app.kubernetes.io/managed-by: salt - app.kubernetes.io/part-of: metalk8s - app.kubernetes.io/version: v1.1.0 - heritage: metalk8s - name: catalogd-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: catalogd-service - namespace: olmv1-system - path: /mutate-olm-operatorframework-io-v1-clustercatalog - port: 9443 - failurePolicy: Fail - matchConditions: - - expression: '''name'' in object.metadata && (!has(object.metadata.labels) || !(''olm.operatorframework.io/metadata.name'' - in object.metadata.labels) || object.metadata.labels[''olm.operatorframework.io/metadata.name''] - != object.metadata.name)' - name: MissingOrIncorrectMetadataNameLabel - name: inject-metadata-name.olm.operatorframework.io - rules: - - apiGroups: - - olm.operatorframework.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - clustercatalogs - sideEffects: None - timeoutSeconds: 10 ---- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: @@ -1617,12 +1843,22 @@ spec: - mountPath: /var/ca-certs/ name: olmv1-certificate readOnly: true + nodeSelector: + kubernetes.io/os: linux + node-role.kubernetes.io/infra: '' securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault serviceAccountName: catalogd-controller-manager terminationGracePeriodSeconds: 10 + tolerations: + - effect: NoSchedule + key: node-role.kubernetes.io/bootstrap + operator: Exists + - effect: NoSchedule + key: node-role.kubernetes.io/infra + operator: Exists volumes: - emptyDir: {} name: cache From f0a4dda400edba56023480753dce03035845ebef Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 16 Jan 2025 14:55:50 +0100 Subject: [PATCH 29/33] fix olm webhook injected secret --- olm/render.py | 3 +++ salt/metalk8s/addons/olm/deployed/chart.sls | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/olm/render.py b/olm/render.py index e8d80317f7..3e62d1ef86 100755 --- a/olm/render.py +++ b/olm/render.py @@ -120,6 +120,9 @@ def fixup_certmanager(manifest): if doc['apiVersion'] == "cert-manager.io/v1" and \ doc['metadata'].get('namespace') == 'cert-manager': doc['metadata']['namespace'] = 'metalk8s-certs' + if doc['kind'] == "MutatingWebhookConfiguration": + doc['metadata']['annotations']['cert-manager.io/inject-ca-from-secret']\ + = "metalk8s-certs/olmv1-ca" return manifest class multiline_string(str): diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index 8cf8e76a38..f2f2b931bd 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -1902,7 +1902,7 @@ apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/olmv1-ca + cert-manager.io/inject-ca-from-secret: metalk8s-certs/olmv1-ca labels: app.kubernetes.io/instance: olm app.kubernetes.io/managed-by: salt From 50f8a0103be8f1d0976f8aa7d89a4c892b7d7bf2 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Thu, 16 Jan 2025 18:08:01 +0100 Subject: [PATCH 30/33] fix olm registries conf --- olm/render.py | 39 +++++++++++++++++++++ salt/metalk8s/addons/olm/deployed/chart.sls | 26 ++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/olm/render.py b/olm/render.py index 3e62d1ef86..8526f654a1 100755 --- a/olm/render.py +++ b/olm/render.py @@ -24,6 +24,18 @@ CATALOGD_MANIFEST_URL = "https://github.com/operator-framework/catalogd/releases/download/{version}/catalogd.yaml" +REGISTRIES_CONF = """ +[[registry]] +prefix = "{{ repo.registry_endpoint }}" +insecure = true +location = "{{ repo.registry_endpoint }}:80" +[[registry]] +prefix = "registry.metalk8s.lan" +insecure = true +location = "{{ repo.registry_endpoint }}:80" +""" + + START_BLOCK = """ #!jinja | metalk8s_kubernetes @@ -106,6 +118,32 @@ def add_tolerations(manifest): ]) return manifest +def add_registries_conf(manifest): + manifest.append({ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "registries-conf", + "namespace": "olmv1-system", + }, + "data": { + "registries.conf": REGISTRIES_CONF, + }, + }) + for doc in manifest: + if doc['kind'] == "Deployment": + doc['spec']['template']['spec']['volumes'].append({ + "name": "registries-conf", + "configMap": { + "name": "registries-conf", + }, + }) + doc['spec']['template']['spec']['containers'][0]['volumeMounts'].append({ + "name": "registries-conf", + "mountPath": "/etc/containers/", + }) + return manifest + def add_node_selector(manifest): for doc in manifest: if doc['kind'] == "Deployment": @@ -190,6 +228,7 @@ def main(): manifest = add_labels(manifest, args.version) manifest = add_tolerations(manifest) manifest = add_node_selector(manifest) + manifest = add_registries_conf(manifest) # 4- Fix cert-manager objects manifest = fixup_certmanager(manifest) diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index f2f2b931bd..c3e299825c 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -1007,6 +1007,8 @@ spec: - mountPath: /var/certs/ name: olmv1-certificate readOnly: true + - mountPath: /etc/containers/ + name: registries-conf nodeSelector: kubernetes.io/os: linux node-role.kubernetes.io/infra: '' @@ -1037,6 +1039,9 @@ spec: path: tls.key optional: false secretName: olmv1-cert + - configMap: + name: registries-conf + name: registries-conf --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -1843,6 +1848,8 @@ spec: - mountPath: /var/ca-certs/ name: olmv1-certificate readOnly: true + - mountPath: /etc/containers/ + name: registries-conf nodeSelector: kubernetes.io/os: linux node-role.kubernetes.io/infra: '' @@ -1872,6 +1879,9 @@ spec: path: olm-ca.crt optional: false secretName: catalogd-service-cert-v1.1.0 + - configMap: + name: registries-conf + name: registries-conf --- apiVersion: cert-manager.io/v1 kind: Certificate @@ -1938,5 +1948,21 @@ webhooks: - clustercatalogs sideEffects: None timeoutSeconds: 10 +--- +apiVersion: v1 +data: + registries.conf: |- + [[registry]] + prefix = "{{ repo.registry_endpoint }}" + insecure = true + location = "{{ repo.registry_endpoint }}:80" + [[registry]] + prefix = "registry.metalk8s.lan" + insecure = true + location = "{{ repo.registry_endpoint }}:80" +kind: ConfigMap +metadata: + name: registries-conf + namespace: olmv1-system {% endraw %} From c0bf61139d4b8f141002b7fda228d4f2220bed96 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 17 Jan 2025 10:24:32 +0100 Subject: [PATCH 31/33] fix olm registries conf 2 --- olm/render.py | 6 +++--- salt/metalk8s/addons/olm/deployed/chart.sls | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/olm/render.py b/olm/render.py index 8526f654a1..c5acc1b016 100755 --- a/olm/render.py +++ b/olm/render.py @@ -26,13 +26,13 @@ REGISTRIES_CONF = """ [[registry]] -prefix = "{{ repo.registry_endpoint }}" +prefix = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}" insecure = true -location = "{{ repo.registry_endpoint }}:80" +location = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}:80" [[registry]] prefix = "registry.metalk8s.lan" insecure = true -location = "{{ repo.registry_endpoint }}:80" +location = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}:80" """ diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index c3e299825c..d735c00d61 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -1953,13 +1953,13 @@ apiVersion: v1 data: registries.conf: |- [[registry]] - prefix = "{{ repo.registry_endpoint }}" + prefix = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}" insecure = true - location = "{{ repo.registry_endpoint }}:80" + location = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}:80" [[registry]] prefix = "registry.metalk8s.lan" insecure = true - location = "{{ repo.registry_endpoint }}:80" + location = "{% endraw -%}{{ repo.registry_endpoint }}{%- raw %}:80" kind: ConfigMap metadata: name: registries-conf From a7f54bbc8330d640e6e7c6448914c4d7e99907ee Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 17 Jan 2025 11:29:26 +0100 Subject: [PATCH 32/33] fix merge algorithm in olm render --- olm/render.py | 6 +----- salt/metalk8s/addons/olm/deployed/chart.sls | 3 +++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/olm/render.py b/olm/render.py index c5acc1b016..831478ef0c 100755 --- a/olm/render.py +++ b/olm/render.py @@ -72,7 +72,7 @@ def merge(source, destination): def _dict_merge(src, dst): for k, v in src.items(): if k in dst and isinstance(dst[k], dict) and isinstance(v, dict): - _dict_merge(dst[k], v) + _dict_merge(v, dst[k]) else: dst[k] = v to_add = [] @@ -102,7 +102,6 @@ def add_labels(manifest, version): def add_tolerations(manifest): for doc in manifest: - print(f"fixing up {doc['metadata']['name']}") if doc['kind'] == "Deployment": doc['spec']['template']['spec'].setdefault('tolerations', []).extend([ { @@ -216,13 +215,10 @@ def main(): # 1.5 - interpret yaml controller = list(yaml.safe_load_all(controller_manifest)) - print(len(controller)) catalogd = list(yaml.safe_load_all(catalogd_manifest)) - print(len(catalogd)) # 2 - merge manifests manifest = merge(catalogd, controller) - print(len(manifest)) # 3- add labels, tolerations, nodeSelector manifest = add_labels(manifest, args.version) diff --git a/salt/metalk8s/addons/olm/deployed/chart.sls b/salt/metalk8s/addons/olm/deployed/chart.sls index d735c00d61..9f0a3b9a6a 100644 --- a/salt/metalk8s/addons/olm/deployed/chart.sls +++ b/salt/metalk8s/addons/olm/deployed/chart.sls @@ -1065,6 +1065,9 @@ spec: algorithm: ECDSA size: 256 secretName: olmv1-ca + secretTemplate: + annotations: + cert-manager.io/allow-direct-injection: 'true' --- apiVersion: cert-manager.io/v1 kind: Certificate From 1162cbd5ef47fe200409a61e6d613ad11c6664f0 Mon Sep 17 00:00:00 2001 From: Ayoub Nasr Date: Fri, 17 Jan 2025 15:06:34 +0100 Subject: [PATCH 33/33] require nginx-operator to deploy nginx ingress --- .../addons/nginx-ingress-control-plane/deployed/init.sls | 2 ++ salt/metalk8s/addons/nginx-ingress/deployed/init.sls | 2 ++ 2 files changed, 4 insertions(+) diff --git a/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/init.sls b/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/init.sls index b202872be4..4ce88ea12a 100644 --- a/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/init.sls +++ b/salt/metalk8s/addons/nginx-ingress-control-plane/deployed/init.sls @@ -1,4 +1,6 @@ include: + - metalk8s.addons.olm.deployed + - metalk8s.addons.nginx-operator.deployed - metalk8s.addons.nginx-ingress.deployed.namespace - .tls-secret - .chart diff --git a/salt/metalk8s/addons/nginx-ingress/deployed/init.sls b/salt/metalk8s/addons/nginx-ingress/deployed/init.sls index 9a57e0c9ce..260bb0696e 100644 --- a/salt/metalk8s/addons/nginx-ingress/deployed/init.sls +++ b/salt/metalk8s/addons/nginx-ingress/deployed/init.sls @@ -1,4 +1,6 @@ include: + - metalk8s.addons.olm.deployed + - metalk8s.addons.nginx-operator.deployed - .namespace - .tls-secret - .chart