Skip to content

Commit 91e49b1

Browse files
committed
Add cluster-instances to configured resources
1 parent 7af668a commit 91e49b1

File tree

7 files changed

+189
-3
lines changed

7 files changed

+189
-3
lines changed

examples/clusters/development/crossplane-resources.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ spec:
2828
function:
2929
packages:
3030
- "xpkg.crossplane.io/crossplane-contrib/function-patch-and-transform:v0.8.2"
31-
- "ghcr.io/amazeeio/amazeeai-k0rdent-catalog/vectordb-function:v0.0.18-crossplane"
31+
- "ghcr.io/amazeeio/amazeeai-k0rdent-catalog/vectordb-function:v0.0.19-crossplane"
3232
provider:
3333
packages:
3434
- "xpkg.crossplane.io/crossplane-contrib/provider-family-aws:v1.23.0" # top level provider for credential management

examples/resources/development/aws-vector-db-comp.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ spec:
7373
type: string
7474
default: "vectordb"
7575
description: "Name of the cluster"
76+
instanceCount:
77+
type: integer
78+
default: 2
79+
description: "Number of instances"
80+
instanceClass:
81+
type: string
82+
default: "db.serverless"
83+
description: "Instance class"
84+
publiclyAccessible:
85+
type: boolean
86+
default: true
87+
description: "Enable public access"
7688
required:
7789
- location
7890
served: true

examples/resources/development/vector-db-ir1.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ spec:
1919
backupWindow: "06:42-07:12"
2020
maintenanceWindow: "wed:04:35-wed:05:05"
2121
deletionProtection: true
22+
instanceCount: 1
23+
instanceClass: "db.serverless"
24+
publiclyAccessible: true

functions/vectordb/function/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@
1515
"""The version of the function."""
1616

1717
# This is set at build time, using "hatch version"
18-
__version__ = "0.0.19"
18+
__version__ = "0.0.20"

functions/vectordb/function/fn.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ class VectorDBConfig:
4545
deletion_protection: bool = False
4646
namespace: str = "default"
4747
provider_config_ref: str = "default"
48+
instance_count: int = 2
49+
instance_class: str = "db.serverless"
50+
publicly_accessible: bool = True
4851

4952

5053
class VectorDBFunctionRunner(grpcv1.FunctionRunnerService):
@@ -120,6 +123,11 @@ async def RunFunction(
120123
aurora_resource = self._create_aurora_cluster(config)
121124
resources.append(("aurora_cluster", aurora_resource))
122125

126+
# 10. Create Aurora instances (depend on cluster, subnet group, and security group)
127+
aurora_instance_resources = self._create_aurora_instances(config)
128+
for i, instance in enumerate(aurora_instance_resources):
129+
resources.append((f"aurora_instance_{i + 1}", instance))
130+
123131
# Add all resources to response
124132
for name, res in resources:
125133
resource.update(response_obj.desired.resources[name], res)
@@ -632,6 +640,63 @@ def _create_aurora_cluster(self, config: VectorDBConfig) -> dict:
632640
},
633641
}
634642

