diff --git a/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled-oc.yml b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled-oc.yml new file mode 100644 index 0000000000..924b12e66c --- /dev/null +++ b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled-oc.yml @@ -0,0 +1,226 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: {} + generation: 5 + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + name: some-name-rs0 + ownerReferences: + - controller: true + kind: PerconaServerMongoDB + name: some-name +spec: + podManagementPolicy: OrderedReady + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + serviceName: some-name-rs0 + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + spec: + containers: + - args: + - --bind_ip_all + - --auth + - --dbpath=/data/db + - --port=27017 + - --replSet=rs0 + - --storageEngine=wiredTiger + - --relaxPermChecks + - --sslAllowInvalidCertificates + - --clusterAuthMode=x509 + - --tlsMode=preferTLS + - --enableEncryption + - --encryptionKeyFile=/etc/mongodb-encryption/encryption-key + - --wiredTigerCacheSizeGB=0.25 + - --wiredTigerIndexPrefixCompression=true + - --config=/etc/mongodb-config/mongod.conf + - --quiet + command: + - /opt/percona/ps-entry.sh + env: + - name: SERVICE_NAME + value: some-name + - name: MONGODB_PORT + value: "27017" + - name: MONGODB_REPLSET + value: rs0 + envFrom: + - secretRef: + name: internal-some-name-users + optional: false + imagePullPolicy: Always + livenessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - liveness + - --ssl + - --sslInsecure + - --sslCAFile + - /etc/mongodb-ssl/ca.crt + - --sslPEMKeyFile + - /tmp/tls.pem + - --startupDelaySeconds + - "7200" + failureThreshold: 4 + initialDelaySeconds: 60 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 + name: mongod + ports: + - containerPort: 27017 + name: mongodb + protocol: TCP + readinessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - readiness + - --component + - mongod + failureThreshold: 8 + initialDelaySeconds: 10 + periodSeconds: 3 + successThreshold: 1 + timeoutSeconds: 2 + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + securityContext: + runAsNonRoot: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /etc/mongodb-secrets + name: some-name-mongodb-keyfile + readOnly: true + - mountPath: /etc/mongodb-ssl + name: ssl + readOnly: true + - mountPath: /etc/mongodb-ssl-internal + name: ssl-internal + readOnly: true + - mountPath: /etc/mongodb-config + name: config + - mountPath: /opt/percona + name: bin + - mountPath: /etc/mongodb-encryption + name: some-name-mongodb-encryption-key + readOnly: true + - mountPath: /etc/users-secret + name: users-secret-file + workingDir: /data/db + - args: + - -c + - while true; do echo echo $(date -u) 'test' >> /dev/null; sleep 5;done + command: + - /bin/sh + imagePullPolicy: Always + name: rs-sidecar-1 + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + initContainers: + - command: + - /init-entrypoint.sh + imagePullPolicy: Always + name: mongo-init + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /opt/percona + name: bin + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 60 + volumes: + - name: some-name-mongodb-keyfile + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-keyfile + - emptyDir: {} + name: bin + - configMap: + defaultMode: 420 + name: some-name-rs0-mongod + optional: true + name: config + - name: some-name-mongodb-encryption-key + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-encryption-key + - name: ssl + secret: + defaultMode: 288 + optional: false + secretName: some-name-ssl + - name: ssl-internal + secret: + defaultMode: 288 + optional: true + secretName: some-name-ssl-internal + - name: users-secret-file + secret: + defaultMode: 420 + secretName: internal-some-name-users + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - metadata: + name: mongod-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: + phase: Pending diff --git a/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled.yml b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled.yml new file mode 100644 index 0000000000..363ccb862e --- /dev/null +++ b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-disabled.yml @@ -0,0 +1,229 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: {} + generation: 5 + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + name: some-name-rs0 + ownerReferences: + - controller: true + kind: PerconaServerMongoDB + name: some-name +spec: + podManagementPolicy: OrderedReady + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + serviceName: some-name-rs0 + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + spec: + containers: + - args: + - --bind_ip_all + - --auth + - --dbpath=/data/db + - --port=27017 + - --replSet=rs0 + - --storageEngine=wiredTiger + - --relaxPermChecks + - --sslAllowInvalidCertificates + - --clusterAuthMode=x509 + - --tlsMode=preferTLS + - --enableEncryption + - --encryptionKeyFile=/etc/mongodb-encryption/encryption-key + - --wiredTigerCacheSizeGB=0.25 + - --wiredTigerIndexPrefixCompression=true + - --config=/etc/mongodb-config/mongod.conf + - --quiet + command: + - /opt/percona/ps-entry.sh + env: + - name: SERVICE_NAME + value: some-name + - name: MONGODB_PORT + value: "27017" + - name: MONGODB_REPLSET + value: rs0 + envFrom: + - secretRef: + name: internal-some-name-users + optional: false + imagePullPolicy: Always + livenessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - liveness + - --ssl + - --sslInsecure + - --sslCAFile + - /etc/mongodb-ssl/ca.crt + - --sslPEMKeyFile + - /tmp/tls.pem + - --startupDelaySeconds + - "7200" + failureThreshold: 4 + initialDelaySeconds: 60 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 + name: mongod + ports: + - containerPort: 27017 + name: mongodb + protocol: TCP + readinessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - readiness + - --component + - mongod + failureThreshold: 8 + initialDelaySeconds: 10 + periodSeconds: 3 + successThreshold: 1 + timeoutSeconds: 2 + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + securityContext: + runAsNonRoot: true + runAsUser: 1001 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /etc/mongodb-secrets + name: some-name-mongodb-keyfile + readOnly: true + - mountPath: /etc/mongodb-ssl + name: ssl + readOnly: true + - mountPath: /etc/mongodb-ssl-internal + name: ssl-internal + readOnly: true + - mountPath: /etc/mongodb-config + name: config + - mountPath: /opt/percona + name: bin + - mountPath: /etc/mongodb-encryption + name: some-name-mongodb-encryption-key + readOnly: true + - mountPath: /etc/users-secret + name: users-secret-file + workingDir: /data/db + - args: + - -c + - while true; do echo echo $(date -u) 'test' >> /dev/null; sleep 5;done + command: + - /bin/sh + imagePullPolicy: Always + name: rs-sidecar-1 + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + initContainers: + - command: + - /init-entrypoint.sh + imagePullPolicy: Always + name: mongo-init + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /opt/percona + name: bin + restartPolicy: Always + runtimeClassName: container-rc + schedulerName: default-scheduler + securityContext: + fsGroup: 1001 + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 60 + volumes: + - name: some-name-mongodb-keyfile + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-keyfile + - emptyDir: {} + name: bin + - configMap: + defaultMode: 420 + name: some-name-rs0-mongod + optional: true + name: config + - name: some-name-mongodb-encryption-key + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-encryption-key + - name: ssl + secret: + defaultMode: 288 + optional: false + secretName: some-name-ssl + - name: ssl-internal + secret: + defaultMode: 288 + optional: true + secretName: some-name-ssl-internal + - name: users-secret-file + secret: + defaultMode: 420 + secretName: internal-some-name-users + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - metadata: + name: mongod-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: + phase: Pending diff --git a/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled-oc.yml b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled-oc.yml new file mode 100644 index 0000000000..78b6d58305 --- /dev/null +++ b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled-oc.yml @@ -0,0 +1,227 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: {} + generation: 9 + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + name: some-name-rs0 + ownerReferences: + - controller: true + kind: PerconaServerMongoDB + name: some-name +spec: + podManagementPolicy: OrderedReady + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + serviceName: some-name-rs0 + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + spec: + containers: + - args: + - --bind_ip_all + - --auth + - --dbpath=/data/db + - --port=27017 + - --replSet=rs0 + - --storageEngine=wiredTiger + - --relaxPermChecks + - --sslAllowInvalidCertificates + - --clusterAuthMode=x509 + - --tlsMode=preferTLS + - --shardsvr + - --enableEncryption + - --encryptionKeyFile=/etc/mongodb-encryption/encryption-key + - --wiredTigerCacheSizeGB=0.25 + - --wiredTigerIndexPrefixCompression=true + - --config=/etc/mongodb-config/mongod.conf + - --quiet + command: + - /opt/percona/ps-entry.sh + env: + - name: SERVICE_NAME + value: some-name + - name: MONGODB_PORT + value: "27017" + - name: MONGODB_REPLSET + value: rs0 + envFrom: + - secretRef: + name: internal-some-name-users + optional: false + imagePullPolicy: Always + livenessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - liveness + - --ssl + - --sslInsecure + - --sslCAFile + - /etc/mongodb-ssl/ca.crt + - --sslPEMKeyFile + - /tmp/tls.pem + - --startupDelaySeconds + - "7200" + failureThreshold: 4 + initialDelaySeconds: 60 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 + name: mongod + ports: + - containerPort: 27017 + name: mongodb + protocol: TCP + readinessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - readiness + - --component + - mongod + failureThreshold: 8 + initialDelaySeconds: 10 + periodSeconds: 3 + successThreshold: 1 + timeoutSeconds: 2 + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + securityContext: + runAsNonRoot: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /etc/mongodb-secrets + name: some-name-mongodb-keyfile + readOnly: true + - mountPath: /etc/mongodb-ssl + name: ssl + readOnly: true + - mountPath: /etc/mongodb-ssl-internal + name: ssl-internal + readOnly: true + - mountPath: /etc/mongodb-config + name: config + - mountPath: /opt/percona + name: bin + - mountPath: /etc/mongodb-encryption + name: some-name-mongodb-encryption-key + readOnly: true + - mountPath: /etc/users-secret + name: users-secret-file + workingDir: /data/db + - args: + - -c + - while true; do echo echo $(date -u) 'test' >> /dev/null; sleep 5;done + command: + - /bin/sh + imagePullPolicy: Always + name: rs-sidecar-1 + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + initContainers: + - command: + - /init-entrypoint.sh + imagePullPolicy: Always + name: mongo-init + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /opt/percona + name: bin + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 60 + volumes: + - name: some-name-mongodb-keyfile + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-keyfile + - emptyDir: {} + name: bin + - configMap: + defaultMode: 420 + name: some-name-rs0-mongod + optional: true + name: config + - name: some-name-mongodb-encryption-key + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-encryption-key + - name: ssl + secret: + defaultMode: 288 + optional: false + secretName: some-name-ssl + - name: ssl-internal + secret: + defaultMode: 288 + optional: true + secretName: some-name-ssl-internal + - name: users-secret-file + secret: + defaultMode: 420 + secretName: internal-some-name-users + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - metadata: + name: mongod-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: + phase: Pending diff --git a/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled.yml b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled.yml new file mode 100644 index 0000000000..28bcab461d --- /dev/null +++ b/e2e-tests/expose-sharded/compare/statefulset_some-name-rs0-sharding-enabled.yml @@ -0,0 +1,230 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: {} + generation: 9 + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + name: some-name-rs0 + ownerReferences: + - controller: true + kind: PerconaServerMongoDB + name: some-name +spec: + podManagementPolicy: OrderedReady + replicas: 3 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + serviceName: some-name-rs0 + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/component: mongod + app.kubernetes.io/instance: some-name + app.kubernetes.io/managed-by: percona-server-mongodb-operator + app.kubernetes.io/name: percona-server-mongodb + app.kubernetes.io/part-of: percona-server-mongodb + app.kubernetes.io/replset: rs0 + spec: + containers: + - args: + - --bind_ip_all + - --auth + - --dbpath=/data/db + - --port=27017 + - --replSet=rs0 + - --storageEngine=wiredTiger + - --relaxPermChecks + - --sslAllowInvalidCertificates + - --clusterAuthMode=x509 + - --tlsMode=preferTLS + - --shardsvr + - --enableEncryption + - --encryptionKeyFile=/etc/mongodb-encryption/encryption-key + - --wiredTigerCacheSizeGB=0.25 + - --wiredTigerIndexPrefixCompression=true + - --config=/etc/mongodb-config/mongod.conf + - --quiet + command: + - /opt/percona/ps-entry.sh + env: + - name: SERVICE_NAME + value: some-name + - name: MONGODB_PORT + value: "27017" + - name: MONGODB_REPLSET + value: rs0 + envFrom: + - secretRef: + name: internal-some-name-users + optional: false + imagePullPolicy: Always + livenessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - liveness + - --ssl + - --sslInsecure + - --sslCAFile + - /etc/mongodb-ssl/ca.crt + - --sslPEMKeyFile + - /tmp/tls.pem + - --startupDelaySeconds + - "7200" + failureThreshold: 4 + initialDelaySeconds: 60 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 10 + name: mongod + ports: + - containerPort: 27017 + name: mongodb + protocol: TCP + readinessProbe: + exec: + command: + - /opt/percona/mongodb-healthcheck + - k8s + - readiness + - --component + - mongod + failureThreshold: 8 + initialDelaySeconds: 10 + periodSeconds: 3 + successThreshold: 1 + timeoutSeconds: 2 + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + securityContext: + runAsNonRoot: true + runAsUser: 1001 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /etc/mongodb-secrets + name: some-name-mongodb-keyfile + readOnly: true + - mountPath: /etc/mongodb-ssl + name: ssl + readOnly: true + - mountPath: /etc/mongodb-ssl-internal + name: ssl-internal + readOnly: true + - mountPath: /etc/mongodb-config + name: config + - mountPath: /opt/percona + name: bin + - mountPath: /etc/mongodb-encryption + name: some-name-mongodb-encryption-key + readOnly: true + - mountPath: /etc/users-secret + name: users-secret-file + workingDir: /data/db + - args: + - -c + - while true; do echo echo $(date -u) 'test' >> /dev/null; sleep 5;done + command: + - /bin/sh + imagePullPolicy: Always + name: rs-sidecar-1 + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + initContainers: + - command: + - /init-entrypoint.sh + imagePullPolicy: Always + name: mongo-init + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 100m + memory: 100M + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /data/db + name: mongod-data + - mountPath: /opt/percona + name: bin + restartPolicy: Always + runtimeClassName: container-rc + schedulerName: default-scheduler + securityContext: + fsGroup: 1001 + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 60 + volumes: + - name: some-name-mongodb-keyfile + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-keyfile + - emptyDir: {} + name: bin + - configMap: + defaultMode: 420 + name: some-name-rs0-mongod + optional: true + name: config + - name: some-name-mongodb-encryption-key + secret: + defaultMode: 288 + optional: false + secretName: some-name-mongodb-encryption-key + - name: ssl + secret: + defaultMode: 288 + optional: false + secretName: some-name-ssl + - name: ssl-internal + secret: + defaultMode: 288 + optional: true + secretName: some-name-ssl-internal + - name: users-secret-file + secret: + defaultMode: 420 + secretName: internal-some-name-users + updateStrategy: + rollingUpdate: + partition: 0 + type: RollingUpdate + volumeClaimTemplates: + - metadata: + name: mongod-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: + phase: Pending diff --git a/e2e-tests/expose-sharded/run b/e2e-tests/expose-sharded/run index 7a20d7cedd..8932032b60 100755 --- a/e2e-tests/expose-sharded/run +++ b/e2e-tests/expose-sharded/run @@ -119,6 +119,25 @@ function main() { compare_kubectl statefulset/$cluster-cfg compare_kubectl statefulset/$cluster-mongos "" + desc 'disabling sharding' + kubectl_bin patch psmdb $cluster --type='json' -p='[{"op": "replace", "path": "/spec/sharding/enabled", "value": false}]' + sleep 10 + wait_cluster_consistency "$cluster" 60 + compare_kubectl statefulset/$cluster-rs0 "-sharding-disabled" + + if [[ "$(kubectl_bin get sts -o yaml | yq '.items | length')" != 1 ]]; then + echo "Expected to have only 1 statefulset $cluster-rs0" + exit 1 + fi + + desc 'enabling sharding' + kubectl_bin patch psmdb $cluster --type='json' -p='[{"op": "replace", "path": "/spec/sharding/enabled", "value": true}]' + sleep 10 + wait_cluster_consistency "$cluster" 60 + compare_kubectl statefulset/$cluster-rs0 "-sharding-enabled" + compare_kubectl statefulset/$cluster-cfg + compare_kubectl statefulset/$cluster-mongos "" + desc 'write data, read from all' run_mongos \ 'db.createUser({user:"myApp",pwd:"myPass",roles:[{db:"myApp",role:"readWrite"}]})' \ diff --git a/pkg/apis/psmdb/v1/psmdb_defaults.go b/pkg/apis/psmdb/v1/psmdb_defaults.go index 98b6d720a1..0fcf3dea1c 100644 --- a/pkg/apis/psmdb/v1/psmdb_defaults.go +++ b/pkg/apis/psmdb/v1/psmdb_defaults.go @@ -1,6 +1,7 @@ package v1 import ( + "context" "fmt" "strconv" "time" @@ -10,6 +11,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + logf "sigs.k8s.io/controller-runtime/pkg/log" "github.com/percona/percona-backup-mongodb/pbm/compress" @@ -57,7 +59,9 @@ const ( // CheckNSetDefaults sets default options, overwrites wrong settings // and checks if other options' values valid -func (cr *PerconaServerMongoDB) CheckNSetDefaults(platform version.Platform, log logr.Logger) error { +func (cr *PerconaServerMongoDB) CheckNSetDefaults(ctx context.Context, platform version.Platform) error { + log := logf.FromContext(ctx) + if cr.Spec.Replsets == nil { return errors.New("at least one replica set should be specified") } diff --git a/pkg/apis/psmdb/v1/psmdb_types.go b/pkg/apis/psmdb/v1/psmdb_types.go index fbc2d6035d..04349cd392 100644 --- a/pkg/apis/psmdb/v1/psmdb_types.go +++ b/pkg/apis/psmdb/v1/psmdb_types.go @@ -262,6 +262,8 @@ const ( AppStatePaused AppState = "paused" AppStateReady AppState = "ready" AppStateError AppState = "error" + + AppStateSharding AppState = "sharding" ) type UpgradeStrategy string @@ -321,6 +323,9 @@ const ( ConditionTrue ConditionStatus = "True" ConditionFalse ConditionStatus = "False" ConditionUnknown ConditionStatus = "Unknown" + + ConditionEnabled ConditionStatus = "Enabled" + ConditionDisabled ConditionStatus = "Disabled" ) type ClusterCondition struct { @@ -331,6 +336,16 @@ type ClusterCondition struct { Message string `json:"message,omitempty"` } +// FindCondition finds the conditionType in conditions. +func (s *PerconaServerMongoDBStatus) FindCondition(conditionType AppState) *ClusterCondition { + for i, c := range s.Conditions { + if c.Type == conditionType { + return &s.Conditions[i] + } + } + return nil +} + type PMMSpec struct { Enabled bool `json:"enabled,omitempty"` ServerHost string `json:"serverHost,omitempty"` @@ -1178,21 +1193,15 @@ func (cr *PerconaServerMongoDB) CanBackup(ctx context.Context) error { return nil } -const maxStatusesQuantity = 20 - func (s *PerconaServerMongoDBStatus) AddCondition(c ClusterCondition) { - if len(s.Conditions) == 0 { - s.Conditions = append(s.Conditions, c) - return - } - - if s.Conditions[len(s.Conditions)-1].Type != c.Type { - s.Conditions = append(s.Conditions, c) - } - - if len(s.Conditions) > maxStatusesQuantity { - s.Conditions = s.Conditions[len(s.Conditions)-maxStatusesQuantity:] + for i, cond := range s.Conditions { + if cond.Type != c.Type { + continue + } + s.Conditions[i] = c } + s.Conditions = append(s.Conditions, c) + return } // GetExternalNodes returns all external nodes for all replsets diff --git a/pkg/controller/perconaservermongodb/connections_test.go b/pkg/controller/perconaservermongodb/connections_test.go index af86b6334f..d9eb5ce858 100644 --- a/pkg/controller/perconaservermongodb/connections_test.go +++ b/pkg/controller/perconaservermongodb/connections_test.go @@ -133,7 +133,7 @@ func TestConnectionLeaks(t *testing.T) { allPods = append(allPods, fakePodsForMongos(cr)...) cr := cr.DeepCopy() - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { t.Fatal(err) } obj = append(obj, fakeStatefulset(cr, cr.Spec.Sharding.ConfigsvrReplSet, cr.Spec.Sharding.ConfigsvrReplSet.Size, updatedRevision)) @@ -144,7 +144,7 @@ func TestConnectionLeaks(t *testing.T) { if cr.Spec.Unmanaged { cr := cr.DeepCopy() - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { t.Fatal(err) } obj = append(obj, &corev1.Secret{ @@ -226,7 +226,7 @@ func updateResource[T any](resource T, update func(T)) T { func updateUsersSecret(ctx context.Context, cl client.Client, cr *api.PerconaServerMongoDB) error { cr = cr.DeepCopy() - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { return err } secret := corev1.Secret{} @@ -425,9 +425,8 @@ func (c *fakeMongoClient) RSBuildInfo(ctx context.Context) (mongo.BuildInfo, err } func (c *fakeMongoClient) RSStatus(ctx context.Context) (mongo.Status, error) { - log := logf.FromContext(ctx) cr := c.cr.DeepCopy() - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, log); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { return mongo.Status{}, err } members := []*mongo.Member{} @@ -453,9 +452,8 @@ func (c *fakeMongoClient) RSStatus(ctx context.Context) (mongo.Status, error) { } func (c *fakeMongoClient) ReadConfig(ctx context.Context) (mongo.RSConfig, error) { - log := logf.FromContext(ctx) cr := c.cr.DeepCopy() - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, log); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { return mongo.RSConfig{}, err } members := []mongo.ConfigMember{} @@ -505,7 +503,7 @@ func (c *fakeMongoClient) ListShard(ctx context.Context) (mongo.ShardList, error func (c *fakeMongoClient) IsMaster(ctx context.Context) (*mongo.IsMasterResp, error) { isMaster := false - if err := c.cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := c.cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { return nil, err } if c.host == psmdb.GetAddr(c.cr, c.pods[0].GetName(), c.cr.Spec.Replsets[0].Name) { diff --git a/pkg/controller/perconaservermongodb/finalizers_test.go b/pkg/controller/perconaservermongodb/finalizers_test.go index d3442e948e..aba820ad3d 100644 --- a/pkg/controller/perconaservermongodb/finalizers_test.go +++ b/pkg/controller/perconaservermongodb/finalizers_test.go @@ -6,7 +6,6 @@ import ( "testing" "k8s.io/apimachinery/pkg/types" - logf "sigs.k8s.io/controller-runtime/pkg/log" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" "github.com/percona/percona-server-mongodb-operator/pkg/naming" @@ -87,7 +86,7 @@ func TestCheckFinalizers(t *testing.T) { t.Fatal(err) } - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { t.Fatal(err) } diff --git a/pkg/controller/perconaservermongodb/getters.go b/pkg/controller/perconaservermongodb/getters.go index 90711dd67d..caeb6c7436 100644 --- a/pkg/controller/perconaservermongodb/getters.go +++ b/pkg/controller/perconaservermongodb/getters.go @@ -29,14 +29,6 @@ func (r *ReconcilePerconaServerMongoDB) getMongodPods(ctx context.Context, cr *a return mongodPods, err } -func (r *ReconcilePerconaServerMongoDB) getMongosDeployment(ctx context.Context, cr *api.PerconaServerMongoDB) (appsv1.Deployment, error) { - mongos := appsv1.Deployment{} - - err := r.client.Get(ctx, cr.MongosNamespacedName(), &mongos) - - return mongos, err -} - func (r *ReconcilePerconaServerMongoDB) getMongosPods(ctx context.Context, cr *api.PerconaServerMongoDB) (corev1.PodList, error) { mongosPods := corev1.PodList{} err := r.client.List(ctx, diff --git a/pkg/controller/perconaservermongodb/psmdb_controller.go b/pkg/controller/perconaservermongodb/psmdb_controller.go index 4a8efdac71..840cccc82c 100644 --- a/pkg/controller/perconaservermongodb/psmdb_controller.go +++ b/pkg/controller/perconaservermongodb/psmdb_controller.go @@ -278,7 +278,7 @@ func (r *ReconcilePerconaServerMongoDB) Reconcile(ctx context.Context, request r return reconcile.Result{}, errors.Wrap(err, "set CR version") } - err = cr.CheckNSetDefaults(r.serverVersion.Platform, log) + err = cr.CheckNSetDefaults(ctx, r.serverVersion.Platform) if err != nil { // If the user created a cluster with finalizers and wrong options, it would be impossible to delete a cluster. // We need to delete finalizers. @@ -569,7 +569,66 @@ func (r *ReconcilePerconaServerMongoDB) reconcileReplsets(ctx context.Context, c return clusterStatus, stderrors.Join(errs...) } +func (r *ReconcilePerconaServerMongoDB) handleShardingToggle(ctx context.Context, cr *api.PerconaServerMongoDB) error { + if cr.Spec.Pause { + return nil + } + + getShardingStatus := func(cr *api.PerconaServerMongoDB) api.ConditionStatus { + if cr.Spec.Sharding.Enabled { + return api.ConditionEnabled + } else { + return api.ConditionDisabled + } + } + + condition := cr.Status.FindCondition(api.AppStateSharding) + if condition == nil { + cr.Status.AddCondition(api.ClusterCondition{ + Status: getShardingStatus(cr), + Type: api.AppStateSharding, + LastTransitionTime: metav1.NewTime(time.Now()), + }) + return nil + } + if condition.Status == getShardingStatus(cr) { + return nil + } + + cr.Spec.Sharding.Enabled = !cr.Spec.Sharding.Enabled + cr.Spec.Pause = true + if err := cr.CheckNSetDefaults(ctx, r.serverVersion.Platform); err != nil { + return errors.Wrap(err, "check and set defaults") + } + + mongodPods, err := r.getMongodPods(ctx, cr) + if err != nil { + return errors.Wrap(err, "get mongod pods") + } + mongosPods, err := r.getMongosPods(ctx, cr) + if err != nil { + return errors.Wrap(err, "get mongos pods") + } + if len(mongodPods.Items) != 0 || len(mongosPods.Items) != 0 { + return nil + } + + cr.Spec.Sharding.Enabled = !cr.Spec.Sharding.Enabled + cr.Spec.Pause = false + if err := cr.CheckNSetDefaults(ctx, r.serverVersion.Platform); err != nil { + return errors.Wrap(err, "check and set defaults") + } + + condition.Status = getShardingStatus(cr) + condition.LastTransitionTime = metav1.NewTime(time.Now()) + + return nil +} + func (r *ReconcilePerconaServerMongoDB) reconcilePause(ctx context.Context, cr *api.PerconaServerMongoDB) error { + if err := r.handleShardingToggle(ctx, cr); err != nil { + return errors.Wrap(err, "handle sharding toggle") + } if !cr.Spec.Pause || cr.DeletionTimestamp != nil { return nil } @@ -582,7 +641,7 @@ func (r *ReconcilePerconaServerMongoDB) reconcilePause(ctx context.Context, cr * } if backupRunning { cr.Spec.Pause = false - if err := cr.CheckNSetDefaults(r.serverVersion.Platform, log); err != nil { + if err := cr.CheckNSetDefaults(ctx, r.serverVersion.Platform); err != nil { return errors.Wrap(err, "failed to set defaults") } log.Info("cluster will pause after all backups finished") diff --git a/pkg/controller/perconaservermongodb/service.go b/pkg/controller/perconaservermongodb/service.go index 698bb6237b..11bb7161e3 100644 --- a/pkg/controller/perconaservermongodb/service.go +++ b/pkg/controller/perconaservermongodb/service.go @@ -18,7 +18,7 @@ import ( func (r *ReconcilePerconaServerMongoDB) reconcileServices(ctx context.Context, cr *api.PerconaServerMongoDB, repls []*api.ReplsetSpec) error { if err := r.reconcileReplsetServices(ctx, cr, repls); err != nil { - return errors.Wrap(err, "reconcile mongos services") + return errors.Wrap(err, "reconcile replset services") } if err := r.reconcileMongosSvc(ctx, cr); err != nil { diff --git a/pkg/controller/perconaservermongodb/statefulset_test.go b/pkg/controller/perconaservermongodb/statefulset_test.go index ec58701463..54e16af731 100644 --- a/pkg/controller/perconaservermongodb/statefulset_test.go +++ b/pkg/controller/perconaservermongodb/statefulset_test.go @@ -9,7 +9,6 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/yaml" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" @@ -27,7 +26,7 @@ func TestReconcileStatefulSet(t *testing.T) { defaultCR := readDefaultCR(t, crName, ns) defaultCR.Spec.Replsets[0].NonVoting.Enabled = true - if err := defaultCR.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := defaultCR.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { t.Fatal(err) } diff --git a/pkg/controller/perconaservermongodb/status_test.go b/pkg/controller/perconaservermongodb/status_test.go index 2e2ee8c551..9164ec23d9 100644 --- a/pkg/controller/perconaservermongodb/status_test.go +++ b/pkg/controller/perconaservermongodb/status_test.go @@ -11,7 +11,6 @@ import ( "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint - logf "sigs.k8s.io/controller-runtime/pkg/log" mcs "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" @@ -239,7 +238,7 @@ func TestConnectionEndpoint(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cr := tt.cr - if err := cr.CheckNSetDefaults(version.PlatformKubernetes, logf.FromContext(ctx)); err != nil { + if err := cr.CheckNSetDefaults(ctx, version.PlatformKubernetes); err != nil { t.Fatal(err) } obj := []client.Object{cr} diff --git a/pkg/controller/perconaservermongodb/version.go b/pkg/controller/perconaservermongodb/version.go index ccb2dcb01e..19938f041f 100644 --- a/pkg/controller/perconaservermongodb/version.go +++ b/pkg/controller/perconaservermongodb/version.go @@ -18,6 +18,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "github.com/percona/percona-backup-mongodb/pbm/defs" + api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" "github.com/percona/percona-server-mongodb-operator/pkg/k8s" ) @@ -74,7 +75,7 @@ func (r *ReconcilePerconaServerMongoDB) scheduleEnsureVersion(ctx context.Contex return } - err = localCr.CheckNSetDefaults(r.serverVersion.Platform, log) + err = localCr.CheckNSetDefaults(ctx, r.serverVersion.Platform) if err != nil { log.Error(err, "failed to set defaults for CR") return diff --git a/pkg/controller/perconaservermongodb/version_test.go b/pkg/controller/perconaservermongodb/version_test.go index a7ff1bdff5..593c502ba3 100644 --- a/pkg/controller/perconaservermongodb/version_test.go +++ b/pkg/controller/perconaservermongodb/version_test.go @@ -19,9 +19,9 @@ import ( k8sruntime "k8s.io/apimachinery/pkg/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" - logf "sigs.k8s.io/controller-runtime/pkg/log" "github.com/percona/percona-backup-mongodb/pbm/defs" + "github.com/percona/percona-server-mongodb-operator/pkg/apis" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" "github.com/percona/percona-server-mongodb-operator/pkg/k8s" @@ -39,7 +39,6 @@ func Test_majorUpgradeRequested(t *testing.T) { want UpgradeRequest wantErr bool }{ - { name: "TestWithEmptyMongoVersionInStatus", args: args{ @@ -563,12 +562,11 @@ func TestVersionMeta(t *testing.T) { scheme: scheme, serverVersion: sv, } - log := logf.Log.WithName(tt.name) if err := r.setCRVersion(context.TODO(), &tt.cr); err != nil { t.Fatal(err, "set CR version") } - err := tt.cr.CheckNSetDefaults(version.PlatformKubernetes, log) + err := tt.cr.CheckNSetDefaults(context.TODO(), version.PlatformKubernetes) if err != nil { t.Fatal(err) } @@ -629,8 +627,7 @@ func startFakeVersionService(t *testing.T, addr string, port int, gwport int) er return nil } -type fakeVS struct { -} +type fakeVS struct{} func (b *fakeVS) Product(ctx context.Context, req *pbVersion.ProductRequest) (*pbVersion.ProductResponse, error) { return &pbVersion.ProductResponse{}, nil diff --git a/pkg/controller/perconaservermongodbbackup/perconaservermongodbbackup_controller.go b/pkg/controller/perconaservermongodbbackup/perconaservermongodbbackup_controller.go index 4b66d3b35f..6020d7c17b 100644 --- a/pkg/controller/perconaservermongodbbackup/perconaservermongodbbackup_controller.go +++ b/pkg/controller/perconaservermongodbbackup/perconaservermongodbbackup_controller.go @@ -170,7 +170,7 @@ func (r *ReconcilePerconaServerMongoDBBackup) Reconcile(ctx context.Context, req return rr, errors.Wrapf(err, "fetch server version") } - err = cluster.CheckNSetDefaults(svr.Platform, log) + err = cluster.CheckNSetDefaults(ctx, svr.Platform) if err != nil { return rr, errors.Wrapf(err, "set defaults for %s/%s", cluster.Namespace, cluster.Name) } diff --git a/pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go b/pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go index 2d95248c62..f5932e6eeb 100644 --- a/pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go +++ b/pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go @@ -170,7 +170,7 @@ func (r *ReconcilePerconaServerMongoDBRestore) Reconcile(ctx context.Context, re return rr, errors.Wrapf(err, "fetch server version") } - if err = cluster.CheckNSetDefaults(svr.Platform, log); err != nil { + if err = cluster.CheckNSetDefaults(ctx, svr.Platform); err != nil { return rr, errors.Wrapf(err, "set defaults for %s/%s", cluster.Namespace, cluster.Name) }