diff --git a/api/v1alpha1/databaserequest_types.go b/api/v1alpha1/databaserequest_types.go index 44e27cd..11f4189 100644 --- a/api/v1alpha1/databaserequest_types.go +++ b/api/v1alpha1/databaserequest_types.go @@ -60,10 +60,7 @@ type DatabaseRequestSpec struct { //+kubebuilder:required //+kubebuilder:validation:Required - //+kubebuilder:validation:Enum=production;development;custom - //+kubebuilder:default:=development - // Scope is the scope of the database request - // it can be either "production" or "development" or "custom" + // Scope is the scope of the database request, this is used to select a provider from a pool of scopes Scope string `json:"scope"` //+kubebuilder:required diff --git a/api/v1alpha1/mongodbprovider_types.go b/api/v1alpha1/mongodbprovider_types.go index 540553b..b07805f 100644 --- a/api/v1alpha1/mongodbprovider_types.go +++ b/api/v1alpha1/mongodbprovider_types.go @@ -89,10 +89,7 @@ type MongoDBConnection struct { type MongoDBProviderSpec struct { //+kubebuilder:required //+kubebuilder:validation:Required - //+kubebuilder:validation:Enum=production;development;custom - //+kubebuilder:default:=development - // Scope is the scope of the database request - // it can be either "production" or "development" or "custom" + // Scope is the scope of the database request, this is used to select a provider from a pool of scopes Scope string `json:"scope"` //+kubebuilder:validation:MinItems=1 diff --git a/api/v1alpha1/relationaldatabaseprovider_types.go b/api/v1alpha1/relationaldatabaseprovider_types.go index f26c235..d856578 100644 --- a/api/v1alpha1/relationaldatabaseprovider_types.go +++ b/api/v1alpha1/relationaldatabaseprovider_types.go @@ -71,10 +71,7 @@ type RelationalDatabaseProviderSpec struct { //+kubebuilder:required //+kubebuilder:validation:Required - //+kubebuilder:validation:Enum=production;development;custom - //+kubebuilder:default:=development - // Scope is the scope of the database request - // it can be either "production" or "development" or "custom" + // Scope is the scope of the database request, this is used to select a provider from a pool of scopes Scope string `json:"scope"` //+kubebuilder:validation:MinItems=1 diff --git a/config/crd/bases/crd.lagoon.sh_databaserequests.yaml b/config/crd/bases/crd.lagoon.sh_databaserequests.yaml index de5711e..2e2cde5 100644 --- a/config/crd/bases/crd.lagoon.sh_databaserequests.yaml +++ b/config/crd/bases/crd.lagoon.sh_databaserequests.yaml @@ -139,14 +139,8 @@ spec: for example mariadb-0 type: string scope: - default: development - description: |- - Scope is the scope of the database request - it can be either "production" or "development" or "custom" - enum: - - production - - development - - custom + description: Scope is the scope of the database request, this is used + to select a provider from a pool of scopes type: string seed: description: |- diff --git a/config/crd/bases/crd.lagoon.sh_mongodbdproviders.yaml b/config/crd/bases/crd.lagoon.sh_mongodbdproviders.yaml deleted file mode 100644 index aae00c2..0000000 --- a/config/crd/bases/crd.lagoon.sh_mongodbdproviders.yaml +++ /dev/null @@ -1,261 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.14.0 - name: mongodbproviders.crd.lagoon.sh -spec: - group: crd.lagoon.sh - names: - kind: MongoDBProvider - listKind: MongoDBProviderList - plural: mongodbproviders - singular: mongodbprovider - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: MongoDBProvider is the Schema for the mongodbproviders API - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: MongoDBProviderSpec defines the desired state of MongoDBProvider - properties: - connections: - description: Connections defines the connection to a relational database - items: - properties: - auth: - description: Auth is the authentication mechanism for the MongoDB - connection - properties: - mechanism: - description: |- - Mechanism is the authentication mechanism for the MongoDB connection - https://www.mongodb.com/docs/drivers/go/current/fundamentals/auth/#std-label-golang-authentication-mechanisms - enum: - - SCRAM-SHA-1 - - SCRAM-SHA-256 - - MONGODB-CR - - MongoDB-AWS - - X509 - type: string - source: - description: Source is the source of the authentication - mechanism for the MongoDB connection - type: string - tls: - description: TLS is the flag to enable or disable TLS for - the MongoDB connection - type: boolean - required: - - mechanism - type: object - enabled: - default: true - description: Enabled is a flag to enable or disable the relational - database - type: boolean - hostname: - description: Hostname is the hostname of the relational database - type: string - name: - description: |- - Name is the name of the MongoDB connection - it is used to identify the connection. Please use a unique name - for each connection. This field will be used in the MongoDBProvider - to reference the connection. The MongoDBProvider controller will - error if the name is not unique. - type: string - passwordSecretRef: - description: PasswordSecretRef is the reference to the secret - containing the password - properties: - name: - description: name is unique within a namespace to reference - a secret resource. - type: string - namespace: - description: namespace defines the space within which the - secret name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - port: - default: 27017 - description: Port is the port of the relational database - maximum: 65535 - minimum: 1 - type: integer - replicaHostnames: - description: ReplicaHostnames is the list of hostnames of the - relational database replicas - items: - type: string - type: array - username: - default: root - description: Username is the username of the relational database - type: string - required: - - auth - - hostname - - name - - passwordSecretRef - type: object - minItems: 1 - type: array - scope: - default: development - description: |- - Scope is the scope of the database request - it can be either "production" or "development" or "custom" - enum: - - production - - development - - custom - type: string - required: - - connections - - scope - type: object - status: - description: MongoDBProviderStatus defines the observed state of MongoDBProvider - properties: - conditions: - description: Conditions defines the status conditions - items: - description: "Condition contains details for one aspect of the current - state of this API Resource.\n---\nThis struct is intended for - direct use as an array at the field path .status.conditions. For - example,\n\n\n\ttype FooStatus struct{\n\t // Represents the - observations of a foo's current state.\n\t // Known .status.conditions.type - are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // - +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t - \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t - \ // other fields\n\t}" - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: |- - type of condition in CamelCase or in foo.example.com/CamelCase. - --- - Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be - useful (see .node.status.conditions), the ability to deconflict is important. - The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - connectionStatus: - description: ConnectionStatus provides the status of the relational - database - items: - description: ConnectionStatus defines the status of a database - connection, it can be either relational database or mongodb - properties: - databaseVersion: - description: DatabaseVersion is the version of the database - type: string - enabled: - description: Enabled is a flag to indicate whether a database - is enabled or not - type: boolean - hostname: - description: Hostname is the hostname of the database - type: string - name: - description: |- - Name is the name of the database connection - it is used to identify the connection. Please use a unique name - for each connection. This field will be used in the DatabaseRequest - to reference the connection. The relationaldatabaseprovider and mongodbprovider - controllers will error if the name is not unique. - type: string - status: - description: Status is the status of the database - enum: - - available - - unavailable - type: string - required: - - databaseVersion - - enabled - - hostname - - name - - status - type: object - type: array - observedGeneration: - description: ObservedGeneration is the last observed generation - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/config/crd/bases/crd.lagoon.sh_mongodbproviders.yaml b/config/crd/bases/crd.lagoon.sh_mongodbproviders.yaml index aae00c2..d8984d7 100644 --- a/config/crd/bases/crd.lagoon.sh_mongodbproviders.yaml +++ b/config/crd/bases/crd.lagoon.sh_mongodbproviders.yaml @@ -124,14 +124,8 @@ spec: minItems: 1 type: array scope: - default: development - description: |- - Scope is the scope of the database request - it can be either "production" or "development" or "custom" - enum: - - production - - development - - custom + description: Scope is the scope of the database request, this is used + to select a provider from a pool of scopes type: string required: - connections diff --git a/config/crd/bases/crd.lagoon.sh_relationaldatabaseproviders.yaml b/config/crd/bases/crd.lagoon.sh_relationaldatabaseproviders.yaml index f431cb4..d8140b4 100644 --- a/config/crd/bases/crd.lagoon.sh_relationaldatabaseproviders.yaml +++ b/config/crd/bases/crd.lagoon.sh_relationaldatabaseproviders.yaml @@ -101,14 +101,8 @@ spec: minItems: 1 type: array scope: - default: development - description: |- - Scope is the scope of the database request - it can be either "production" or "development" or "custom" - enum: - - production - - development - - custom + description: Scope is the scope of the database request, this is used + to select a provider from a pool of scopes type: string type: description: |- diff --git a/config/samples/crd_v1alpha1_databaserequest_mysql-scope.yaml b/config/samples/crd_v1alpha1_databaserequest_mysql-scope.yaml new file mode 100644 index 0000000..e460a1b --- /dev/null +++ b/config/samples/crd_v1alpha1_databaserequest_mysql-scope.yaml @@ -0,0 +1,14 @@ +apiVersion: crd.lagoon.sh/v1alpha1 +kind: DatabaseRequest +metadata: + labels: + app.kubernetes.io/name: databaserequest + app.kubernetes.io/instance: databaserequest-mysql-scope-sample + app.kubernetes.io/part-of: dbaas-controller + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/created-by: dbaas-controller + name: databaserequest-mysql-scope-sample +spec: + name: first-mysql-scope-db + scope: vip-development + type: mysql \ No newline at end of file diff --git a/config/samples/crd_v1alpha1_relationaldatabaseprovider_mysql-scope.yaml b/config/samples/crd_v1alpha1_relationaldatabaseprovider_mysql-scope.yaml new file mode 100644 index 0000000..a305038 --- /dev/null +++ b/config/samples/crd_v1alpha1_relationaldatabaseprovider_mysql-scope.yaml @@ -0,0 +1,19 @@ +apiVersion: crd.lagoon.sh/v1alpha1 +kind: RelationalDatabaseProvider +metadata: + labels: + app.kubernetes.io/name: dbaas-controller + app.kubernetes.io/managed-by: kustomize + name: relationaldatabaseprovider-mysql-scope-sample +spec: + type: mysql + scope: vip-development + connections: + - name: primary-test-mysql-connection + hostname: mysql-service.mysql + passwordSecretRef: + name: mysql-secret + namespace: mysql + port: 3306 + username: root + enabled: true diff --git a/config/samples/crd_v1alpha1_seed_databaserequest.yaml b/config/samples/crd_v1alpha1_seed_databaserequest.yaml deleted file mode 100644 index 4270189..0000000 --- a/config/samples/crd_v1alpha1_seed_databaserequest.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: crd.lagoon.sh/v1alpha1 -kind: DatabaseRequest -metadata: - labels: - app.kubernetes.io/name: seed-databaserequest - app.kubernetes.io/instance: seed-databaserequest-sample - app.kubernetes.io/part-of: dbaas-controller - app.kubernetes.io/managed-by: kustomize - app.kubernetes.io/created-by: dbaas-controller - name: seed-databaserequest-sample -spec: - seed: - name: mysql-seed-secret - namespace: default - name: seed-mysql-db - scope: development - type: mysql \ No newline at end of file diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 402e392..37b6751 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -60,7 +60,7 @@ var _ = Describe("controller", Ordered, func() { utils.UninstallCertManager() By("removing the RelationalDatabaseProvider resource") - for _, name := range []string{"mysql", "postgres", "mongodb"} { + for _, name := range []string{"mysql", "mysql-scope", "postgres", "mongodb"} { cmd := exec.Command( "kubectl", "patch", @@ -77,7 +77,7 @@ var _ = Describe("controller", Ordered, func() { _, _ = utils.Run(cmd) } By("removing the DatabaseRequest resource") - for _, name := range []string{"mysql", "postgres", "seed"} { + for _, name := range []string{"mysql", "mysql-scope", "postgres", "seed"} { cmd := exec.Command( "kubectl", "patch", @@ -104,7 +104,7 @@ var _ = Describe("controller", Ordered, func() { utils.UninstallMongoDB() By("removing service and secret") - for _, name := range []string{"mysql", "postgres", "mongodb"} { + for _, name := range []string{"mysql", "mysql-scope", "postgres", "mongodb"} { cmd = exec.Command( "kubectl", "delete", "service", "-n", "default", "-l", "app.kubernetes.io/instance=databaserequest-"+name+"-sample") _, _ = utils.Run(cmd) @@ -178,7 +178,7 @@ var _ = Describe("controller", Ordered, func() { EventuallyWithOffset(1, verifyControllerUp, time.Minute, time.Second).Should(Succeed()) By("validating that all database providers and database requests are working") - for _, name := range []string{"mysql", "postgres", "seed"} { + for _, name := range []string{"mysql", "mysql-scope", "postgres", "seed"} { if name != "seed" { By("creating a RelationalDatabaseProvider resource") cmd = exec.Command( @@ -221,6 +221,7 @@ var _ = Describe("controller", Ordered, func() { By("creating a DatabaseRequest resource") cmd = exec.Command( "kubectl", + "-n", "default", "apply", "-f", fmt.Sprintf("config/samples/crd_v1alpha1_databaserequest_%s.yaml", name), @@ -231,6 +232,7 @@ var _ = Describe("controller", Ordered, func() { By("validating that the DatabaseRequest resource is created") cmd = exec.Command( "kubectl", + "-n", "default", "wait", "--for=condition=Ready", "databaserequest", @@ -279,6 +281,7 @@ var _ = Describe("controller", Ordered, func() { By("deleting the DatabaseRequest resource the database is getting deprovisioned") cmd = exec.Command( "kubectl", + "-n", "default", "delete", "databaserequest", fmt.Sprintf("databaserequest-%s-sample", name), @@ -325,6 +328,7 @@ var _ = Describe("controller", Ordered, func() { dbrName := strings.ReplaceAll(name, "-", "_") cmd = exec.Command( "kubectl", + "-n", "default", "apply", "-f", fmt.Sprintf("test/e2e/testdata/crd_v1alpha1_%s_databaserequest.yaml", dbrName), @@ -335,6 +339,7 @@ var _ = Describe("controller", Ordered, func() { By("validating that the DatabaseRequest resource is created but fails") cmd = exec.Command( "kubectl", + "-n", "default", "get", "databaserequest", fmt.Sprintf("%s-databaserequest-sample", name), @@ -389,6 +394,7 @@ var _ = Describe("controller", Ordered, func() { By("deleting the DatabaseRequest resource the database is getting deprovisioned") cmd = exec.Command( "kubectl", + "-n", "default", "delete", "databaserequest", fmt.Sprintf("%s-databaserequest-sample", name),