643+
def _create_aurora_instances(self, config: VectorDBConfig) -> list[dict]:
644+
"""Create Aurora PostgreSQL cluster instances."""
645+
instances = []
646+
for i in range(config.instance_count):
647+
instance_name = f"{config.postgres_cluster_name}-instance-{i + 1}"
648+
instance = {
649+
"apiVersion": "rds.aws.upbound.io/v1beta1",
650+
"kind": "ClusterInstance",
651+
"spec": {
652+
"forProvider": {
653+
"region": config.region,
654+
"engine": "aurora-postgresql",
655+
"engineVersion": config.engine_version,
656+
"instanceClass": config.instance_class,
657+
"publiclyAccessible": config.publicly_accessible,
658+
"clusterIdentifierRef": {
659+
"name": config.postgres_cluster_name,
660+
},
661+
"dbSubnetGroupNameRef": {
662+
"name": f"{config.claim_name}-subnet-group-{config.environment_suffix}",
663+
},
664+
"performanceInsightsEnabled": True,
665+
"performanceInsightsRetentionPeriod": 7,
666+
"dbParameterGroupName": "default.aurora-postgresql16",
667+
"autoMinorVersionUpgrade": True,
668+
"monitoringInterval": 60,
669+
"promotionTier": i,
670+
"tags": {
671+
"Name": (
672+
f"{config.claim_name}-instance-{i + 1}-{config.environment_suffix}"
673+
),
674+
"App": config.claim_name,
675+
"Environment": config.environment_suffix,
676+
},
677+
},
678+
"providerConfigRef": {
679+
"name": config.provider_config_ref,
680+
},
681+
"writeConnectionSecretToRef": {
682+
"name": f"{config.claim_name}-instance-{i + 1}-{config.environment_suffix}",
683+
"namespace": config.namespace,
684+
},
685+
},
686+
"metadata": {
687+
"name": instance_name,
688+
"labels": {
689+
"app": config.claim_name,
690+
"environment": config.environment_suffix,
691+
},
692+
"annotations": {
693+
"crossplane.io/depends-on": "aurora_cluster,subnet_group,security_group",
694+
},
695+
},
696+
}
697+
instances.append(instance)
698+
return instances
699+
635700

636701
# Keep the original FunctionRunner for backward compatibility
637702
class FunctionRunner(VectorDBFunctionRunner):

functions/vectordb/package/input/input.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ spec:
6161
clusterName:
6262
type: string
6363
description: "Name of the cluster"
64+
instanceCount:
65+
type: integer
66+
description: "Number of instances"
67+
instanceClass:
68+
type: string
69+
description: "Instance class"
70+
publiclyAccessible:
71+
type: boolean
72+
description: "Enable public access"
6473
required:
6574
- location
6675
- providerConfigRef

functions/vectordb/tests/test_fn.py

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ def test_config_creation(self):
2929
self.assertEqual(config.environment_suffix, "dev")
3030
self.assertEqual(config.master_username, "postgres")
3131
self.assertEqual(config.postgres_cluster_name, "vectordb-cluster")
32-
self.assertEqual(config.az_count, 3) # Default value
32+
self.assertEqual(config.az_count, 3)
33+
self.assertEqual(config.instance_count, 2)
34+
self.assertEqual(config.instance_class, "db.serverless")
35+
self.assertTrue(config.publicly_accessible) # Default value
3336
self.assertEqual(config.engine_version, "16.1") # Default value
3437

3538

@@ -304,6 +307,100 @@ def test_create_aurora_cluster(self):
304307

305308
# Connection details have been removed as they are not required
306309

