From 5c40976d273e6f0e351e070a420046793a119dc7 Mon Sep 17 00:00:00 2001 From: alhendrickson Date: Fri, 30 Oct 2026 14:06:42 +0000 Subject: [PATCH 1/3] refactor(iac): cleanup Openstack Kubernetes infra. Add test --- .../.terraform.lock.hcl | 104 ++++++++++++ .../openstack-kubernetes-infra/README.md | 15 +- .../openstack-kubernetes-infra/compute.tf | 14 +- .../shared-locals.tf | 2 +- .../tests/compute.tftest.hcl | 160 ++++++++++++++++++ .../openstack-kubernetes-infra/variables.tf | 23 ++- 6 files changed, 291 insertions(+), 27 deletions(-) create mode 100644 terraform-modules/openstack-kubernetes-infra/.terraform.lock.hcl create mode 100644 terraform-modules/openstack-kubernetes-infra/tests/compute.tftest.hcl diff --git a/terraform-modules/openstack-kubernetes-infra/.terraform.lock.hcl b/terraform-modules/openstack-kubernetes-infra/.terraform.lock.hcl new file mode 100644 index 00000000..6d5aed29 --- /dev/null +++ b/terraform-modules/openstack-kubernetes-infra/.terraform.lock.hcl @@ -0,0 +1,104 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/cloudinit" { + version = "2.4.1" + hashes = [ + "h1:TKuE7Sq6387hl4eBo0/Gur73M9IP7OM0soSr6IqXWr0=", + "zh:0290af752ce1617c9258e11ccac1787ff134c59f444197db759af65e6e4fed2e", + "zh:489e950720f129c51a3868575c8656e165cd58652c34cb5d2efd9f89057f46b4", + "zh:5688e28d20f3a4cfea7808d882824e75ebdd6b2cb305df126d13b04f7a874ba2", + "zh:59cf1a815c8f1316c7e05ffd34fd78a9bf6e1de4823f40b4951ef2e538b9d6d6", + "zh:637a27f88d25e549dd096936a4c1eac85cf2a6d1cc44cf592690b4158cd2f969", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:95c80caef31829666a71adc9deaf70010a1fa8a9bda8a742b469e218b49c6442", + "zh:a23fc664a6f53d432684b8b9745c209e0eb8df8ad8455d98180d97fe8626afbf", + "zh:b74fe251542d65137dbf0b4b8cc597fbb89f862776456179db05865c717646e6", + "zh:d15dfa0a50147cd34c6c8192990d3c880f38ab64db825da8a322301930aa10f9", + "zh:d1757d138f00e79b8ad3f53c07d9569de7b44b6343e40407faeaaf07b43382c3", + "zh:daac40bbcd0e3fc8fc6be6e57b746995ed40996d3bfd077db60f1ec32b7a205e", + "zh:f2dfc80edb573514ce98add5eb4c178fb5b041ba6a8e94d1098d28fa2b0988a5", + ] +} + +provider "registry.terraform.io/hashicorp/local" { + version = "2.9.1" + hashes = [ + "h1:qGLHCuYSus+uHNnoEL4SuJqOs5yrNOcB7gnuHoVqizo=", + "zh:25606c7a5e308144fb627f6e31611bb52ff72bb9ae2d27af39673ab1a6b3c1bf", + "zh:2568c4ef4dab31821f6f7040af0d1a2aa2b9455b8d9cc546598b791b8ada34cd", + "zh:25ac210f136042047975896e5e11fe6012425301c826d6b7ce22a49f96a1e0e8", + "zh:55d3a7bf01eced8e1f259b548020ef1221c5687e0fe6b5b30f81ad0b4121ff12", + "zh:6168d6934777b853c57815baa18a54101c604a6f1124ca47cd23d016c6f2f1e5", + "zh:63c0aa17c8373f761123376226debffd1f2259901ff259d4547c520def9a6787", + "zh:6d1f1572db6c85bd6d6b1b1deef247084e189816875f67e6bcc5d4736794e0a9", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:a8ea1c155bd5e0d695a28d3c0e2f542de8844e1791ea021f015a3f08e1c059e1", + "zh:ccd790f97269509ade0574ef63c955d3943cb1d812c59177bd85ce4c1d17ca0f", + "zh:dcfc17bb666e659a9daa9ff52fd8f6ec9ea519868726015e645955c372296332", + "zh:eb83abbfa7f52cba609b48cbb9a6a5cab07780a672b2020fc2ba190e699a2516", + "zh:eedffca70074ae153790fb23c4ace8d1637a60ceba4e3c42c8eaeda7c1f9d10f", + ] +} + +provider "registry.terraform.io/hashicorp/null" { + version = "3.3.2" + hashes = [ + "h1:IQ1qrkht1sC1nibUR+AJ3ulryyhVDHfCHZhoJi0sg2Y=", + "zh:10ec43b8b7b18d5639238c7fb9e111f6a4b038523dd66c7a426bf27b25fa4c08", + "zh:60beb9cc2ad5b871c710860cee75b42850cc6acd43db0d77cb5e00fda7288b55", + "zh:62538582d0a4a2f10ad8a8d9a6c3cd3f05af6c6d91c6641ffc78d4f0e8e69b27", + "zh:64a8f9ce7852d9efc5b464c12306c946366d59f5e2757def97969c9fd64bd1d6", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:92a374fb736a52f465283326d0a5bf4f495132eb99be209dfb4c75ec803fe8db", + "zh:98da9c42785d27a50f0604758bcb61a30f6278b9f2acd92bb3b2046e0e71916c", + "zh:b0f7896fae554729cdf4a24ac06359a050cff5817e6cd8597cba8a4ae01a7409", + "zh:bc8179ee35d67c72fb03012e7023b9f9816f033a7ec4109c001dd6d29752e812", + "zh:d23a598f713bfb6098bc003571d7de90b5a33b78f9be240488252fe5f3c2a60d", + "zh:d2855b922ea345dbd89ea287e4c6c4757e38bc0aaffeb2b79aa0b8004f9c53ff", + "zh:d3a60422bc6a2f9244d076c5222c07060c826ef91bdbaf4634cb752b86057473", + "zh:faa01928c25d2a6ecd9c7eb8b88134cb08de55a6b11ca6c703ac0092845344ba", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.9.1" + hashes = [ + "h1:g40qr7yDmIpaur4SsK5BcOda3HSo1RJ6zHVMqN4EJ+0=", + "zh:05f4734c1f0be840b711b3eff259ebc5fca436784c728955b1678078466f48d7", + "zh:0b91bf19371d012434eba1deeb6aab77158def9b39601dcbd94450b3974a2a26", + "zh:0ee6eacd47ec00183d55d726a4b6c4ce951a199f944bf22f1aa58392ebdfa7a2", + "zh:19388a4074b76a89a43a6c8328d7ae8ee2e7de3d346af51e80d3e6d3d12925f1", + "zh:23e74d48c5e2ac2e823fd527f49fee9db37d32a1990c9e3bf126ead697b843eb", + "zh:3cabf7fbd096c520064aae3aba61aba670af83ab91291a71fa1b1332929c2b7f", + "zh:5c0a3b8af0be60be4eca12ddee385cfa8babc1ec8e98cdf9de2f2274c73eabfa", + "zh:60b4f8a8ef18f52bf8e19215229dae408bee732825964092db7c989fd2de4097", + "zh:7359015acfedcbd6366f2329c854cf8d3c8ca5cd0faa89d2d37db358d6eba6c5", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7b38758402f0e13a1071162da28994023cd2ac676e54af350c9ffd8dfa73fa7b", + "zh:7c7fbb8895eb75bb4de1f933e98553bd99c8d048c89a925ddba490aa5a67f7dc", + "zh:8c2b8c6a7ccdec16b73e2fb9f3700ea097f58c592571e4c5de60c93d2301732c", + ] +} + +provider "registry.terraform.io/terraform-provider-openstack/openstack" { + version = "3.0.0" + constraints = "~> 3.0.0" + hashes = [ + "h1:sxq+0vFl4SfV9dlut5liwaH4FejyNIf4ClAjRgowxv8=", + "zh:01718f229597b34ed430236a230a407dacd6289543556d33910e151462e8cb8a", + "zh:2424c5347d35fe0de778d1c40dbe8d9b1278309c4d65cce31709e6fcbec139df", + "zh:2a785f9efd6d8c979031803dd78411a583bc0d9a572ddf5fb9e539cbbfc1ce43", + "zh:8ab18c7eb1fd04b34be75fcecfc461888bd37ff017973f46745abeabd21b3fda", + "zh:98e805318292b58d9692bfe6d3d82e0db0f8044e588a38b239309221198aa92d", + "zh:9a99c9801f96dc69e7c76c5ddc0e2800b77a333becacae530d7a3acd18855347", + "zh:c5aa6690c094be211d2700d7ea44ffe937763e4dd566506c87eb99d6d8330b52", + "zh:d06fc3a148a49aab059a1f08ceadbfe1a5c82c7b80b960169987603dddaaaf58", + "zh:d079da24a9f2cc0d6fec9616e7ebe994245a3d98da629f012069c26d650edb05", + "zh:d1d2b63dba9045a4ff3869c65ddcaf2703d993254b58b2a0230d067f5c036de2", + "zh:d2b9d09c47e7eca08091da825cdf0982dc30089ee401888ce8704b79c7636e95", + "zh:dd6be78f98772bfc1ebf022fc36e5d68ef0f165f9e87476430d4e0dc3f1cc57f", + "zh:e7743c11dd0c83a5c1905f04ffd490b4471941218b4c841b760223fcf416affd", + "zh:f234aefac77f4e9a2b05877a00d322ee165009713d79a8d8e19039c6c6f7cf1b", + ] +} diff --git a/terraform-modules/openstack-kubernetes-infra/README.md b/terraform-modules/openstack-kubernetes-infra/README.md index b21981b9..166daf00 100644 --- a/terraform-modules/openstack-kubernetes-infra/README.md +++ b/terraform-modules/openstack-kubernetes-infra/README.md @@ -18,16 +18,19 @@ Terraform Module for provisioning VMs on Openstack as a kubernetes cluster using module "openstack_kubernetes_cluster" { source = "../../modules/openstack-kubernetes-infra" host_instances = [ - { name = "cogstack-k3s-server", is_controller = true }, + { name = "cogstack-k3s-server", is_controller = true, flavour = "m1.small" }, { name = "cogstack-k3s-node-2" - flavour = "2cpu4ram" + flavour = "m1.small" volume_size = 20 is_controller = false }, ] + network = { + name = "public" + } allowed_ingress_ips_cidr = "0.0.0.0/24" - ubuntu_immage_name = "Ubuntu_Jammy"" + ubuntu_immage_name = "ubuntu-22.04" ssh_key_pair = { private_key_file = "~/.ssh/id_rsa", public_key_file = "~/.ssh/id_rsa.pub", @@ -36,7 +39,7 @@ module "openstack_kubernetes_cluster" { ``` ## Existing Network and Floating IPs -You can use this module with a custom OpenStack network by specifying the `network` variable. By default, it will use the network named `"external_4003"`, but you can override this with your own network name or network ID. +You can use this module with a custom OpenStack network by specifying the `network` variable with your own network name or network ID. Using a custom OpenStack network with your own subnet allows you to improve security by keeping most nodes private. This ensures worker nodes and other internal resources are not directly exposed, reducing security risks. Only the controller node needs a floating IP to be accessible in order to use the k8s api server (eg for kubectl to work from outside the network). Using floating ips will also have the advantage of being stable, so you can destroy/create VMs without having to update anywhere the IP address is referenced by reassigning the floating ip. @@ -49,6 +52,7 @@ host_instances = [ { name = "controller" is_controller = true + flavour = "m1.small" floating_ip = { use_floating_ip = true address = "203.0.113.10" # Address of an existing floating_ip in openstack @@ -56,6 +60,7 @@ host_instances = [ }, { name = "worker" + flavour = "m1.small" # Optionally also assign a floating IP here, or leave blank to keep it internal to the network } network = { @@ -79,7 +84,7 @@ resource "openstack_networking_subnet_v2" "example_subnet"{ resource "openstack_networking_router_v2" "example_router" { name = "test-router" admin_state_up = true - external_network_id = data.openstack_networking_network_v2.external_4003.id + external_network_id = data.openstack_networking_network_v2.public.id } ``` diff --git a/terraform-modules/openstack-kubernetes-infra/compute.tf b/terraform-modules/openstack-kubernetes-infra/compute.tf index d59cd455..e1cff447 100644 --- a/terraform-modules/openstack-kubernetes-infra/compute.tf +++ b/terraform-modules/openstack-kubernetes-infra/compute.tf @@ -2,8 +2,7 @@ resource "openstack_compute_instance_v2" "kubernetes_server" { name = local.prefix != "" ? "${local.prefix}-${local.controller_host.name}" : local.controller_host.name flavor_id = data.openstack_compute_flavor_v2.available_compute_flavors[local.controller_host.flavour].id - key_pair = openstack_compute_keypair_v2.compute_keypair.name - region = "RegionOne" + key_pair = openstack_compute_keypair_v2.compute_keypair.name user_data = data.cloudinit_config.init_docker_controller.rendered @@ -54,8 +53,7 @@ resource "openstack_compute_instance_v2" "kubernetes_nodes" { name = local.prefix != "" ? "${local.prefix}-${each.value.name}" : each.value.name flavor_id = data.openstack_compute_flavor_v2.available_compute_flavors[each.value.flavour].id - key_pair = openstack_compute_keypair_v2.compute_keypair.name - region = "RegionOne" + key_pair = openstack_compute_keypair_v2.compute_keypair.name user_data = data.cloudinit_config.init_docker[each.key].rendered security_groups = ["default", @@ -81,10 +79,9 @@ resource "openstack_compute_instance_v2" "kubernetes_nodes" { } locals { - is_default_network = var.network != null && var.network == { name = "external_4003" } - nodes_with_exernal_ip = { for node in local.created_nodes : node.name => node if local.is_default_network || node.use_floating_ip } - + nodes_with_exernal_ip = { for node in local.created_nodes : node.name => node if local.controller_host_has_floating_ip ? node.use_floating_ip : true } } + resource "null_resource" "kubernetes_nodes_provisioner" { # Provisioner is only used to check for node readiness. Skip for any nodes that are not in the external network, # TODO: Filter this provisioner to only run on nodes that have a floating IP if the network is not default @@ -159,7 +156,8 @@ data "openstack_compute_flavor_v2" "available_compute_flavors" { data "openstack_networking_network_v2" "network" { - name = var.network != null && var.network.name != null ? var.network.name : "external_4003" + count = var.network.network_id == null ? 1 : 0 + name = var.network.name } data "openstack_images_image_v2" "ubuntu" { diff --git a/terraform-modules/openstack-kubernetes-infra/shared-locals.tf b/terraform-modules/openstack-kubernetes-infra/shared-locals.tf index cff1b88a..1febbbb3 100644 --- a/terraform-modules/openstack-kubernetes-infra/shared-locals.tf +++ b/terraform-modules/openstack-kubernetes-infra/shared-locals.tf @@ -2,7 +2,7 @@ locals { random_prefix = random_id.server.b64_url prefix = var.prefix != null ? var.prefix : (var.generate_random_name_prefix ? local.random_prefix : "") - network_id = var.network != null && var.network.network_id != null ? var.network.network_id : data.openstack_networking_network_v2.network.id + network_id = var.network.network_id != null ? var.network.network_id : data.openstack_networking_network_v2.network[0].id } diff --git a/terraform-modules/openstack-kubernetes-infra/tests/compute.tftest.hcl b/terraform-modules/openstack-kubernetes-infra/tests/compute.tftest.hcl new file mode 100644 index 00000000..39698df7 --- /dev/null +++ b/terraform-modules/openstack-kubernetes-infra/tests/compute.tftest.hcl @@ -0,0 +1,160 @@ +mock_provider "openstack" { + override_during = plan + + mock_data "openstack_networking_network_v2" { + defaults = { id = "net-1" } + } +} + +mock_provider "random" { + override_during = plan + + mock_resource "random_password" { + defaults = { result = "k3stoken" } + } + + mock_resource "random_id" { + defaults = { b64_url = "rand" } + } +} + +override_resource { + target = openstack_compute_instance_v2.kubernetes_server + override_during = plan + values = { access_ip_v4 = "10.0.0.1" } +} + +run "server_and_node" { + command = plan + + variables { + ubuntu_immage_name = "ubuntu" + generate_random_name_prefix = false + prefix = "test" + network = { name = "public" } + host_instances = [ + { name = "controller", is_controller = true, flavour = "m1.small" }, + { name = "worker", flavour = "m1.small" }, + ] + } + + assert { + condition = openstack_compute_instance_v2.kubernetes_server.name == "test-controller" && openstack_compute_instance_v2.kubernetes_nodes["worker"].name == "test-worker" + error_message = "expected a controller and a worker" + } + + assert { + condition = strcontains(data.cloudinit_config.init_docker_controller.part[0].content, "INSTALL_K3S_EXEC=\"server\"") + error_message = "server cloud-init should install k3s server" + } + + assert { + condition = strcontains(data.cloudinit_config.init_docker["worker"].part[0].content, "K3S_URL=https://10.0.0.1:6443") + error_message = "node cloud-init should join the server" + } +} + +run "required_only" { + command = plan + + variables { + ubuntu_immage_name = "ubuntu" + network = { name = "public" } + host_instances = [ + { name = "controller", is_controller = true, flavour = "m1.small" }, + { name = "worker", flavour = "m1.small" }, + ] + } + + assert { + condition = openstack_compute_instance_v2.kubernetes_server.name == "rand-controller" && openstack_compute_instance_v2.kubernetes_nodes["worker"].name == "rand-worker" + error_message = "required-only should still create a controller and worker" + } + + assert { + condition = openstack_compute_instance_v2.kubernetes_server.block_device[0].volume_size == 20 + error_message = "volume_size should default to 20" + } + + assert { + condition = strcontains(data.cloudinit_config.init_docker["worker"].part[0].content, "K3S_URL=https://10.0.0.1:6443") + error_message = "node cloud-init should join the server" + } +} + +run "all_variables" { + command = plan + + variables { + ubuntu_immage_name = "ubuntu" + allowed_ingress_ips_cidr = "10.1.2.0/24" + k3s_version = "v1.32.2+k3s1" + generate_random_name_prefix = false + prefix = "full" + output_file_directory = "/tmp/cogstack-test" + network = { + name = "private" + network_id = "net-custom" + } + ssh_key_pair = { + private_key_file = "tests/fixtures/fake_key" + public_key_file = "tests/fixtures/fake_key.pub" + } + host_instances = [ + { + name = "controller" + is_controller = true + flavour = "m1.large" + volume_size = 50 + image_uuid = "img-controller" + floating_ip = { + use_floating_ip = true + address = "203.0.113.10" + } + }, + { + name = "worker" + flavour = "m1.medium" + volume_size = 40 + image_uuid = "img-worker" + floating_ip = { + use_floating_ip = true + address = "203.0.113.11" + } + }, + ] + } + + assert { + condition = openstack_compute_instance_v2.kubernetes_server.name == "full-controller" && openstack_compute_instance_v2.kubernetes_nodes["worker"].name == "full-worker" + error_message = "prefix should be applied to host names" + } + + assert { + condition = ( + openstack_compute_instance_v2.kubernetes_server.block_device[0].volume_size == 50 && + openstack_compute_instance_v2.kubernetes_server.block_device[0].uuid == "img-controller" && + openstack_compute_instance_v2.kubernetes_nodes["worker"].block_device[0].volume_size == 40 && + openstack_compute_instance_v2.kubernetes_nodes["worker"].block_device[0].uuid == "img-worker" && + openstack_compute_instance_v2.kubernetes_server.network[0].uuid == "net-custom" + ) + error_message = "optional host and network values should be used" + } + + assert { + condition = ( + strcontains(data.cloudinit_config.init_docker_controller.part[0].content, "TF_K3S_VERSION=\"v1.32.2+k3s1\"") && + strcontains(data.cloudinit_config.init_docker_controller.part[0].content, "TF_K3S_TLS_SAN=203.0.113.10") && + strcontains(data.cloudinit_config.init_docker["worker"].part[0].content, "TF_K3S_NODE_EXTERNAL_IP=203.0.113.11") + ) + error_message = "cloud-init should include k3s version and floating IPs" + } + + assert { + condition = ( + openstack_networking_secgroup_rule_v2.cogstack_apps_port_rules["22-Expose SSH"].remote_ip_prefix == "10.1.2.0/24" && + openstack_compute_keypair_v2.compute_keypair.public_key == file("tests/fixtures/fake_key.pub") + ) + error_message = "ingress CIDR and ssh keypair should be used" + } +} diff --git a/terraform-modules/openstack-kubernetes-infra/variables.tf b/terraform-modules/openstack-kubernetes-infra/variables.tf index 3bb61e53..05edbd69 100644 --- a/terraform-modules/openstack-kubernetes-infra/variables.tf +++ b/terraform-modules/openstack-kubernetes-infra/variables.tf @@ -28,7 +28,7 @@ floating_ip = (Optional) Floating IP configuration. Set use_floating_ip to true EOT type = list(object({ name = string, - flavour = optional(string, "2cpu4ram"), + flavour = string, volume_size = optional(number, 20), is_controller = optional(bool, false), image_uuid = optional(string, null), @@ -38,9 +38,6 @@ EOT }), null) })) - default = [ - { name = "cogstack-devops", is_controller = true } - ] validation { condition = length(var.host_instances) >= 1 error_message = "Must have at least one host instance" @@ -90,24 +87,24 @@ variable "prefix" { variable "network" { type = object({ - name = optional(string, "external_4003") + name = optional(string) network_id = optional(string) }) - default = { name = "external_4003" } - description = "Network configuration. Either provide 'name' to lookup the network by name, or 'network_id' to use a network UUID directly. Defaults to name 'external_4003' if null" + description = "Network configuration. Either provide 'name' to lookup the network by name, or 'network_id' to use a network UUID directly." validation { - condition = var.network == null || var.network.name != null || var.network.network_id != null + condition = var.network.name != null || var.network.network_id != null error_message = "Either network.name or network.network_id must be provided" } } -check "controller_floating_ip_required_for_non_default_network" { +check "controller_floating_ip_required_when_using_floating_ips" { assert { - condition = (var.network == null - || (var.network.name == "external_4003" && var.network.network_id == null) - || (length([for host in var.host_instances : host if host.is_controller == true && host.floating_ip.use_floating_ip == true]) == 1)) + condition = ( + length([for host in var.host_instances : host if host.floating_ip != null && host.floating_ip.use_floating_ip == true]) == 0 + || length([for host in var.host_instances : host if host.is_controller == true && host.floating_ip != null && host.floating_ip.use_floating_ip == true]) == 1 + ) error_message = <<-EOT -When using a non-default network, the controller host should have a floating IP in order to be accessible by the terraform agent +When using floating IPs, the controller host should have a floating IP in order to be accessible by the terraform agent EOT } } From 8cb50c80bfd75bb04f9a280ce3e8d4b904156b53 Mon Sep 17 00:00:00 2001 From: alhendrickson Date: Fri, 30 Oct 2026 14:06:51 +0000 Subject: [PATCH 2/3] refactor(iac): cleanup Openstack Kubernetes infra. Add test --- .../openstack-kubernetes-infra/tests/fixtures/fake_key | 3 +++ .../openstack-kubernetes-infra/tests/fixtures/fake_key.pub | 1 + 2 files changed, 4 insertions(+) create mode 100644 terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key create mode 100644 terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key.pub diff --git a/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key b/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key new file mode 100644 index 00000000..8ed7861d --- /dev/null +++ b/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key @@ -0,0 +1,3 @@ +-----BEGIN TEST PRIVATE KEY----- +test +-----END TEST PRIVATE KEY----- diff --git a/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key.pub b/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key.pub new file mode 100644 index 00000000..8778f5c7 --- /dev/null +++ b/terraform-modules/openstack-kubernetes-infra/tests/fixtures/fake_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC test@test From 8d9c6637ad9aad194abd6970db9ccb9d27ebc4af Mon Sep 17 00:00:00 2001 From: alhendrickson Date: Fri, 30 Oct 2026 14:08:28 +0000 Subject: [PATCH 3/3] refactor(iac): cleanup Openstack Kubernetes infra. Add test --- terraform-modules/openstack-kubernetes-infra/compute.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/terraform-modules/openstack-kubernetes-infra/compute.tf b/terraform-modules/openstack-kubernetes-infra/compute.tf index e1cff447..76f4c46c 100644 --- a/terraform-modules/openstack-kubernetes-infra/compute.tf +++ b/terraform-modules/openstack-kubernetes-infra/compute.tf @@ -2,7 +2,7 @@ resource "openstack_compute_instance_v2" "kubernetes_server" { name = local.prefix != "" ? "${local.prefix}-${local.controller_host.name}" : local.controller_host.name flavor_id = data.openstack_compute_flavor_v2.available_compute_flavors[local.controller_host.flavour].id - key_pair = openstack_compute_keypair_v2.compute_keypair.name + key_pair = openstack_compute_keypair_v2.compute_keypair.name user_data = data.cloudinit_config.init_docker_controller.rendered @@ -53,7 +53,7 @@ resource "openstack_compute_instance_v2" "kubernetes_nodes" { name = local.prefix != "" ? "${local.prefix}-${each.value.name}" : each.value.name flavor_id = data.openstack_compute_flavor_v2.available_compute_flavors[each.value.flavour].id - key_pair = openstack_compute_keypair_v2.compute_keypair.name + key_pair = openstack_compute_keypair_v2.compute_keypair.name user_data = data.cloudinit_config.init_docker[each.key].rendered security_groups = ["default",