diff --git a/modules/cloudsql-instance/README.md b/modules/cloudsql-instance/README.md index 9e05b0b3..962188d2 100644 --- a/modules/cloudsql-instance/README.md +++ b/modules/cloudsql-instance/README.md @@ -40,7 +40,7 @@ module "db" { database_version = "POSTGRES_13" tier = "db-g1-small" } -# tftest modules=3 resources=9 +# tftest modules=3 resources=9 inventory=simple.yaml ``` ## Cross-regional read replica @@ -50,6 +50,7 @@ module "db" { source = "./fabric/modules/cloudsql-instance" project_id = var.project_id network = var.vpc.self_link + prefix = "myprefix" name = "db" region = "europe-west1" database_version = "POSTGRES_13" @@ -60,7 +61,7 @@ module "db" { replica2 = { region = "us-central1", encryption_key_name = null } } } -# tftest modules=1 resources=3 +# tftest modules=1 resources=3 inventory=replicas.yaml ``` ## Custom flags, databases and users @@ -91,7 +92,7 @@ module "db" { user2 = "mypassword" } } -# tftest modules=1 resources=6 +# tftest modules=1 resources=6 inventory=custom.yaml ``` ### CMEK encryption @@ -140,6 +141,28 @@ module "db" { # tftest modules=3 resources=10 ``` + +### Enable public IP + +Use `ipv_enabled` to create instances with a public IP. + +```hcl +module "db" { + source = "./fabric/modules/cloudsql-instance" + project_id = var.project_id + network = var.vpc.self_link + name = "db" + region = "europe-west1" + tier = "db-g1-small" + database_version = "MYSQL_8_0" + ipv4_enabled = true + replicas = { + replica1 = { region = "europe-west3", encryption_key_name = null } + } +} +# tftest modules=1 resources=2 inventory=public-ip.yaml +``` + ## Variables diff --git a/tests/modules/cloudsql_instance/__init__.py b/tests/modules/cloudsql_instance/__init__.py deleted file mode 100644 index 6d6d1266..00000000 --- a/tests/modules/cloudsql_instance/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/modules/cloudsql_instance/examples/custom.yaml b/tests/modules/cloudsql_instance/examples/custom.yaml new file mode 100644 index 00000000..7130fe20 --- /dev/null +++ b/tests/modules/cloudsql_instance/examples/custom.yaml @@ -0,0 +1,59 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.db.google_sql_database.databases["departments"]: + deletion_policy: DELETE + instance: db + name: departments + project: project-id + module.db.google_sql_database.databases["people"]: + deletion_policy: DELETE + instance: db + name: people + project: project-id + module.db.google_sql_database_instance.primary: {} + module.db.google_sql_user.users["user1"]: + deletion_policy: null + instance: db + name: user1 + password_policy: [] + project: project-id + type: null + module.db.google_sql_user.users["user2"]: + deletion_policy: null + instance: db + name: user2 + password_policy: [] + project: project-id + type: null + module.db.random_password.passwords["user1"]: + keepers: null + length: 16 + lower: true + min_lower: 0 + min_numeric: 0 + min_special: 0 + min_upper: 0 + number: true + numeric: true + override_special: null + special: true + upper: true + +counts: + google_sql_database: 2 + google_sql_database_instance: 1 + google_sql_user: 2 + modules: 1 diff --git a/tests/modules/cloudsql_instance/examples/public-ip.yaml b/tests/modules/cloudsql_instance/examples/public-ip.yaml new file mode 100644 index 00000000..7d832c53 --- /dev/null +++ b/tests/modules/cloudsql_instance/examples/public-ip.yaml @@ -0,0 +1,91 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.db.google_sql_database_instance.primary: + database_version: MYSQL_8_0 + name: db + project: project-id + region: europe-west1 + restore_backup_context: [] + settings: + - activation_policy: ALWAYS + active_directory_config: [] + availability_type: ZONAL + backup_configuration: + - backup_retention_settings: + - retained_backups: 7 + retention_unit: COUNT + binary_log_enabled: true + enabled: true + location: null + point_in_time_recovery_enabled: null + start_time: '23:00' + transaction_log_retention_days: 7 + collation: null + database_flags: [] + deletion_protection_enabled: null + deny_maintenance_period: [] + disk_autoresize: true + disk_autoresize_limit: 0 + disk_type: PD_SSD + insights_config: [] + ip_configuration: + - allocated_ip_range: null + authorized_networks: [] + enable_private_path_for_google_cloud_services: null + ipv4_enabled: true + private_network: projects/xxx/global/networks/aaa + require_ssl: null + maintenance_window: [] + password_validation_policy: [] + pricing_plan: PER_USE + sql_server_audit_config: [] + tier: db-g1-small + time_zone: null + module.db.google_sql_database_instance.replicas["replica1"]: + database_version: MYSQL_8_0 + master_instance_name: db + name: replica1 + project: project-id + region: europe-west3 + settings: + - activation_policy: ALWAYS + active_directory_config: [] + availability_type: ZONAL + collation: null + database_flags: [] + deletion_protection_enabled: null + deny_maintenance_period: [] + disk_autoresize: true + disk_autoresize_limit: 0 + disk_type: PD_SSD + insights_config: [] + ip_configuration: + - allocated_ip_range: null + authorized_networks: [] + enable_private_path_for_google_cloud_services: null + ipv4_enabled: true + private_network: projects/xxx/global/networks/aaa + require_ssl: null + maintenance_window: [] + password_validation_policy: [] + pricing_plan: PER_USE + sql_server_audit_config: [] + tier: db-g1-small + time_zone: null + timeouts: null + +counts: + google_sql_database_instance: 2 diff --git a/tests/modules/cloudsql_instance/examples/replicas.yaml b/tests/modules/cloudsql_instance/examples/replicas.yaml new file mode 100644 index 00000000..1ed30f9b --- /dev/null +++ b/tests/modules/cloudsql_instance/examples/replicas.yaml @@ -0,0 +1,38 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.db.google_sql_database_instance.primary: + clone: [] + database_version: POSTGRES_13 + name: myprefix-db + project: project-id + region: europe-west1 + module.db.google_sql_database_instance.replicas["replica1"]: + clone: [] + database_version: POSTGRES_13 + master_instance_name: myprefix-db + name: myprefix-replica1 + project: project-id + region: europe-west3 + module.db.google_sql_database_instance.replicas["replica2"]: + clone: [] + database_version: POSTGRES_13 + master_instance_name: myprefix-db + name: myprefix-replica2 + project: project-id + region: us-central1 + +counts: + google_sql_database_instance: 3 diff --git a/tests/modules/cloudsql_instance/examples/simple.yaml b/tests/modules/cloudsql_instance/examples/simple.yaml new file mode 100644 index 00000000..b397408a --- /dev/null +++ b/tests/modules/cloudsql_instance/examples/simple.yaml @@ -0,0 +1,48 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.db.google_sql_database_instance.primary: + clone: [] + database_version: POSTGRES_13 + name: db + project: my-db-project + region: europe-west1 + settings: + - activation_policy: ALWAYS + active_directory_config: [] + availability_type: ZONAL + collation: null + database_flags: [] + deletion_protection_enabled: null + deny_maintenance_period: [] + disk_autoresize: true + disk_autoresize_limit: 0 + disk_type: PD_SSD + insights_config: [] + ip_configuration: + - allocated_ip_range: null + authorized_networks: [] + enable_private_path_for_google_cloud_services: null + ipv4_enabled: false + require_ssl: null + maintenance_window: [] + password_validation_policy: [] + pricing_plan: PER_USE + sql_server_audit_config: [] + tier: db-g1-small + time_zone: null + +counts: + google_sql_database_instance: 1 diff --git a/tests/modules/cloudsql_instance/fixture/main.tf b/tests/modules/cloudsql_instance/fixture/main.tf deleted file mode 100644 index cb5cc025..00000000 --- a/tests/modules/cloudsql_instance/fixture/main.tf +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module "test" { - source = "../../../../modules/cloudsql-instance" - project_id = "my-project" - authorized_networks = var.authorized_networks - availability_type = var.availability_type - backup_configuration = var.backup_configuration - database_version = var.database_version - databases = var.databases - disk_size = var.disk_size - disk_type = var.disk_type - flags = var.flags - labels = var.labels - name = var.name - network = var.network - prefix = var.prefix - region = var.region - replicas = var.replicas - users = var.users - tier = var.tier - deletion_protection = var.deletion_protection - ipv4_enabled = var.ipv4_enabled -} diff --git a/tests/modules/cloudsql_instance/fixture/variables.tf b/tests/modules/cloudsql_instance/fixture/variables.tf deleted file mode 100644 index 4f983865..00000000 --- a/tests/modules/cloudsql_instance/fixture/variables.tf +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright 2022 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -variable "authorized_networks" { - type = map(string) - default = null -} - -variable "availability_type" { - type = string - default = "ZONAL" -} - -variable "backup_configuration" { - type = object({ - enabled = bool - binary_log_enabled = bool - start_time = string - location = string - log_retention_days = number - retention_count = number - }) - default = { - enabled = false - binary_log_enabled = false - start_time = "23:00" - location = "EU" - log_retention_days = 7 - retention_count = 7 - } -} - -variable "database_version" { - type = string - default = "POSTGRES_13" -} - -variable "databases" { - type = list(string) - default = null -} - -variable "disk_size" { - type = number - default = null -} - -variable "disk_type" { - type = string - default = "PD_SSD" -} - -variable "flags" { - type = map(string) - default = null -} - -variable "labels" { - type = map(string) - default = null -} - -variable "name" { - type = string - default = "db" -} - -variable "network" { - type = string - default = "projects/xxx/global/networks/yyy" -} - -variable "prefix" { - type = string - default = null -} - -variable "region" { - type = string - default = "europe-west1" -} - -variable "replicas" { - type = any - default = null -} - -variable "users" { - type = map(string) - default = null -} - -variable "tier" { - type = string - default = "db-g1-small" -} - -variable "deletion_protection" { - type = bool - default = false -} - -variable "ipv4_enabled" { - type = bool - default = false -} diff --git a/tests/modules/cloudsql_instance/test_plan.py b/tests/modules/cloudsql_instance/test_plan.py deleted file mode 100644 index 72d31dad..00000000 --- a/tests/modules/cloudsql_instance/test_plan.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from collections import Counter - - -def test_simple_instance(plan_runner): - "Test standalone instance." - - _, resources = plan_runner() - assert len(resources) == 1 - r = resources[0] - assert r['values']['project'] == 'my-project' - assert r['values']['name'] == 'db' - assert r['values']['region'] == 'europe-west1' - - -def test_prefix(plan_runner): - "Test instance prefix." - - _, resources = plan_runner(prefix="prefix") - assert len(resources) == 1 - r = resources[0] - assert r['values']['name'] == 'prefix-db' - - replicas = """{ - replica1 = { region = "europe-west3", encryption_key_name = null } - replica2 = { region = "us-central1", encryption_key_name = null } - }""" - - _, resources = plan_runner(prefix="prefix") - assert len(resources) == 1 - r = resources[0] - assert r['values']['name'] == 'prefix-db' - - -def test_replicas(plan_runner): - "Test replicated instance." - - replicas = """{ - replica1 = { region = "europe-west3", encryption_key_name = null } - replica2 = { region = "us-central1", encryption_key_name = null } - }""" - - _, resources = plan_runner(replicas=replicas, prefix="prefix") - assert len(resources) == 3 - - primary = [r for r in resources if r['name'] == 'primary'][0] - replica1 = [ - r for r in resources - if r['name'] == 'replicas' and r['index'] == 'replica1' - ][0] - replica2 = [ - r for r in resources - if r['name'] == 'replicas' and r['index'] == 'replica2' - ][0] - - assert replica1['values']['name'] == 'prefix-replica1' - assert replica2['values']['name'] == 'prefix-replica2' - - assert replica1['values']['master_instance_name'] == 'prefix-db' - assert replica2['values']['master_instance_name'] == 'prefix-db' - - assert replica1['values']['region'] == 'europe-west3' - assert replica2['values']['region'] == 'us-central1' - - -def test_mysql_replicas_enables_backup(plan_runner): - "Test MySQL backup setup with replicas." - - replicas = """{ - replica1 = { region = "europe-west3", encryption_key_name = null } - }""" - _, resources = plan_runner(replicas=replicas, database_version="MYSQL_8_0") - assert len(resources) == 2 - primary = [r for r in resources if r['name'] == 'primary'][0] - backup_config = primary['values']['settings'][0]['backup_configuration'][0] - assert backup_config['enabled'] - assert backup_config['binary_log_enabled'] - - -def test_mysql_binary_log_for_regional(plan_runner): - "Test that the binary log will be enabled for regional MySQL DBs." - - _, resources = plan_runner(database_version="MYSQL_8_0", availability_type="REGIONAL") - assert len(resources) == 1 - primary = [r for r in resources if r['name'] == 'primary'][0] - backup_config = primary['values']['settings'][0]['backup_configuration'][0] - assert backup_config['enabled'] - assert backup_config['binary_log_enabled'] - - -def test_users(plan_runner): - "Test user creation." - - users = """{ - user1 = "123" - user2 = null - }""" - - _, resources = plan_runner(users=users) - types = Counter(r['type'] for r in resources) - assert types == { - 'google_sql_user': 2, - 'google_sql_database_instance': 1, - 'random_password': 1 - } - - -def test_databases(plan_runner): - "Test database creation." - - databases = '["db1", "db2"]' - _, resources = plan_runner(databases=databases) - - resources = [r for r in resources if r['type'] == 'google_sql_database'] - assert len(resources) == 2 - assert all(r['values']['instance'] == "db" for r in resources) - assert sorted(r['values']['name'] for r in resources) == ["db1", "db2"] - - -def test_simple_instance_ipv4_enable(plan_runner): - "Test instance ipv4_enabled." - - _, resources = plan_runner(ipv4_enabled="true") - assert len(resources) == 1 - assert resources[0]['values']['settings'][0]['ip_configuration'][0]['ipv4_enabled'] - - -def test_replicas_ipv4_enable(plan_runner): - "Test replicas ipv4_enabled." - - replicas = """{ - replica1 = { region = "europe-west3", encryption_key_name = null } - }""" - - _, resources = plan_runner(replicas=replicas, ipv4_enabled="true") - - assert len(resources) == 2 - assert all([r['values']['settings'][0]['ip_configuration'][0]['ipv4_enabled'] for r in resources]) -