310+
def test_create_aurora_instances(self):
311+
"""Test Aurora cluster instances creation."""
312+
# Given: Configuration
313+
config = fn.VectorDBConfig(
314+
claim_name="test-claim",
315+
vpc_cidr="10.10.0.0/16",
316+
region="us-west-2",
317+
environment_suffix="dev",
318+
master_username="postgres",
319+
postgres_cluster_name="vectordb-cluster",
320+
instance_count=2,
321+
instance_class="db.serverless",
322+
publicly_accessible=True,
323+
)
324+
runner = fn.VectorDBFunctionRunner()
325+
326+
# When: Creating Aurora instances
327+
aurora_instance_resources = runner._create_aurora_instances(config)
328+
329+
# Then: Should create the correct number of instances
330+
self.assertEqual(len(aurora_instance_resources), 2)
331+
332+
# Check first instance
333+
instance1 = aurora_instance_resources[0]
334+
self.assertEqual(instance1["apiVersion"], "rds.aws.upbound.io/v1beta1")
335+
self.assertEqual(instance1["kind"], "ClusterInstance")
336+
self.assertEqual(instance1["metadata"]["name"], "vectordb-cluster-instance-1")
337+
self.assertEqual(instance1["spec"]["forProvider"]["engine"], "aurora-postgresql")
338+
self.assertEqual(instance1["spec"]["forProvider"]["engineVersion"], "16.1")
339+
self.assertEqual(instance1["spec"]["forProvider"]["instanceClass"], "db.serverless")
340+
self.assertTrue(instance1["spec"]["forProvider"]["publiclyAccessible"])
341+
self.assertEqual(instance1["spec"]["forProvider"]["promotionTier"], 0)
342+
self.assertEqual(
343+
instance1["spec"]["forProvider"]["clusterIdentifierRef"]["name"], "vectordb-cluster"
344+
)
345+
self.assertEqual(
346+
instance1["spec"]["forProvider"]["dbSubnetGroupNameRef"]["name"],
347+
"test-claim-subnet-group-dev",
348+
)
349+
self.assertTrue(instance1["spec"]["forProvider"]["performanceInsightsEnabled"])
350+
self.assertEqual(instance1["spec"]["forProvider"]["performanceInsightsRetentionPeriod"], 7)
351+
self.assertEqual(
352+
instance1["spec"]["forProvider"]["dbParameterGroupName"], "default.aurora-postgresql16"
353+
)
354+
self.assertTrue(instance1["spec"]["forProvider"]["autoMinorVersionUpgrade"])
355+
self.assertEqual(instance1["spec"]["forProvider"]["monitoringInterval"], 60)
356+
357+
# Check second instance
358+
instance2 = aurora_instance_resources[1]
359+
self.assertEqual(instance2["metadata"]["name"], "vectordb-cluster-instance-2")
360+
self.assertEqual(instance2["spec"]["forProvider"]["promotionTier"], 1)
361+
self.assertEqual(
362+
instance2["spec"]["forProvider"]["clusterIdentifierRef"]["name"], "vectordb-cluster"
363+
)
364+
365+
# Check metadata and dependencies
366+
for instance in aurora_instance_resources:
367+
self.assertEqual(instance["metadata"]["labels"]["app"], "test-claim")
368+
self.assertEqual(instance["metadata"]["labels"]["environment"], "dev")
369+
self.assertIn("crossplane.io/depends-on", instance["metadata"]["annotations"])
370+
self.assertIn(
371+
"aurora_cluster",
372+
instance["metadata"]["annotations"]["crossplane.io/depends-on"],
373+
)
374+
375+
def test_create_aurora_instances_custom_config(self):
376+
"""Test Aurora cluster instances creation with custom configuration."""
377+
# Given: Configuration with custom instance settings
378+
config = fn.VectorDBConfig(
379+
claim_name="test-claim",
380+
vpc_cidr="10.10.0.0/16",
381+
region="us-west-2",
382+
environment_suffix="prod",
383+
master_username="postgres",
384+
postgres_cluster_name="vectordb-cluster",
385+
instance_count=3,
386+
instance_class="db.r6g.large",
387+
publicly_accessible=False,
388+
)
389+
runner = fn.VectorDBFunctionRunner()
390+
391+
# When: Creating Aurora instances
392+
aurora_instance_resources = runner._create_aurora_instances(config)
393+
394+
# Then: Should create the correct number of instances with custom settings
395+
self.assertEqual(len(aurora_instance_resources), 3)
396+
397+
# Check custom settings are applied
398+
for i, instance in enumerate(aurora_instance_resources):
399+
self.assertEqual(instance["spec"]["forProvider"]["instanceClass"], "db.r6g.large")
400+
self.assertFalse(instance["spec"]["forProvider"]["publiclyAccessible"])
401+
self.assertEqual(instance["spec"]["forProvider"]["promotionTier"], i)
402+
self.assertEqual(instance["metadata"]["name"], f"vectordb-cluster-instance-{i + 1}")
403+
307404
def test_extract_config(self):
308405
"""Test configuration extraction from request."""
309406
# Given: Request with configuration

0 commit comments

Comments
 (0)