Skip to content

Commit c6537d2

Browse files
authored
Migrate to Crossplane v2 and namespaced XRs (#110)
- Update XRD to apiVersion v2 with scope: Namespaced - Rename XSQLInstance/XNetwork to SQLInstance/Network (remove X prefix) - Remove claimNames (not supported for namespaced v2 XRs) - Replace deletionPolicy with managementPolicies array - Move compositionSelector under spec.crossplane - Remove namespace from passwordSecretRef (uses XR namespace) - Switch from CompositeConnectionDetails to corev1.Secret for connection secrets - Update providers from v1 to v2 (provider-azure-* packages) - Update imports from azure to azurem with v1beta1 models - Update upbound.yaml to v2alpha1 with new dependency format - Add k8s apiDependencies for corev1 types - Update configuration-azure-network dependency to v2.0.0 - Update all examples and tests to match new schema
1 parent 53ebb89 commit c6537d2

File tree

12 files changed

+143
-118
lines changed

12 files changed

+143
-118
lines changed

apis/definition.yaml

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
1-
apiVersion: apiextensions.crossplane.io/v1
1+
apiVersion: apiextensions.crossplane.io/v2
22
kind: CompositeResourceDefinition
33
metadata:
4-
name: xsqlinstances.azure.platform.upbound.io
4+
name: sqlinstances.azure.platform.upbound.io
55
spec:
6+
scope: Namespaced
67
group: azure.platform.upbound.io
78
names:
8-
kind: XSQLInstance
9-
plural: xsqlinstances
10-
claimNames:
119
kind: SQLInstance
1210
plural: sqlinstances
13-
connectionSecretKeys:
14-
- username
15-
- password
16-
- port
17-
- host
1811
versions:
1912
- name: v1alpha1
2013
served: true
@@ -26,19 +19,34 @@ spec:
2619
spec:
2720
type: object
2821
properties:
22+
writeConnectionSecretToRef:
23+
type: object
24+
description: Connection secret reference for database credentials
25+
properties:
26+
name:
27+
type: string
28+
description: Name of the connection secret
29+
required:
30+
- name
2931
parameters:
3032
type: object
3133
properties:
3234
region:
3335
type: string
3436
description: Region is the region you'd like your resource to be created in.
35-
deletionPolicy:
36-
description: Delete the external resources when the Claim/XR is deleted. Defaults to Delete
37-
enum:
38-
- Delete
39-
- Orphan
40-
type: string
41-
default: Delete
37+
managementPolicies:
38+
description: ManagementPolicies for Azure Database resources. Defaults to ["*"] which includes all operations (Create, Observe, Update, Delete, LateInitialize). To orphan resources on deletion, use ["Create", "Observe", "Update", "LateInitialize"].
39+
type: array
40+
items:
41+
type: string
42+
enum:
43+
- "*"
44+
- Create
45+
- Observe
46+
- Update
47+
- Delete
48+
- LateInitialize
49+
default: ["*"]
4250
providerConfigName:
4351
description: Crossplane ProviderConfig to use for provisioning this resources
4452
type: string
@@ -53,14 +61,11 @@ spec:
5361
type: object
5462
description: "A reference to the Secret object containing database password"
5563
properties:
56-
namespace:
57-
type: string
5864
name:
5965
type: string
6066
key:
6167
type: string
6268
required:
63-
- namespace
6469
- name
6570
- key
6671
networkRef:

apis/mysql/composition.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
apiVersion: apiextensions.crossplane.io/v1
22
kind: Composition
33
metadata:
4-
name: xmysqlinstances.azure.platform.upbound.io
4+
name: mysqlinstances.azure.platform.upbound.io
55
labels:
66
dbengine: mysql
77
provider: azure
88
spec:
99
compositeTypeRef:
1010
apiVersion: azure.platform.upbound.io/v1alpha1
11-
kind: XSQLInstance
11+
kind: SQLInstance
1212
mode: Pipeline
1313
pipeline:
1414
- functionRef:

apis/postgresql/composition.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
apiVersion: apiextensions.crossplane.io/v1
22
kind: Composition
33
metadata:
4-
name: xpostgresqlinstances.azure.platform.upbound.io
4+
name: postgresqlinstances.azure.platform.upbound.io
55
labels:
66
dbengine: postgres
77
provider: azure
88
spec:
99
compositeTypeRef:
1010
apiVersion: azure.platform.upbound.io/v1alpha1
11-
kind: XSQLInstance
11+
kind: SQLInstance
1212
mode: Pipeline
1313
pipeline:
1414
- functionRef:

examples/mysql-xr.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
apiVersion: azure.platform.upbound.io/v1alpha1
2-
kind: XSQLInstance
2+
kind: SQLInstance
33
metadata:
44
name: configuration-azure-database-db-mysql
55
namespace: default
66
spec:
7-
compositionSelector:
8-
matchLabels:
9-
dbengine: mysql
7+
crossplane:
8+
compositionSelector:
9+
matchLabels:
10+
dbengine: mysql
1011
parameters:
1112
region: westus
1213
storageGB: 20 #Minimum value is 20
1314
version: "8.0"
15+
managementPolicies: ["*"]
1416
passwordSecretRef:
15-
namespace: default
1617
name: psqlsecret
1718
key: password
1819
networkRef:
19-
id: configuration-azure-database #This field must match the XNetwork XR spec.parameters.id
20+
id: configuration-azure-database #This field must match the Network XR spec.parameters.id
2021
writeConnectionSecretToRef:
2122
name: configuration-azure-database-db-conn-mysql
22-
namespace: default

examples/network-xr.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
apiVersion: azure.platform.upbound.io/v1alpha1
2-
kind: XNetwork
2+
kind: Network
33
metadata:
44
name: ref-azure-network
5+
namespace: default
56
spec:
67
parameters:
78
id: configuration-azure-database
89
region: westus
910
addressRange: "10.0.0.0/16"
1011
generalSubnetRange: "10.0.1.0/24"
12+
managementPolicies: ["*"]
13+
providerConfigName: default
1114
databaseSubnets:
1215
- addressRange: "10.0.2.0/24"
1316
serviceType: "postgres"

examples/postgres-xr.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
apiVersion: azure.platform.upbound.io/v1alpha1
2-
kind: XSQLInstance
2+
kind: SQLInstance
33
metadata:
44
name: configuration-azure-database-db-postgresql
55
namespace: default
66
spec:
7-
compositionSelector:
8-
matchLabels:
9-
dbengine: postgres
7+
crossplane:
8+
compositionSelector:
9+
matchLabels:
10+
dbengine: postgres
1011
parameters:
1112
region: westus
1213
storageGB: 32 #Minimum value is 32
1314
version: "11"
15+
managementPolicies: ["*"]
1416
passwordSecretRef:
15-
namespace: default
1617
name: psqlsecret
1718
key: password
1819
networkRef:
19-
id: configuration-azure-database #This field must match the XNetwork XR spec.parameters.id
20+
id: configuration-azure-database #This field must match the Network XR spec.parameters.id
2021
writeConnectionSecretToRef:
2122
name: configuration-azure-database-db-conn-postgresql
22-
namespace: default

functions/mysql/main.k

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import models.io.upbound.azure.dbformysql.v1beta2 as dbformysqlv1beta2
2-
import models.io.upbound.azure.dbformysql.v1beta1 as dbformysqlv1beta1
3-
import models.io.upbound.azure.network.v1beta2 as networkv1beta2
4-
import models.io.upbound.azure.network.v1beta1 as networkv1beta1
1+
import models.io.upbound.azurem.dbformysql.v1beta1 as dbformysqlv1beta1
2+
import models.io.upbound.azurem.network.v1beta1 as networkv1beta1
53
import models.io.upbound.platform.azure.v1alpha1 as platformazurev1alpha1
4+
import models.io.k8s.api.core.v1 as corev1
65

76
import base64
87

98
schema DefaultSpec:
10-
deletionPolicy: str
9+
managementPolicies: [str]
1110
providerConfigRef: {str:str}
1211
forProvider: {str:str}
1312

14-
oxr = platformazurev1alpha1.XSQLInstance {**option("params").oxr}
13+
oxr = platformazurev1alpha1.SQLInstance {**option("params").oxr}
1514
ocds = option("params").ocds # observed composed resources
1615

1716
_metadata = lambda name: str -> any {
@@ -22,8 +21,9 @@ _metadata = lambda name: str -> any {
2221

2322
# spec defaults
2423
_defaultSpec = DefaultSpec {
25-
deletionPolicy = oxr.spec.parameters.deletionPolicy or "Delete"
24+
managementPolicies = oxr.spec.parameters.managementPolicies or ["*"]
2625
providerConfigRef = {
26+
kind = "ProviderConfig"
2727
name = oxr.spec.parameters.providerConfigName or "default"
2828
}
2929
forProvider = {}
@@ -32,7 +32,7 @@ _defaultSpec = DefaultSpec {
3232
assert 20 <= oxr.spec.parameters.storageGB <= 16384, "storageGB supported values for MySQL FlexibleServer are between 20 and 16384"
3333

3434
_items = [
35-
networkv1beta2.PrivateDNSZone {
35+
networkv1beta1.PrivateDNSZone {
3636
metadata = {
3737
**_metadata("privatednszone")
3838
name = "{}-mysql".format(oxr.spec.parameters.networkRef.id)
@@ -80,7 +80,7 @@ _items = [
8080
}
8181
}
8282
}
83-
dbformysqlv1beta2.FlexibleServer {
83+
dbformysqlv1beta1.FlexibleServer {
8484
metadata = {
8585
**_metadata("mysqlserver")
8686
name = "{}-mysql".format(oxr.spec.parameters.networkRef.id)
@@ -94,7 +94,6 @@ _items = [
9494
administratorPasswordSecretRef = {
9595
key = oxr.spec.parameters.passwordSecretRef.key
9696
name = oxr.spec.parameters.passwordSecretRef.name
97-
namespace = oxr.spec.parameters.passwordSecretRef.namespace
9897
}
9998
backupRetentionDays = 7
10099
storage.sizeGb = oxr.spec.parameters.storageGB
@@ -116,7 +115,6 @@ _items = [
116115
}
117116
}
118117
writeConnectionSecretToRef = {
119-
namespace = oxr.spec.writeConnectionSecretToRef.namespace
120118
name = "{}-mysql".format(oxr.metadata.uid)
121119
}
122120
}
@@ -143,17 +141,23 @@ _items = [
143141
}
144142
}
145143
}
146-
{
147-
apiVersion: "meta.krm.kcl.dev/v1alpha1"
148-
kind: "CompositeConnectionDetails"
144+
corev1.Secret {
145+
metadata = {
146+
name = oxr.spec?.writeConnectionSecretToRef?.name
147+
namespace = oxr.metadata.namespace
148+
annotations = {
149+
"krm.kcl.dev/composition-resource-name" = "connection-secret"
150+
if "mysqlserver" in ocds:
151+
"krm.kcl.dev/ready" = "True"
152+
}
153+
}
149154
if "mysqlserver" in ocds:
150-
data: {
155+
data = {
151156
username = base64.encode(ocds["mysqlserver"].Resource?.spec?.forProvider?.administratorLogin)
152157
password = ocds["mysqlserver"].ConnectionDetails["attribute.administrator_password"]
153158
host = base64.encode(ocds["mysqlserver"].Resource?.status?.atProvider?.fqdn)
159+
port = base64.encode("3306")
154160
}
155-
else:
156-
data: {}
157161
}
158162
]
159163

functions/postgres/main.k

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import models.io.upbound.azure.dbforpostgresql.v1beta2 as dbforpostgresqlv1beta2
2-
import models.io.upbound.azure.dbforpostgresql.v1beta1 as dbforpostgresqlv1beta1
3-
import models.io.upbound.azure.network.v1beta2 as networkv1beta2
4-
import models.io.upbound.azure.network.v1beta1 as networkv1beta1
1+
import models.io.upbound.azurem.dbforpostgresql.v1beta1 as dbforpostgresqlv1beta1
2+
import models.io.upbound.azurem.network.v1beta1 as networkv1beta1
3+
import models.io.k8s.api.core.v1 as corev1
54

65
import base64
76

87
oxr = option("params").oxr # observed composite resource
98
ocds = option("params").ocds # observed composed resources
109

1110
schema DefaultSpec:
12-
deletionPolicy: str
11+
managementPolicies: [str]
1312
providerConfigRef: {str:str}
1413
forProvider: {str:str}
1514

@@ -19,8 +18,9 @@ _metadata = lambda name: str -> any {
1918

2019
# spec defaults
2120
_defaultSpec = DefaultSpec {
22-
deletionPolicy = oxr.spec.parameters.deletionPolicy or "Delete"
21+
managementPolicies = oxr.spec.parameters.managementPolicies or ["*"]
2322
providerConfigRef = {
23+
kind = "ProviderConfig"
2424
name = oxr.spec.parameters.providerConfigName or "default"
2525
}
2626
forProvider = {}
@@ -29,7 +29,7 @@ _defaultSpec = DefaultSpec {
2929
assert oxr.spec.parameters.storageGB in [32,64,128,256,512,1024,2048], "storageGB supported values are 32,64,128,256,512,1024,2048"
3030

3131
_items = [
32-
networkv1beta2.PrivateDNSZone {
32+
networkv1beta1.PrivateDNSZone {
3333
metadata = {
3434
**_metadata("privatednszone")
3535
name = "{}-postgresql".format(oxr.spec.parameters.networkRef.id)
@@ -77,7 +77,7 @@ _items = [
7777
}
7878
}
7979
}
80-
dbforpostgresqlv1beta2.FlexibleServer {
80+
dbforpostgresqlv1beta1.FlexibleServer {
8181
metadata = {
8282
**_metadata("postgresqlserver")
8383
name = "{}-postgresql".format(oxr.spec.parameters.networkRef.id)
@@ -92,7 +92,6 @@ _items = [
9292
administratorPasswordSecretRef= {
9393
key = oxr.spec.parameters.passwordSecretRef.key
9494
name = oxr.spec.parameters.passwordSecretRef.name
95-
namespace = oxr.spec.parameters.passwordSecretRef.namespace
9695
}
9796
resourceGroupNameSelector = {
9897
matchLabels = {
@@ -115,7 +114,6 @@ _items = [
115114
}
116115
}
117116
writeConnectionSecretToRef = {
118-
namespace = oxr.spec.writeConnectionSecretToRef.namespace
119117
name = "{}-postgresql".format(oxr.metadata.uid)
120118
}
121119
}
@@ -126,6 +124,7 @@ _items = [
126124
name = "upbound"
127125
}
128126
spec = {
127+
**_defaultSpec
129128
forProvider = {
130129
charset = "utf8"
131130
collation = "en_US.utf8"
@@ -135,17 +134,23 @@ _items = [
135134
}
136135
}
137136
}
138-
{
139-
apiVersion: "meta.krm.kcl.dev/v1alpha1"
140-
kind: "CompositeConnectionDetails"
137+
corev1.Secret {
138+
metadata = {
139+
name = oxr.spec?.writeConnectionSecretToRef?.name
140+
namespace = oxr.metadata.namespace
141+
annotations = {
142+
"krm.kcl.dev/composition-resource-name" = "connection-secret"
143+
if "postgresqlserver" in ocds:
144+
"krm.kcl.dev/ready" = "True"
145+
}
146+
}
141147
if "postgresqlserver" in ocds:
142-
data: {
148+
data = {
143149
username = base64.encode(ocds["postgresqlserver"].Resource?.spec?.forProvider?.administratorLogin)
144150
password = ocds["postgresqlserver"].ConnectionDetails["attribute.administrator_password"]
145151
host = base64.encode(ocds["postgresqlserver"].Resource?.status?.atProvider?.fqdn)
152+
port = base64.encode("5432")
146153
}
147-
else:
148-
data: {}
149154
}
150155
]
151156

0 commit comments

Comments
 (0)