diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_kube-root-ca.crt.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_kube-root-ca.crt.yaml new file mode 100644 index 00000000..1fab4156 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_kube-root-ca.crt.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + ca.crt: REDACTED +kind: ConfigMap +metadata: + annotations: + kubernetes.io/description: Contains a CA bundle that can be used to verify the + kube-apiserver when using internal endpoints such as the internal service IP + or kubernetes.default.svc. No other usage is guaranteed across distributions + of Kubernetes clusters. + name: kube-root-ca.crt + namespace: redis diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ConfigMap__v1_simple-nginx-nopv_openshift-service-ca.crt.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_openshift-service-ca.crt.yaml similarity index 85% rename from e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ConfigMap__v1_simple-nginx-nopv_openshift-service-ca.crt.yaml rename to e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_openshift-service-ca.crt.yaml index 620f03dd..4201325a 100644 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ConfigMap__v1_simple-nginx-nopv_openshift-service-ca.crt.yaml +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ConfigMap__v1_redis_openshift-service-ca.crt.yaml @@ -6,4 +6,4 @@ metadata: annotations: service.beta.openshift.io/inject-cabundle: "true" name: openshift-service-ca.crt - namespace: simple-nginx-nopv + namespace: redis diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Deployment_apps_v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Deployment_apps_v1_redis_redis.yaml new file mode 100644 index 00000000..c877852e --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Deployment_apps_v1_redis_redis.yaml @@ -0,0 +1,166 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + deployment.kubernetes.io/revision: "1" + creationTimestamp: "2026-07-29T11:57:01Z" + generation: 2 + labels: + name: redis + managedFields: + - apiVersion: apps/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: {} + f:name: {} + f:spec: + f:progressDeadlineSeconds: {} + f:revisionHistoryLimit: {} + f:selector: {} + f:strategy: + f:rollingUpdate: + .: {} + f:maxSurge: {} + f:maxUnavailable: {} + f:type: {} + f:template: + f:metadata: + f:labels: + .: {} + f:name: {} + f:spec: + f:containers: + k:{"name":"redis"}: + .: {} + f:command: {} + f:image: {} + f:imagePullPolicy: {} + f:name: {} + f:ports: + .: {} + k:{"containerPort":6379,"protocol":"TCP"}: + .: {} + f:containerPort: {} + f:name: {} + f:protocol: {} + f:resources: {} + f:terminationMessagePath: {} + f:terminationMessagePolicy: {} + f:volumeMounts: + .: {} + k:{"mountPath":"/data"}: + .: {} + f:mountPath: {} + f:name: {} + f:dnsPolicy: {} + f:restartPolicy: {} + f:schedulerName: {} + f:securityContext: {} + f:terminationGracePeriodSeconds: {} + f:volumes: + .: {} + k:{"name":"redis-data"}: + .: {} + f:name: {} + f:persistentVolumeClaim: + .: {} + f:claimName: {} + manager: OpenAPI-Generator + operation: Update + time: "2026-07-29T11:57:01Z" + - apiVersion: apps/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:deployment.kubernetes.io/revision: {} + f:status: + f:conditions: + .: {} + k:{"type":"Available"}: + .: {} + f:lastTransitionTime: {} + f:lastUpdateTime: {} + f:message: {} + f:reason: {} + f:status: {} + f:type: {} + k:{"type":"Progressing"}: + .: {} + f:lastTransitionTime: {} + f:lastUpdateTime: {} + f:message: {} + f:reason: {} + f:status: {} + f:type: {} + f:observedGeneration: {} + manager: kube-controller-manager + operation: Update + subresource: status + time: "2026-07-29T11:57:43Z" + name: redis + namespace: redis + resourceVersion: "134042" + uid: c8d35c35-660f-4b82-bf7b-c8e4e89894db +spec: + progressDeadlineSeconds: 600 + replicas: 0 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: redis + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + name: redis + spec: + containers: + - command: + - redis-server + - --requirepass + - PASSWORD + image: redis:latest + imagePullPolicy: Always + name: redis + ports: + - containerPort: 6379 + name: redis + protocol: TCP + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data + name: redis-data + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - name: redis-data + persistentVolumeClaim: + claimName: redis-data +status: + conditions: + - lastTransitionTime: "2026-07-29T11:57:08Z" + lastUpdateTime: "2026-07-29T11:57:08Z" + message: Deployment has minimum availability. + reason: MinimumReplicasAvailable + status: "True" + type: Available + - lastTransitionTime: "2026-07-29T11:57:01Z" + lastUpdateTime: "2026-07-29T11:57:08Z" + message: ReplicaSet "redis-6b9f4c765d" has successfully progressed. + reason: NewReplicaSetAvailable + status: "True" + type: Progressing + observedGeneration: 2 diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/EndpointSlice_discovery.k8s.io_v1_redis_redis-r8vds.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/EndpointSlice_discovery.k8s.io_v1_redis_redis-r8vds.yaml new file mode 100644 index 00000000..920dd5dc --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/EndpointSlice_discovery.k8s.io_v1_redis_redis-r8vds.yaml @@ -0,0 +1,49 @@ +addressType: IPv4 +apiVersion: discovery.k8s.io/v1 +endpoints: null +kind: EndpointSlice +metadata: + annotations: + endpoints.kubernetes.io/last-change-trigger-time: "2026-07-29T11:57:44Z" + creationTimestamp: "2026-07-29T11:56:57Z" + generateName: redis- + generation: 4 + labels: + endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.io + kubernetes.io/service-name: redis + name: redis + managedFields: + - apiVersion: discovery.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:addressType: {} + f:endpoints: {} + f:metadata: + f:annotations: + .: {} + f:endpoints.kubernetes.io/last-change-trigger-time: {} + f:generateName: {} + f:labels: + .: {} + f:endpointslice.kubernetes.io/managed-by: {} + f:kubernetes.io/service-name: {} + f:name: {} + f:ownerReferences: + .: {} + k:{"uid":"600b5f3e-a866-4acf-8bf2-256d80a4b080"}: {} + f:ports: {} + manager: kube-controller-manager + operation: Update + time: "2026-07-29T11:57:44Z" + name: redis-r8vds + namespace: redis + ownerReferences: + - apiVersion: v1 + blockOwnerDeletion: true + controller: true + kind: Service + name: redis + uid: 600b5f3e-a866-4acf-8bf2-256d80a4b080 + resourceVersion: "134045" + uid: 965d04da-5f5d-4287-b5f9-ba10e4d84c4b +ports: null diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Endpoints__v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Endpoints__v1_redis_redis.yaml new file mode 100644 index 00000000..2abc9419 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Endpoints__v1_redis_redis.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: Endpoints +metadata: + creationTimestamp: "2026-07-29T11:56:57Z" + labels: + endpoints.kubernetes.io/managed-by: endpoint-controller + name: redis + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: {} + f:endpoints.kubernetes.io/managed-by: {} + f:name: {} + manager: kube-controller-manager + operation: Update + time: "2026-07-29T11:57:08Z" + name: redis + namespace: redis + resourceVersion: "134036" + uid: 16d11b11-a4f1-4395-8a59-d2aa5d52f2ee diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/PersistentVolumeClaim__v1_redis_redis-data.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/PersistentVolumeClaim__v1_redis_redis-data.yaml new file mode 100644 index 00000000..44888032 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/PersistentVolumeClaim__v1_redis_redis-data.yaml @@ -0,0 +1,79 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + annotations: + pv.kubernetes.io/bind-completed: "yes" + pv.kubernetes.io/bound-by-controller: "yes" + creationTimestamp: "2026-07-29T11:56:59Z" + finalizers: + - kubernetes.io/pvc-protection + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:spec: + f:accessModes: {} + f:resources: + f:requests: + .: {} + f:storage: {} + f:volumeMode: {} + manager: OpenAPI-Generator + operation: Update + time: "2026-07-29T11:56:59Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:volume.kubernetes.io/selected-node: {} + manager: kube-scheduler + operation: Update + time: "2026-07-29T11:57:01Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + f:pv.kubernetes.io/bind-completed: {} + f:pv.kubernetes.io/bound-by-controller: {} + f:volume.beta.kubernetes.io/storage-provisioner: {} + f:volume.kubernetes.io/storage-provisioner: {} + f:spec: + f:volumeName: {} + manager: kube-controller-manager + operation: Update + time: "2026-07-29T11:57:03Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:status: + f:accessModes: {} + f:capacity: + .: {} + f:storage: {} + f:phase: {} + manager: kube-controller-manager + operation: Update + subresource: status + time: "2026-07-29T11:57:03Z" + name: redis-data + namespace: redis + resourceVersion: "133859" + uid: 4551f374-2f86-4794-827a-e2475a2593df +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: gp3-csi + volumeMode: Filesystem + volumeName: pvc-4551f374-2f86-4794-827a-e2475a2593df +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ReplicaSet_apps_v1_redis_redis-6b9f4c765d.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ReplicaSet_apps_v1_redis_redis-6b9f4c765d.yaml new file mode 100644 index 00000000..cf1c0a09 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ReplicaSet_apps_v1_redis_redis-6b9f4c765d.yaml @@ -0,0 +1,141 @@ +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + annotations: + deployment.kubernetes.io/desired-replicas: "0" + deployment.kubernetes.io/max-replicas: "0" + deployment.kubernetes.io/revision: "1" + creationTimestamp: "2026-07-29T11:57:01Z" + generation: 2 + labels: + name: redis + pod-template-hash: 6b9f4c765d + managedFields: + - apiVersion: apps/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:deployment.kubernetes.io/desired-replicas: {} + f:deployment.kubernetes.io/max-replicas: {} + f:deployment.kubernetes.io/revision: {} + f:labels: + .: {} + f:name: {} + f:pod-template-hash: {} + f:ownerReferences: + .: {} + k:{"uid":"c8d35c35-660f-4b82-bf7b-c8e4e89894db"}: {} + f:spec: + f:replicas: {} + f:selector: {} + f:template: + f:metadata: + f:labels: + .: {} + f:name: {} + f:pod-template-hash: {} + f:spec: + f:containers: + k:{"name":"redis"}: + .: {} + f:command: {} + f:image: {} + f:imagePullPolicy: {} + f:name: {} + f:ports: + .: {} + k:{"containerPort":6379,"protocol":"TCP"}: + .: {} + f:containerPort: {} + f:name: {} + f:protocol: {} + f:resources: {} + f:terminationMessagePath: {} + f:terminationMessagePolicy: {} + f:volumeMounts: + .: {} + k:{"mountPath":"/data"}: + .: {} + f:mountPath: {} + f:name: {} + f:dnsPolicy: {} + f:restartPolicy: {} + f:schedulerName: {} + f:securityContext: {} + f:terminationGracePeriodSeconds: {} + f:volumes: + .: {} + k:{"name":"redis-data"}: + .: {} + f:name: {} + f:persistentVolumeClaim: + .: {} + f:claimName: {} + manager: kube-controller-manager + operation: Update + time: "2026-07-29T11:57:43Z" + - apiVersion: apps/v1 + fieldsType: FieldsV1 + fieldsV1: + f:status: + f:observedGeneration: {} + f:replicas: {} + manager: kube-controller-manager + operation: Update + subresource: status + time: "2026-07-29T11:57:43Z" + name: redis-6b9f4c765d + namespace: redis + ownerReferences: + - apiVersion: apps/v1 + blockOwnerDeletion: true + controller: true + kind: Deployment + name: redis + uid: c8d35c35-660f-4b82-bf7b-c8e4e89894db + resourceVersion: "134041" + uid: 3ca53332-56d2-444f-b0af-71221bc7dc33 +spec: + replicas: 0 + selector: + matchLabels: + name: redis + pod-template-hash: 6b9f4c765d + template: + metadata: + labels: + name: redis + pod-template-hash: 6b9f4c765d + spec: + containers: + - command: + - redis-server + - --requirepass + - PASSWORD + image: redis:latest + imagePullPolicy: Always + name: redis + ports: + - containerPort: 6379 + name: redis + protocol: TCP + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data + name: redis-data + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - name: redis-data + persistentVolumeClaim: + claimName: redis-data +status: + observedGeneration: 2 + replicas: 0 diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:deployers.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:deployers.yaml new file mode 100644 index 00000000..33c9d265 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:deployers.yaml @@ -0,0 +1,34 @@ +apiVersion: authorization.openshift.io/v1 +groupNames: null +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows deploymentconfigs in this namespace to rollout + pods in this namespace. It is auto-managed by a controller; remove subjects + to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:deployers + namespace: redis + resourceVersion: "133792" + uid: 8fa4cde0-ecb2-484f-81f3-94482b22d8cf +roleRef: + name: system:deployer +subjects: +- kind: ServiceAccount + name: deployer + namespace: redis +userNames: +- system:serviceaccount:redis:deployer diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-builders.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-builders.yaml new file mode 100644 index 00000000..4eb35784 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-builders.yaml @@ -0,0 +1,33 @@ +apiVersion: authorization.openshift.io/v1 +groupNames: null +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows builds in this namespace to push images to this + namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:image-builders + namespace: redis + resourceVersion: "133791" + uid: f1f51514-0c62-45e1-8e0d-5f25c368ae39 +roleRef: + name: system:image-builder +subjects: +- kind: ServiceAccount + name: builder + namespace: redis +userNames: +- system:serviceaccount:redis:builder diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-pullers.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-pullers.yaml new file mode 100644 index 00000000..9496b5a5 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_authorization.openshift.io_v1_redis_system:image-pullers.yaml @@ -0,0 +1,32 @@ +apiVersion: authorization.openshift.io/v1 +groupNames: +- system:serviceaccounts:redis +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows all pods in this namespace to pull images from + this namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:image-pullers + namespace: redis + resourceVersion: "133790" + uid: 9ec4ac50-950e-4bb0-baac-d6bb266bcc48 +roleRef: + name: system:image-puller +subjects: +- kind: SystemGroup + name: system:serviceaccounts:redis +userNames: null diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:deployers.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:deployers.yaml new file mode 100644 index 00000000..92021d21 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:deployers.yaml @@ -0,0 +1,33 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows deploymentconfigs in this namespace to rollout + pods in this namespace. It is auto-managed by a controller; remove subjects + to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:deployers + namespace: redis + resourceVersion: "133792" + uid: 8fa4cde0-ecb2-484f-81f3-94482b22d8cf +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:deployer +subjects: +- kind: ServiceAccount + name: deployer + namespace: redis diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-builders.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-builders.yaml new file mode 100644 index 00000000..7987e52b --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-builders.yaml @@ -0,0 +1,32 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows builds in this namespace to push images to this + namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:image-builders + namespace: redis + resourceVersion: "133791" + uid: f1f51514-0c62-45e1-8e0d-5f25c368ae39 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:image-builder +subjects: +- kind: ServiceAccount + name: builder + namespace: redis diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-pullers.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-pullers.yaml new file mode 100644 index 00000000..608c5dc8 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/RoleBinding_rbac.authorization.k8s.io_v1_redis_system:image-pullers.yaml @@ -0,0 +1,32 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + annotations: + openshift.io/description: Allows all pods in this namespace to pull images from + this namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: rbac.authorization.k8s.io/v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + .: {} + f:openshift.io/description: {} + f:roleRef: {} + f:subjects: {} + manager: openshift-controller-manager + operation: Update + time: "2026-07-29T11:56:52Z" + name: system:image-pullers + namespace: redis + resourceVersion: "133790" + uid: 9ec4ac50-950e-4bb0-baac-d6bb266bcc48 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:image-puller +subjects: +- apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts:redis diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_builder-dockercfg-lgfpb.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_builder-dockercfg-lgfpb.yaml new file mode 100644 index 00000000..41d8089a --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_builder-dockercfg-lgfpb.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +data: + .dockercfg: REDACTED +kind: Secret +metadata: + annotations: + openshift.io/internal-registry-auth-token.binding: bound + openshift.io/internal-registry-auth-token.service-account: builder + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:data: + f:.dockercfg: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.binding: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_image-pull-secret-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.service-account: {} + f:ownerReferences: + k:{"uid":"65e40fd1-e248-4de3-be35-80849ead02b0"}: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: builder-dockercfg-lgfpb + namespace: redis + ownerReferences: + - apiVersion: v1 + kind: ServiceAccount + name: builder + uid: 65e40fd1-e248-4de3-be35-80849ead02b0 + resourceVersion: "133789" + uid: f7b8e726-7d2e-4994-9c55-8d6ffaac8958 +type: kubernetes.io/dockercfg diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_default-dockercfg-jpgs2.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_default-dockercfg-jpgs2.yaml new file mode 100644 index 00000000..71501483 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_default-dockercfg-jpgs2.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +data: + .dockercfg: REDACTED +kind: Secret +metadata: + annotations: + openshift.io/internal-registry-auth-token.binding: bound + openshift.io/internal-registry-auth-token.service-account: default + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:data: + f:.dockercfg: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.binding: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_image-pull-secret-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.service-account: {} + f:ownerReferences: + k:{"uid":"8c9992b4-af7a-466d-87b4-7b47cc7c2bb3"}: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: default-dockercfg-jpgs2 + namespace: redis + ownerReferences: + - apiVersion: v1 + kind: ServiceAccount + name: default + uid: 8c9992b4-af7a-466d-87b4-7b47cc7c2bb3 + resourceVersion: "133788" + uid: 8ba355c4-259a-44ff-a223-5ac624c78c3b +type: kubernetes.io/dockercfg diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_deployer-dockercfg-vf8ll.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_deployer-dockercfg-vf8ll.yaml new file mode 100644 index 00000000..4601e232 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_deployer-dockercfg-vf8ll.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +data: + .dockercfg: REDACTED +kind: Secret +metadata: + annotations: + openshift.io/internal-registry-auth-token.binding: bound + openshift.io/internal-registry-auth-token.service-account: deployer + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:data: + f:.dockercfg: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.binding: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_image-pull-secret-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:annotations: + f:openshift.io/internal-registry-auth-token.service-account: {} + f:ownerReferences: + k:{"uid":"0284d0fd-c0fb-447b-b52d-4bffda1154bd"}: {} + f:type: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: deployer-dockercfg-vf8ll + namespace: redis + ownerReferences: + - apiVersion: v1 + kind: ServiceAccount + name: deployer + uid: 0284d0fd-c0fb-447b-b52d-4bffda1154bd + resourceVersion: "133787" + uid: ebcc1896-0aff-4320-8932-07ae0bc5d4f4 +type: kubernetes.io/dockercfg diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_redis.yaml new file mode 100644 index 00000000..3c8581f7 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Secret__v1_redis_redis.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +data: + redis-password: UEFTU1dPUkQ= +kind: Secret +metadata: + creationTimestamp: "2026-07-29T11:56:55Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:data: + .: {} + f:redis-password: {} + f:type: {} + manager: OpenAPI-Generator + operation: Update + time: "2026-07-29T11:56:55Z" + name: redis + namespace: redis + resourceVersion: "133801" + uid: 2534e8f3-8e56-4067-89af-d02c846ef69f +type: Opaque diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_builder.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_builder.yaml new file mode 100644 index 00000000..503c962b --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_builder.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +imagePullSecrets: +- name: builder-dockercfg-lgfpb +kind: ServiceAccount +metadata: + annotations: + openshift.io/internal-registry-pull-secret-ref: builder-dockercfg-lgfpb + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:imagePullSecrets: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-pull-secret-ref: {} + f:secrets: + k:{"name":"builder-dockercfg-lgfpb"}: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: builder + namespace: redis + resourceVersion: "133780" + uid: 65e40fd1-e248-4de3-be35-80849ead02b0 +secrets: +- name: builder-dockercfg-lgfpb diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_default.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_default.yaml new file mode 100644 index 00000000..d773e18f --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_default.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +imagePullSecrets: +- name: default-dockercfg-jpgs2 +kind: ServiceAccount +metadata: + annotations: + openshift.io/internal-registry-pull-secret-ref: default-dockercfg-jpgs2 + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:imagePullSecrets: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-pull-secret-ref: {} + f:secrets: + k:{"name":"default-dockercfg-jpgs2"}: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: default + namespace: redis + resourceVersion: "133777" + uid: 8c9992b4-af7a-466d-87b4-7b47cc7c2bb3 +secrets: +- name: default-dockercfg-jpgs2 diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_deployer.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_deployer.yaml new file mode 100644 index 00000000..d9c478de --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/ServiceAccount__v1_redis_deployer.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +imagePullSecrets: +- name: deployer-dockercfg-vf8ll +kind: ServiceAccount +metadata: + annotations: + openshift.io/internal-registry-pull-secret-ref: deployer-dockercfg-vf8ll + creationTimestamp: "2026-07-29T11:56:52Z" + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:imagePullSecrets: {} + f:metadata: + f:annotations: + f:openshift.io/internal-registry-pull-secret-ref: {} + f:secrets: + k:{"name":"deployer-dockercfg-vf8ll"}: {} + manager: openshift.io/image-registry-pull-secrets_service-account-controller + operation: Apply + time: "2026-07-29T11:56:52Z" + name: deployer + namespace: redis + resourceVersion: "133779" + uid: 0284d0fd-c0fb-447b-b52d-4bffda1154bd +secrets: +- name: deployer-dockercfg-vf8ll diff --git a/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Service__v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Service__v1_redis_redis.yaml new file mode 100644 index 00000000..b7a6a1fa --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/export/resources/redis/Service__v1_redis_redis.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: "2026-07-29T11:56:57Z" + labels: + name: redis + managedFields: + - apiVersion: v1 + fieldsType: FieldsV1 + fieldsV1: + f:metadata: + f:labels: + .: {} + f:name: {} + f:spec: + f:internalTrafficPolicy: {} + f:ports: + .: {} + k:{"port":6379,"protocol":"TCP"}: + .: {} + f:name: {} + f:port: {} + f:protocol: {} + f:targetPort: {} + f:selector: {} + f:sessionAffinity: {} + f:type: {} + manager: OpenAPI-Generator + operation: Update + time: "2026-07-29T11:56:57Z" + name: redis + namespace: redis + resourceVersion: "133808" + uid: 600b5f3e-a866-4acf-8bf2-256d80a4b080 +spec: + clusterIP: 172.30.113.13 + clusterIPs: + - 172.30.113.13 + internalTrafficPolicy: Cluster + ports: + - name: redis + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + name: redis + sessionAffinity: None + type: ClusterIP +status: + loadBalancer: {} diff --git a/e2e-tests/golden-manifests-ocp/redis/output/output.yaml b/e2e-tests/golden-manifests-ocp/redis/output/output.yaml new file mode 100644 index 00000000..409e8bbf --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/output/output.yaml @@ -0,0 +1,84 @@ +apiVersion: v1 +data: + redis-password: UEFTU1dPUkQ= +kind: Secret +metadata: + name: redis + namespace: redis +type: Opaque +--- +apiVersion: v1 +kind: Service +metadata: + labels: + name: redis + name: redis + namespace: redis +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: redis + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + name: redis + sessionAffinity: None + type: ClusterIP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + deployment.kubernetes.io/revision: "1" + labels: + name: redis + name: redis + namespace: redis +spec: + progressDeadlineSeconds: 600 + replicas: 0 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: redis + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + name: redis + spec: + containers: + - command: + - redis-server + - --requirepass + - PASSWORD + image: redis:latest + imagePullPolicy: Always + name: redis + ports: + - containerPort: 6379 + name: redis + protocol: TCP + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data + name: redis-data + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - name: redis-data + persistentVolumeClaim: + claimName: redis-data diff --git a/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Deployment_apps_v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Deployment_apps_v1_redis_redis.yaml new file mode 100644 index 00000000..ce77d1ea --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Deployment_apps_v1_redis_redis.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + deployment.kubernetes.io/revision: "1" + labels: + name: redis + name: redis + namespace: redis +spec: + progressDeadlineSeconds: 600 + replicas: 0 + revisionHistoryLimit: 10 + selector: + matchLabels: + name: redis + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + labels: + name: redis + spec: + containers: + - command: + - redis-server + - --requirepass + - PASSWORD + image: redis:latest + imagePullPolicy: Always + name: redis + ports: + - containerPort: 6379 + name: redis + protocol: TCP + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data + name: redis-data + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + volumes: + - name: redis-data + persistentVolumeClaim: + claimName: redis-data diff --git a/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Secret__v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Secret__v1_redis_redis.yaml new file mode 100644 index 00000000..20024610 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Secret__v1_redis_redis.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +data: + redis-password: UEFTU1dPUkQ= +kind: Secret +metadata: + name: redis + namespace: redis +type: Opaque diff --git a/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Service__v1_redis_redis.yaml b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Service__v1_redis_redis.yaml new file mode 100644 index 00000000..cd1c8ee1 --- /dev/null +++ b/e2e-tests/golden-manifests-ocp/redis/output/resources/redis/Service__v1_redis_redis.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + name: redis + name: redis + namespace: redis +spec: + internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: redis + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + name: redis + sessionAffinity: None + type: ClusterIP diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/output.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/output.yaml index b43f564b..4970c7b5 100644 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/output.yaml +++ b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/output.yaml @@ -1,91 +1,4 @@ apiVersion: v1 -imagePullSecrets: -- name: builder-dockercfg-n5zzt -kind: ServiceAccount -metadata: - annotations: - openshift.io/internal-registry-pull-secret-ref: builder-dockercfg-n5zzt - name: builder - namespace: simple-nginx-nopv -secrets: -- name: builder-dockercfg-n5zzt ---- -apiVersion: v1 -imagePullSecrets: -- name: deployer-dockercfg-rgp2c -kind: ServiceAccount -metadata: - annotations: - openshift.io/internal-registry-pull-secret-ref: deployer-dockercfg-rgp2c - name: deployer - namespace: simple-nginx-nopv -secrets: -- name: deployer-dockercfg-rgp2c ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows deploymentconfigs in this namespace to rollout - pods in this namespace. It is auto-managed by a controller; remove subjects - to disable. - name: system:deployers - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:deployer -subjects: -- kind: ServiceAccount - name: deployer - namespace: simple-nginx-nopv ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows builds in this namespace to push images to this - namespace. It is auto-managed by a controller; remove subjects to disable. - name: system:image-builders - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:image-builder -subjects: -- kind: ServiceAccount - name: builder - namespace: simple-nginx-nopv ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows all pods in this namespace to pull images from - this namespace. It is auto-managed by a controller; remove subjects to disable. - name: system:image-pullers - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:image-puller -subjects: -- apiGroup: rbac.authorization.k8s.io - kind: Group - name: system:serviceaccounts:simple-nginx-nopv ---- -apiVersion: v1 -data: - service-ca.crt: | - REDACTED -kind: ConfigMap -metadata: - annotations: - service.beta.openshift.io/inject-cabundle: "true" - name: openshift-service-ca.crt - namespace: simple-nginx-nopv ---- -apiVersion: v1 kind: Service metadata: labels: @@ -153,6 +66,8 @@ spec: apiVersion: route.openshift.io/v1 kind: Route metadata: + annotations: + openshift.io/host.generated: "true" labels: app: simple-nginx-nopv name: my-simple-nginx-nopv diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:deployers.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:deployers.yaml deleted file mode 100644 index f603a26b..00000000 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:deployers.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows deploymentconfigs in this namespace to rollout pods in this namespace. It is auto-managed by a controller; remove subjects to disable. - name: system:deployers - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:deployer -subjects: - - kind: ServiceAccount - name: deployer - namespace: simple-nginx-nopv diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-builders.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-builders.yaml deleted file mode 100644 index c7016efc..00000000 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-builders.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows builds in this namespace to push images to this namespace. It is auto-managed by a controller; remove subjects to disable. - name: system:image-builders - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:image-builder -subjects: - - kind: ServiceAccount - name: builder - namespace: simple-nginx-nopv diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-pullers.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-pullers.yaml deleted file mode 100644 index 94c9140f..00000000 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/RoleBinding_rbac.authorization.k8s.io_v1_simple-nginx-nopv_system:image-pullers.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - annotations: - openshift.io/description: Allows all pods in this namespace to pull images from this namespace. It is auto-managed by a controller; remove subjects to disable. - name: system:image-pullers - namespace: simple-nginx-nopv -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:image-puller -subjects: - - apiGroup: rbac.authorization.k8s.io - kind: Group - name: system:serviceaccounts:simple-nginx-nopv diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/Route_route.openshift.io_v1_simple-nginx-nopv_my-simple-nginx-nopv.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/Route_route.openshift.io_v1_simple-nginx-nopv_my-simple-nginx-nopv.yaml index 97020c4e..ff42f566 100644 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/Route_route.openshift.io_v1_simple-nginx-nopv_my-simple-nginx-nopv.yaml +++ b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/Route_route.openshift.io_v1_simple-nginx-nopv_my-simple-nginx-nopv.yaml @@ -1,6 +1,8 @@ apiVersion: route.openshift.io/v1 kind: Route metadata: + annotations: + openshift.io/host.generated: "true" labels: app: simple-nginx-nopv name: my-simple-nginx-nopv diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_builder.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_builder.yaml deleted file mode 100644 index 7afcea92..00000000 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_builder.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -imagePullSecrets: - - name: builder-dockercfg-n5zzt -kind: ServiceAccount -metadata: - annotations: - openshift.io/internal-registry-pull-secret-ref: builder-dockercfg-n5zzt - name: builder - namespace: simple-nginx-nopv -secrets: - - name: builder-dockercfg-n5zzt diff --git a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_deployer.yaml b/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_deployer.yaml deleted file mode 100644 index c9e1d603..00000000 --- a/e2e-tests/golden-manifests-ocp/simple-nginx-nopv/output/resources/simple-nginx-nopv/ServiceAccount__v1_simple-nginx-nopv_deployer.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -imagePullSecrets: - - name: deployer-dockercfg-rgp2c -kind: ServiceAccount -metadata: - annotations: - openshift.io/internal-registry-pull-secret-ref: deployer-dockercfg-rgp2c - name: deployer - namespace: simple-nginx-nopv -secrets: - - name: deployer-dockercfg-rgp2c diff --git a/e2e-tests/tests/tier0/mta_801_stateful_migration_test.go b/e2e-tests/tests/tier0/mta_801_stateful_migration_test.go index 5ff822b7..0c8aac75 100644 --- a/e2e-tests/tests/tier0/mta_801_stateful_migration_test.go +++ b/e2e-tests/tests/tier0/mta_801_stateful_migration_test.go @@ -27,6 +27,7 @@ var _ = Describe("Stateful app migration", func() { tgtApp := scenario.TgtApp kubectlSrc := scenario.KubectlSrc kubectlTgt := scenario.KubectlTgt + isOpenShift := kubectlSrc.IsOpenShift() By("Prepare source app") log.Printf("Preparing source app %s in namespace %s\n", srcApp.Name, srcApp.Namespace) @@ -63,16 +64,20 @@ var _ = Describe("Stateful app migration", func() { Expect(RunCranePipelineWithChecks(runner, exportOpts, transformOpts, applyOpts)).NotTo(HaveOccurred()) log.Printf("Crane pipeline completed for namespace %s\n", srcApp.Namespace) By("Compare YAML semantic diff of golden and actual export files") - goldenExportDir, err := utils.GoldenManifestsDir(appName, "export") + goldenExportDir, err := utils.GoldenManifestsDirForPlatform(appName, "export", isOpenShift) Expect(err).NotTo(HaveOccurred()) - if err := utils.CompareDirectoryYAMLSemanticsExport(goldenExportDir, paths.ExportDir); err != nil { + compareExport := utils.CompareDirectoryYAMLSemanticsExport + if isOpenShift { + compareExport = utils.CompareDirectoryYAMLSemanticsExportAllowOptionalOCPOutputDefaults + } + if err := compareExport(goldenExportDir, paths.ExportDir); err != nil { Fail(fmt.Sprintf("YAML semantic diff of golden and actual export files: %v", err)) } else { log.Printf("YAML semantic diff of golden and actual export files: no differences found") } log.Printf("Yaml diff comparison completed for export files successfully") By("Compare YAML semantic diff of golden and actual output files") - goldenOutputDir, err := utils.GoldenManifestsDir(appName, "output") + goldenOutputDir, err := utils.GoldenManifestsDirForPlatform(appName, "output", isOpenShift) Expect(err).NotTo(HaveOccurred()) if err := utils.CompareDirectoryYAMLSemantics(goldenOutputDir, paths.OutputDir); err != nil { Fail(fmt.Sprintf("YAML semantic diff of golden and actual output files: %v", err)) diff --git a/e2e-tests/tests/tier0/mta_817_stateless_migration_test.go b/e2e-tests/tests/tier0/mta_817_stateless_migration_test.go index 83f4dea8..a4a4dd53 100644 --- a/e2e-tests/tests/tier0/mta_817_stateless_migration_test.go +++ b/e2e-tests/tests/tier0/mta_817_stateless_migration_test.go @@ -71,11 +71,7 @@ var _ = Describe("Stateless migration", func() { By("Compare YAML semantic diff of golden and actual output files") goldenOutputDir, err := utils.GoldenManifestsDirForPlatform(appName, "output", isOpenShift) Expect(err).NotTo(HaveOccurred()) - compareOutput := utils.CompareDirectoryYAMLSemantics - if isOpenShift { - compareOutput = utils.CompareDirectoryYAMLSemanticsExportAllowOptionalOCPOutputDefaults - } - if err := compareOutput(goldenOutputDir, paths.OutputDir); err != nil { + if err := utils.CompareDirectoryYAMLSemantics(goldenOutputDir, paths.OutputDir); err != nil { Fail(fmt.Sprintf("YAML semantic diff of golden and actual output files: %v", err)) } else { log.Printf("YAML semantic diff of golden and actual output files: no differences found") diff --git a/e2e-tests/utils/utils.go b/e2e-tests/utils/utils.go index 9d10dc96..299cab6d 100644 --- a/e2e-tests/utils/utils.go +++ b/e2e-tests/utils/utils.go @@ -770,6 +770,28 @@ func normalizeUnstableFields(doc any) any { return normalized } + if kind == "PersistentVolumeClaim" { + if annotations, ok := metadata["annotations"].(map[string]any); ok { + // Scheduler and provisioner annotations vary across OCP clusters. + delete(annotations, "volume.kubernetes.io/selected-node") + delete(annotations, "volume.kubernetes.io/storage-provisioner") + delete(annotations, "volume.beta.kubernetes.io/storage-provisioner") + if len(annotations) == 0 { + delete(metadata, "annotations") + } + } + return normalized + } + + if kind == "Service" { + if spec, ok := root["spec"].(map[string]any); ok { + // Single-stack defaults can be injected differently across clusters. + delete(spec, "ipFamilies") + delete(spec, "ipFamilyPolicy") + } + return normalized + } + if kind == "Route" { if annotations, ok := metadata["annotations"].(map[string]any); ok { // Only normalize host when OpenShift explicitly marks it as generated. @@ -1275,35 +1297,35 @@ func AssertFilesExist(dir string, expectedFiles []string) error { } return nil } - - // RemapNamespaceInYAML parses each document in a multi-doc YAML stream, - // replaces srcNamespace with tgtNamespace in metadata.namespace, - // and returns the re-serialized YAML string. - func RemapNamespaceInYAML(content []byte, srcNamespace, tgtNamespace string) (string, error) { - docs, err := parseYAMLDocuments(content) - if err != nil { - return "", fmt.Errorf("parsing YAML documents: %w", err) - } - - var parts []string - for i, doc := range docs { - obj, ok := doc.(map[string]any) - if !ok { - return "", fmt.Errorf("document %d: expected map[string]any, got %T", i, doc) - } - if meta, ok := obj["metadata"].(map[string]any); ok { - if meta["namespace"] == srcNamespace { - meta["namespace"] = tgtNamespace - } - } - out, err := yaml.Marshal(obj) - if err != nil { - return "", fmt.Errorf("marshaling YAML document: %w", err) - } - parts = append(parts, string(out)) - } - return strings.Join(parts, "---\n"), nil - } + +// RemapNamespaceInYAML parses each document in a multi-doc YAML stream, +// replaces srcNamespace with tgtNamespace in metadata.namespace, +// and returns the re-serialized YAML string. +func RemapNamespaceInYAML(content []byte, srcNamespace, tgtNamespace string) (string, error) { + docs, err := parseYAMLDocuments(content) + if err != nil { + return "", fmt.Errorf("parsing YAML documents: %w", err) + } + + var parts []string + for i, doc := range docs { + obj, ok := doc.(map[string]any) + if !ok { + return "", fmt.Errorf("document %d: expected map[string]any, got %T", i, doc) + } + if meta, ok := obj["metadata"].(map[string]any); ok { + if meta["namespace"] == srcNamespace { + meta["namespace"] = tgtNamespace + } + } + out, err := yaml.Marshal(obj) + if err != nil { + return "", fmt.Errorf("marshaling YAML document: %w", err) + } + parts = append(parts, string(out)) + } + return strings.Join(parts, "---\n"), nil +} // ParseValidationReport reads and parses a crane validate report file. // The report parameter should be a pointer to the structure that will hold the parsed data. diff --git a/e2e-tests/utils/utils_test.go b/e2e-tests/utils/utils_test.go index fdefd140..b4e19c0d 100644 --- a/e2e-tests/utils/utils_test.go +++ b/e2e-tests/utils/utils_test.go @@ -590,6 +590,36 @@ func TestCompareDirectoryYAMLSemanticsExport(t *testing.T) { return golden, got }, }, + { + name: "service_ip_family_defaults_are_ignored", + build: func(t *testing.T) (string, string) { + golden := t.TempDir() + got := t.TempDir() + write(t, golden, "resources/svc.yaml", "apiVersion: v1\nkind: Service\nmetadata:\n namespace: ns\n name: s\nspec:\n type: ClusterIP\n ipFamilies:\n - IPv4\n ipFamilyPolicy: SingleStack\n") + write(t, got, "resources/svc.yaml", "apiVersion: v1\nkind: Service\nmetadata:\n namespace: ns\n name: s\nspec:\n type: ClusterIP\n ipFamilies:\n - IPv6\n ipFamilyPolicy: PreferDualStack\n") + return golden, got + }, + }, + { + name: "pvc_provisioner_and_selected_node_annotations_are_ignored", + build: func(t *testing.T) (string, string) { + golden := t.TempDir() + got := t.TempDir() + write(t, golden, "resources/pvc.yaml", "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n namespace: ns\n name: data\n annotations:\n volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com\n volume.kubernetes.io/selected-node: ip-10-0-25-205.us-east-2.compute.internal\n volume.kubernetes.io/storage-provisioner: ebs.csi.aws.com\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 1Gi\n") + write(t, got, "resources/pvc.yaml", "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n namespace: ns\n name: data\n annotations:\n volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io\n volume.kubernetes.io/selected-node: gke-worker-01\n volume.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 1Gi\n") + return golden, got + }, + }, + { + name: "pvc_ignored_annotations_present_on_one_side_only", + build: func(t *testing.T) (string, string) { + golden := t.TempDir() + got := t.TempDir() + write(t, golden, "resources/pvc.yaml", "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n namespace: ns\n name: data\n annotations:\n volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com\n volume.kubernetes.io/selected-node: ip-10-0-25-205.us-east-2.compute.internal\n volume.kubernetes.io/storage-provisioner: ebs.csi.aws.com\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 1Gi\n") + write(t, got, "resources/pvc.yaml", "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n namespace: ns\n name: data\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 1Gi\n") + return golden, got + }, + }, { name: "real_semantic_diff_detected", build: func(t *testing.T) (string, string) {