diff --git a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-416.yaml b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-416.yaml index c3b5cdc39..515c08045 100644 --- a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-416.yaml +++ b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-416.yaml @@ -247,6 +247,9 @@ spec: value: credentials - name: run-e2e-tests onError: continue + resources: + limits: + memory: 8Gi volumeMounts: - name: azure-openai-token mountPath: /var/run/azure_openai @@ -280,7 +283,7 @@ spec: echo "---------------------------------------------" cat $KUBECONFIG echo "---------------------------------------------" - dnf -y install git make golang + dnf -y install git make golang gpgme-devel git clone https://github.com/openshift/lightspeed-operator.git cd lightspeed-operator git config --global user.email olsci@redhat.com diff --git a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-417.yaml b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-417.yaml index a57eff8be..4610df89f 100644 --- a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-417.yaml +++ b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-417.yaml @@ -247,6 +247,9 @@ spec: value: credentials - name: run-e2e-tests onError: continue + resources: + limits: + memory: 8Gi volumeMounts: - name: azure-openai-token mountPath: /var/run/azure_openai @@ -280,7 +283,7 @@ spec: echo "---------------------------------------------" cat $KUBECONFIG echo "---------------------------------------------" - dnf -y install git make golang + dnf -y install git make golang gpgme-devel git clone https://github.com/openshift/lightspeed-operator.git cd lightspeed-operator git config --global user.email olsci@redhat.com diff --git a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-418.yaml b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-418.yaml index dd57495b7..724faf0f6 100644 --- a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-418.yaml +++ b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-418.yaml @@ -247,6 +247,9 @@ spec: value: credentials - name: run-e2e-tests onError: continue + resources: + limits: + memory: 8Gi volumeMounts: - name: azure-openai-token mountPath: /var/run/azure_openai @@ -280,7 +283,7 @@ spec: echo "---------------------------------------------" cat $KUBECONFIG echo "---------------------------------------------" - dnf -y install git make golang + dnf -y install git make golang gpgme-devel git clone https://github.com/openshift/lightspeed-operator.git cd lightspeed-operator git config --global user.email olsci@redhat.com diff --git a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-419.yaml b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-419.yaml index c83078402..5fbdbd8f3 100644 --- a/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-419.yaml +++ b/.tekton/integration-tests/pipelines/lightspeed-operator-e2e-test-pipeline-419.yaml @@ -247,6 +247,9 @@ spec: value: credentials - name: run-e2e-tests onError: continue + resources: + limits: + memory: 8Gi volumeMounts: - name: azure-openai-token mountPath: /var/run/azure_openai @@ -280,7 +283,7 @@ spec: echo "---------------------------------------------" cat $KUBECONFIG echo "---------------------------------------------" - dnf -y install git make golang + dnf -y install git make golang gpgme-devel git clone https://github.com/openshift/lightspeed-operator.git cd lightspeed-operator git config --global user.email olsci@redhat.com diff --git a/Makefile b/Makefile index 2e1101b43..ddef42fef 100644 --- a/Makefile +++ b/Makefile @@ -119,7 +119,7 @@ fmt: ## Run go fmt against code. .PHONY: vet vet: ## Run go vet against code. - go vet ./... + go vet -tags=exclude_graphdriver_btrfs ./... .PHONY: test test: manifests generate fmt vet envtest test-crds ## Run local tests. @@ -131,15 +131,18 @@ OS_CONSOLE_PLUGIN_CRD_URL = https://raw.githubusercontent.com/openshift/api/refs OCP_CLUSTER_VERSION_CRD_URL = https://raw.githubusercontent.com/openshift/api/refs/heads/release-4.18/config/v1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversions-Default.crd.yaml MONITORING_CRD_URL = https://raw.githubusercontent.com/openshift/prometheus-operator/master/bundle.yaml OCP_APISERVER_CRD_URL = https://raw.githubusercontent.com/openshift/api/refs/heads/release-4.18/payload-manifests/crds/0000_10_config-operator_01_apiservers.crd.yaml +# generated with `controller-gen crd paths=./image/... output:crd:dir=./crd` from https://github.com/openshift/api +OCP_IMAGESTREAM_CRD_URL = ./config/crd/ocp/image.openshift.io_imagestreams.yaml TEST_CRD_DIR = .testcrds OS_CONSOLE_CRD_FILE = $(TEST_CRD_DIR)/openshift-console-crd.yaml OS_CONSOLE_PLUGIN_CRD_FILE = $(TEST_CRD_DIR)/openshift-console-plugin-crd.yaml OCP_CLUSTER_VERSION_CRD_FILE = $(TEST_CRD_DIR)/openshift-config-clusterversion-crd.yaml MONITORING_CRD_FILE = $(TEST_CRD_DIR)/monitoring-crd.yaml OCP_APISERVER_CRD_FILE = $(TEST_CRD_DIR)/openshift-apiserver-crd.yaml +OCP_IMAGESTREAM_CRD_FILE = $(TEST_CRD_DIR)/image.openshift.io_imagestreams.yaml .PHONY: test-crds -test-crds: $(TEST_CRD_DIR) $(OS_CONSOLE_CRD_FILE) $(OS_CONSOLE_PLUGIN_CRD_FILE) $(MONITORING_CRD_FILE) $(OCP_CLUSTER_VERSION_CRD_FILE) $(OCP_APISERVER_CRD_FILE) ## Test Dependencies CRDs +test-crds: $(TEST_CRD_DIR) $(OS_CONSOLE_CRD_FILE) $(OS_CONSOLE_PLUGIN_CRD_FILE) $(MONITORING_CRD_FILE) $(OCP_CLUSTER_VERSION_CRD_FILE) $(OCP_APISERVER_CRD_FILE) $(OCP_IMAGESTREAM_CRD_FILE) ## Test Dependencies CRDs $(TEST_CRD_DIR): mkdir -p $(TEST_CRD_DIR) @@ -159,6 +162,9 @@ $(OCP_CLUSTER_VERSION_CRD_FILE): $(TEST_CRD_DIR) $(OCP_APISERVER_CRD_FILE): $(TEST_CRD_DIR) wget -O $(OCP_APISERVER_CRD_FILE) $(OCP_APISERVER_CRD_URL) +$(OCP_IMAGESTREAM_CRD_FILE): $(TEST_CRD_DIR) + cp $(OCP_IMAGESTREAM_CRD_URL) $(OCP_APISERVER_CRD_FILE) + .PHONY: test-e2e test-e2e: ## Run e2e tests with an Openshift cluster. Requires KUBECONFIG and LLM_TOKEN environment variables. @@ -168,7 +174,7 @@ endif ifndef LLM_TOKEN $(error LLM_TOKEN environment variable is not set) endif - go test ./test/e2e -timeout=120m -ginkgo.v -test.v -ginkgo.show-node-events --ginkgo.label-filter="!Rapidast && !Upgrade" --ginkgo.timeout=2h + go test -tags=exclude_graphdriver_btrfs ./test/e2e -timeout=120m -ginkgo.v -test.v -ginkgo.show-node-events --ginkgo.label-filter="!Rapidast && !Upgrade" --ginkgo.timeout=2h .PHONY: test-upgrade test-upgrade: ## Run upgrade tests with an Openshift cluster. Requires KUBECONFIG, LLM_TOKEN and BUNDLE_IMAGE environment variables. @@ -195,7 +201,7 @@ endif .PHONY: lint lint: ## Run golangci-lint against code. - golangci-lint run --config=.golangci.yaml + golangci-lint run --config=.golangci.yaml --build-tags "exclude_graphdriver_btrfs" .PHONY: lint-fix lint-fix: ## Fix found issues (if it's supported by the linter). @@ -297,17 +303,18 @@ LOCALBIN ?= $(shell pwd)/bin $(LOCALBIN): mkdir -p $(LOCALBIN) +## Tool Versions +KUSTOMIZE_VERSION ?= v5.3.0 +CONTROLLER_TOOLS_VERSION ?= v0.19.0 +ENVTEST_VERSION ?= release-0.19 + + ## Tool Binaries KUBECTL ?= kubectl KUSTOMIZE ?= $(LOCALBIN)/kustomize -CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen --load-build-tags=exclude_graphdriver_btrfs ENVTEST ?= $(LOCALBIN)/setup-envtest -## Tool Versions -KUSTOMIZE_VERSION ?= v5.3.0 -CONTROLLER_TOOLS_VERSION ?= v0.16.5 -ENVTEST_VERSION ?= release-0.19 - .PHONY: kustomize kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading. $(KUSTOMIZE): $(LOCALBIN) diff --git a/bundle/manifests/lightspeed-operator.clusterserviceversion.yaml b/bundle/manifests/lightspeed-operator.clusterserviceversion.yaml index 0e768b946..d305ca2f4 100644 --- a/bundle/manifests/lightspeed-operator.clusterserviceversion.yaml +++ b/bundle/manifests/lightspeed-operator.clusterserviceversion.yaml @@ -36,9 +36,9 @@ metadata: } } ] - capabilities: Basic Install + capabilities: Seamless Upgrades console.openshift.io/operator-monitoring-default: "true" - createdAt: "2025-10-10T17:31:05Z" + createdAt: "2025-12-06T17:28:28Z" features.operators.openshift.io/cnf: "false" features.operators.openshift.io/cni: "false" features.operators.openshift.io/csi: "false" @@ -81,9 +81,7 @@ spec: - description: The name of the secret object that stores API provider credentials displayName: Credential Secret path: llm.providers[0].credentialsSecretRef - - description: |- - Feature Gates holds list of features to be enabled explicitly, otherwise they are disabled by default. - possible values: MCPServer + - description: 'Feature Gates holds list of features to be enabled explicitly, otherwise they are disabled by default. possible values: MCPServer' displayName: Feature Gates path: featureGates - displayName: LLM Settings @@ -137,12 +135,7 @@ spec: - description: Enable Server Sent Events displayName: Enable Server Sent Events path: mcpServers[0].streamableHTTP.enableSSE - - description: |- - Headers to send to the MCP server - the map contains the header name and the name of the secret with the content of the header. This secret - should contain a header path in the data containing a header value. - A special case is usage of the kubernetes token in the header. to specify this use - a string "kubernetes" instead of the secret name + - description: Headers to send to the MCP server the map contains the header name and the name of the secret with the content of the header. This secret should contain a header path in the data containing a header value. A special case is usage of the kubernetes token in the header. to specify this use a string "kubernetes" instead of the secret name displayName: Headers path: mcpServers[0].streamableHTTP.headers - description: SSE Read Timeout, default is 10 seconds @@ -277,9 +270,7 @@ spec: - description: The configmap holding proxy CA certificate displayName: Proxy CA Certificate path: ols.proxyConfig.proxyCACertificate - - description: |- - Proxy URL, e.g. https://proxy.example.com:8080 - If not specified, the cluster wide proxy will be used, though env var "https_proxy". + - description: Proxy URL, e.g. https://proxy.example.com:8080 If not specified, the cluster wide proxy will be used, though env var "https_proxy". displayName: Proxy URL path: ols.proxyConfig.proxyURL - description: Query filters @@ -513,6 +504,18 @@ spec: - delete - get - update + - apiGroups: + - image.openshift.io + resources: + - imagestreams + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - monitoring.coreos.com resources: diff --git a/bundle/manifests/ols.openshift.io_olsconfigs.yaml b/bundle/manifests/ols.openshift.io_olsconfigs.yaml index f9bf8a19b..6ff25000b 100644 --- a/bundle/manifests/ols.openshift.io_olsconfigs.yaml +++ b/bundle/manifests/ols.openshift.io_olsconfigs.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.5 + controller-gen.kubebuilder.io/version: v0.19.0 creationTimestamp: null name: olsconfigs.ols.openshift.io spec: diff --git a/cmd/main.go b/cmd/main.go index d8c20d6f5..f618e2312 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -62,6 +62,7 @@ import ( _ "k8s.io/client-go/plugin/pkg/client/auth" consolev1 "github.com/openshift/api/console/v1" + imagev1 "github.com/openshift/api/image/v1" openshiftv1 "github.com/openshift/api/operator/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" @@ -107,6 +108,7 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(consolev1.AddToScheme(scheme)) + utilruntime.Must(imagev1.AddToScheme(scheme)) utilruntime.Must(openshiftv1.AddToScheme(scheme)) utilruntime.Must(monv1.AddToScheme(scheme)) utilruntime.Must(configv1.AddToScheme(scheme)) diff --git a/config/crd/bases/ols.openshift.io_olsconfigs.yaml b/config/crd/bases/ols.openshift.io_olsconfigs.yaml index f1386a4ca..70be7b0c6 100644 --- a/config/crd/bases/ols.openshift.io_olsconfigs.yaml +++ b/config/crd/bases/ols.openshift.io_olsconfigs.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.16.5 + controller-gen.kubebuilder.io/version: v0.19.0 name: olsconfigs.ols.openshift.io spec: group: ols.openshift.io diff --git a/config/crd/ocp/image.openshift.io_imagestreams.yaml b/config/crd/ocp/image.openshift.io_imagestreams.yaml new file mode 100644 index 000000000..e026402e4 --- /dev/null +++ b/config/crd/ocp/image.openshift.io_imagestreams.yaml @@ -0,0 +1,301 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.5 + name: imagestreams.image.openshift.io +spec: + group: image.openshift.io + names: + kind: ImageStream + listKind: ImageStreamList + plural: imagestreams + singular: imagestream + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: |- + An ImageStream stores a mapping of tags to images, metadata overrides that are applied + when images are tagged in a stream, and an optional reference to a container image + repository on a registry. Users typically update the spec.tags field to point to external + images which are imported from container registries using credentials in your namespace + with the pull secret type, or to existing image stream tags and images which are + immediately accessible for tagging or pulling. The history of images applied to a tag + is visible in the status.tags field and any user who can view an image stream is allowed + to tag that image into their own image streams. Access to pull images from the integrated + registry is granted by having the "get imagestreams/layers" permission on a given image + stream. Users may remove a tag by deleting the imagestreamtag resource, which causes both + spec and status for that tag to be removed. Image stream history is retained until an + administrator runs the prune operation, which removes references that are no longer in + use. To preserve a historical image, ensure there is a tag in spec pointing to that image + by its digest. + + Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). + 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 describes the desired state of this stream + properties: + dockerImageRepository: + description: |- + dockerImageRepository is optional, if specified this stream is backed by a container repository on this server + Deprecated: This field is deprecated as of v3.7 and will be removed in a future release. + Specify the source for the tags to be imported in each tag via the spec.tags.from reference instead. + type: string + lookupPolicy: + description: lookupPolicy controls how other resources reference images + within this namespace. + properties: + local: + description: |- + local will change the docker short image references (like "mysql" or + "php:latest") on objects in this namespace to the image ID whenever they match + this image stream, instead of reaching out to a remote registry. The name will + be fully qualified to an image ID if found. The tag's referencePolicy is taken + into account on the replaced value. Only works within the current namespace. + type: boolean + required: + - local + type: object + tags: + description: tags map arbitrary string values to specific image locators + items: + description: TagReference specifies optional annotations for images + using this tag and an optional reference to an ImageStreamTag, + ImageStreamImage, or DockerImage this tag should track. + properties: + annotations: + additionalProperties: + type: string + description: Optional; if specified, annotations that are applied + to images retrieved via ImageStreamTags. + type: object + from: + description: |- + Optional; if specified, a reference to another image that this tag should point to. Valid values + are ImageStreamTag, ImageStreamImage, and DockerImage. ImageStreamTag references + can only reference a tag within this same ImageStream. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + generation: + description: |- + Generation is a counter that tracks mutations to the spec tag (user intent). When a tag reference + is changed the generation is set to match the current stream generation (which is incremented every + time spec is changed). Other processes in the system like the image importer observe that the + generation of spec tag is newer than the generation recorded in the status and use that as a trigger + to import the newest remote tag. To trigger a new import, clients may set this value to zero which + will reset the generation to the latest stream generation. Legacy clients will send this value as + nil which will be merged with the current tag generation. + format: int64 + type: integer + importPolicy: + description: ImportPolicy is information that controls how images + may be imported by the server. + properties: + importMode: + description: ImportMode describes how to import an image + manifest. + type: string + insecure: + description: Insecure is true if the server may bypass certificate + verification or connect directly over HTTP during image + import. + type: boolean + scheduled: + description: Scheduled indicates to the server that this + tag should be periodically checked to ensure it is up + to date, and imported + type: boolean + type: object + name: + description: Name of the tag + type: string + reference: + description: |- + Reference states if the tag will be imported. Default value is false, which means the tag will + be imported. + type: boolean + referencePolicy: + description: ReferencePolicy defines how other components should + consume the image. + properties: + type: + description: |- + Type determines how the image pull spec should be transformed when the image stream tag is used in + deployment config triggers or new builds. The default value is `Source`, indicating the original + location of the image should be used (if imported). The user may also specify `Local`, indicating + that the pull spec should point to the integrated container image registry and leverage the registry's + ability to proxy the pull to an upstream registry. `Local` allows the credentials used to pull this + image to be managed from the image stream's namespace, so others on the platform can access a remote + image but have no access to the remote secret. It also allows the image layers to be mirrored into + the local registry which the images can still be pulled even if the upstream registry is unavailable. + type: string + required: + - type + type: object + required: + - name + type: object + type: array + type: object + status: + description: Status describes the current state of this stream + properties: + dockerImageRepository: + description: |- + DockerImageRepository represents the effective location this stream may be accessed at. + May be empty until the server determines where the repository is located + type: string + publicDockerImageRepository: + description: |- + PublicDockerImageRepository represents the public location from where the image can + be pulled outside the cluster. This field may be empty if the administrator + has not exposed the integrated registry externally. + type: string + tags: + description: |- + Tags are a historical record of images associated with each tag. The first entry in the + TagEvent array is the currently tagged image. + items: + description: NamedTagEventList relates a tag to its image history. + properties: + conditions: + description: Conditions is an array of conditions that apply + to the tag event list. + items: + description: TagEventCondition contains condition information + for a tag event. + properties: + generation: + description: Generation is the spec tag generation that + this status corresponds to + format: int64 + type: integer + lastTransitionTime: + description: LastTransitionTIme is the time the condition + transitioned from one status to another. + format: date-time + type: string + message: + description: Message is a human readable description of + the details about last transition, complementing reason. + type: string + reason: + description: Reason is a brief machine readable explanation + for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, + Unknown. + type: string + type: + description: Type of tag event condition, currently only + ImportSuccess + type: string + required: + - generation + - status + - type + type: object + type: array + items: + description: Standard object's metadata. + items: + description: TagEvent is used by ImageStreamStatus to keep + a historical record of images associated with a tag. + properties: + created: + description: Created holds the time the TagEvent was created + format: date-time + type: string + dockerImageReference: + description: DockerImageReference is the string that can + be used to pull this image + type: string + generation: + description: Generation is the spec tag generation that + resulted in this tag being updated + format: int64 + type: integer + image: + description: Image is the image + type: string + required: + - created + - dockerImageReference + - generation + - image + type: object + type: array + tag: + description: Tag is the tag for which the history is recorded + type: string + required: + - items + - tag + type: object + type: array + required: + - dockerImageRepository + type: object + type: object + served: true + storage: true diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 6cd59ef2f..9d7358ef0 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -100,6 +100,18 @@ rules: - delete - get - update +- apiGroups: + - image.openshift.io + resources: + - imagestreams + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - monitoring.coreos.com resources: diff --git a/go.mod b/go.mod index e8ec215a5..d342cf77e 100644 --- a/go.mod +++ b/go.mod @@ -16,10 +16,36 @@ require ( ) require ( + dario.cat/mergo v1.0.2 // indirect + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect + github.com/BurntSushi/toml v1.5.0 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Microsoft/hcsshim v0.13.0 // indirect + github.com/VividCortex/ewma v1.2.0 // indirect + github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/containerd/cgroups/v3 v3.0.5 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect + github.com/containerd/typeurl/v2 v2.2.3 // indirect + github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect + github.com/containers/ocicrypt v1.2.1 // indirect + github.com/containers/storage v1.59.1 // indirect + github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v28.3.2+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.3 // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/swag/cmdutils v0.25.3 // indirect github.com/go-openapi/swag/conv v0.25.3 // indirect github.com/go-openapi/swag/fileutils v0.25.3 // indirect @@ -32,25 +58,74 @@ require ( github.com/go-openapi/swag/typeutils v0.25.3 // indirect github.com/go-openapi/swag/yamlutils v0.25.3 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect + github.com/google/go-containerregistry v0.20.3 // indirect + github.com/google/go-intervals v0.0.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/pgzip v1.2.6 // indirect + github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-sqlite3 v1.14.28 // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mistifyio/go-zfs/v3 v3.0.1 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/spdystream v0.5.0 // indirect + github.com/moby/sys/capability v0.4.0 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect + github.com/moby/sys/user v0.4.0 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/opencontainers/runtime-spec v1.2.1 // indirect + github.com/opencontainers/selinux v1.12.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/proglottis/gpgme v0.1.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/sigstore/fulcio v1.6.6 // indirect + github.com/sigstore/protobuf-specs v0.4.1 // indirect + github.com/sigstore/sigstore v1.9.5 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/smallstep/pkcs7 v0.1.1 // indirect + github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 // indirect + github.com/sylabs/sif/v2 v2.21.1 // indirect + github.com/tchap/go-patricia/v2 v2.3.3 // indirect + github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect + github.com/vbatts/tar-split v0.12.1 // indirect + github.com/vbauerster/mpb/v8 v8.10.2 // indirect github.com/x448/float16 v0.8.4 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.44.0 // indirect golang.org/x/mod v0.30.0 // indirect golang.org/x/sync v0.18.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect + google.golang.org/grpc v1.72.2 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect ) -require github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.85.0 +require ( + github.com/containers/image/v5 v5.36.2 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.85.0 +) require ( github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index e213a3ae1..8e1c09e7e 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,92 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg= github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= +github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= +github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= +github.com/containers/image/v5 v5.36.2 h1:GcxYQyAHRF/pLqR4p4RpvKllnNL8mOBn0eZnqJbfTwk= +github.com/containers/image/v5 v5.36.2/go.mod h1:b4GMKH2z/5t6/09utbse2ZiLK/c72GuGLFdp7K69eA4= +github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= +github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= +github.com/containers/ocicrypt v1.2.1 h1:0qIOTT9DoYwcKmxSt8QJt+VzMY18onl9jUXsxpVhSmM= +github.com/containers/ocicrypt v1.2.1/go.mod h1:aD0AAqfMp0MtwqWgHM1bUwe1anx0VazI108CRrSKINQ= +github.com/containers/storage v1.59.1 h1:11Zu68MXsEQGBBd+GadPrHPpWeqjKS8hJDGiAHgIqDs= +github.com/containers/storage v1.59.1/go.mod h1:KoAYHnAjP3/cTsRS+mmWZGkufSY2GACiKQ4V3ZLQnR0= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v28.3.2+incompatible h1:mOt9fcLE7zaACbxW1GeS65RI67wIJrTnqS3hP2huFsY= +github.com/docker/cli v28.3.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v28.3.2+incompatible h1:wn66NJ6pWB1vBZIilP8G3qQPqHy5XymfYn5vsqeA5oA= +github.com/docker/docker v28.3.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= @@ -30,8 +97,13 @@ github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZ github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= github.com/gkampitakis/go-snaps v0.5.14 h1:3fAqdB6BCPKHDMHAKRwtPUwYexKtGrNuw8HX/T/4neo= github.com/gkampitakis/go-snaps v0.5.14/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.22.3 h1:dKMwfV4fmt6Ah90zloTbUKWMD+0he+12XYAsPotrkn8= @@ -70,26 +142,64 @@ github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6 github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI= +github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI= +github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM= +github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 h1:3DsUAV+VNEQa2CUVLxCY3f87278uWfIDhJnbdvDjvmE= github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= +github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= +github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -98,23 +208,51 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec h1:2tTW6cDth2TSgRbAhD7yjZzTQmcN25sDRPEeinR51yQ= +github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec/go.mod h1:TmwEoGCwIti7BCeJ9hescZgRtatxRE+A72pCoPfmcfk= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= +github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= +github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= +github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= +github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= @@ -123,36 +261,81 @@ github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= +github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= +github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= github.com/openshift/api v0.0.0-20250904155839-a30da32c0ca8 h1:MoRFjO11/qZjhg9kIOkaqEvgGjLzTtbq+msdWEB1SCM= github.com/openshift/api v0.0.0-20250904155839-a30da32c0ca8/go.mod h1:SPLf21TYPipzCO67BURkCfK6dcIIxx0oNRVWaOyRcXM= github.com/openshift/client-go v0.0.0-20231218140158-47f6d749b9d9 h1:kjgW3luAkf9NWu+8u+jqNNbexDG+CY82/INw8hGbG14= github.com/openshift/client-go v0.0.0-20231218140158-47f6d749b9d9/go.mod h1:kKmxYRXTMutfF7XzGppFdbLhNGX1brXkRsZx5ID8c7U= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/proglottis/gpgme v0.1.4 h1:3nE7YNA70o2aLjcg63tXMOhPD7bplfE5CBdV+hLAm2M= +github.com/proglottis/gpgme v0.1.4/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glEEZ7mRKrM= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.85.0 h1:oY+F5FZFmCjCyzkHWPjVQpzvnvEB/0FP+iyzDUUlqFc= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.85.0/go.mod h1:VB7wtBmDT6W2RJHzsvPZlBId+EnmeQA0d33fFTXvraM= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc= github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= github.com/prometheus/procfs v0.19.1 h1:QVtROpTkphuXuNlnCv3m1ut3JytkXHtQ3xvck/YmzMM= github.com/prometheus/procfs v0.19.1/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sebdah/goldie/v2 v2.5.5 h1:rx1mwF95RxZ3/83sdS4Yp7t2C5TCokvWP4TBRbAyEWY= +github.com/sebdah/goldie/v2 v2.5.5/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sigstore/fulcio v1.6.6 h1:XaMYX6TNT+8n7Npe8D94nyZ7/ERjEsNGFC+REdi/wzw= +github.com/sigstore/fulcio v1.6.6/go.mod h1:BhQ22lwaebDgIxVBEYOOqLRcN5+xOV+C9bh/GUXRhOk= +github.com/sigstore/protobuf-specs v0.4.1 h1:5SsMqZbdkcO/DNHudaxuCUEjj6x29tS2Xby1BxGU7Zc= +github.com/sigstore/protobuf-specs v0.4.1/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= +github.com/sigstore/sigstore v1.9.5 h1:Wm1LT9yF4LhQdEMy5A2JeGRHTrAWGjT3ubE5JUSrGVU= +github.com/sigstore/sigstore v1.9.5/go.mod h1:VtxgvGqCmEZN9X2zhFSOkfXxvKUjpy8RpUW39oCtoII= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smallstep/pkcs7 v0.1.1 h1:x+rPdt2W088V9Vkjho4KtoggyktZJlMduZAtRHm68LU= +github.com/smallstep/pkcs7 v0.1.1/go.mod h1:dL6j5AIz9GHjVEBTXtW+QliALcgM19RtXaTeyxI+AfA= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/sylabs/sif/v2 v2.21.1 h1:GZ0b5//AFAqJEChd8wHV/uSKx/l1iuGYwjR8nx+4wPI= +github.com/sylabs/sif/v2 v2.21.1/go.mod h1:YoqEGQnb5x/ItV653bawXHZJOXQaEWpGwHsSD3YePJI= +github.com/tchap/go-patricia/v2 v2.3.3 h1:xfNEsODumaEcCcY3gI0hYPZ/PcpVv5ju6RMAhgwZDDc= +github.com/tchap/go-patricia/v2 v2.3.3/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -161,10 +344,41 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= +github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= +github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= +github.com/vbauerster/mpb/v8 v8.10.2 h1:2uBykSHAYHekE11YvJhKxYmLATKHAGorZwFlyNw4hHM= +github.com/vbauerster/mpb/v8 v8.10.2/go.mod h1:+Ja4P92E3/CorSZgfDtK46D7AVbDqmBQRTmyTqPElo0= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -180,40 +394,114 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= +golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -222,6 +510,31 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= +google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -231,8 +544,13 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSP gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= diff --git a/hack/update_bundle.sh b/hack/update_bundle.sh index dcd409069..e57328c95 100755 --- a/hack/update_bundle.sh +++ b/hack/update_bundle.sh @@ -183,7 +183,7 @@ ${YQ} eval -i '.annotations."com.redhat.openshift.versions"="v4.16-v4.20"' ${ANN ${YQ} eval -i '(.annotations."com.redhat.openshift.versions" | key) head_comment="OCP compatibility labels"' ${ANNOTATION_FILE} ${YQ} eval -i '.annotations."features.operators.openshift.io/fips-compliant"="true"' ${ANNOTATION_FILE} # use UBI image as base image for bundle image -: "${BASE_IMAGE:=registry.redhat.io/ubi9/ubi-minimal:9.6}" +: "${BASE_IMAGE:=registry.redhat.io/ubi9/ubi-minimal:9.7}" sed -i 's|^FROM scratch|FROM '"${BASE_IMAGE}"'|' ${BUNDLE_DOCKERFILE} # generate bundle container file using template_bundle.Containerfile diff --git a/internal/controller/appserver/deployment.go b/internal/controller/appserver/deployment.go index c814e553b..03afcdcc2 100644 --- a/internal/controller/appserver/deployment.go +++ b/internal/controller/appserver/deployment.go @@ -428,6 +428,10 @@ func GenerateOLSDeployment(r reconciler.Reconciler, cr *olsv1alpha1.OLSConfig) ( }, } + if len(cr.Spec.OLSConfig.RAG) > 0 { + deployment.Annotations[utils.OLSAppServerImageStreamTriggerAnnotation] = generateImageStreamTriggers(cr) + } + if cr.Spec.OLSConfig.DeploymentConfig.APIContainer.NodeSelector != nil { deployment.Spec.Template.Spec.NodeSelector = cr.Spec.OLSConfig.DeploymentConfig.APIContainer.NodeSelector } @@ -499,7 +503,7 @@ func GenerateOLSDeployment(r reconciler.Reconciler, cr *olsv1alpha1.OLSConfig) ( func updateOLSDeployment(r reconciler.Reconciler, ctx context.Context, existingDeployment, desiredDeployment *appsv1.Deployment) error { // Step 1: Check if deployment spec has changed utils.SetDefaults_Deployment(desiredDeployment) - changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec) + changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec, false) // Step 2: Check if OLS ConfigMap ResourceVersion has changed currentConfigMapVersion, err := utils.GetConfigMapResourceVersion(r, ctx, utils.OLSConfigCmName) diff --git a/internal/controller/appserver/rag.go b/internal/controller/appserver/rag.go index 444fc3237..c32c10a08 100644 --- a/internal/controller/appserver/rag.go +++ b/internal/controller/appserver/rag.go @@ -3,6 +3,7 @@ package appserver import ( "fmt" "path" + "strings" corev1 "k8s.io/api/core/v1" @@ -45,3 +46,15 @@ func generateRAGVolumeMount() corev1.VolumeMount { MountPath: utils.RAGVolumeMountPath, } } + +func generateImageStreamTriggers(cr *olsv1alpha1.OLSConfig) string { + res := "[" + triggers := []string{} + for idx, rag := range cr.Spec.OLSConfig.RAG { + isName := utils.ImageStreamNameFor(rag.Image) + initContainerName := fmt.Sprintf("rag-%d", idx) + triggers = append(triggers, fmt.Sprintf(`{"from":{"kind":"ImageStreamTag","name":"%s:latest"},"fieldPath":"spec.template.spec.initContainers[?(@.name==\"%s\")].image"}`, isName, initContainerName)) + } + res += strings.Join(triggers, ",") + "]" + return res +} diff --git a/internal/controller/appserver/rag_test.go b/internal/controller/appserver/rag_test.go index c0750a1d0..ae1e934e7 100644 --- a/internal/controller/appserver/rag_test.go +++ b/internal/controller/appserver/rag_test.go @@ -1,12 +1,16 @@ package appserver import ( + "context" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gstruct" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + imagev1 "github.com/openshift/api/image/v1" olsv1alpha1 "github.com/openshift/lightspeed-operator/api/v1alpha1" "github.com/openshift/lightspeed-operator/internal/controller/utils" ) @@ -59,5 +63,14 @@ var _ = Describe("App server assets", func() { })) }) + It("should create an ImageStream for each RAG image", func() { + err := reconcileImageStreams(testReconcilerInstance, context.Background(), cr) + Expect(err).NotTo(HaveOccurred()) + for _, rag := range cr.Spec.OLSConfig.RAG { + var is imagev1.ImageStream + err = testReconcilerInstance.Get(ctx, types.NamespacedName{Name: utils.ImageStreamNameFor(rag.Image), Namespace: testReconcilerInstance.GetNamespace()}, &is) + Expect(err).NotTo(HaveOccurred()) + } + }) }) }) diff --git a/internal/controller/appserver/reconciler.go b/internal/controller/appserver/reconciler.go index 5119ce1e0..9466fe393 100644 --- a/internal/controller/appserver/reconciler.go +++ b/internal/controller/appserver/reconciler.go @@ -21,14 +21,20 @@ import ( "github.com/openshift/lightspeed-operator/internal/controller/reconciler" + imagev1 "github.com/openshift/api/image/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" rbacv1 "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" @@ -73,6 +79,10 @@ func ReconcileAppServerResources(r reconciler.Reconciler, ctx context.Context, o Name: "reconcile Proxy CA ConfigMap", Task: reconcileProxyCAConfigMap, }, + { + Name: "reconcile ImageStreams", + Task: reconcileImageStreams, + }, } failedTasks := make(map[string]error) @@ -577,3 +587,97 @@ func ReconcileAppServer(r reconciler.Reconciler, ctx context.Context, olsconfig r.GetLogger().Info("reconcileAppServer completes") return nil } + +func reconcileImageStreams(r reconciler.Reconciler, ctx context.Context, cr *olsv1alpha1.OLSConfig) error { + var ragImages []string + for _, rag := range cr.Spec.OLSConfig.RAG { + ragImages = append(ragImages, rag.Image) + } + + desired := make(map[string]*imagev1.ImageStream, len(ragImages)) + for _, img := range uniqueStrings(ragImages) { + name := utils.ImageStreamNameFor(img) + is := &imagev1.ImageStream{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: r.GetNamespace(), + Labels: utils.GenerateAppServerSelectorLabels(), + }, + Spec: imagev1.ImageStreamSpec{ + Tags: []imagev1.TagReference{ + { + Name: "latest", + From: &corev1.ObjectReference{ + Kind: "DockerImage", + Name: img, + }, + ImportPolicy: imagev1.TagImportPolicy{ + Scheduled: true, + }, + ReferencePolicy: imagev1.TagReferencePolicy{ + Type: imagev1.SourceTagReferencePolicy, + }, + }, + }, + }, + } + if err := controllerutil.SetControllerReference(cr, is, r.GetScheme()); err != nil { + return err + } + desired[name] = is + } + + sel := labels.SelectorFromSet(utils.GenerateAppServerSelectorLabels()) + var existing imagev1.ImageStreamList + if err := r.List(ctx, &existing, client.InNamespace(r.GetNamespace()), &client.ListOptions{LabelSelector: sel}); err != nil { + return fmt.Errorf("list ImageStreams: %w", err) + } + + seen := make(map[string]struct{}, len(desired)) + for name, want := range desired { + var got imagev1.ImageStream + err := r.Get(ctx, types.NamespacedName{Name: name, Namespace: r.GetNamespace()}, &got) + if client.IgnoreNotFound(err) != nil { + return fmt.Errorf("get ImageStream %q: %w", name, err) + } + if err != nil { + if err := r.Create(ctx, want); err != nil { + return fmt.Errorf("create ImageStream %q: %w", name, err) + } + } else { + updated := got.DeepCopy() + + if !equality.Semantic.DeepEqual(updated.Spec, got.Spec) || + !equality.Semantic.DeepEqual(updated.OwnerReferences, got.OwnerReferences) { + if err := r.Update(ctx, updated); err != nil { + return fmt.Errorf("update ImageStream %q: %w", name, err) + } + } + } + seen[name] = struct{}{} + } + + for _, is := range existing.Items { + if _, ok := seen[is.Name]; ok { + continue + } + if err := r.Delete(ctx, &is); client.IgnoreNotFound(err) != nil { + return fmt.Errorf("delete ImageStream %q: %w", is.Name, err) + } + } + + return nil +} + +func uniqueStrings(in []string) []string { + seen := make(map[string]struct{}, len(in)) + var out []string + for _, s := range in { + if _, ok := seen[s]; ok { + continue + } + seen[s] = struct{}{} + out = append(out, s) + } + return out +} diff --git a/internal/controller/appserver/suite_test.go b/internal/controller/appserver/suite_test.go index 92f3342d1..2ebeb39dd 100644 --- a/internal/controller/appserver/suite_test.go +++ b/internal/controller/appserver/suite_test.go @@ -10,6 +10,7 @@ import ( configv1 "github.com/openshift/api/config/v1" consolev1 "github.com/openshift/api/console/v1" + imagev1 "github.com/openshift/api/image/v1" openshiftv1 "github.com/openshift/api/operator/v1" monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" corev1 "k8s.io/api/core/v1" @@ -78,6 +79,9 @@ var _ = BeforeSuite(func() { err = configv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) + err = imagev1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + //+kubebuilder:scaffold:scheme k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) diff --git a/internal/controller/console/reconciler.go b/internal/controller/console/reconciler.go index 710350a1d..d0aece0c9 100644 --- a/internal/controller/console/reconciler.go +++ b/internal/controller/console/reconciler.go @@ -207,7 +207,7 @@ func ReconcileConsoleUIDeployment(r reconciler.Reconciler, ctx context.Context, // Check if deployment spec has changed // Note: TLS secret changes are handled by watchers, not here - if utils.DeploymentSpecEqual(&foundDeployment.Spec, &deployment.Spec) { + if utils.DeploymentSpecEqual(&foundDeployment.Spec, &deployment.Spec, true) { return nil } diff --git a/internal/controller/lcore/deployment.go b/internal/controller/lcore/deployment.go index cae0fef89..303922889 100644 --- a/internal/controller/lcore/deployment.go +++ b/internal/controller/lcore/deployment.go @@ -592,7 +592,7 @@ func RestartLCore(r reconciler.Reconciler, ctx context.Context, deployment ...*a func updateLCoreDeployment(r reconciler.Reconciler, ctx context.Context, existingDeployment, desiredDeployment *appsv1.Deployment) error { // Step 1: Check if deployment spec has changed utils.SetDefaults_Deployment(desiredDeployment) - changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec) + changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec, true) // Step 2: Check ConfigMap ResourceVersions // Check if LCore ConfigMap ResourceVersion has changed diff --git a/internal/controller/olsconfig_controller.go b/internal/controller/olsconfig_controller.go index 1921a015d..c4539abd7 100644 --- a/internal/controller/olsconfig_controller.go +++ b/internal/controller/olsconfig_controller.go @@ -54,6 +54,7 @@ import ( "github.com/go-logr/logr" consolev1 "github.com/openshift/api/console/v1" + imagev1 "github.com/openshift/api/image/v1" monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -142,6 +143,9 @@ type OLSConfigReconciler struct { // +kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=storage.k8s.io,resources=storageclasses,verbs=get;list;watch +// ImageStream access +// +kubebuilder:rbac:groups=image.openshift.io,resources=imagestreams,verbs=get;list;watch;create;update;patch;delete + // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.17.3/pkg/reconcile func (r *OLSConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { @@ -459,5 +463,6 @@ func (r *OLSConfigReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&consolev1.ConsolePlugin{}). Owns(&monv1.ServiceMonitor{}). Owns(&monv1.PrometheusRule{}). + Owns(&imagev1.ImageStream{}). Complete(r) } diff --git a/internal/controller/postgres/deployment.go b/internal/controller/postgres/deployment.go index d9106e7b5..4bd50b9d5 100644 --- a/internal/controller/postgres/deployment.go +++ b/internal/controller/postgres/deployment.go @@ -261,7 +261,7 @@ func GeneratePostgresDeployment(r reconciler.Reconciler, ctx context.Context, cr func UpdatePostgresDeployment(r reconciler.Reconciler, ctx context.Context, cr *olsv1alpha1.OLSConfig, existingDeployment, desiredDeployment *appsv1.Deployment) error { // Step 1: Check if deployment spec has changed utils.SetDefaults_Deployment(desiredDeployment) - changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec) + changed := !utils.DeploymentSpecEqual(&existingDeployment.Spec, &desiredDeployment.Spec, true) // Step 2: Check if ConfigMap ResourceVersion has changed currentConfigMapVersion, err := utils.GetConfigMapResourceVersion(r, ctx, utils.PostgresConfigMap) diff --git a/internal/controller/suite_test.go b/internal/controller/suite_test.go index a2236bc04..1d948132a 100644 --- a/internal/controller/suite_test.go +++ b/internal/controller/suite_test.go @@ -26,6 +26,7 @@ import ( configv1 "github.com/openshift/api/config/v1" consolev1 "github.com/openshift/api/console/v1" + imagev1 "github.com/openshift/api/image/v1" openshiftv1 "github.com/openshift/api/operator/v1" monv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" corev1 "k8s.io/api/core/v1" @@ -98,6 +99,9 @@ var _ = BeforeSuite(func() { err = configv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) + err = imagev1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + //+kubebuilder:scaffold:scheme k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) diff --git a/internal/controller/utils/constants.go b/internal/controller/utils/constants.go index fb6f4e8ad..d812f2d85 100644 --- a/internal/controller/utils/constants.go +++ b/internal/controller/utils/constants.go @@ -116,6 +116,8 @@ const ( AzureOpenAIType = "azure_openai" // DeploymentInProgress message DeploymentInProgress = "In Progress" + // BYOK image stream annotation on the app server deployment + OLSAppServerImageStreamTriggerAnnotation = "image.openshift.io/triggers" /*** console UI plugin ***/ // ConsoleUIConfigMapName is the name of the console UI nginx configmap diff --git a/internal/controller/utils/utils.go b/internal/controller/utils/utils.go index 6fcfde75b..0b3c708fb 100644 --- a/internal/controller/utils/utils.go +++ b/internal/controller/utils/utils.go @@ -17,10 +17,13 @@ package utils import ( "context" + "crypto/sha1" //nolint:gosec "crypto/x509" + "encoding/hex" "encoding/pem" "fmt" "os" + "regexp" "strings" configv1 "github.com/openshift/api/config/v1" @@ -200,7 +203,7 @@ func ConfigMapEqual(a, b *corev1.ConfigMap) bool { apiequality.Semantic.DeepEqual(a.BinaryData, b.BinaryData) } -func DeploymentSpecEqual(a, b *appsv1.DeploymentSpec) bool { +func DeploymentSpecEqual(a, b *appsv1.DeploymentSpec, compareInitContainers bool) bool { if !apiequality.Semantic.DeepEqual(a.Template.Spec.NodeSelector, b.Template.Spec.NodeSelector) || // check node selector !apiequality.Semantic.DeepEqual(a.Template.Spec.Tolerations, b.Template.Spec.Tolerations) || // check toleration !apiequality.Semantic.DeepEqual(a.Strategy, b.Strategy) || // check strategy @@ -215,7 +218,7 @@ func DeploymentSpecEqual(a, b *appsv1.DeploymentSpec) bool { } // check init containers - if !ContainersEqual(a.Template.Spec.InitContainers, b.Template.Spec.InitContainers) { + if compareInitContainers && !ContainersEqual(a.Template.Spec.InitContainers, b.Template.Spec.InitContainers) { return false } @@ -686,3 +689,22 @@ func ForEachExternalConfigMap(cr *olsv1alpha1.OLSConfig, fn func(name string, so return nil } + +func ImageStreamNameFor(image string) string { + base := strings.ToLower(strings.ReplaceAll(image, "/", "_")) + base = strings.ReplaceAll(base, ":", "_") + base = strings.ReplaceAll(base, "@", "_") + + re := regexp.MustCompile(`[^a-z0-9-]+`) + slug := re.ReplaceAllString(base, "-") + slug = strings.Trim(slug, "-") + + const maxSlug = 52 + if len(slug) > maxSlug { + slug = slug[:maxSlug] + } + slug = strings.Trim(slug, "-") + sum := sha1.Sum([]byte(image)) //nolint:gosec + sfx := hex.EncodeToString(sum[:])[:6] + return fmt.Sprintf("%s-%s", slug, sfx) +} diff --git a/internal/controller/utils/utils_comparison_test.go b/internal/controller/utils/utils_comparison_test.go index 233047b9d..f1130d5f6 100644 --- a/internal/controller/utils/utils_comparison_test.go +++ b/internal/controller/utils/utils_comparison_test.go @@ -231,44 +231,44 @@ var _ = Describe("Resource Comparison Functions", func() { }) It("should return true for identical deployment specs", func() { - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeTrue()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeTrue()) }) It("should return false when replicas differ", func() { newReplicas := int32(3) deployment2.Replicas = &newReplicas - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) It("should return false when node selector differs", func() { deployment2.Template.Spec.NodeSelector = map[string]string{"disktype": "hdd"} - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) It("should return false when tolerations differ", func() { deployment2.Template.Spec.Tolerations = []corev1.Toleration{} - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) It("should return false when strategy differs", func() { deployment2.Strategy.Type = appsv1.RecreateDeploymentStrategyType - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) It("should return false when volumes differ", func() { deployment2.Template.Spec.Volumes = []corev1.Volume{} - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) It("should return false when containers differ", func() { deployment2.Template.Spec.Containers[0].Image = "myapp:v2" - Expect(DeploymentSpecEqual(deployment1, deployment2)).To(BeFalse()) + Expect(DeploymentSpecEqual(deployment1, deployment2, true)).To(BeFalse()) }) }) diff --git a/internal/controller/utils/utils_deployment_test.go b/internal/controller/utils/utils_deployment_test.go index f66e28fd3..578afcc42 100644 --- a/internal/controller/utils/utils_deployment_test.go +++ b/internal/controller/utils/utils_deployment_test.go @@ -62,7 +62,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { replicas := int32(3) desiredDeployment.Spec.Replicas = &replicas - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -70,7 +70,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { It("should detect when replicas are the same", func() { desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) @@ -80,7 +80,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { replicas := int32(0) desiredDeployment.Spec.Replicas = &replicas - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -98,7 +98,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { }, } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -110,7 +110,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { deployment.Spec.Template.Spec.Tolerations = tolerations desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) @@ -120,7 +120,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { desiredDeployment := deployment.DeepCopy() desiredDeployment.Spec.Template.Spec.Tolerations = []corev1.Toleration{} - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -134,7 +134,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { "region": "us-west", } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -144,7 +144,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { deployment.Spec.Template.Spec.NodeSelector = nodeSelector desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) @@ -154,7 +154,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { desiredDeployment := deployment.DeepCopy() desiredDeployment.Spec.Template.Spec.NodeSelector = map[string]string{} - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -174,7 +174,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { }, } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -182,7 +182,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { It("should detect when volumes are the same", func() { desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) @@ -198,7 +198,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { {Name: "vol-a", VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}}}, } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) // Should be true because PodVolumeEqual sorts them Expect(equal).To(BeTrue()) @@ -212,7 +212,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { {Name: "vol2", MountPath: "/config"}, } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -220,7 +220,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { It("should detect when volume mounts are the same", func() { desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) @@ -229,7 +229,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { desiredDeployment := deployment.DeepCopy() desiredDeployment.Spec.Template.Spec.Containers[0].VolumeMounts = []corev1.VolumeMount{} - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -283,7 +283,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { }, } - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeFalse()) }) @@ -291,7 +291,7 @@ var _ = Describe("Deployment Manipulation Functions", func() { It("should detect when resources are the same", func() { desiredDeployment := deployment.DeepCopy() - equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec) + equal := DeploymentSpecEqual(&deployment.Spec, &desiredDeployment.Spec, true) Expect(equal).To(BeTrue()) }) diff --git a/rpms.in.yaml b/rpms.in.yaml index b03dae8e8..3c3226f95 100644 --- a/rpms.in.yaml +++ b/rpms.in.yaml @@ -1,4 +1,4 @@ -packages: [jq] +packages: [jq, gpgme-devel] contentOrigin: repofiles: ["./ubi.repo"] arches: [x86_64, aarch64] diff --git a/rpms.lock.yaml b/rpms.lock.yaml index 2e915e1ce..3c6ed01bc 100644 --- a/rpms.lock.yaml +++ b/rpms.lock.yaml @@ -4,6 +4,55 @@ lockfileVendor: redhat arches: - arch: aarch64 packages: + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/g/glib2-devel-2.68.4-18.el9_7.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 562642 + checksum: sha256:c8197e152d3f83d3d615e2c700b3651b6f225051a98a1ef9fca3d091a3ba0d41 + name: glib2-devel + evr: 2.68.4-18.el9_7 + sourcerpm: glib2-2.68.4-18.el9_7.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libblkid-devel-2.37.4-21.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 18820 + checksum: sha256:41a14a958ddb7b3dd1f01f3ac19a75156e551d088c1fc7e5d77e060119537ee3 + name: libblkid-devel + evr: 2.37.4-21.el9 + sourcerpm: util-linux-2.37.4-21.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libffi-devel-3.4.2-8.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 31109 + checksum: sha256:5cbe643ebd6c7608b127ccb0eaff9320db2e77b60dd79a3bfbf1b49cd1877bd6 + name: libffi-devel + evr: 3.4.2-8.el9 + sourcerpm: libffi-3.4.2-8.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libgpg-error-devel-1.42-5.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 70304 + checksum: sha256:0d815a4a6adc7b4a5bf19770ae55308c997af8e50274fe3f2b8fc4aeaccc086c + name: libgpg-error-devel + evr: 1.42-5.el9 + sourcerpm: libgpg-error-1.42-5.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libmount-devel-2.37.4-21.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 19507 + checksum: sha256:cc916cb9374d41ccd421f89f9330310ebc8e9980386194c2f80dd409805ffba8 + name: libmount-devel + evr: 2.37.4-21.el9 + sourcerpm: util-linux-2.37.4-21.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libselinux-devel-3.6-3.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 166975 + checksum: sha256:72c7fe8206d0eefa506962f2f3e3e15be9c3dca8d6d9d968e9983c9727557cc1 + name: libselinux-devel + evr: 3.6-3.el9 + sourcerpm: libselinux-3.6-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/l/libsepol-devel-3.6-3.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 52234 + checksum: sha256:4400c6eada78369b0be71e9c9ea350835d9d9c70e8347fc7d003113d1504edb2 + name: libsepol-devel + evr: 3.6-3.el9 + sourcerpm: libsepol-3.6-3.el9.src.rpm - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/o/oniguruma-6.9.6-1.el9.5.aarch64.rpm repoid: ubi-9-for-aarch64-appstream-rpms size: 222582 @@ -11,6 +60,90 @@ arches: name: oniguruma evr: 6.9.6-1.el9.5 sourcerpm: oniguruma-6.9.6-1.el9.5.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre-cpp-8.44-4.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 26773 + checksum: sha256:c2fe0ce9b973902ef670187fbc8a6ab061f77a371dcd26afdb8b08b2a7f8527a + name: pcre-cpp + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre-devel-8.44-4.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 522441 + checksum: sha256:3b4d4cf28fa8a4970fa0d20c0c34056aa8b04516764f1fe99ef7a7be3dcec438 + name: pcre-devel + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre-utf16-8.44-4.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 172108 + checksum: sha256:46d829467bc41118a15fcef940dd18a247b6610d61af26e9074acbc6c761f5d9 + name: pcre-utf16 + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre-utf32-8.44-4.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 164050 + checksum: sha256:c56242c8c7f82bd797e8370679fcf692f52c60d138c9850dd0f3b3a50cf3a0ae + name: pcre-utf32 + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre2-devel-10.40-6.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 528574 + checksum: sha256:58600c82959cc9ed11bf8e353a1744faf1bad7629dde5efcccc2e620fbc601ea + name: pcre2-devel + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre2-utf16-10.40-6.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 202210 + checksum: sha256:10fa13474654d43c785714d2250aa5db45a52b672d6ef2ba35d168e86522d5d4 + name: pcre2-utf16 + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/pcre2-utf32-10.40-6.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 192622 + checksum: sha256:7a953c81ff18f05fba47b636e813b410e938db1f934c63b207b14bf0b52c4ad3 + name: pcre2-utf32 + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/p/python-unversioned-command-3.9.23-2.el9.noarch.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 9209 + checksum: sha256:20ed4bbcb151aef651eb315825d3a02e0f6203ab1b858e94812258f5b41ce703 + name: python-unversioned-command + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/s/sysprof-capture-devel-3.40.1-3.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 66841 + checksum: sha256:47307f58e4707dc31c1bf096e095653aff30837cea5cb4a8820c4c6d57870eb3 + name: sysprof-capture-devel + evr: 3.40.1-3.el9 + sourcerpm: sysprof-3.40.1-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/appstream/os/Packages/z/zlib-devel-1.2.11-40.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-appstream-rpms + size: 47965 + checksum: sha256:ec1e974313c06f71a11a0732b9b08ef588e3cc58bd7ee0c02df792a1b196f60b + name: zlib-devel + evr: 1.2.11-40.el9 + sourcerpm: zlib-1.2.11-40.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/e/elfutils-libelf-0.193-1.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 208617 + checksum: sha256:481f731dd9877eedebe6b99cb1af171e091ce59265aa6bbee04f9b6b589c9ce6 + name: elfutils-libelf + evr: 0.193-1.el9 + sourcerpm: elfutils-0.193-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/e/expat-2.5.0-5.el9_7.1.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 114334 + checksum: sha256:1129f05857f5fad3f7755514591fa22cedda810f541476e3a54b6257a4846341 + name: expat + evr: 2.5.0-5.el9_7.1 + sourcerpm: expat-2.5.0-5.el9_7.1.src.rpm - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/j/jq-1.6-19.el9.aarch64.rpm repoid: ubi-9-for-aarch64-baseos-rpms size: 185334 @@ -18,10 +151,136 @@ arches: name: jq evr: 1.6-19.el9 sourcerpm: jq-1.6-19.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/l/libpkgconf-1.7.3-10.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 38310 + checksum: sha256:9bdfccf6b092e0683aa6984f7c6caa737b30c0b1495e16abb03b5d1a5f8e787a + name: libpkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/pkgconf-1.7.3-10.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 45196 + checksum: sha256:aa38a3951a690d721a815ea8f9b01995a85f35a8540d8075205821011d0385e6 + name: pkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/pkgconf-m4-1.7.3-10.el9.noarch.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 16054 + checksum: sha256:91bafd6e06099451f60288327b275cfcc651822f6145176a157c6b0fa5131e02 + name: pkgconf-m4 + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/pkgconf-pkg-config-1.7.3-10.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 12398 + checksum: sha256:47f1f744f96a2f3d360bc129837738dcebb1ee5032effc4472a891eea1d6a907 + name: pkgconf-pkg-config + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/python3-3.9.23-2.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 26208 + checksum: sha256:61362064f2fad6a572a4b52dedac8a4f7aa2b80bf91c914d35d4608272a3a86b + name: python3 + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/python3-libs-3.9.23-2.el9.aarch64.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 8464402 + checksum: sha256:433d9fc1e3b431d206334cd6271e92b53a1b40b805dc265c772b3f0935cda9ea + name: python3-libs + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/python3-pip-wheel-21.3.1-1.el9.noarch.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 1193706 + checksum: sha256:75c46aab03898c66ce16be556432b71aed7efcedce02b9263339c14f57b4fdc0 + name: python3-pip-wheel + evr: 21.3.1-1.el9 + sourcerpm: python-pip-21.3.1-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/baseos/os/Packages/p/python3-setuptools-wheel-53.0.0-15.el9.noarch.rpm + repoid: ubi-9-for-aarch64-baseos-rpms + size: 479203 + checksum: sha256:36dacb345e21bc0308ef2508f0c93995520a15ef0b56aab3593186c8dc9c0c5a + name: python3-setuptools-wheel + evr: 53.0.0-15.el9 + sourcerpm: python-setuptools-53.0.0-15.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/codeready-builder/os/Packages/g/gpgme-devel-1.15.1-6.el9.aarch64.rpm + repoid: codeready-builder-for-ubi-9-aarch64-rpms + size: 169701 + checksum: sha256:fd33333376d49ad4260b7d1d3244b776e7152285a008a1b8dc0bb4ea0679e67d + name: gpgme-devel + evr: 1.15.1-6.el9 + sourcerpm: gpgme-1.15.1-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/aarch64/codeready-builder/os/Packages/l/libassuan-devel-2.5.5-3.el9.aarch64.rpm + repoid: codeready-builder-for-ubi-9-aarch64-rpms + size: 66558 + checksum: sha256:6d9f0d4616ac24b91eea9207b5ca5a742c634bf786ef044a4f712c3916d0d5bd + name: libassuan-devel + evr: 2.5.5-3.el9 + sourcerpm: libassuan-2.5.5-3.el9.src.rpm source: [] module_metadata: [] - arch: x86_64 packages: + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/glib2-devel-2.68.4-18.el9_7.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 562955 + checksum: sha256:a92921a6541a470f8ee54756affdc99efc46f53b55a894f3ed1a13bd3953f819 + name: glib2-devel + evr: 2.68.4-18.el9_7 + sourcerpm: glib2-2.68.4-18.el9_7.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libblkid-devel-2.37.4-21.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 18854 + checksum: sha256:f0bcbd0d6d96405d96e6a5326ec382d37133af36b6f8c491506b4e2e2785f702 + name: libblkid-devel + evr: 2.37.4-21.el9 + sourcerpm: util-linux-2.37.4-21.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libffi-devel-3.4.2-8.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 32520 + checksum: sha256:cd74ba2a4bac6b9f7df20e50915e0aeee6581dd815d3a388eb3f9c45565cef68 + name: libffi-devel + evr: 3.4.2-8.el9 + sourcerpm: libffi-3.4.2-8.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libgpg-error-devel-1.42-5.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 70899 + checksum: sha256:3bbaa1add2e083a43ce0cb9e1c1a35ad8a5e8f2f56280b8f1ab241194acc56d6 + name: libgpg-error-devel + evr: 1.42-5.el9 + sourcerpm: libgpg-error-1.42-5.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libmount-devel-2.37.4-21.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 19542 + checksum: sha256:b6cc197e511d7326496d6b4a14614b972bcd3e7170d7d5736073139891a775b5 + name: libmount-devel + evr: 2.37.4-21.el9 + sourcerpm: util-linux-2.37.4-21.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libselinux-devel-3.6-3.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 166987 + checksum: sha256:7a6edd1eea0907f10a43ca35b1d0845a72d25901c6fe037bb9cd0a7876c7c338 + name: libselinux-devel + evr: 3.6-3.el9 + sourcerpm: libselinux-3.6-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libsepol-devel-3.6-3.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 52271 + checksum: sha256:9706feb22f9a935b86ce91833637dd8cb567f379c008fc63dd070fdd6ce75036 + name: libsepol-devel + evr: 3.6-3.el9 + sourcerpm: libsepol-3.6-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libxcrypt-compat-4.4.18-3.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 93189 + checksum: sha256:2bd6c288e1970a001d3a1ae69166c0d926d9c87ce892edcb2110f4e142c12a7a + name: libxcrypt-compat + evr: 4.4.18-3.el9 + sourcerpm: libxcrypt-4.4.18-3.el9.src.rpm - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/o/oniguruma-6.9.6-1.el9.5.x86_64.rpm repoid: ubi-9-for-x86_64-appstream-rpms size: 226331 @@ -29,6 +288,90 @@ arches: name: oniguruma evr: 6.9.6-1.el9.5 sourcerpm: oniguruma-6.9.6-1.el9.5.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre-cpp-8.44-4.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 27327 + checksum: sha256:8d627da32ee74ce4855162c6b592d1693084645d078ca3c229af138dd9da5f2a + name: pcre-cpp + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre-devel-8.44-4.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 522466 + checksum: sha256:9e164aa48810dbdf2d8373dfaccdccf7a51c78c75a2c459074d41e661aa6a665 + name: pcre-devel + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre-utf16-8.44-4.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 190856 + checksum: sha256:bab46d49557b6f8a20e1c367e22bf9c7a6b802e97e6acb506ccb1fd5c06debe3 + name: pcre-utf16 + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre-utf32-8.44-4.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 181048 + checksum: sha256:1c9aad468e260629903304f29bac36faddb3960e67dc543502c4ec7900d84f01 + name: pcre-utf32 + evr: 8.44-4.el9 + sourcerpm: pcre-8.44-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre2-devel-10.40-6.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 528624 + checksum: sha256:f2fa0c49019f12b9c01986c1d05ffc83863ac7b47b8e348d6357e7fbdf3b17e3 + name: pcre2-devel + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre2-utf16-10.40-6.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 220256 + checksum: sha256:935664188bce50473e3c148fc9d71167d3881fc2de9ccc99394c03d00e8ff5b3 + name: pcre2-utf16 + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/pcre2-utf32-10.40-6.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 209174 + checksum: sha256:d50fc56a1e9710b3374826c82044d4624b6c5949db0178d5774f575a5fcd6934 + name: pcre2-utf32 + evr: 10.40-6.el9 + sourcerpm: pcre2-10.40-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/python-unversioned-command-3.9.23-2.el9.noarch.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 9209 + checksum: sha256:20ed4bbcb151aef651eb315825d3a02e0f6203ab1b858e94812258f5b41ce703 + name: python-unversioned-command + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/s/sysprof-capture-devel-3.40.1-3.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 65413 + checksum: sha256:3006309779a18bde4fff7e633881218284a46584e4d529a14fbbc4bc0683ebae + name: sysprof-capture-devel + evr: 3.40.1-3.el9 + sourcerpm: sysprof-3.40.1-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/z/zlib-devel-1.2.11-40.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-appstream-rpms + size: 48017 + checksum: sha256:9775022716a2b6dd51d151a40aa4a6bcb466edeb01b747f48072703e509be097 + name: zlib-devel + evr: 1.2.11-40.el9 + sourcerpm: zlib-1.2.11-40.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/e/elfutils-libelf-0.193-1.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 209533 + checksum: sha256:c37308dadac722a4fc928cb4b919c0c5561c458169f754beb7375eb067012195 + name: elfutils-libelf + evr: 0.193-1.el9 + sourcerpm: elfutils-0.193-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/e/expat-2.5.0-5.el9_7.1.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 120241 + checksum: sha256:e8ce7bfb8667fc6e4d080f4cae71e175a25cc78b5389a41e3e2e05ffe8edeafe + name: expat + evr: 2.5.0-5.el9_7.1 + sourcerpm: expat-2.5.0-5.el9_7.1.src.rpm - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/j/jq-1.6-19.el9.x86_64.rpm repoid: ubi-9-for-x86_64-baseos-rpms size: 191662 @@ -36,5 +379,75 @@ arches: name: jq evr: 1.6-19.el9 sourcerpm: jq-1.6-19.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/libpkgconf-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 38387 + checksum: sha256:4feae5941b73640bd86b8d506a657cac5b770043db1464fbcd207721b2159dda + name: libpkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 45675 + checksum: sha256:bb47b4ecc499c308f41031a99e723827d152d5d750f59849d0c265d820944a26 + name: pkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-m4-1.7.3-10.el9.noarch.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 16054 + checksum: sha256:91bafd6e06099451f60288327b275cfcc651822f6145176a157c6b0fa5131e02 + name: pkgconf-m4 + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-pkg-config-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 12438 + checksum: sha256:9a502d81d73d3303ceb53a06ad7ce525c97117ea64352174a33708bf3429283d + name: pkgconf-pkg-config + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/python3-3.9.23-2.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 26265 + checksum: sha256:b25fcb3b9d37193b8b2f6638fab40db6679cc81bfbf7799869b472d04f7051c8 + name: python3 + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/python3-libs-3.9.23-2.el9.x86_64.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 8473618 + checksum: sha256:23e63da66e2e0a96481cc839d905de23a9a4b1a8986c9b0659fb78767f8edf9a + name: python3-libs + evr: 3.9.23-2.el9 + sourcerpm: python3.9-3.9.23-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/python3-pip-wheel-21.3.1-1.el9.noarch.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 1193706 + checksum: sha256:75c46aab03898c66ce16be556432b71aed7efcedce02b9263339c14f57b4fdc0 + name: python3-pip-wheel + evr: 21.3.1-1.el9 + sourcerpm: python-pip-21.3.1-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/python3-setuptools-wheel-53.0.0-15.el9.noarch.rpm + repoid: ubi-9-for-x86_64-baseos-rpms + size: 479203 + checksum: sha256:36dacb345e21bc0308ef2508f0c93995520a15ef0b56aab3593186c8dc9c0c5a + name: python3-setuptools-wheel + evr: 53.0.0-15.el9 + sourcerpm: python-setuptools-53.0.0-15.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/codeready-builder/os/Packages/g/gpgme-devel-1.15.1-6.el9.x86_64.rpm + repoid: codeready-builder-for-ubi-9-x86_64-rpms + size: 170873 + checksum: sha256:864381afbdbdcf4a625a14643b5775a5b9b6b0724c342cd743a2dc350aedddd2 + name: gpgme-devel + evr: 1.15.1-6.el9 + sourcerpm: gpgme-1.15.1-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/codeready-builder/os/Packages/l/libassuan-devel-2.5.5-3.el9.x86_64.rpm + repoid: codeready-builder-for-ubi-9-x86_64-rpms + size: 66633 + checksum: sha256:232bccdb2c45f2ceafae2fa138c18d6aba5c953d9eee0aab2f8fc078b9b4b4a4 + name: libassuan-devel + evr: 2.5.5-3.el9 + sourcerpm: libassuan-2.5.5-3.el9.src.rpm source: [] module_metadata: [] diff --git a/test/e2e/byok_test.go b/test/e2e/byok_test.go index 91096b46b..2fff7a74e 100644 --- a/test/e2e/byok_test.go +++ b/test/e2e/byok_test.go @@ -1,25 +1,76 @@ package e2e import ( + "context" "fmt" "net/http" + "os" + "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" olsv1alpha1 "github.com/openshift/lightspeed-operator/api/v1alpha1" + "github.com/openshift/lightspeed-operator/internal/controller/utils" + appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + origImage1 = "docker://quay.io/openshift-lightspeed-test/assisted-installer-guide:2025-1" + origImage2 = "docker://quay.io/openshift-lightspeed-test/assisted-installer-guide:2025-2" + imageName = "assisted-installer-guide" + internalRegistyHostName = "image-registry.openshift-image-registry.svc:5000" + imageTag = "latest" + imageNameAndTag = imageName + ":" + imageTag + dstUserName = "builder" + latestImageName = internalRegistyHostName + "/" + utils.OLSNamespaceDefault + "/" + imageNameAndTag +) + var _ = Describe("BYOK", Ordered, Label("BYOK"), func() { var env *OLSTestEnvironment var err error + var registryDefaultRoute string + var dstToken string BeforeAll(func() { By("Setting up OLS test environment with RAG configuration") + ctx := context.Background() + client, err := GetClient(nil) + Expect(err).NotTo(HaveOccurred()) + + err = EnableInternalImageRegistryRoute(client) + Expect(err).NotTo(HaveOccurred()) + + registryDefaultRoute, err = GetInternalImageRegistryRoute(client) + Expect(err).NotTo(HaveOccurred()) + + err = AddImageBuilderRole(client, utils.OLSNamespaceDefault, dstUserName) + Expect(err).NotTo(HaveOccurred()) + + dstToken, err = GetBuilderToken(client, utils.OLSNamespaceDefault, dstUserName) + Expect(err).NotTo(HaveOccurred()) + + _, err = CopyImageToRegistry( + ctx, + origImage1, + registryDefaultRoute, + utils.OLSNamespaceDefault, + imageNameAndTag, + "", + "", + dstUserName, + dstToken, + false, + true, + os.Stdout, + 15*time.Minute, + ) + Expect(err).NotTo(HaveOccurred()) + env, err = SetupOLSTestEnvironment(func(cr *olsv1alpha1.OLSConfig) { cr.Spec.OLSConfig.RAG = []olsv1alpha1.RAGSpec{ { - Image: "quay.io/openshift-lightspeed-test/assisted-installer-guide:2025-1", + Image: latestImageName, }, } cr.Spec.OLSConfig.ByokRAGOnly = true @@ -82,4 +133,54 @@ var _ = Describe("BYOK", Ordered, Label("BYOK"), func() { Expect(string(body)).NotTo(ContainSubstring("Related documentation")) }) + + It("should check that BYOK image update propagates to the OLS", func() { + appServerDeployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: AppServerDeploymentName, + Namespace: OLSNameSpace, + }, + } + err := env.Client.Get(appServerDeployment) + Expect(err).NotTo(HaveOccurred()) + oldGeneration := appServerDeployment.Generation + + By("Copying a BYOK image to the internal image registry") + ctx := context.Background() + digest, err := CopyImageToRegistry( + ctx, + origImage2, + registryDefaultRoute, + utils.OLSNamespaceDefault, + imageNameAndTag, + "", + "", + dstUserName, + dstToken, + false, + true, + os.Stdout, + 15*time.Minute, + ) + Expect(err).NotTo(HaveOccurred()) + err = AddImageStreamImport(env.Client, utils.OLSNamespaceDefault, imageTag, latestImageName) + Expect(err).NotTo(HaveOccurred()) + err = env.Client.WaitForDeploymentNextGeneration(appServerDeployment, oldGeneration) + Expect(err).NotTo(HaveOccurred()) + + err = env.Client.WaitForDeploymentRollout(appServerDeployment) + Expect(err).NotTo(HaveOccurred()) + + appServerDeployment = &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: AppServerDeploymentName, + Namespace: OLSNameSpace, + }, + } + err = env.Client.Get(appServerDeployment) + Expect(err).NotTo(HaveOccurred()) + Expect(appServerDeployment.Spec.Template.Spec.InitContainers[0].Image).To( + Equal(internalRegistyHostName + "/" + utils.OLSNamespaceDefault + "/" + imageName + "@" + digest), + ) + }) }) diff --git a/test/e2e/client.go b/test/e2e/client.go index cc3f6ebf6..e5e8a864e 100644 --- a/test/e2e/client.go +++ b/test/e2e/client.go @@ -15,7 +15,10 @@ import ( "github.com/onsi/ginkgo/v2" + configv1 "github.com/openshift/api/config/v1" consolev1 "github.com/openshift/api/console/v1" + imagev1 "github.com/openshift/api/image/v1" + imageregistryv1 "github.com/openshift/api/imageregistry/v1" openshiftv1 "github.com/openshift/api/operator/v1" routev1 "github.com/openshift/api/route/v1" appsv1 "k8s.io/api/apps/v1" @@ -91,6 +94,9 @@ func GetClient(options *ClientOptions) (*Client, error) { utilruntime.Must(openshiftv1.AddToScheme(scheme)) utilruntime.Must(olsv1alpha1.AddToScheme(scheme)) utilruntime.Must(routev1.AddToScheme(scheme)) + utilruntime.Must(imagev1.AddToScheme(scheme)) + utilruntime.Must(imageregistryv1.AddToScheme(scheme)) + utilruntime.Must(configv1.AddToScheme(scheme)) // Create a new client k8sClient, err := client.New(cfg, client.Options{ Scheme: scheme, @@ -174,6 +180,16 @@ func (c *Client) WaitForDeploymentRollout(dep *appsv1.Deployment) error { }) } +func (c *Client) WaitForDeploymentNextGeneration(dep *appsv1.Deployment, oldGen int64) error { + return c.WaitForDeploymentCondition(dep, func(dep *appsv1.Deployment) (bool, error) { + if dep.Status.ObservedGeneration <= oldGen { + return false, fmt.Errorf("observed generation %d, old generation %d", + dep.Status.ObservedGeneration, oldGen) + } + return true, nil + }) +} + func (c *Client) isPodTerminating(pod *corev1.Pod) bool { return pod.DeletionTimestamp != nil } diff --git a/test/e2e/image_utils.go b/test/e2e/image_utils.go new file mode 100644 index 000000000..b7d2bb575 --- /dev/null +++ b/test/e2e/image_utils.go @@ -0,0 +1,252 @@ +package e2e + +import ( + "context" + "fmt" + "io" + "time" + + configv1 "github.com/openshift/api/config/v1" + imagev1 "github.com/openshift/api/image/v1" + imageregistryv1 "github.com/openshift/api/imageregistry/v1" + routev1 "github.com/openshift/api/route/v1" + authv1 "k8s.io/api/authentication/v1" + corev1 "k8s.io/api/core/v1" + rbacv1 "k8s.io/api/rbac/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/containers/image/v5/copy" + "github.com/containers/image/v5/manifest" + "github.com/containers/image/v5/signature" + "github.com/containers/image/v5/transports/alltransports" + "github.com/containers/image/v5/types" + + "github.com/openshift/lightspeed-operator/internal/controller/utils" +) + +func CopyImageToRegistry( + ctx context.Context, + srcRef string, + destRegistry, destNamespace, destImage string, + srcUser, srcPass, dstUser, dstPass string, + insecureSrc, insecureDst bool, + reportWriter io.Writer, + timeout time.Duration, +) (string, error) { + if destRegistry == "" || destNamespace == "" || destImage == "" { + return "", fmt.Errorf("destRegistry, destNamespace and destImage must be provided") + } + destRefStr := fmt.Sprintf("docker://%s/%s/%s", destRegistry, destNamespace, destImage) + + src, err := alltransports.ParseImageName(srcRef) + if err != nil { + return "", fmt.Errorf("parsing source reference %q: %w", srcRef, err) + } + dst, err := alltransports.ParseImageName(destRefStr) + if err != nil { + return "", fmt.Errorf("parsing destination reference %q: %w", destRefStr, err) + } + + var srcSys types.SystemContext + if srcUser != "" || srcPass != "" { + srcSys.DockerAuthConfig = &types.DockerAuthConfig{ + Username: srcUser, + Password: srcPass, + } + } + if insecureSrc { + srcSys.DockerInsecureSkipTLSVerify = types.NewOptionalBool(true) + } + + var dstSys types.SystemContext + if dstUser != "" || dstPass != "" { + dstSys.DockerAuthConfig = &types.DockerAuthConfig{ + Username: dstUser, + Password: dstPass, + } + } + if insecureDst { + dstSys.DockerInsecureSkipTLSVerify = types.NewOptionalBool(true) + } + + policyJSON := []byte(`{"default":[{"type":"insecureAcceptAnything"}]}`) + policy, err := signature.NewPolicyFromBytes(policyJSON) + if err != nil { + return "", fmt.Errorf("creating signature policy: %w", err) + } + policyCtx, err := signature.NewPolicyContext(policy) + if err != nil { + return "", fmt.Errorf("creating signature policy context: %w", err) + } + defer func() { _ = policyCtx.Destroy() }() + + opts := ©.Options{ + SourceCtx: &srcSys, + DestinationCtx: &dstSys, + ReportWriter: reportWriter, + } + + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, timeout) + defer cancel() + } + + var manifestBytes []byte + if manifestBytes, err = copy.Image(ctx, policyCtx, dst, src, opts); err != nil { + return "", fmt.Errorf("copy.Image failed: %w", err) + } + + digest, err := manifest.Digest(manifestBytes) + if err != nil { + return "", fmt.Errorf("compute digest: %w", err) + } + + return digest.String(), nil +} + +func AddImageStreamImport(client *Client, namespace, tagName, fromRef string) error { + isName := utils.ImageStreamNameFor(fromRef) + isi := &imagev1.ImageStreamImport{ + ObjectMeta: metav1.ObjectMeta{ + Name: isName, + Namespace: utils.OLSNamespaceDefault, + }, + Spec: imagev1.ImageStreamImportSpec{ + Import: true, + Images: []imagev1.ImageImportSpec{ + { + From: corev1.ObjectReference{ + Kind: "DockerImage", + Name: fromRef, + }, + To: &corev1.LocalObjectReference{ + Name: tagName, + }, + }, + }, + }, + } + if err := client.Create(isi); err != nil { + return fmt.Errorf("failed to create ImageStreamImport %s/%s: %w", namespace, isName, err) + } + return nil +} + +func GetInternalImageRegistryRoute(client *Client) (string, error) { + const ( + defaultRouteName = "default-route" + imageRegistryNamespace = "openshift-image-registry" + ) + route := routev1.Route{ + ObjectMeta: metav1.ObjectMeta{ + Name: defaultRouteName, + Namespace: imageRegistryNamespace, + }, + } + if err := client.WaitForObjectCreated(&route); err != nil { + return "", fmt.Errorf("error waiting for the internal registry route creation: %w", err) + } + if err := client.Get(&route); err != nil { + return "", fmt.Errorf("failed to get the internal image registry route %s/%s: %w", imageRegistryNamespace, defaultRouteName, err) + } + return route.Spec.Host, nil +} + +func EnableInternalImageRegistryRoute(client *Client) error { + cfg := imageregistryv1.Config{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cluster", + }, + } + if err := client.Get(&cfg); err != nil { + return fmt.Errorf("get imageregistry config/cluster: %w", err) + } + cfg.Spec.DefaultRoute = true + if err := client.Update(&cfg); err != nil { + return fmt.Errorf("update imageregistry config/cluster: %w", err) + } + + return nil +} + +func GetBuilderToken(client *Client, namespace, saName string) (string, error) { + ctx := context.Background() + expSeconds := int64(3600) + + issuer, err := GetOAuthIssuer(client) + if err != nil { + return "", err + } + audience := "https://kubernetes.default.svc" + if issuer != "" { + audience = issuer + } + + tr := &authv1.TokenRequest{ + TypeMeta: metav1.TypeMeta{ + Kind: "TokenRequest", + APIVersion: "authentication.k8s.io/v1", + }, + Spec: authv1.TokenRequestSpec{ + Audiences: []string{audience}, + ExpirationSeconds: &expSeconds, + }, + } + + sa := &corev1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: saName, + }, + } + + if err := client.kClient.SubResource("token").Create(ctx, sa, tr); err != nil { + return "", fmt.Errorf("creating token subresource: %w", err) + } + return tr.Status.Token, nil +} + +func AddImageBuilderRole(client *Client, namespace, saName string) error { + const rbName = "allow-builder-image-build" + + newRB := &rbacv1.RoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: rbName, + Namespace: namespace, + }, + Subjects: []rbacv1.Subject{ + { + Kind: "ServiceAccount", + Name: saName, + Namespace: namespace, + }, + }, + RoleRef: rbacv1.RoleRef{ + APIGroup: "rbac.authorization.k8s.io", + Kind: "ClusterRole", + Name: "system:image-builder", + }, + } + if err := client.Create(newRB); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("creating RoleBinding %s/%s: %w", namespace, rbName, err) + } + } + return nil +} + +func GetOAuthIssuer(client *Client) (string, error) { + auth := &configv1.Authentication{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cluster", + }, + } + + if err := client.Get(auth); err != nil { + return "", fmt.Errorf("getting Authentication/cluster: %w", err) + } + + return auth.Spec.ServiceAccountIssuer, nil +}