Skip to content

Commit 1eb0b7c

Browse files
fix: add count condition and replica resource
1 parent 622ee61 commit 1eb0b7c

File tree

10 files changed

+370
-12
lines changed

10 files changed

+370
-12
lines changed

.github/dependabot.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,16 @@ updates:
106106
- "approvers"
107107
# Allow up to 3 open pull requests for pip dependencies
108108
open-pull-requests-limit: 3
109+
110+
- package-ecosystem: "terraform" # See documentation for possible values
111+
directory: "/_examples/replica-db" # Location of package manifests
112+
schedule:
113+
interval: "weekly"
114+
# Add assignees
115+
assignees:
116+
- "clouddrove-ci"
117+
# Add reviewer
118+
reviewers:
119+
- "approvers"
120+
# Allow up to 3 open pull requests for pip dependencies
121+
open-pull-requests-limit: 3

.github/workflows/tf-checks.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,7 @@ jobs:
2929
uses: clouddrove/github-shared-workflows/.github/workflows/tf-checks.yml@master
3030
with:
3131
working_directory: './_examples/redis/'
32+
tf-checks-replica-db-example:
33+
uses: clouddrove/github-shared-workflows/.github/workflows/tf-checks.yml@master
34+
with:
35+
working_directory: './_examples/replica-db/'

