diff --git a/charts/apache-shardingsphere-operator-charts/crds/shardingsphere.apache.org_storageproviders.yaml b/charts/apache-shardingsphere-operator-charts/crds/shardingsphere.apache.org_storageproviders.yaml index 0ed5d8cc..45db4134 100644 --- a/charts/apache-shardingsphere-operator-charts/crds/shardingsphere.apache.org_storageproviders.yaml +++ b/charts/apache-shardingsphere-operator-charts/crds/shardingsphere.apache.org_storageproviders.yaml @@ -31,7 +31,7 @@ spec: shortNames: - sp singular: storageprovider - scope: Cluster + scope: Namespaced versions: - name: v1alpha1 schema: diff --git a/charts/apache-shardingsphere-operator-charts/templates/operator_rbac.yaml b/charts/apache-shardingsphere-operator-charts/templates/operator_rbac.yaml index 3e4b5a76..0b8dac70 100644 --- a/charts/apache-shardingsphere-operator-charts/templates/operator_rbac.yaml +++ b/charts/apache-shardingsphere-operator-charts/templates/operator_rbac.yaml @@ -371,8 +371,6 @@ rules: - storageproviders verbs: - get - - list - - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding diff --git a/examples/operator/shardingsphere-storageprovider-aws-aurora-cluster.yaml b/examples/operator/shardingsphere-storageprovider-aws-aurora-cluster.yaml index 903a8fcb..5755f8fd 100644 --- a/examples/operator/shardingsphere-storageprovider-aws-aurora-cluster.yaml +++ b/examples/operator/shardingsphere-storageprovider-aws-aurora-cluster.yaml @@ -20,6 +20,7 @@ apiVersion: shardingsphere.apache.org/v1alpha1 kind: StorageProvider metadata: name: aws-aurora-cluster-mysql-5.7 + namespace: default spec: provisioner: storageproviders.shardingsphere.apache.org/aws-aurora reclaimPolicy: Delete diff --git a/examples/operator/shardingsphere-storageprovider-aws-rds-cluster.yaml b/examples/operator/shardingsphere-storageprovider-aws-rds-cluster.yaml index 2eb0e849..5f48af5c 100644 --- a/examples/operator/shardingsphere-storageprovider-aws-rds-cluster.yaml +++ b/examples/operator/shardingsphere-storageprovider-aws-rds-cluster.yaml @@ -19,6 +19,7 @@ apiVersion: shardingsphere.apache.org/v1alpha1 kind: StorageProvider metadata: name: aws-rds-cluster-mysql-8.0.32 + namespace: default spec: provisioner: storageproviders.shardingsphere.apache.org/aws-rds-cluster reclaimPolicy: Delete diff --git a/examples/operator/shardingsphere-storageprovider-aws-rds-instance.yaml b/examples/operator/shardingsphere-storageprovider-aws-rds-instance.yaml index 135d35e7..9a1882a2 100644 --- a/examples/operator/shardingsphere-storageprovider-aws-rds-instance.yaml +++ b/examples/operator/shardingsphere-storageprovider-aws-rds-instance.yaml @@ -20,6 +20,7 @@ apiVersion: shardingsphere.apache.org/v1alpha1 kind: StorageProvider metadata: name: aws-rds-instance-mysql-5.7 + namespace: default spec: provisioner: storageproviders.shardingsphere.apache.org/aws-rds-instance reclaimPolicy: Delete diff --git a/shardingsphere-operator/api/v1alpha1/storageprovider_types.go b/shardingsphere-operator/api/v1alpha1/storageprovider_types.go index 02cb15fd..9065c892 100644 --- a/shardingsphere-operator/api/v1alpha1/storageprovider_types.go +++ b/shardingsphere-operator/api/v1alpha1/storageprovider_types.go @@ -75,7 +75,7 @@ type StorageProviderStatus struct { //+kubebuilder:object:root=true //+kubebuilder:subresource:status -//+kubebuilder:resource:scope=Cluster,shortName=sp +//+kubebuilder:resource:scope=Namespaced,shortName=sp // StorageProvider is the Schema for the storageproviders API type StorageProvider struct { diff --git a/shardingsphere-operator/config/crd/bases/shardingsphere.apache.org_storageproviders.yaml b/shardingsphere-operator/config/crd/bases/shardingsphere.apache.org_storageproviders.yaml index 21891b8d..e554542a 100644 --- a/shardingsphere-operator/config/crd/bases/shardingsphere.apache.org_storageproviders.yaml +++ b/shardingsphere-operator/config/crd/bases/shardingsphere.apache.org_storageproviders.yaml @@ -15,7 +15,7 @@ spec: shortNames: - sp singular: storageprovider - scope: Cluster + scope: Namespaced versions: - name: v1alpha1 schema: diff --git a/shardingsphere-operator/pkg/controllers/storage_ndoe_controller_test.go b/shardingsphere-operator/pkg/controllers/storage_ndoe_controller_test.go index ce2e4e22..96226810 100644 --- a/shardingsphere-operator/pkg/controllers/storage_ndoe_controller_test.go +++ b/shardingsphere-operator/pkg/controllers/storage_ndoe_controller_test.go @@ -98,7 +98,8 @@ var _ = Describe("StorageNode Controller Mock Test For AWS Rds Instance", func() // create default resource dbClass := &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: defaultTestStorageProvider, + Name: defaultTestStorageProvider, + Namespace: defaultTestNamespace, }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSRDSInstance, @@ -131,7 +132,8 @@ var _ = Describe("StorageNode Controller Mock Test For AWS Rds Instance", func() })).Should(Succeed()) Expect(fakeClient.Delete(ctx, &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: defaultTestStorageProvider, + Name: defaultTestStorageProvider, + Namespace: defaultTestNamespace, }, })).Should(Succeed()) @@ -183,6 +185,45 @@ var _ = Describe("StorageNode Controller Mock Test For AWS Rds Instance", func() }) }) + Context("create storage node with storage provider in another namespace", func() { + It("should fail reconcile because cross-namespace reference is not allowed", func() { + storageProvider := &v1alpha1.StorageProvider{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-storage-provider-cross-namespace", + Namespace: "another-namespace", + }, + Spec: v1alpha1.StorageProviderSpec{ + Provisioner: v1alpha1.ProvisionerAWSRDSInstance, + }, + } + storageNode := &v1alpha1.StorageNode{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-storage-node-3", + Namespace: defaultTestNamespace, + }, + Spec: v1alpha1.StorageNodeSpec{ + StorageProviderName: storageProvider.GetName(), + }, + Status: v1alpha1.StorageNodeStatus{}, + } + + Expect(fakeClient.Create(ctx, storageProvider)).Should(Succeed()) + Expect(fakeClient.Create(ctx, storageNode)).Should(Succeed()) + + req := ctrl.Request{ + NamespacedName: client.ObjectKey{ + Name: storageNode.GetName(), + Namespace: storageNode.GetNamespace(), + }, + } + + _, err := reconciler.Reconcile(ctx, req) + Expect(apierrors.IsNotFound(err)).To(BeTrue()) + Expect(fakeClient.Delete(ctx, storageNode)).Should(Succeed()) + Expect(fakeClient.Delete(ctx, storageProvider)).Should(Succeed()) + }) + }) + Context("reconcile storageNode", func() { It("should reconcile successfully with Creating Instance", func() { req := ctrl.Request{ @@ -640,7 +681,8 @@ var _ = Describe("StorageNode Controller Mock Test For AWS Rds Instance", func() storageProvider := &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: defaultTestStorageProvider, + Name: defaultTestStorageProvider, + Namespace: defaultTestNamespace, }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSRDSInstance, @@ -741,7 +783,8 @@ var _ = Describe("StorageNode Controller Mock Test For AWS Aurora", func() { BeforeEach(func() { provider = &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: "aws-aurora", + Name: "aws-aurora", + Namespace: defaultTestNamespace, }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSAurora, @@ -1191,7 +1234,8 @@ var _ = Describe("StorageNode Controller Mock Test For AWS RDS Cluster", func() BeforeEach(func() { provider = &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: providerName, + Name: providerName, + Namespace: defaultTestNamespace, }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSRDSCluster, diff --git a/shardingsphere-operator/pkg/controllers/storage_node_controller.go b/shardingsphere-operator/pkg/controllers/storage_node_controller.go index c221e87a..bce5c1ef 100644 --- a/shardingsphere-operator/pkg/controllers/storage_node_controller.go +++ b/shardingsphere-operator/pkg/controllers/storage_node_controller.go @@ -76,7 +76,7 @@ type StorageNodeReconciler struct { // +kubebuilder:rbac:groups=shardingsphere.apache.org,resources=storagenodes,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=shardingsphere.apache.org,resources=storagenodes/status,verbs=get;update;patch // +kubebuilder:rbac:groups=shardingsphere.apache.org,resources=storagenodes/finalizers,verbs=update -// +kubebuilder:rbac:groups=shardingsphere.apache.org,resources=storageproviders,verbs=get;list;watch +// +kubebuilder:rbac:groups=shardingsphere.apache.org,resources=storageproviders,verbs=get // +kubebuilder:rbac:groups=postgresql.cnpg.io,resources=clusters,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups="",resources=event,verbs=create;patch @@ -249,9 +249,9 @@ func (r *StorageNodeReconciler) getStorageProvider(ctx context.Context, node *v1 storageProvider = &v1alpha1.StorageProvider{} - if err := r.Get(ctx, client.ObjectKey{Name: node.Spec.StorageProviderName}, storageProvider); err != nil { - r.Log.Error(err, fmt.Sprintf("unable to fetch storageProvider %s", node.Spec.StorageProviderName)) - r.Recorder.Event(node, corev1.EventTypeWarning, "storageProviderNotFound", fmt.Sprintf("storageProvider %s not found", node.Spec.StorageProviderName)) + if err := r.Get(ctx, client.ObjectKey{Name: node.Spec.StorageProviderName, Namespace: node.Namespace}, storageProvider); err != nil { + r.Log.Error(err, fmt.Sprintf("unable to fetch storageProvider %s/%s", node.Namespace, node.Spec.StorageProviderName)) + r.Recorder.Event(node, corev1.EventTypeWarning, "storageProviderNotFound", fmt.Sprintf("storageProvider %s/%s not found", node.Namespace, node.Spec.StorageProviderName)) return nil, err } diff --git a/shardingsphere-operator/pkg/reconcile/storagenode/aws/aurora_test.go b/shardingsphere-operator/pkg/reconcile/storagenode/aws/aurora_test.go index 6a83269a..cd6ed515 100644 --- a/shardingsphere-operator/pkg/reconcile/storagenode/aws/aurora_test.go +++ b/shardingsphere-operator/pkg/reconcile/storagenode/aws/aurora_test.go @@ -146,7 +146,8 @@ var _ = Describe("Test For AWS Aurora Manually", func() { storageProvider := &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-get-aurora-cluster", + Name: "test-get-aurora-cluster", + Namespace: "test-namespace", }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSAurora, diff --git a/shardingsphere-operator/test/e2e/storage_node_controller_test.go b/shardingsphere-operator/test/e2e/storage_node_controller_test.go index 1fac6f8d..ab10d194 100644 --- a/shardingsphere-operator/test/e2e/storage_node_controller_test.go +++ b/shardingsphere-operator/test/e2e/storage_node_controller_test.go @@ -46,7 +46,8 @@ var _ = Describe("StorageNode Controller Suite Test For AWS RDS Instance", func( BeforeEach(func() { StorageProvider := &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: storageProviderName, + Name: storageProviderName, + Namespace: "default", }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSRDSInstance, @@ -66,7 +67,7 @@ var _ = Describe("StorageNode Controller Suite Test For AWS RDS Instance", func( AfterEach(func() { StorageProvider := &v1alpha1.StorageProvider{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Name: storageProviderName}, StorageProvider)).Should(Succeed()) + Expect(k8sClient.Get(ctx, client.ObjectKey{Name: storageProviderName, Namespace: "default"}, StorageProvider)).Should(Succeed()) Expect(k8sClient.Delete(ctx, StorageProvider)).Should(Succeed()) }) @@ -293,7 +294,8 @@ var _ = Describe("StorageNode Controller Suite Test For AWS Aurora Cluster", fun BeforeEach(func() { provider := &v1alpha1.StorageProvider{ ObjectMeta: metav1.ObjectMeta{ - Name: storageProviderName, + Name: storageProviderName, + Namespace: "default", }, Spec: v1alpha1.StorageProviderSpec{ Provisioner: v1alpha1.ProvisionerAWSAurora, @@ -313,7 +315,7 @@ var _ = Describe("StorageNode Controller Suite Test For AWS Aurora Cluster", fun monkey.UnpatchAll() StorageProvider := &v1alpha1.StorageProvider{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Name: storageProviderName}, StorageProvider)).Should(Succeed()) + Expect(k8sClient.Get(ctx, client.ObjectKey{Name: storageProviderName, Namespace: "default"}, StorageProvider)).Should(Succeed()) Expect(k8sClient.Delete(ctx, StorageProvider)).Should(Succeed()) })