README.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,42 @@ usage : |-
242242
]
243243
}
244244
```
245+
## database replica example
246+
```hcl
247+
module "redis" {
248+
source = "terraform-do-modules/database/digitalocean"
249+
version = "1.0.0"
250+
name = "app"
251+
environment = "test"
252+
region = "blr1"
253+
cluster_engine = "mysql"
254+
cluster_version = "8"
255+
cluster_size = "db-s-1vcpu-1gb"
256+
cluster_node_count = 1
257+
cluster_private_network_uuid = module.vpc.id
258+
mysql_sql_mode = "ANSI,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_ALL_TABLES,ALLOW_INVALID_DATES"
259+
cluster_maintenance = {
260+
maintenance_hour = "02:00:00"
261+
maintenance_day = "saturday"
262+
}
263+
databases = ["testdb", "testdbt"]
264+
265+
users = [
266+
{
267+
name = "test1",
268+
mysql_auth_plugin = "mysql_native_password"
269+
}
270+
]
271+
272+
## database replica
273+
replica_enable = true
274+
275+
create_firewall = false
276+
firewall_rules = [
277+
{
278+
type = "ip_addr"
279+
value = "0.0.0.0"
280+
}
281+
]
282+
}
283+
```

_examples/mysql/main.tf

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,10 @@ module "mysql" {
3636
maintenance_hour = "02:00:00"
3737
maintenance_day = "saturday"
3838
}
39-
databases = ["testdb"]
40-
39+
databases = ["testdb", "testdbt"]
4140
users = [
4241
{
43-
name = "test",
42+
name = "test1",
4443
mysql_auth_plugin = "mysql_native_password"
4544
}
4645
]

_examples/replica-db/main.tf

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
provider "digitalocean" {}
2+
3+
locals {
4+
name = "app"
5+
environment = "test"
6+
region = "blr1"
7+
}
8+
9+
##------------------------------------------------
10+
## VPC module call
11+
##------------------------------------------------
12+
module "vpc" {
13+
source = "terraform-do-modules/vpc/digitalocean"
14+
version = "1.0.0"
15+
name = local.name
16+
environment = local.environment
17+
region = local.region
18+
ip_range = "10.10.0.0/16"
19+
}
20+
21+
##------------------------------------------------
22+
## mysql database cluster module call
23+
##------------------------------------------------
24+
module "mysql" {
25+
source = "../../"
26+
name = local.name
27+
environment = local.environment
28+
region = local.region
29+
cluster_engine = "mysql"
30+
cluster_version = "8"
31+
cluster_size = "db-s-1vcpu-1gb"
32+
cluster_node_count = 1
33+
cluster_private_network_uuid = module.vpc.id
34+
mysql_sql_mode = "ANSI,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_ALL_TABLES,ALLOW_INVALID_DATES"
35+
cluster_maintenance = {
36+
maintenance_hour = "02:00:00"
37+
maintenance_day = "saturday"
38+
}
39+
databases = ["testdb", "testdbt"]
40+
41+
users = [
42+
{
43+
name = "test1",
44+
mysql_auth_plugin = "mysql_native_password"
45+
}
46+
]
47+
48+
## database replica
49+
replica_enable = true
50+
51+
create_firewall = true
52+
firewall_rules = [
53+
{
54+
type = "ip_addr"
55+
value = "0.0.0.0"
56+
}
57+
]
58+
}

_examples/replica-db/outputs.tf

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//# ------------------------------------------------------------------------------
2+
//# Outputs
3+
//# ------------------------------------------------------------------------------
4+
//output "database_cluster_id" {
5+
// value = module.mysql.database_cluster_id
6+
// description = "The id of the database cluster"
7+
//}
8+
//
9+
//output "database_cluster_urn" {
10+
// value = module.mysql.database_cluster_urn
11+
// description = "The uniform resource name of the database cluster"
12+
//}
13+
//
14+
//output "database_cluster_host" {
15+
// value = module.mysql.database_cluster_host
16+
// description = "The hostname of the database cluster"
17+
//}
18+
//
19+
//output "database_cluster_private_host" {
20+
// value = module.mysql.database_cluster_private_host
21+
// description = "Same as host, but only accessible from resources within the account and in the same region"
22+
//}
23+
//
24+
//output "database_cluster_port" {
25+
// value = module.mysql.database_cluster_port
26+
// description = "Network port that the database cluster is listening on"
27+
//}
28+
//
29+
//output "database_cluster_uri" {
30+
// value = module.mysql.database_cluster_uri
31+
// sensitive = true
32+
// description = "The full URI for connecting to the database cluster"
33+
//}
34+
//
35+
//output "database_cluster_database" {
36+
// value = module.mysql.database_cluster_default_database
37+
// description = "Name of the cluster's default database"
38+
//}
39+
//
40+
//output "database_cluster_user" {
41+
// value = module.mysql.database_cluster_default_user
42+
// description = "Username for the cluster's default user"
43+
//}
44+
//
45+
//output "database_cluster_password" {
46+
// value = module.mysql.database_cluster_default_password
47+
// sensitive = true
48+
// description = "Password for the cluster's default user"
49+
//}
50+
//
51+
//output "connection_pool_id" {
52+
// value = module.mysql.connection_pool_id
53+
// description = "The ID of the database connection pool"
54+
//}
55+
//
56+
//output "connection_pool_host" {
57+
// value = module.mysql.connection_pool_host
58+
// description = "The hostname used to connect to the database connection pool"
59+
//}
60+
//
61+
//output "connection_pool_private_host" {
62+
// value = module.mysql.connection_pool_private_host
63+
// description = "Same as pool host, but only accessible from resources within the account and in the same region"
64+
//}
65+
//
66+
//output "connection_pool_port" {
67+
// value = module.mysql.connection_pool_port
68+
// description = "Network port that the database connection pool is listening on"
69+
//}
70+
//
71+
//output "connection_pool_uri" {
72+
// value = module.mysql.connection_pool_uri
73+
// sensitive = true
74+
// description = "The full URI for connecting to the database connection pool"
75+
//}
76+
//
77+
//output "connection_pool_private_uri" {
78+
// value = module.mysql.connection_pool_private_uri
79+
// sensitive = true
80+
// description = "Same as pool uri, but only accessible from resources within the account and in the same region"
81+
//}
82+
//
83+
//output "connection_pool_password" {
84+
// value = module.mysql.connection_pool_password
85+
// sensitive = true
86+
// description = "Password for the connection pool's user"
87+
//}
88+
//
89+
//output "db_name" {
90+
// value = module.mysql.db_name
91+
// description = "The name for the database"
92+
//}
93+
//
94+
//output "user_role" {
95+
// value = module.mysql.user_role
96+
// description = "Role for the database user"
97+
//}
98+
//
99+
//output "user_password" {
100+
// value = module.mysql.user_password
101+
// sensitive = true
102+
// description = "Password for the database user"
103+
//}
104+
//
105+
//output "database_firewall_id" {
106+
// value = module.mysql.database_firewall_id
107+
// description = "A unique identifier for the firewall rule"
108+
//}
109+
//
110+
//output "database_firewall_rule" {
111+
// value = module.mysql.database_firewall_rule
112+
// description = "A map with rule's uuid, type, value and created_at params"
113+
//}

_examples/replica-db/versions.tf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Terraform version
2+
terraform {
3+
required_version = ">= 1.5.4"
4+
required_providers {
5+
digitalocean = {
6+
source = "digitalocean/digitalocean"
7+
version = ">= 2.29.0"
8+
}
9+
}
10+
}

main.tf

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module "labels" {
1414
#Description :Provides a DigitalOcean database cluster resource.
1515
##-----------------------------------------------------------------------------
1616
resource "digitalocean_database_cluster" "cluster" {
17+
count = var.enabled == true ? 1 : 0
1718
name = format("%s-${var.cluster_engine}", module.labels.id)
1819
engine = var.cluster_engine
1920
version = var.cluster_version
@@ -24,6 +25,7 @@ resource "digitalocean_database_cluster" "cluster" {
2425
tags = [module.labels.id]
2526
eviction_policy = var.redis_eviction_policy
2627
sql_mode = var.mysql_sql_mode
28+
project_id = var.project_id
2729

2830
dynamic "maintenance_window" {
2931
for_each = var.cluster_maintenance != null ? [var.cluster_maintenance] : []
@@ -32,23 +34,32 @@ resource "digitalocean_database_cluster" "cluster" {
3234
day = maintenance_window.value.maintenance_day
3335
}
3436
}
37+
dynamic "backup_restore" {
38+
for_each = var.backup_restore != null ? [var.backup_restore] : []
39+
content {
40+
database_name = backup_restore.value.database_name
41+
backup_created_at = lookup(backup_restore.value, "backup_created_at", null)
42+
}
43+
}
3544
}
3645

46+
3747
##-----------------------------------------------------------------------------
3848
#Description :Provides a DigitalOcean database resource.
3949
##-----------------------------------------------------------------------------
4050
resource "digitalocean_database_db" "database" {
41-
for_each = toset(var.databases)
42-
cluster_id = digitalocean_database_cluster.cluster.id
43-
name = each.value
51+
depends_on = [digitalocean_database_cluster.cluster]
52+
count = var.enabled == true ? length(var.databases) : 0
53+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
54+
name = var.databases[count.index]
4455
}
4556

4657
##-----------------------------------------------------------------------------
4758
#Description : Provides a DigitalOcean database user resource.
4859
##-----------------------------------------------------------------------------
4960
resource "digitalocean_database_user" "user" {
50-
for_each = var.users != null ? { for u in var.users : u.name => u } : {}
51-
cluster_id = digitalocean_database_cluster.cluster.id
61+
for_each = var.enabled == true && var.users != null ? { for u in var.users : u.name => u } : {}
62+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
5263
name = each.value.name
5364
mysql_auth_plugin = lookup(each.value, "mysql_auth_plugin", null)
5465
}
@@ -57,8 +68,8 @@ resource "digitalocean_database_user" "user" {
5768
#Description : Provides a DigitalOcean database connection pool resource.
5869
##-----------------------------------------------------------------------------
5970
resource "digitalocean_database_connection_pool" "connection_pool" {
60-
for_each = var.create_pools ? { for p in var.pools : p.name => p } : {}
61-
cluster_id = digitalocean_database_cluster.cluster.id
71+
for_each = var.enabled == true && var.create_pools ? { for p in var.pools : p.name => p } : {}
72+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
6273
name = each.value.name
6374
mode = each.value.mode
6475
size = each.value.size
@@ -70,8 +81,37 @@ resource "digitalocean_database_connection_pool" "connection_pool" {
7081
#Description :Provides a DigitalOcean database firewall resource.
7182
##-----------------------------------------------------------------------------
7283
resource "digitalocean_database_firewall" "firewall" {
73-
count = var.create_firewall ? 1 : 0
74-
cluster_id = digitalocean_database_cluster.cluster.id
84+
count = var.enabled == true && var.create_firewall ? 1 : 0
85+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
86+
dynamic "rule" {
87+
for_each = var.firewall_rules
88+
content {
89+
type = rule.value.type
90+
value = rule.value.value
91+
}
92+
}
93+
depends_on = [digitalocean_database_cluster.cluster]
94+
}
95+
96+
##-----------------------------------------------------------------------------
97+
#Description: Provides a DigitalOcean database replica resource.
98+
##-----------------------------------------------------------------------------
99+
resource "digitalocean_database_replica" "replica-example" {
100+
count = var.enabled == true && var.replica_enable ? 1 : 0
101+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
102+
name = format("%s-${var.cluster_engine}-replica", module.labels.id)
103+
size = var.replica_size
104+
region = var.region
105+
tags = [module.labels.id]
106+
private_network_uuid = var.cluster_private_network_uuid
107+
}
108+
109+
##-----------------------------------------------------------------------------
110+
#Description :Provides a DigitalOcean database firewall resource.
111+
##-----------------------------------------------------------------------------
112+
resource "digitalocean_database_firewall" "replica-firewall" {
113+
count = var.enabled == true && var.create_firewall && var.replica_enable ? 1 : 0
114+
cluster_id = join("", digitalocean_database_cluster.cluster[*].id)
75115
dynamic "rule" {
76116
for_each = var.firewall_rules
77117
content {

0 commit comments

Comments
 (0)