Repository: kinvolk/lokomotive
Pull request #299 (2020-04-16 20:32:34)

 packet: improve hardware reservations support using terraform dependencies 
This PR supersedes #119 and adds support for hardware reservations in Packet by adding auto-generated (i.e generated automatically by lokomotive) explicit terraform dependencies.

The need to use explicit dependencies on terraform (`depends_on`) is explained in the code itself, but you can have a look at these two links for more info (also linked in the code):
  https://github.com/terraform-providers/terraform-provider-packet/issues/176
  https://github.com/terraform-providers/terraform-provider-packet/pull/208

To guarantee that nodes with specific hw reservation UUID are created first, terraform dependencies are used and computed automatically in lokomotive. In contrast, PR #119 to achieve the same, did the following: `terraform apply -target=<nodes_to_create_first>` and then finished with `terraform apply` to create the rest of the resources.

The reasoning to change and rely on terraform for dependencies is simple: terraform already handles dependencies, handling them in different places is confusing and may hit several unexpected issues (as if running `terraform apply -target=<nodes_to_create_first>` we don't expect some resources to be created, but due to dependencies at the terraform layer they might be created if needed).

As explained in #119, I first started with the `terraform -target` approach because it was already used for DNS provider manual in packet, seemed simple and supporting all possible combinations of `reservation_ids` and `reservation_ids_default` seemed difficult otherwise. While working on #119, I decided that to support all combinations was not sane, and little by little, started to reduce the different combinations accepted. Basically, it was reduced and now `reservation_ids` and `reservation_ids_default` are mutually exclusive now. With that simplification in mind, going the terraform dependencies route seems simple. This PR just goes down that route, with this simplification.

There are some TODOs in the code, for things that I want to fully understand before merging, but other than that, this is pretty much functional.

## Pending things:
- [x] Add tests to new functions in this iteration and review other tests, just in case
- [x] Address "TODO" currently in the code 
- [ ] Create issue about plumbing to test terraform code (e.g. dependencies between devices, like we added here). Or should this be included here?


Patch:
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/controllers.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/controllers.tf
index 930b8eed..24008bf8 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/controllers.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/controllers.tf
@@ -59,6 +59,10 @@ resource "packet_device" "controllers" {
   ipxe_script_url = var.ipxe_script_url
   always_pxe      = false
   tags            = var.tags
+
+  # This way to handle dependencies was inspired in this:
+  # https://discuss.hashicorp.com/t/tips-howto-implement-module-depends-on-emulation/2305/2
+  depends_on = [var.nodes_depend_on]
 }
 
 data "ct_config" "controller-install-ignitions" {
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/outputs.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/outputs.tf
index f656dc52..7893b3d8 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/outputs.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/outputs.tf
@@ -30,3 +30,9 @@ output "kubelet_values" {
 output "calico_values" {
   value = module.bootkube.calico_values
 }
+
+# Dummy output used to create dependencies only
+# Not guaranteed that won't change
+output "device_ids" {
+  value = packet_device.controllers.*.id
+}
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/variables.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/variables.tf
index e2bb5297..5490ea02 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/variables.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/variables.tf
@@ -175,3 +175,9 @@ variable "tags" {
   type        = list(string)
   default     = ["ManagedBy:Lokomotive", "CreatedBy:Unspecified"]
 }
+
+variable "nodes_depend_on" {
+  description = "Make the controller nodes depend on the list of resources. Might change, must not be used by an end-user"
+  type        = list(any)
+  default     = null
+}
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/outputs.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/outputs.tf
index 6a724db6..0cd34763 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/outputs.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/outputs.tf
@@ -5,3 +5,9 @@ output "worker_nodes_hostname" {
 output "worker_nodes_public_ipv4" {
   value = packet_device.nodes.*.access_public_ipv4
 }
+
+# Dummy output used to create dependencies only
+# Not guaranteed that won't change
+output "device_ids" {
+  value = packet_device.nodes.*.id
+}
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/variables.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/variables.tf
index 7b2082b9..301d7b13 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/variables.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/variables.tf
@@ -169,3 +169,9 @@ variable "tags" {
   type        = list(string)
   default     = ["ManagedBy:Lokomotive", "CreatedBy:Unspecified"]
 }
+
+variable "nodes_depend_on" {
+  description = "Make the worker nodes depend on the list of resources. Might change, must not be used by an end-user"
+  type        = list(any)
+  default     = null
+}
diff --git a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/workers.tf b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/workers.tf
index 0bbf96b2..d0c5ebce 100644
--- a/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/workers.tf
+++ b/assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/workers.tf
@@ -18,6 +18,10 @@ resource "packet_device" "nodes" {
   )
 
   tags = var.tags
+
+  # This way to handle dependencies was inspired in this:
+  # https://discuss.hashicorp.com/t/tips-howto-implement-module-depends-on-emulation/2305/2
+  depends_on = [var.nodes_depend_on]
 }
 
 data "ct_config" "install-ignitions" {
diff --git a/docs/configuration-reference/platforms/packet.md b/docs/configuration-reference/platforms/packet.md
index 107a2fe8..d3f6441b 100644
--- a/docs/configuration-reference/platforms/packet.md
+++ b/docs/configuration-reference/platforms/packet.md
@@ -207,8 +207,8 @@ node_type = var.custom_default_worker_type
 | `service_cidr`                        | CIDR IPv4 range to assign Kubernetes services.                                                                                                                                | "10.3.0.0/16"   | false    |
 | `cluster_domain_suffix`               | Cluster's DNS domain.                                                                                                                                                         | "cluster.local" | false    |
 | `enable_reporting`                    | Enables usage or analytics reporting to upstream.                                                                                                                             | false           | false    |
-| `reservation_ids`                     | Specify Packet hardware reservation ID for instances.                                                                                                                         | -               | false    |
-| `reservation_ids_default`             | Default reservation ID for nodes not listed in the `reservation_ids`. The value`next-available` will choose any reservation that matches the pool's device type and facility. | ""              | false    |
+| `reservation_ids`                     | Block with Packet hardware reservation IDs for controller nodes. Each key must have the format `controller-${index}` and the value is the reservation UUID. Can't be combined with `reservation_ids_default`. Example: `reservation_ids = { controller-0 = "<reservation_id>" }`.                                    | -               | false    |
+| `reservation_ids_default`             | Default reservation ID for controllers. The value`next-available` will choose any reservation that matches the pool's device type and facility. Can't be combined with `reservation_ids`                                                                                                                             | -               | false    |
 | `certs_validity_period_hours`         | Validity of all the certificates in hours.                                                                                                                                    | 8760            | false    |
 | `worker_pool`                         | Configuration block for worker pools. There can be more than one.                                                                                                             | -               | true     |
 | `worker_pool.count`                   | Number of workers in the worker pool. Can be changed afterwards to add or delete workers.                                                                                     | 1               | true     |
@@ -220,6 +220,8 @@ node_type = var.custom_default_worker_type
 | `worker_pool.node_type`               | Packet instance type for worker nodes.                                                                                                                                        | "baremetal_0"   | false    |
 | `worker_pool.labels`                  | Custom labels to assign to worker nodes.                                                                                                                                      | -               | false    |
 | `worker_pool.taints`                  | Taints to assign to worker nodes.                                                                                                                                             | -               | false    |
+| `worker_pool.reservation_ids`         | Block with Packet hardware reservation IDs for worker nodes. Each key must have the format `worker-${index}` and the value is the reservation UUID. Can't be combined with `reservation_ids_default`. Example: `reservation_ids = { worker-0 = "<reservation_id>" }`.                                                | -               | false    |
+| `worker_pool.reservation_ids_default` | Default reservation ID for workers. The value`next-available` will choose any reservation that matches the pool's device type and facility. Can't be combined with `reservation_ids`.                                                                                                                                | -               | false    |
 | `worker_pool.setup_raid`              | Attempt to create a RAID 0 from extra disks to be used for persistent container storage. Can't be used with `setup_raid_hdd` nor `setup_raid_sdd`.                            | false           | false    |
 | `worker_pool.setup_raid_hdd`          | Attempt to create a RAID 0 from extra Hard Disk drives only, to be used for persistent container storage. Can't be used with `setup_raid` nor `setup_raid_sdd`.               | false           | false    |
 | `worker_pool.setup_raid_ssd`          | Attempt to create a RAID 0 from extra Solid State Drives only, to be used for persistent container storage.  Can't be used with `setup_raid` nor `setup_raid_hdd`.            | false           | false    |
diff --git a/pkg/assets/generated_assets.go b/pkg/assets/generated_assets.go
index a8cf03de..dee03d61 100644
--- a/pkg/assets/generated_assets.go
+++ b/pkg/assets/generated_assets.go
@@ -4382,16 +4382,16 @@ var vfsgenAssets = func() http.FileSystem {
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/controllers.tf": &vfsgen۰CompressedFileInfo{
 			name:             "controllers.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 4332,
+			uncompressedSize: 4520,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x57\x5d\x6f\xdb\x3a\x12\x7d\xd7\xaf\x98\x55\x1c\x34\x59\x38\x4a\xb2\x2d\x16\x45\x00\x63\x51\xa4\x05\xb6\x2f\xdd\xa2\x1f\x4f\x41\x40\x30\xd4\xd8\x66\x43\x91\x2a\x49\x39\xf6\x1a\xfe\xef\x8b\x21\x29\x5b\xb2\xe5\xa4\xdb\x8b\x7b\xfb\x52\x8b\x9c\x39\x9c\x8f\x73\x86\x8c\x32\x82\x2b\x07\xeb\x0c\x80\xd7\x92\xe1\xd2\xa3\xd5\x5c\xb1\xe9\xcf\x52\xc3\x04\xa6\xc6\x56\xdc\x9f\xe5\xa7\xae\x38\x75\x45\x3e\x86\x05\xb7\x85\x50\x8d\xf3\x68\x99\xe6\x15\xc6\x95\x52\x3b\xf6\x5f\xa3\xf1\x3c\xc1\x04\xef\xed\xbf\x2e\xcc\x45\x6d\xe5\x82\x7b\xfc\x65\x38\xf4\xa2\xec\xe3\x4d\xe0\x6e\x6a\x2c\x48\x5d\xe2\x72\x0c\x25\x2e\xa4\x40\x90\x1a\x6a\x2e\x1e\xd1\xb3\xb8\x50\x08\xa3\xbd\x35\x4a\xa1\x75\x70\xd3\x0d\x80\x00\x4f\xcb\xa3\xe7\x27\xd8\x5e\x18\xf7\x59\x06\x40\x5f\xa8\xbd\x95\xe8\x60\x02\xc2\x68\xc1\xfd\x59\x46\x01\xdd\x65\x31\xb0\x13\xca\xdd\xa1\x5d\xa0\x85\xba\x79\x50\x52\xa4\x8d\x75\xd6\xc6\x4e\x67\xc4\x1c\x42\xe1\x8b\x83\x9a\x8f\xb7\xa6\x7e\x55\x27\xd3\xfc\x5d\xde\x59\xf6\x2a\x55\xe1\xf5\xd5\xd5\x6e\xd9\xa2\x30\xb6\xa4\xc8\x8e\x96\xa1\xf8\x7b\xc1\x85\x40\xe7\x58\x0c\x8e\xc9\x7a\xf1\xa6\x45\xd8\x8c\x87\x92\x88\xbd\xfa\xa5\x2c\xfe\xba\xe0\x63\x50\x43\xd1\xdf\xc7\xff\x4e\x02\x69\x7a\xad\xf9\x7f\x09\xf3\x62\xca\x5b\x5a\xde\x05\xd8\xfb\x3f\x9e\xfa\x5d\x8a\x63\x20\xcd\x2d\xfa\x66\x97\xe6\x79\xb6\xc9\x32\x8b\xce\x34\x56\x20\xe8\x46\x29\xb6\xfd\xca\x3b\x5c\xcd\x43\x12\xde\xca\xd9\x8c\x32\x9b\xa4\x9c\x16\x5c\x35\x08\x13\xf8\xe1\x8c\x46\x2d\x4c\x89\x67\x31\xb1\x8e\x2b\xc9\x6f\xd3\x3b\x26\xef\x95\x2c\x87\xbc\x53\xb4\x78\x90\x30\x8d\xf6\x00\x5d\xf1\x07\x8d\x6d\xed\x58\xb0\xc8\x00\xe6\xc6\xf9\xb6\xaa\xc9\x32\x1f\xad\xf7\x05\xb9\xb9\xd8\xb9\x5e\x8c\xd6\xc1\xb9\x08\x25\xdf\xe4\x19\x40\xad\xb8\x86\x67\x8f\xa3\x76\x64\x00\x53\x2e\xa4\x92\x9e\xc4\xdb\x1a\xde\x91\x65\x5a\x5f\xdd\x67\x00\xa6\x46\xcb\xbd\xd4\x33\xe6\x56\xce\x63\x95\xc0\x64\xbd\x44\xe6\x84\x95\xb5\x67\x8d\x55\xf0\xb7\x09\xe4\x39\xfc\x0b\x72\xd1\x38\x6f\x2a\x46\xfb\x79\x67\xc6\x4c\x15\xf7\x82\x5b\x76\xea\xd2\x80\x31\x8e\x89\x39\xd7\x1a\x15\x55\xf4\x41\x2a\x45\x67\x88\x95\x50\x2d\x51\xe6\xa6\xb1\x6a\x15\x12\xb2\xe6\x07\x0a\xcf\x64\xd9\x4b\x68\xb7\x9c\x01\x34\x0e\x2d\x2b\xb9\xe7\xfd\xa4\x8f\xc5\x49\x96\x85\xf0\x4c\x18\x3d\x95\xb3\x4e\x6d\x2e\xa4\x76\x9e\x2b\x75\x21\x67\x5a\x7a\x69\xb4\xbb\xeb\xd4\xf7\xbe\xb0\xa8\x4b\xb4\x58\xc2\xcd\x73\x18\xcf\xfb\xd2\xe4\x3c\x81\x8f\x53\xd0\xc6\x43\x6d\xd1\xa1\xf6\xa4\x3d\x3f\x47\xa8\x78\x3d\x06\xe9\x29\x1f\x07\xb1\xf5\x64\x60\x17\x9c\x00\x99\x2c\x1d\x2b\x71\xca\x1b\xe5\x37\x05\x11\x86\xdb\xf2\x89\x5b\x64\x7d\xa3\x20\x49\xf3\xd8\xd4\x67\x89\xd8\x07\x28\x51\x3d\x6d\x7b\x3a\xb1\x9f\x2e\xf2\x31\x74\xc2\x3e\x1f\x1f\x83\x68\x03\x89\xca\xcb\x00\xf6\x8b\x3d\xd8\x02\xba\x0d\xd5\x13\x5f\x39\x56\x2f\xb1\x6d\xd5\x94\x2b\x47\x8c\xf4\x7c\xe6\x0e\x99\x4b\xab\x24\xb9\xd0\xde\x7c\x5b\xf1\x9e\xd4\x0e\xfb\xd6\xd7\xde\x51\xc9\xd1\x12\xd5\x7f\x12\xfb\xe9\xb1\xaa\x15\xcd\x98\xa9\x54\x38\xc0\x8b\x23\x1d\xdd\x46\xd7\xf3\x1f\x8c\x70\x6f\x26\x1c\x0d\xac\x45\xa2\xf2\x48\x85\x67\xf9\x68\x5d\x73\x3f\x2f\x2a\x53\x36\x0a\x37\x97\x42\x5d\x1e\x82\x17\x2b\x5e\xa9\xc2\x57\xb5\xca\x43\x4b\x16\xbc\x33\xdf\x76\x9a\x3b\x28\xf1\x6e\xab\xb5\x5c\xa0\x75\xd2\xe8\x21\xcb\xb4\xd5\x5a\x72\x2b\xe6\x30\x30\x70\xd2\x56\x24\x5a\xd2\xbf\x92\xba\x59\x32\x83\x55\x12\x79\x9c\x9d\x79\xb0\x71\x6e\xce\x1e\x71\xe5\xf6\xa0\x3a\xd3\x98\x50\x5b\xab\xf3\xe0\x53\x1b\xe7\x53\xea\xac\xed\x7c\xdb\xca\xdf\x92\x66\x9a\xee\xcf\x53\x6d\x98\x62\xc7\x5b\x49\x7d\x24\xa9\xf5\x33\x6e\x99\xf7\x22\xf5\x62\x0c\xc7\x23\x76\x5a\xd6\x35\x7a\x37\x10\x80\x12\xac\xdd\xfd\x25\x8e\xa6\xa3\xfe\x14\x8e\xbe\xc4\xcd\xc0\xa3\x43\xea\x9c\xc0\x2d\xd7\x34\x29\x1b\x87\x40\x17\x84\x14\x50\x62\x4d\xe9\x6b\x41\x77\x97\xd1\xd0\x7d\xa7\x18\x4b\x83\x54\x5a\x78\xff\xe9\x6b\xfb\x94\x08\x40\xe1\x79\xd2\xbb\x5d\x23\x07\x69\xfd\xf0\x16\x4d\xf6\xa5\xa9\xb8\xec\xbd\xdb\x07\x2f\xe4\x43\x8c\x22\x9a\xb5\xef\xe5\x2e\x26\xa5\xc6\x3c\x9f\x31\xd7\x4c\xa7\x72\xd9\xcf\x19\x26\x13\xc8\xb9\xad\xfe\xf9\x26\xdc\xa7\x17\xe9\xe7\x0d\xe4\xfb\x08\xa6\x0e\x24\x3c\x10\xdc\x1e\xc2\x87\x6f\xb7\xef\xd9\xf7\x4f\x5f\xbf\x7f\xfe\xfc\x9f\x2f\xdf\x3e\xbc\x67\xef\xbe\xdc\xfe\x7b\xb2\x0f\x1b\xdf\x87\x57\x93\xb9\xf7\xb5\xbb\xb9\xbc\x4c\xe9\x85\xc4\xae\x0a\x5c\xf2\xaa\x0e\xa4\xac\xc6\xb4\x72\x3d\x68\x77\xdd\xb3\x2b\x8a\x62\x17\xb0\x24\xc5\x70\xc5\x92\x79\xd0\xb5\x91\xfa\x2c\x1f\xe7\xe3\x21\xf6\x93\x13\xbd\x6f\x5b\x96\x47\xb5\x3f\x36\x0f\x18\x19\xda\x6f\x21\x55\x5c\xfb\xb3\xeb\xab\x31\x44\xe6\x15\x0f\xc6\x78\xb2\x2e\x76\x2e\x17\xf4\x53\xa1\x3f\x3f\x3e\x6c\x5e\x9a\x36\x8f\x6f\x1d\xa3\x86\xd2\x35\x28\x05\xbd\x43\xa3\x93\x90\xa5\xa5\xa7\x5b\x74\x49\x9b\xb4\x38\x86\xeb\xab\xe8\xda\xd2\x25\xf2\xa9\xdf\xf9\xc1\xbd\xe8\xb5\x27\xb9\xee\x78\x3d\x90\x63\xea\xe3\x13\x82\x46\x2c\xc1\x1b\x7a\x5b\x90\x4e\x80\xd3\x2f\x3a\xef\x55\x69\xc4\x23\xda\x9b\xcb\xcb\x57\xe1\xf9\x1f\x58\x30\x86\x07\x14\x9c\xd4\x15\x3e\x41\x56\x7c\x86\x2e\xa1\x19\x0d\x3f\x1b\xbe\x22\x80\x05\x0d\xab\xc6\xc1\xd4\x9a\x0a\x4a\xf3\xa4\x95\xe1\xa5\xd4\x33\x78\x77\xfb\x11\x84\xb1\x16\x85\x57\xab\x22\x39\x7e\x35\x20\xfd\x2b\x07\x4f\xc6\x3e\x72\x6b\x1a\x1d\x22\x6a\xdd\x7a\x47\x41\xa3\xbd\x54\xf1\x9c\xb4\x22\x4c\xa3\x4a\x78\x40\x98\xca\x25\x96\x11\x33\x6c\x45\xea\x37\x56\xb1\x94\xd2\x73\xd4\xdf\x66\xbb\x25\xfa\xe6\xf8\x14\x0c\x94\xfb\x8d\xc1\x17\xe7\xc7\x68\x1d\x65\xbf\x15\xc6\x68\xb4\x1e\x18\x11\xad\x59\x31\x1a\xad\xb7\xa3\xe1\xe6\x1f\xaf\xdf\x5e\xe5\x07\x23\x31\x58\xee\x98\xd9\x19\x2e\x3d\x46\x85\x89\x36\x39\xf8\xab\x3d\xd8\xb4\x47\x74\x68\xd3\x2e\xa5\x62\xfc\x2f\x00\x00\xff\xff\x49\x00\xe0\xd5\xec\x10\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\x5b\x6f\x1b\xbd\x11\x7d\xd7\xaf\x98\xae\x65\xc4\x2e\xa4\x95\x9c\x7c\x2d\x02\x03\x42\x11\x38\x01\x9a\x97\x34\xc8\xe5\xc9\x30\x08\x9a\x3b\x92\x18\x73\xc9\x0d\xc9\xd5\xa5\x82\xfe\x7b\x31\x24\x57\xda\xd5\xc5\x4e\x53\xf4\xcb\x4b\x24\x72\xe6\x70\x2e\x67\x0e\x29\x2b\x23\xb8\x72\xb0\xe9\x01\xf0\x4a\x32\x5c\x79\xb4\x9a\x2b\x36\xfd\x59\x68\x98\xc0\xd4\xd8\x92\xfb\xab\xec\xd2\xe5\x97\x2e\xcf\x06\xb0\xe0\x36\x17\xaa\x76\x1e\x2d\xd3\xbc\xc4\xb8\x52\x68\xc7\xfe\x6d\x34\x5e\x27\x98\xe0\xbd\xfb\xd7\x86\x19\x56\x56\x2e\xb8\xc7\x5f\x86\x43\x2f\x8a\x2e\xde\x04\xee\xa7\xc6\x82\xd4\x05\xae\x06\x50\xe0\x42\x0a\x04\xa9\xa1\xe2\xe2\x09\x3d\x8b\x0b\xb9\x30\xda\x5b\xa3\x14\x5a\x07\xb7\xed\x00\x08\xf0\xb2\x38\x7b\x7e\x82\xed\x84\xf1\xd0\xeb\x01\xd0\x37\xd4\xde\x4a\x74\x30\x01\x61\xb4\xe0\xfe\xaa\x47\x01\xdd\xf7\x62\x60\x17\x94\xbb\x43\xbb\x40\x0b\x55\xfd\xa8\xa4\x48\x1b\x9b\x5e\x13\x3b\x9d\x11\x73\x08\x85\xcf\x8f\x6a\x3e\xd8\x99\xfa\x75\x95\x4c\xb3\x77\x59\x6b\xd9\xab\x54\x85\x37\xe3\xf1\x7e\xd9\xa2\x30\xb6\xa0\xc8\xce\x96\x21\xff\x6b\xce\x85\x40\xe7\x58\x0c\x8e\xc9\x6a\xf1\x47\x83\xb0\x1d\x9c\x4a\x22\xf6\xea\x97\xb2\xf8\xf3\x82\x8f\x41\x9d\x8a\xfe\x21\xfe\x77\x11\x48\xd3\x69\xcd\x7f\x4b\x98\x17\x53\xde\xd1\xf2\x3e\xc0\x3e\xfc\xef\xa9\xdf\xa7\x38\x4e\xa4\xb9\x43\xdf\xee\xd3\xbc\xee\x6d\x7b\x3d\x8b\xce\xd4\x56\x20\xe8\x5a\x29\xb6\xfb\x96\xb5\xb8\x9a\x85\x24\xbc\x95\xb3\x19\x65\x36\x49\x39\x2d\xb8\xaa\x11\x26\xf0\xc3\x19\x8d\x5a\x98\x02\xaf\x62\x62\x2d\x57\x1a\xbf\x6d\xe7\x98\xac\x53\xb2\x0c\xb2\x56\xd1\xe2\x41\xc2\xd4\xda\x03\xb4\x87\x3f\xcc\xd8\xce\x8e\x05\x8b\x1e\xc0\xdc\x38\xdf\x54\x35\x59\x66\xfd\xcd\xe1\x40\x6e\x87\x7b\xd7\x61\x7f\x13\x9c\xf3\x50\xf2\x6d\xd6\x03\xa8\x14\xd7\xf0\xec\x71\xd4\x8e\x1e\xc0\x94\x0b\xa9\xa4\xa7\xe1\x6d\x0c\xef\xc9\x32\xad\xaf\x1f\x7a\x00\xa6\x42\xcb\xbd\xd4\x33\xe6\xd6\xce\x63\x99\xc0\x64\xb5\x42\xe6\x84\x95\x95\x67\xb5\x55\xf0\x97\x09\x64\x19\xfc\x03\x32\x51\x3b\x6f\x4a\x46\xfb\x59\x4b\x63\xa6\x8a\x7b\xc1\x2d\xbb\x74\x49\x60\x8c\x63\x62\xce\xb5\x46\x45\x15\x7d\x94\x4a\xd1\x19\x62\x2d\x54\x43\x94\xb9\xa9\xad\x5a\x87\x84\xac\xf9\x81\xc2\x33\x59\x74\x12\xda\x2f\xf7\x00\x6a\x87\x96\x15\xdc\xf3\x6e\xd2\xe7\xe2\x24\xcb\x5c\x78\x26\x8c\x9e\xca\x59\xab\x36\x43\xa9\x9d\xe7\x4a\x0d\xe5\x4c\x4b\x2f\x8d\x76\xf7\xad\xfa\x3e\xe4\x16\x75\x81\x16\x0b\xb8\x7d\x0e\xe3\x79\x5f\x52\xce\x0b\xf8\x38\x05\x6d\x3c\x54\x16\x1d\x6a\x4f\xb3\xe7\xe7\x08\x25\xaf\x06\x20\x3d\xe5\xe3\x20\xb6\x9e\x0c\xec\x82\x13\x20\x93\x85\x63\x05\x4e\x79\xad\xfc\x36\x27\xc2\x70\x5b\x2c\xb9\x45\xd6\x35\x0a\x23\x69\x9e\xea\xea\x2a\x11\xfb\x08\x25\x4e\x4f\xd3\x9e\x56\xec\x97\x8b\x6c\x00\xad\xb0\xaf\x07\xe7\x20\x9a\x40\xe2\xe4\xf5\x00\x0e\x8b\x7d\xb2\x05\x74\x1b\xaa\x25\x5f\x3b\x56\xad\xb0\x69\xd5\x94\x2b\x47\x8c\xf4\x7c\xe6\x8e\x99\x4b\xab\xb1\x66\xdf\xe6\xd2\xc1\x92\xaf\xc1\x1b\x98\x73\x5d\x28\x84\x02\x2b\x2a\xab\x16\x44\xe3\x25\x77\x20\xb5\xab\x24\x75\x28\x54\x54\xba\xdb\xe0\x39\xf7\xbe\x72\xb7\xa3\x51\x21\x9d\xa8\x9d\xcb\xe7\xdc\xcd\xa5\x30\xb6\xca\x85\x29\x47\x7e\xe4\x65\xe5\x86\x73\xb3\xf4\x66\x28\xcb\x4a\x61\x89\xda\x0f\x4b\x53\xd4\x0a\x87\xf1\x08\x37\x34\x7a\x88\x65\xad\x42\x01\x46\xaf\xdf\x8c\xff\x36\x7a\x4d\x77\x60\xdc\x65\x46\x37\xf3\xa3\x4d\x81\x54\x1d\x5a\x67\x46\x3f\x90\x5c\x04\x6a\x66\x3b\xb6\x74\x64\xe2\x98\x73\x5d\xdd\x38\x2b\x17\xb4\x44\xdc\x99\x44\x2e\x7a\x2c\x2b\x45\xfa\x38\x95\x0a\x4f\x70\xfa\x0c\x1b\x77\xd1\x75\xfc\x4f\x46\x78\xa0\x67\x67\x03\x6b\x90\xa8\xb5\x52\xe1\x55\xd6\xdf\x54\xdc\xcf\xf3\x58\xd0\xed\x48\xa8\xd1\x31\x78\xbe\xe6\xa5\xca\x7d\x59\xa9\x2c\xd0\x69\xc1\x5b\xda\xbc\xd7\x8b\x23\x7a\xec\xb7\x1a\xcb\x05\x5a\x27\x8d\x3e\x65\x99\xb6\x1a\x4b\x6e\xc5\x1c\x4e\x88\x65\xda\x8a\x43\x92\xb4\x4b\x49\x5d\xaf\x98\xc1\x32\x09\x54\xd4\xfd\x2c\xd8\x38\x37\x67\x4f\xb8\x76\x07\x50\xad\x9b\x84\x50\x1b\xab\xeb\xe0\x53\x19\xe7\x53\xea\xac\xe9\x7c\xd3\xca\xdf\x92\x95\x74\x33\x3d\x4f\xb5\xd3\x14\x3b\xdf\x4a\xea\x23\xc9\x44\x37\xe3\x86\x79\x2f\x52\x2f\xc6\x70\x3e\x62\xa7\x65\x55\xa1\x77\x27\x02\x50\x82\x35\xbb\xbf\xc4\xd1\x74\xd4\xff\x85\xa3\x2f\x71\x33\xf0\xe8\x98\x3a\x17\x70\xc7\x35\xa9\x7c\xed\x10\xe8\x72\x93\xa2\x2b\x58\x46\x43\xfb\x8d\x65\x2c\x5d\x02\xd2\xc2\xfb\x4f\x5f\x9b\x67\x50\x00\x0a\x4f\xab\xce\xcb\x20\x72\x90\xd6\x8f\x5f\x00\xc9\xbe\x30\x25\x97\x9d\xdf\x1c\x27\x1f\x13\xc7\x18\x79\x34\x6b\xde\xfa\x6d\x4c\x4a\x8d\x79\x3e\x63\xae\x9e\x4e\xe5\xaa\x9b\x33\x4c\x26\x90\x71\x5b\xfe\xfd\x8f\xf0\x16\x18\xa6\x8f\xb7\x90\x1d\x22\x98\x2a\x90\xf0\x68\xe0\x0e\x10\x3e\x7c\xbb\x7b\xcf\xbe\x7f\xfa\xfa\xfd\xf3\xe7\x7f\x7d\xf9\xf6\xe1\x3d\x7b\xf7\xe5\xee\x9f\x93\x43\xd8\xf8\xb6\x1d\x4f\x1a\x8d\x4f\xe9\x85\xc4\xc6\x39\xae\x38\x09\x3a\xe9\xfc\x80\x56\x6e\x4e\xda\xdd\x74\xec\xf2\x3c\xdf\x07\x2c\x69\x62\xb8\x62\xc9\x3c\xcc\xb5\x91\xfa\x2a\x1b\x64\x83\x53\xec\x27\x27\x7a\x9b\x37\x2c\x8f\xd3\xfe\x54\x3f\x62\x64\x68\xb7\x85\x54\x71\xed\xaf\x6e\xc6\x03\x88\xcc\xcb\x1f\x8d\xf1\x64\x9d\xef\x5d\x86\xf4\x51\xa1\xbf\x3e\x2f\x36\x2f\xa9\xcd\xd3\x5b\xc7\xa8\xa1\x74\x85\x4b\x41\x6f\xe8\xe8\x24\x64\x61\xe9\xd9\x19\x5d\xd2\x26\x2d\x0e\xe0\x66\x1c\x5d\x1b\xba\x44\x3e\x75\x3b\x7f\x72\x2f\x7a\x1d\x8c\x5c\x5b\x5e\x8f\xc6\x31\xf5\x71\x89\xa0\x11\x0b\xba\xde\x2b\x1b\xe6\x04\x38\x7d\xa2\xf3\x5e\x15\x46\x3c\xa1\xbd\x1d\x8d\x5e\x85\x9f\x2e\x81\x05\x03\x78\x44\xc1\x69\xba\xc2\x57\x90\x25\x9f\xa1\x4b\x68\x46\xc3\xcf\x9a\xaf\x09\x60\x41\x62\x55\x3b\x98\x5a\x53\x42\x61\x96\x5a\x19\x5e\x48\x3d\x83\x77\x77\x1f\x41\x18\x6b\x51\x78\xb5\xce\x93\xe3\x57\x03\xd2\xbf\x72\xb0\x34\xf6\x89\x5b\x53\xeb\x10\x51\xe3\xd6\x39\x0a\x6a\xed\xa5\x8a\xe7\xa4\x15\x61\x6a\x55\xc0\x23\xc2\x54\xae\xb0\x88\x98\x61\x2b\x52\xbf\xb6\x8a\xa5\x94\x9e\xa3\xfe\x2e\xdb\x1d\xd1\xb7\xe7\x55\x30\x50\xee\x37\x84\x2f\xea\x47\x7f\x13\xc7\x7e\x37\x18\xfd\xfe\xe6\x84\x44\x34\x66\x79\xbf\xbf\xd9\x49\xc3\xed\xeb\x37\x6f\xc7\xd9\x91\x24\x06\xcb\x3d\x33\x5b\xe2\xd2\x61\x54\x50\xb4\xc9\xd1\x5f\x1c\x82\x4d\x73\x44\x8b\x36\xcd\x52\x2a\xc6\x7f\x02\x00\x00\xff\xff\x31\xe8\x6b\xd9\xa8\x11\x00\x00"),
 		},
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/outputs.tf": &vfsgen۰CompressedFileInfo{
 			name:             "outputs.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 630,
+			uncompressedSize: 779,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xd0\x51\x6a\xc3\x30\x0c\x80\xe1\x77\x9f\x42\x74\xcf\xf1\x0d\x76\x96\xa2\xca\xea\x6a\xaa\x48\xc6\x96\x0b\x65\xf4\xee\x23\x14\xb6\x24\xdb\x8a\xdf\x0c\xfa\xf5\xd9\xd8\xba\x97\xee\x70\xb8\xf6\x13\x93\xe9\x39\x7f\x4c\x98\xe6\xac\x07\xf8\x0c\x00\x37\x94\xce\xf0\x0e\xb3\xa5\x2e\x1c\x4f\x66\xbe\x84\x71\x5f\x87\x47\x08\xbf\xa5\x61\x63\x39\x0a\xfb\x5a\x49\xda\x8e\xac\x5e\x33\xb7\x2d\x23\x46\x28\x71\x35\x5e\xb6\xde\x9e\xe3\x16\xef\x38\x0b\x90\xa9\xb3\x3a\x9c\xad\x02\x8a\x40\xe2\x22\x76\xe7\x04\x74\xc1\xea\x2d\x7e\x5f\x52\x2c\x4d\x74\x61\xba\x16\xcb\xea\x5c\x8f\x4f\xe5\xf5\xbb\xff\x59\xda\x7f\xc1\x84\x25\x37\xae\xb7\x41\xf5\xcf\x95\xbd\x59\x95\x9d\xdb\xb0\xb7\xc9\xf7\x96\xb0\x0f\x43\x3f\xed\x5a\x21\x94\x4c\x36\x84\x6c\xd2\xf0\x08\x5f\x01\x00\x00\xff\xff\x1f\xb4\x39\xa0\x76\x02\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\xd2\xcf\x6a\xc3\x30\x0c\x06\xf0\x7b\x9e\x42\xb4\x87\xc1\xa0\x7e\x83\xdd\x76\xde\x2b\x04\xd7\xfe\xda\x9a\x2a\x52\xb0\xe5\x8e\x30\xfa\xee\xc3\x64\xac\x6d\xf6\x87\xdc\x02\xfa\xf4\x8b\xb0\xa4\xd5\xc6\x6a\xb4\x39\xd7\x3d\x82\xca\x21\x1d\x77\x3e\x0e\x49\x36\xf4\xd1\x11\x5d\x3c\x57\xd0\x0b\x0d\x1a\x2b\xc3\xed\x55\xad\x05\xdd\x32\xdd\x5d\xbb\xee\xa7\xb4\xda\x68\x9f\x0c\xbb\x57\xa2\x94\x1e\x62\x39\xa1\x3c\x32\xac\xc1\xb3\xbb\x2b\xb7\xae\xed\x5c\x2e\x6e\xf2\x03\x53\x50\x31\x88\xd1\x41\x33\x79\x66\x8a\x18\x59\x27\x44\x0a\x27\x9f\xad\xb8\xef\x9f\x8c\x1a\x77\xe1\x84\x70\x1e\x35\x89\x21\xf7\xb3\xf2\xff\xdc\x7f\x34\x2d\x9f\x60\xe7\xc7\x54\x90\x2f\x2b\xd5\x5f\x5b\x96\x66\x16\x18\xca\x6a\xef\x21\xbe\xb4\x18\xb6\x1a\xba\x65\xef\x95\xe0\x39\x05\x5d\x85\x3c\x44\xe7\x85\xbd\xd6\x61\x98\xe8\xcb\xaa\x05\x91\x4c\x29\x64\x78\x43\x5b\x18\x24\x42\x42\x42\x21\x15\x9e\xba\x2d\xbd\xa9\xd1\xb1\xfa\xec\xc5\xd0\xc2\x27\x6f\xf4\xae\xf2\x64\x6d\xab\x72\xc4\xed\x72\x70\x49\x01\x7d\x8a\x8b\x99\x46\x1f\xce\xb0\x7e\x2e\xbb\x76\x23\x59\x99\x91\x8b\x7b\x76\x29\x76\xd7\xee\x33\x00\x00\xff\xff\x42\xcc\x15\x8c\x0b\x03\x00\x00"),
 		},
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/require.tf": &vfsgen۰CompressedFileInfo{
 			name:             "require.tf",
@@ -4410,9 +4410,9 @@ var vfsgenAssets = func() http.FileSystem {
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/variables.tf": &vfsgen۰CompressedFileInfo{
 			name:             "variables.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 5068,
+			uncompressedSize: 5270,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x58\x6d\x6f\x1b\xb9\x11\xfe\xae\x5f\x31\xd8\x3b\xc0\x0e\x20\xad\x65\xd7\x97\xc4\x46\x5c\x20\x67\xe7\x10\xa3\x4e\xce\xad\x9d\xa2\x68\xaf\x58\x53\xe4\xac\x96\x35\x97\xb3\xe5\x70\x25\xeb\x82\xfc\xf7\x82\xe4\xae\xac\x37\xe7\xec\xe6\x4b\x12\x89\x7c\xe6\x99\xb7\x67\x86\xfa\x01\x2e\x3e\xdf\x80\x43\x49\x4e\xf1\x60\x30\x13\x4e\x8b\x89\x41\xc8\xa4\x69\xd9\xa3\x2b\xac\xa8\x31\x83\xaf\x03\x00\xbf\x68\x10\xba\x3f\x67\xc0\xde\x69\x3b\x1d\x00\x28\x64\xe9\x74\xe3\x35\x59\x38\x83\xec\x8b\xd5\xff\x6d\x11\xba\xeb\x10\xae\xc3\x7e\xe3\xb0\x41\xab\x50\x81\x27\x50\x96\x8b\xdf\xc9\xe2\xab\x6c\xf0\x6d\xd5\x62\xff\xf9\x4b\xac\x05\xf2\xff\x24\x8b\xb0\x8f\xf9\x34\x07\x7c\x10\x75\x63\x30\x97\x54\x6f\xa2\x37\x8e\xfe\x83\xd2\x17\x5a\x25\xfc\x0d\xa0\x6b\x21\xef\xd1\x43\x77\x0a\x2e\x2f\x3a\xc4\xe3\xf1\x4f\x58\xe2\x89\x1c\x49\x89\x27\xa3\x63\xf9\xe6\x70\xf4\xf6\x8d\x3c\x1c\x9d\x1c\x9f\xc8\xa3\x93\xf1\xe4\xe8\x8d\x92\xc9\xd4\x0f\xf0\x99\x14\xae\xc5\x90\xb8\x10\x4e\x56\x7f\xe0\x50\x29\x5a\xe3\xbb\x8f\x33\x51\xab\xd7\xc7\xd9\x36\xbf\x5f\x8c\xf0\x52\x38\x38\x27\xeb\x85\xb6\xe8\xe0\x4a\xdb\xf6\x01\x02\xbe\xf6\x28\x7d\xeb\x30\x04\x57\x5b\xf6\xc2\x18\xd8\x8f\x40\x43\x10\xae\x7e\x7d\xbc\x19\x0b\xe2\x42\x56\xc2\x5a\x34\x2f\xa1\xc6\x3e\xdc\x7e\x01\xb7\xce\xc6\x2a\xad\xd2\x51\x0d\xfb\x09\x69\x08\x13\xf4\x62\x08\xc2\x34\x95\x18\x02\xaa\xe9\x56\x49\x10\x17\x33\x74\xac\xc9\xbe\x84\xa8\x6c\x9d\x43\xeb\x5f\xc0\xb4\x33\xb2\x16\xc0\x92\x5c\x5f\x4f\xb0\x77\x74\x78\x72\x98\xff\x94\x8f\xf7\x60\x04\x8c\x08\x95\xf7\x0d\x9f\x1e\x1c\xcc\xe7\xf3\xbc\x4c\xa0\x23\x13\xa0\x72\x72\xd3\x03\x87\x06\x05\x23\x1f\xbc\x1a\x02\x59\xb3\x80\x80\xa5\xaf\xff\xf1\x61\xc3\x3d\x49\xd6\x3b\x32\x06\x5d\x21\xa9\xb5\x7e\x97\x93\xb6\xad\x27\xe8\xb6\x9c\x3c\xdc\x76\xee\x73\x3c\x09\x54\xc2\x23\x2e\xc3\xbe\xce\x31\x87\x5a\x84\x6e\xe4\xcd\xf8\xae\x10\x08\x56\x5f\x12\xe4\x89\x70\x58\xa3\x17\xa6\x18\xef\x08\x74\xd7\x4e\x31\x98\x56\x62\xc2\x0c\x51\x58\xa1\xb6\xc1\x45\x37\x0f\x58\x24\x90\xa2\x75\xab\x95\xb9\x24\x31\x00\x08\x5d\xe6\xf1\x34\x46\x73\x34\x21\xf2\xda\x4e\xa1\x4f\x2b\x59\xe8\x0c\xd3\x0c\x1d\x7c\xbc\xbd\xbd\xbe\x01\xcd\x50\x0a\x6d\xc2\x39\xd5\xc6\x1e\x11\x30\x69\xa7\xa0\x6d\x04\xc9\x23\xe8\x6d\xa5\x19\x1a\xe1\x65\x15\xce\x73\xdb\x34\xc4\x49\xad\x4a\xfd\x00\xbe\xd2\x7c\x1a\x73\x7e\x7a\x70\x30\xd5\x3e\x0f\x5c\x63\xa6\xe3\x3f\xa6\xda\x1f\x48\xaa\x6b\xed\x95\x2e\xcb\x83\xc9\xeb\xb2\xc4\xa3\xb7\xe2\x28\x22\x7f\xa4\x39\xce\xd0\x0d\xc1\x57\x08\x6d\xc3\xde\xa1\xa8\x23\xaa\x14\x16\xe6\xe4\xee\x53\x89\xcc\x2b\xb4\xf1\x4c\x62\xcd\xe8\x82\x0b\x8a\x90\xc1\x92\x07\x87\x66\x11\xfc\x43\x63\x42\x94\x65\xc4\x96\xad\x9b\x21\xe7\x70\x43\x30\x47\xe0\x8a\x5a\xa3\xa0\xe5\x1e\x63\x59\x7a\x09\x8c\x61\xae\x7d\x45\xad\x5f\x82\x74\x00\x43\x10\x56\x01\xf9\x0a\xdd\x5c\x33\x46\xe8\x1e\x25\x87\x5f\xc8\xf9\xd6\x0a\x8f\x66\x31\x04\xd6\x21\x9b\xa9\x7f\xf3\xae\xcc\x37\x1a\xc0\xa2\x7f\x26\x6d\xed\x7b\xce\xe1\xe8\x04\x41\x04\xfd\x9d\x18\xac\x43\x72\x7c\x25\x3c\xc8\x80\x1f\x2f\x5d\x7a\xa8\x04\xc3\x04\xd1\x42\x43\xcc\x3a\x14\x8d\x27\xb0\xc2\xeb\x59\xb0\xd2\x37\x6e\x5f\x0c\xba\x16\x53\x64\x10\x0c\x54\x96\x5a\x6a\x61\xe0\xd7\x1b\xa0\x54\xa2\xcb\x4a\x19\x46\xf0\x49\xeb\x1f\xa3\x15\x95\x33\x87\xdb\x0a\x1d\x86\x6a\xb0\x94\x54\x74\x1d\x19\xc4\x4c\x68\x13\x4b\x77\x09\x96\xaf\xb4\xc9\x19\x64\xd9\x60\xbb\x31\xae\x48\x0a\xdf\x49\x8d\x21\xa1\x62\xca\x9b\x07\x84\x50\xcb\x90\x8e\x46\x95\xdc\xe8\x8e\x52\x48\x6d\xb4\x5f\xbc\x64\x38\x76\xbd\xd0\x5f\x8d\xb3\x17\x1b\x43\x8b\x68\xb4\x9f\xd0\xda\x7e\x47\x95\x8c\x2c\xd8\xea\xa6\x41\xcf\xbb\x2c\x1b\xcd\x7e\x3f\x99\x7f\xb5\x6d\xff\x7c\x09\xb4\x25\xb8\xe7\x64\x4b\x3d\x85\x25\xf6\x96\xbe\xfc\xeb\xdf\x69\xa6\xa6\x83\xad\x8b\x41\x5b\x65\xc9\x5c\x15\xf7\xb8\xf8\x3f\x68\xdd\xdc\x7c\x84\xa6\x9d\x18\x2d\x21\x00\xc4\x9c\xb7\x8c\x0e\xf6\x24\x39\xdc\xdb\x88\x86\x60\x46\x5f\x28\xed\x9e\x58\x1b\x7c\x95\x24\x45\x69\x87\xd2\x93\x8b\x9d\xec\x10\xa6\x68\xd1\x09\x8f\x0a\x22\x02\xf7\xa5\x3e\x41\x68\x8c\x90\xa8\x60\x5f\xa6\xa0\x30\x30\x4a\x87\x3e\xa8\xf3\x13\xa9\x5d\x63\x64\xd1\x07\xd9\x28\x6a\xdf\xee\xe4\x74\xfe\xf9\x12\xb4\xf5\xe8\x4a\x21\x11\x3e\xdd\x7e\xd9\x86\x7d\x6a\xa8\x1c\xbf\x1d\xef\xb6\xa5\x9b\x42\xb4\x9e\x14\x86\x55\x43\x93\x2d\x6a\xf4\x15\xed\x5e\xa5\x3e\xc5\xaf\x62\x54\x96\x57\x62\xc5\x55\xc4\x1e\x2e\xaf\x67\xc7\x20\x94\x72\xc8\xfc\xa4\xbf\x5b\xd3\xa6\xd4\x8e\xfd\xa8\xa4\xd6\xaa\xcd\xbd\x8e\x54\x21\xb5\xda\x9d\x9e\xf3\xcb\x8b\xbf\x25\x8b\x4e\xd8\x69\x12\x7f\x66\x3d\xb5\xf0\x97\x76\x82\xce\xa2\x47\x86\x86\xd4\x0b\x98\x1c\x8e\xf3\xa3\x7c\x9c\x8f\x0f\x0e\x5f\x6f\x30\x09\x2a\xab\x25\x3e\xc9\xe6\xdd\xbb\x0f\xbf\x5e\x0c\x9e\x45\xa9\x83\xe2\x7c\x70\x5b\x21\x1c\xc6\xb0\xc1\x5c\x1b\x13\xca\xc7\x61\xd4\x73\x15\x0b\xf7\xbe\x9d\x60\x21\x1a\x9d\x24\x3e\x4d\x99\xc3\xb1\xaf\x9e\xbc\x10\x6a\x5c\x59\xce\x07\x81\xcc\x60\xc5\xed\x1d\x2e\x27\x77\xff\xb4\xdb\xdd\xfe\x81\xa0\xa8\x16\xda\x16\xdc\x96\xa5\x7e\xd8\x99\x85\xbf\xb6\xe8\x34\xa6\x46\x4b\xa7\xd3\x28\x8a\x64\xd3\xbd\x25\x57\x61\x79\x8e\x0e\x15\x4c\x16\x4b\xaa\x70\xd1\xf1\xd1\xdc\xab\x56\x6e\x48\x0a\xd3\xed\xe8\x25\x51\xde\x51\xce\x79\x26\xf3\xb5\x33\xaf\xe0\xf9\xb9\x5d\xbb\xb8\xe1\x2e\xda\xf0\x77\xe1\xb0\x21\x17\x96\x8e\x5d\xba\x33\x21\x32\xdb\xee\x7f\x88\x37\xa1\xe5\x30\x35\xc2\x7c\xb1\xc2\x2c\xbc\x96\x0c\x4b\xb0\x50\x05\xfd\x6e\xc0\xb0\x7f\x2e\x8c\x96\xf4\x6a\x5b\x15\x4b\x61\x18\xd7\x79\xd5\xc2\x8a\x29\xd6\x68\x7d\x2c\x3c\xde\x99\x81\x2b\xcd\x3e\x2c\x86\xb1\xee\x42\x05\x72\xe8\xcd\x8a\x9c\xfe\x3d\x6d\x39\x42\x4a\x64\x0e\xec\x12\xde\xea\x84\xd8\x8e\xdf\x9a\xbe\xae\xeb\x05\x29\x2c\x1a\xa7\x67\xc2\x3f\xdd\x08\xd9\x75\x3a\xf0\x48\x27\x70\x0b\x16\xc3\x75\x0e\x62\x9c\x48\x19\x43\xf3\x24\x65\xa3\xf0\x0d\x78\x27\xc2\x28\x7f\x9e\x4c\x76\x09\x13\xd3\xa9\xc3\x69\x1c\x1f\x3b\xb9\x74\xd9\x09\xd6\x57\x1a\xf0\xfd\xe3\x2d\xb8\x12\x0b\x74\xb0\xdf\x65\x82\x03\x33\xef\x5a\xdc\xa1\xd6\xcb\xfc\xaf\xe6\x2c\x9c\x5d\x67\x96\xfa\x31\x82\x17\x5a\xed\xce\xd8\x4d\x83\x52\x97\x8b\x7e\x9f\xad\x84\x53\x73\xe1\x42\xfd\xad\xde\x4d\x0f\x8b\x6e\xc9\xe6\x1c\xde\x43\x2d\x9a\x6e\x00\x05\x8f\xee\x31\xae\x34\xb5\x88\xbd\xb3\xf7\x38\xd9\x47\x3f\xfe\xf8\x55\x5b\x85\x0f\xdf\xf6\xe2\xf2\x17\x0e\xcf\x84\x69\xe3\xc2\x13\xfe\xb3\x62\x07\x2e\x2f\xf2\xf4\xb6\x8d\x7b\x5a\x13\xbe\xb2\x3e\xad\x68\x98\x0c\x86\xe6\x0d\x1b\xe3\x23\x0c\x95\x70\xb7\xe1\x67\xd1\xc5\xe5\x0e\xfa\x50\xe4\xf0\x21\x3d\xb0\x4e\x61\xe3\x2c\x9c\xc1\xd7\x95\xb7\xc2\x68\x0c\x67\xf0\x5b\xf6\x6e\xfd\xd4\x9f\x7f\xcb\xe0\xdb\x76\x16\x6a\xd1\xac\x0d\xff\xd5\x64\x7c\xfd\xf6\xdd\x54\xf4\x14\x9f\x96\xef\xeb\x7e\xf5\x8c\x6e\xf2\x29\x64\x59\x0c\x60\x66\xf1\xc1\x8f\x96\x3b\x61\x96\x0f\x06\x7d\x0a\xc5\x92\xc3\x7a\x50\x63\xf2\xec\x32\xae\xa1\xa9\x50\xf5\x61\xdd\x0c\xde\xdd\xa0\x16\x4d\x0e\xef\x2d\x60\xdd\xf8\x45\x57\xf1\x50\xa3\xb0\x0c\x59\x88\xbd\xa5\x65\x95\xac\x1a\xca\x72\xb8\x5b\xe7\x76\x17\xf3\x35\x90\x15\x11\x07\xc1\x5d\xac\xf1\x8a\x6b\x77\x1d\x5e\x42\x98\x2a\xa1\x21\x32\x7b\x0c\x0a\xc3\x44\x4a\xa1\x0e\x0e\xf7\x5b\xe5\x73\x07\x49\xf7\x1b\xc9\x39\x3a\xaf\x4b\x2d\x85\x5f\xff\xa9\x44\xa2\xf3\x5c\xcc\x84\xd1\x4a\xfb\x45\xd1\xa0\xd3\xa4\x8a\x8a\xda\x27\x14\xed\xef\xdd\xc9\x50\x68\x61\xeb\x8f\x7a\xb5\x82\x1d\xe2\x98\x6e\x3f\x77\xf9\x79\xfb\xe6\xf5\xc6\xf2\xe3\xc5\xf4\xfb\x72\x1a\x0e\xa4\x80\xf5\xe3\xab\x71\xd4\x88\x69\x5c\xfb\x3c\x75\xaf\xee\x94\xe3\x3f\x50\xd1\xad\xfd\x37\xfb\x14\x85\x58\xfd\xbc\x38\xbd\xa2\x7b\xaa\x29\x3c\x73\xb2\x21\x64\xe7\x0e\x03\xfe\xcf\x8b\xd3\x2f\x96\x63\x89\x69\x54\x59\x58\x97\xff\x17\x00\x00\xff\xff\x58\x61\x30\x9d\xcc\x13\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x58\x7d\x6f\x1b\x37\xf2\xfe\x5f\x9f\x62\xb0\x2d\x60\x07\x90\xd6\x2f\x3f\x37\x89\x8d\xe6\x07\xb4\x76\x8a\x18\x97\xa4\xbe\xb3\x73\x38\xdc\xb5\xd8\x50\xe4\xec\x2e\xcf\x5c\xce\x1e\x87\x2b\x59\x0d\xf2\xdd\x0f\x24\x77\x65\xbd\xa6\xf6\xe5\x9f\x24\x12\xf9\xcc\x33\x6f\xcf\x0c\xf5\x1d\x5c\x7d\xbc\x05\x87\x92\x9c\xe2\xd1\x68\x26\x9c\x16\x53\x83\x90\x49\xd3\xb1\x47\x57\x58\xd1\x60\x06\x5f\x46\x00\x7e\xd1\x22\xf4\x7f\xde\x00\x7b\xa7\x6d\x35\x02\x50\xc8\xd2\xe9\xd6\x6b\xb2\xf0\x06\xb2\x4f\x56\xff\xa7\x43\xe8\xaf\x43\xb8\x0e\x87\xad\xc3\x16\xad\x42\x05\x9e\x40\x59\x2e\xfe\x20\x8b\x2f\xb2\xd1\xd7\x55\x8b\xc3\xe7\xcf\xb1\x16\xc8\xff\x93\x2c\xc2\x21\xe6\x55\x0e\xf8\x20\x9a\xd6\x60\x2e\xa9\xd9\x44\x6f\x1d\xfd\x1b\xa5\x2f\xb4\x4a\xf8\x1b\x40\x37\x42\xde\xa3\x87\xfe\x14\x5c\x5f\xf5\x88\x67\xc7\x3f\x60\x89\xe7\x72\x22\x25\x9e\x4f\xce\xe4\xab\x93\xc9\xeb\x57\xf2\x64\x72\x7e\x76\x2e\x4f\xcf\x8f\xa7\xa7\xaf\x94\x4c\xa6\xbe\x83\x8f\xa4\x70\x2d\x86\xc4\x85\x70\xb2\xfe\x13\x87\x4a\xd1\x19\xdf\x7f\x9c\x89\x46\xbd\x3c\xcb\xb6\xf9\xfd\x62\x84\x97\xc2\xc1\x25\x59\x2f\xb4\x45\x07\xef\xb5\xed\x1e\x20\xe0\x6b\x8f\xd2\x77\x0e\x43\x70\xb5\x65\x2f\x8c\x81\xc3\x08\x34\x06\xe1\x9a\x97\x67\x9b\xb1\x20\x2e\x64\x2d\xac\x45\xf3\x1c\x6a\xec\xc3\xed\x67\x70\xeb\x6d\xac\xd2\x2a\x1d\x35\x70\x98\x90\xc6\x30\x45\x2f\xc6\x20\x4c\x5b\x8b\x31\xa0\xaa\xb6\x4a\x82\xb8\x98\xa1\x63\x4d\xf6\x39\x44\x65\xe7\x1c\x5a\xff\x0c\xa6\xbd\x91\xb5\x00\x96\xe4\x86\x7a\x82\x83\xd3\x93\xf3\x93\xfc\x87\xfc\xf8\x00\x26\xc0\x88\x50\x7b\xdf\xf2\xc5\xd1\xd1\x7c\x3e\xcf\xcb\x04\x3a\x31\x01\x2a\x27\x57\x1d\x39\x34\x28\x18\xf9\xe8\xc5\x18\xc8\x9a\x05\x04\x2c\x7d\xf3\x8f\xb7\x1b\xee\x49\xb2\xde\x91\x31\xe8\x0a\x49\x9d\xf5\xbb\x9c\xb4\x5d\x33\x45\xb7\xe5\xe4\xc9\xb6\x73\x1f\xe3\x49\xa0\x12\x1e\x71\x19\x0e\x75\x8e\x39\x34\x22\x74\x23\x6f\xc6\x77\x85\x40\xb0\xfa\x9c\x20\x4f\x85\xc3\x06\xbd\x30\xc5\xf1\x8e\x40\xf7\xed\x14\x83\x69\x25\x26\xcc\x10\x85\x15\x6a\x1b\x5c\x74\xfb\x80\x45\x02\x29\x3a\xb7\x5a\x99\x4b\x12\x23\x80\xd0\x65\x1e\x2f\x62\x34\x27\x53\x22\xaf\x6d\x05\x43\x5a\xc9\x42\x6f\x98\x66\xe8\xe0\xdd\xdd\xdd\xcd\x2d\x68\x86\x52\x68\x13\xce\xa9\x2e\xf6\x88\x80\x69\x57\x81\xb6\x11\x24\x8f\xa0\x77\xb5\x66\x68\x85\x97\x75\x38\xcf\x5d\xdb\x12\x27\xb5\x2a\xf5\x03\xf8\x5a\xf3\x45\xcc\xf9\xc5\xd1\x51\xa5\x7d\x1e\xb8\xc6\x4c\xc7\x7f\x54\xda\x1f\x49\x6a\x1a\xed\x95\x2e\xcb\xa3\xe9\xcb\xb2\xc4\xd3\xd7\xe2\x34\x22\xbf\xa3\x39\xce\xd0\x8d\xc1\xd7\x08\x5d\xcb\xde\xa1\x68\x22\xaa\x14\x16\xe6\xe4\xee\x53\x89\xcc\x6b\xb4\xf1\x4c\x62\xcd\xe8\x82\x0b\x8a\x90\xc1\x92\x07\x87\x66\x11\xfc\x43\x63\x42\x94\x65\xc4\x96\x9d\x9b\x21\xe7\x70\x4b\x30\x47\xe0\x9a\x3a\xa3\xa0\xe3\x01\x63\x59\x7a\x09\x8c\x61\xae\x7d\x4d\x9d\x5f\x82\xf4\x00\x63\x10\x56\x01\xf9\x1a\xdd\x5c\x33\x46\xe8\x01\x25\x87\x5f\xc8\xf9\xce\x0a\x8f\x66\x31\x06\xd6\x21\x9b\xa9\x7f\xf3\xbe\xcc\x37\x1a\xc0\xa2\x7f\x22\x6d\xed\x07\xce\xe1\xe8\x14\x41\x04\xfd\x9d\x1a\x6c\x42\x72\x7c\x2d\x3c\xc8\x80\x1f\x2f\x5d\x7b\xa8\x05\xc3\x14\xd1\x42\x4b\xcc\x3a\x14\x8d\x27\xb0\xc2\xeb\x59\xb0\x32\x34\xee\x50\x0c\xba\x11\x15\x32\x08\x06\x2a\x4b\x2d\xb5\x30\xf0\xeb\x2d\x50\x2a\xd1\x65\xa5\x8c\x23\xf8\xb4\xf3\x8f\xd1\x8a\xca\x99\xc3\x5d\x8d\x0e\x43\x35\x58\x4a\x2a\xba\x8e\x0c\x62\x26\xb4\x89\xa5\xbb\x04\xcb\x57\xda\xe4\x0d\x64\xd9\x68\xbb\x31\xde\x93\x14\xbe\x97\x1a\x43\x42\xc5\x94\xb7\x0f\x08\xa1\x96\x21\x1d\x8d\x2a\xb9\xd1\x1d\xa5\x90\xda\x68\xbf\x78\xce\x70\xec\x7b\x61\xb8\x1a\x67\x2f\xb6\x86\x16\xd1\xe8\x30\xa1\xb5\xfd\x86\x2a\x19\x59\xb0\xd5\x6d\x8b\x9e\x77\x59\x36\x9a\xfd\x61\x32\xff\x62\xdb\xfe\xe5\x12\x68\x4b\x70\x2f\xc9\x96\xba\x82\x25\xf6\x96\xbe\xfc\xeb\xf7\x34\x53\xd3\xc1\xce\xc5\xa0\xad\xb2\x64\xae\x8b\x7b\x5c\xfc\x0f\xb4\x6e\x6f\xdf\x41\xdb\x4d\x8d\x96\x10\x00\x62\xce\x3b\x46\x07\x07\x92\x1c\x1e\x6c\x44\x43\x30\xa3\x2f\x94\x76\x7b\xd6\x06\x5f\x27\x49\x51\xda\xa1\xf4\xe4\x62\x27\x3b\x84\x0a\x2d\x3a\xe1\x51\x41\x44\xe0\xa1\xd4\xa7\x08\xad\x11\x12\x15\x1c\xca\x14\x14\x06\x46\xe9\xd0\x07\x75\xde\x93\xda\x35\x46\x16\x7d\x90\x8d\xa2\xf1\xdd\x4e\x4e\x97\x1f\xaf\x41\x5b\x8f\xae\x14\x12\xe1\xc3\xdd\xa7\x6d\xd8\x7d\x43\xe5\xec\xf5\xf1\x6e\x5b\xba\x2d\x44\xe7\x49\x61\x58\x35\x34\xd9\xa2\x41\x5f\xd3\xee\x55\xea\x43\xfc\x2a\x46\x65\x79\x25\x56\x5c\x4d\xec\xe1\xfa\x66\x76\x06\x42\x29\x87\xcc\x7b\xfd\xdd\x9a\x36\xa5\x76\xec\x27\x25\x75\x56\x6d\xee\x75\xa4\x0a\xa9\xd5\xee\xf4\x5c\x5e\x5f\xfd\x2d\x59\x74\xc2\x56\x49\xfc\x99\x75\x65\xe1\x2f\xdd\x14\x9d\x45\x8f\x0c\x2d\xa9\x67\x30\x39\x39\xce\x4f\xf3\xe3\xfc\xf8\xe8\xe4\xe5\x06\x93\xa0\xb2\x5a\xe2\x5e\x36\x3f\xfe\xf8\xf6\xd7\xab\xd1\x93\x28\xf5\x50\x9c\x8f\xee\x6a\x84\x93\x18\x36\x98\x6b\x63\x42\xf9\x38\x8c\x7a\xae\x62\xe1\xde\x77\x53\x2c\x44\xab\x93\xc4\xa7\x29\x73\x72\xec\xeb\xbd\x17\x42\x8d\x2b\xcb\xf9\x28\x90\x19\xad\xb8\xbd\xc3\xe5\xe4\xee\xff\xed\x76\x77\x78\x20\x28\x6a\x84\xb6\x05\x77\x65\xa9\x1f\x76\x66\xe1\xaf\x1d\x3a\x8d\xa9\xd1\xd2\xe9\x34\x8a\x22\xd9\x74\x6f\xc9\x55\x58\x9e\xa3\x43\x05\xd3\xc5\x92\x2a\x5c\xf5\x7c\x34\x0f\xaa\x95\x1b\x92\xc2\xf4\x3b\x7a\x49\x94\xf7\x94\x73\x9e\xc9\x7c\xed\xcc\x0b\x78\x7a\x6e\xd7\x2e\x6e\xb8\x8b\x36\xfc\x5d\x38\x6c\xc9\x85\xa5\x63\x97\xee\x4c\x89\xcc\xb6\xfb\x6f\xe3\x4d\xe8\x38\x4c\x8d\x30\x5f\xac\x30\x0b\xaf\x25\xc3\x12\x2c\x54\xc1\xb0\x1b\x30\x1c\x5e\x0a\xa3\x25\xbd\xd8\x56\xc5\x52\x18\xc6\x75\x5e\x8d\xb0\xa2\xc2\x06\xad\x8f\x85\xc7\x3b\x33\xf0\x5e\xb3\x0f\x8b\x61\xac\xbb\x50\x81\x1c\x7a\xb3\x26\xa7\xff\x48\x5b\x8e\x90\x12\x99\x03\xbb\x84\xb7\x3a\x21\xb6\xe3\xb7\xa6\xaf\xeb\x7a\x41\x0a\x8b\xd6\xe9\x99\xf0\xfb\x1b\x21\xbb\x49\x07\x1e\xe9\x04\x6e\xc1\x62\xb8\xce\x41\x8c\x13\x29\x63\x68\x9e\xa4\x6c\x12\xbe\x01\xef\x44\x18\xe5\x4f\x93\xc9\x3e\x61\xa2\xaa\x1c\x56\x71\x7c\xec\xe4\xd2\x67\x27\x58\x5f\x69\xc0\x9f\x1e\x6f\xc1\x7b\xb1\x40\x07\x87\x7d\x26\x38\x30\xf3\xae\xc3\x1d\x6a\xbd\xcc\xff\x6a\xce\xc2\xd9\x75\x66\xa9\x1f\x23\x78\xa1\xd5\xee\x8c\xdd\xb6\x28\x75\xb9\x18\xf6\xd9\x5a\x38\x35\x17\x2e\xd4\xdf\xea\xdd\xf4\xb0\xe8\x97\x6c\xce\xe1\x27\x68\x44\xdb\x0f\xa0\xe0\xd1\x3d\xc6\x95\xa6\x11\xb1\x77\x0e\x1e\x27\xfb\xe4\xfb\xef\xbf\x68\xab\xf0\xe1\xeb\x41\x5c\xfe\xc2\xe1\x99\x30\x5d\x5c\x78\xc2\x7f\x56\xec\xc0\xf5\x55\x9e\xde\xb6\x71\x4f\x6b\xc3\x57\xd6\xa7\x15\x0d\x93\xc1\xd0\xbc\x61\x63\x7c\x84\xa1\x12\x3e\x6f\xf8\x59\xf4\x71\xf9\x0c\x43\x28\x72\x78\x9b\x1e\x58\x17\xb0\x71\x16\xde\xc0\x97\x95\xb7\xc2\xe4\x18\xde\xc0\x6f\xd9\x8f\xeb\xa7\xfe\xff\xb7\x0c\xbe\x6e\x67\xa1\x11\xed\xda\xf0\x5f\x4d\xc6\x97\xaf\xdf\x4c\xc5\x40\x71\xbf\x7c\xdf\x0c\xab\x67\x74\x93\x2f\x20\xcb\x62\x00\x33\x8b\x0f\x7e\xb2\xdc\x09\xb3\x7c\x34\x1a\x52\x28\x96\x1c\xd6\x83\x1a\x93\x67\x97\x71\x0d\x4d\x85\x6a\x08\xeb\x66\xf0\x3e\x8f\x1a\xd1\xe6\xf0\x93\x05\x6c\x5a\xbf\xe8\x2b\x1e\x1a\x14\x96\x21\x0b\xb1\xb7\xb4\xac\x92\x55\x43\x59\x0e\x9f\xd7\xb9\x7d\x8e\xf9\x1a\xc9\x9a\x88\x83\xe0\x2e\xd6\x78\xc5\xb5\xbb\x09\x2f\x21\x4c\x95\xd0\x12\x99\x03\x06\x85\x61\x22\xa5\x50\x07\x87\x87\xad\xf2\xa9\x83\xa4\xff\x8d\xe4\x12\x9d\xd7\xa5\x96\xc2\xaf\xff\x54\x22\xd1\x79\x2e\x66\xc2\x68\xa5\xfd\xa2\x68\xd1\x69\x52\x45\x4d\xdd\x1e\x45\xfb\x7b\x7f\x32\x14\x5a\xd8\xfa\xa3\x5e\xad\x60\x87\x38\xa6\xdb\x4f\x5d\x7e\x5e\xbf\x7a\xb9\xb1\xfc\x78\x51\x7d\x5b\x4e\xc3\x81\x14\xb0\x61\x7c\xb5\x8e\x5a\x51\xc5\xb5\xcf\x53\xff\xea\x4e\x39\xfe\x13\x15\xdd\xda\x7f\xb3\x0f\x51\x88\xd5\xcf\x8b\x8b\xf7\x74\x4f\x0d\x85\x67\x4e\x36\x86\xec\xd2\x61\xc0\xff\x79\x71\xf1\xc9\x72\x2c\x31\x8d\x2a\xfb\x7d\x5b\x87\x43\x35\xb7\x68\x55\xb1\x47\xf9\x3e\x88\xfb\x5e\xe7\x1f\xf7\xf4\x54\x8e\xe9\x1e\x50\x2a\x45\xd3\x7b\xeb\x90\xa9\x73\x51\x67\x3e\xe8\xaa\xf6\xf1\xf7\x9d\x0a\xc7\xd0\x74\xec\x87\x27\x5c\xd4\xee\xe9\x02\x84\x05\xb4\x6a\x12\xf6\xea\x3d\x9e\x0b\xbb\xd8\x76\xdb\x76\xc6\x8c\xbe\x8e\xfe\x1b\x00\x00\xff\xff\x4d\x91\x37\xcd\x96\x14\x00\x00"),
 		},
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers": &vfsgen۰DirInfo{
 			name:    "workers",
@@ -4439,9 +4439,9 @@ var vfsgenAssets = func() http.FileSystem {
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/outputs.tf": &vfsgen۰CompressedFileInfo{
 			name:             "outputs.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 166,
+			uncompressedSize: 309,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xca\x2f\x2d\x29\x28\x2d\x51\x50\x2a\xcf\x2f\xca\x4e\x2d\x8a\xcf\xcb\x4f\x49\x2d\x8e\xcf\xc8\x2f\x2e\xc9\x4b\xcc\x4d\x55\x52\xa8\xe6\x52\x50\x28\x4b\xcc\x29\x4d\x55\xb0\x55\x28\x48\x4c\xce\x4e\x2d\x89\x4f\x49\x2d\xcb\x4c\x4e\xd5\x03\xab\xd4\xd3\xd2\x83\xa9\xe5\xaa\xe5\xe2\xc2\x6a\x58\x41\x69\x52\x4e\x66\x72\x7c\x66\x41\x99\x09\x31\xe6\x25\x26\x27\xa7\x16\xa3\xe8\xe2\xaa\xe5\x02\x04\x00\x00\xff\xff\xf4\x5a\x86\xc2\xa6\x00\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x8e\xbd\x6a\x03\x31\x10\x84\x7b\x3d\xc5\x60\x17\x81\x14\x57\xa5\x4d\x97\x3a\xaf\x20\x36\xd2\xe0\x13\xbe\xdb\x15\xd2\xea\x8c\x09\x7e\xf7\xe0\xfc\x41\x20\xc5\xf5\xdf\x7c\xf3\xd9\xf0\x3a\x1c\x87\x8b\xb5\x33\x5b\x54\xcb\xec\x71\xb6\xee\x2a\x2b\x0f\x78\x0f\xc0\x26\xcb\x20\x9e\x51\x25\x9d\xe9\x31\x73\x2b\x89\xd3\x27\x39\x3d\x4e\x3f\x6c\xb8\x85\xf0\xaf\xac\x8e\xb7\xa5\xa4\x58\xea\xf6\xb4\xc7\x27\x29\xb1\xff\x59\xdd\xcd\x47\xbc\x8c\x75\xbd\xe2\xfb\x61\x74\x66\xb8\x21\x35\x8a\x13\x99\x95\x9a\xa9\xa9\xb0\xc3\x74\xb9\x86\x23\x5e\xcd\x71\x1a\xd2\x44\x9d\x77\x78\x16\xc7\xc5\xf4\xc1\x91\x66\xd1\x13\x7f\x63\xbf\xfe\x63\xc9\x7d\x4f\x5e\xc9\xe1\x16\x3e\x02\x00\x00\xff\xff\x07\x17\xf9\x71\x35\x01\x00\x00"),
 		},
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/require.tf": &vfsgen۰CompressedFileInfo{
 			name:             "require.tf",
@@ -4453,16 +4453,16 @@ var vfsgenAssets = func() http.FileSystem {
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/variables.tf": &vfsgen۰CompressedFileInfo{
 			name:             "variables.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 5791,
+			uncompressedSize: 5989,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\xff\x6f\xdb\xb8\xf9\xfe\xdd\x7f\xc5\x0b\xdd\x7d\x90\x16\xb0\x65\x27\x9f\x5c\xef\x12\x34\x03\xda\xb8\xb7\x06\xeb\xda\xec\x9c\xdb\x06\x2c\x07\xf9\x15\xf9\x4a\xe2\x42\x91\x1a\x49\xd9\x71\x8b\xec\x6f\x1f\x48\x4a\xae\xbf\x65\x6b\x7a\x87\xcd\x3f\x19\x12\xf9\xf0\xe1\xf3\x7e\xd7\x37\x70\x29\x5b\xeb\xc8\x0c\x06\x0b\x34\x02\x73\x49\x90\xb0\xf8\x28\x53\x58\x53\x02\x9f\x06\x00\x6e\xd5\x10\x74\xbf\x0b\xb0\xce\x08\x55\x0e\x00\x38\x59\x66\x44\xe3\x84\x56\x70\x01\xc9\xcf\x4a\xfc\xa3\x25\xe8\xb6\x83\xdf\x0e\xcf\x1a\x43\x0d\x29\x4e\x1c\x9c\x06\xae\x6c\xf6\x51\x2b\x7a\x9e\x0c\x1e\x36\x4f\x6c\x8c\xfe\x3b\x31\x97\x09\x1e\xcf\xdb\x01\xbe\x46\x76\x47\x0e\xba\x55\x70\x35\x85\x67\x94\x96\x29\x9c\x4e\xbe\xa3\x82\xce\xd8\x88\x31\x3a\x1b\x9d\xb2\xef\x8f\x47\x3f\x7c\xcf\x8e\x47\x67\xa7\x67\xec\xe4\x6c\x92\x9f\x7c\xcf\x59\x3c\xea\x1b\x78\xaf\x39\xd9\xad\x33\xb5\x96\x5f\x7b\xc5\xa5\x36\x77\x64\xc0\x43\x1c\xba\x66\xa5\xad\xf3\x8f\x77\xaf\x19\xb7\x65\x4c\xb7\xca\x1d\x3a\x55\xb5\x75\x4e\x26\x9c\x5a\x60\x2b\x5d\xf7\xf8\x78\x9f\xc7\xfb\xb0\x12\x74\xd1\x51\xb1\x43\x60\xa8\x20\x27\x60\x15\xaa\x92\x38\x60\xe1\xc8\x2c\xd1\x70\x1b\x84\x27\x49\x8e\x40\x1b\x40\xce\x41\x79\x2d\x76\xb8\x79\x26\xff\x41\x89\x4d\x4e\x49\x8e\x86\x6a\x72\x28\xb3\x49\xf2\xa8\xc5\x84\xb2\x0e\x15\xa3\x88\x59\x68\xf3\x85\x74\x0d\x31\x43\xe8\x08\x5c\x45\x07\xd9\x32\xc9\x32\xab\x44\xd3\x90\xb3\x87\x58\x4b\x61\xdd\xb3\x48\xfd\xf9\x3e\xbb\x4b\xad\x1c\x0a\x45\x06\xde\x09\xd5\xde\xc3\xa5\x56\x85\x28\x61\x0d\xb8\x77\xdb\xbf\xfd\x12\x9d\xe8\xe6\xc3\xf4\xc3\x39\xd4\xa2\x34\x81\x9c\x86\xb9\xa3\xba\x91\xe8\xa8\x10\x92\xe6\xb0\xac\x48\xc1\x0d\x19\x83\x85\x36\x35\xcc\x27\xe9\xf1\xc9\x1c\x84\x05\xdd\x3a\x40\xc5\xa1\xb5\x04\xf3\x4f\xff\x17\xa4\xf8\xe7\xc3\x7c\xf0\x8d\x07\xc1\x85\x16\x1c\x6c\x43\x4c\x14\x2b\xa1\x4a\x98\x8f\x46\xfe\xd2\x23\x89\x39\x49\x3b\x07\x2c\x51\xa8\x08\xee\x05\x59\xa0\xf1\x98\x54\x37\x6e\x95\x6e\x88\x12\x97\x3f\xc5\x88\x07\x2c\x77\xd9\x5a\xa7\x6b\x88\x58\x81\x9d\xb5\xa2\x54\xfe\x5f\xe7\xf5\xc1\x1e\x29\x5c\x1b\xbd\x10\x9c\x80\xe9\xba\x46\xb0\xd4\xa0\x17\x85\xc3\x1d\xad\x2e\x16\x28\x5b\x82\x06\x85\xb1\x80\xb6\x03\x4b\x21\x04\xed\x51\xa1\xf5\x85\xd6\xc5\x30\x47\x73\x31\xcc\xf1\xe3\xc5\x47\xcc\x8f\x76\xbd\x11\x85\x3a\x6c\xd9\xa7\x5c\x65\x87\x99\x77\x0a\x1f\x32\x11\x3c\x05\xf2\x6c\xba\x6c\x75\xb3\x6a\xe8\xc2\x3a\x2c\x85\x2a\xcf\xdf\xeb\x19\xab\x88\xb7\x92\x86\xfe\xb2\xdd\x3b\x6d\xb0\xa4\x8d\x77\xbb\x9c\x45\x73\x4f\x59\x24\x90\xb5\x46\x6e\x90\x5f\xb3\x1e\x00\xf8\x4c\xe4\xe8\x1c\xc4\xf5\x5f\xdf\x8c\x72\xad\x9d\x37\xf8\x8f\x12\x1d\x43\x03\x5a\x41\x17\x39\x7a\x41\x06\xde\xde\xdc\x5c\xcf\xbc\xa9\x0b\x14\xd2\xaf\xe3\x6d\xf0\x3a\x84\xbc\x2d\x41\xa8\x00\x92\x06\xd0\x9b\x4a\x58\x68\xd0\xb1\xca\xaf\xb7\x6d\xd3\x68\x1b\x93\x51\x21\xee\xc1\x55\xc2\x9e\x43\xe5\x5c\x73\x3e\x1e\x97\xc2\xa5\x9e\x6b\xaa\x4d\x39\x0e\x7f\x4a\xe1\xc6\xde\x8c\xc2\x71\x51\x14\xe3\xfc\x45\x51\xd0\xc9\x0f\x78\x12\x90\xdf\xea\x25\x2d\xc8\x0c\x83\xeb\xb5\x8d\x75\x86\xb0\x0e\xa8\x3e\x84\xbd\x4f\x80\x56\x72\xf5\xd9\x3d\x23\x6b\x4b\xc6\x5f\x81\x6b\xb2\xa0\xb4\x03\x43\x72\xe5\xef\x47\x52\x7a\x0b\xb1\x80\xcd\x5a\xb3\xf0\xbe\x34\xd3\xb0\x24\xb0\x95\x6e\x65\x8c\x91\x88\x11\x70\x7d\xa8\x44\x30\x0b\x4b\xe1\x2a\x1f\x4a\x3d\x48\x07\x30\x0c\xb1\xa5\x5d\x45\x66\x29\x2c\x05\xe8\x1e\x25\x85\x1f\xb5\x71\xad\x42\x47\x72\x35\x04\x2b\x7c\x3a\xb2\xce\x9b\x2c\x35\x24\x09\x2d\xa5\x45\x94\x7f\x24\x7d\x36\x48\x15\xb9\x2f\xa4\x2d\x5c\xcf\xd9\x2f\xcd\x09\xd0\xd7\xa8\x5c\x52\xed\x8d\xe3\x2a\x74\xc0\x3c\x7e\xd8\x74\xe5\xa0\x42\x0b\x39\x91\x82\x46\x5b\x2b\xbc\xd3\x38\x0d\x0a\x9d\x58\xf8\x53\x42\xb2\x94\x72\xed\x0c\xa2\xc6\x92\x42\xfc\xe8\xa2\x10\x4c\xa0\x84\x0f\x33\xd0\xd1\xbd\xd7\x9e\x32\x0c\xe0\x79\xeb\x3e\xab\x85\x35\x7f\x71\x9a\xc2\x4d\x45\x86\xbc\x37\x28\x0d\x68\xea\x17\xa7\xdb\xc8\x80\x0b\x14\x32\xb8\xee\x1a\x2c\xdd\x88\xab\x10\x53\xfb\x41\xf5\x4e\x33\x0c\xff\x9d\x06\xa9\x91\x07\x93\x37\xf7\x04\xde\x97\x21\x2e\x85\xc2\xe8\x7a\x27\x3a\x0a\x64\x42\x0a\xb7\x7a\x4a\xb5\xed\x62\xa1\xdf\x1a\x0b\x59\x23\xf5\x2a\x1c\xda\xf7\x19\x42\xed\x1c\xa5\x6d\x86\x86\x55\x4f\xc9\x1e\x41\xb2\x03\x29\xa4\x57\x6c\xb7\x62\x78\x7c\xe1\x88\xb9\xd6\x04\x23\xf6\xb6\x7b\x16\x80\x86\x51\xef\xdd\xf2\xaf\x6d\xe6\xcb\x9d\x22\xf9\x14\x6a\xd1\x57\x9f\xc0\xad\x3b\x63\x93\x96\xb7\x07\x3c\x8b\x48\x43\xc8\xc9\xe1\x10\x50\x36\x15\x0e\x81\x78\xb9\xd7\xa7\x68\x9b\xf9\x70\x13\x5a\x3d\x85\x28\x6b\x8d\x21\xe5\x9e\xc0\xb4\x3b\x64\x4b\x40\xef\xc0\x74\x8f\x75\x23\x09\x8e\x4e\x8e\xcf\x8e\xd3\xef\xd2\xc9\x11\x8c\xc0\x12\x85\x0c\x66\xcf\xc7\xe3\xe5\x72\xb9\x13\xb4\x3e\x97\x75\xe1\x6c\xc7\xcf\x87\x9f\x83\xc1\xa7\xc8\xbd\xe6\x21\xf6\xb7\x5c\xd7\x28\x54\x66\xdb\xa2\x10\xf7\x07\x1b\xcf\x3f\xb5\x64\x04\xd9\x00\x14\x57\xc7\x1c\x14\xfc\x2f\xee\x83\xa5\x90\x32\xc4\xbe\xb2\x4b\x32\xc4\x21\x5f\x01\xd3\x86\xb8\xb2\x29\x4c\x3b\x89\x84\xed\xdd\x35\x95\x9a\xa1\xec\x1a\xd8\x42\xeb\xb4\x53\x31\xb5\x0b\x96\x6e\xad\x79\x0e\xc9\x97\x6b\xbf\xb9\x71\xe7\xba\x77\x6d\x4e\x2c\x74\x38\x07\xef\xf8\x87\xf5\x6b\xf0\x4d\xcc\xa3\x67\x6e\x61\x5a\x5b\x65\x77\xb4\xfa\x8a\xde\x6b\x36\x7b\x0b\x4d\x9b\x4b\xc1\x7c\xa7\x10\xa5\x6d\x2d\x19\x38\xf2\xa2\xed\xd6\x54\x9f\xf8\x05\xa3\x8c\x09\x6e\x0e\xb1\x7f\xf9\xf2\xcd\x87\xe9\xe0\xf2\x6a\xfa\x13\x5c\x5d\x2f\x4e\xc1\xf8\x6e\x72\xa3\x6b\xf1\x97\x33\x8a\x1c\x59\xe8\xa0\x6c\x3a\xb8\xa9\x08\x8e\xad\x83\xab\xeb\xb5\xf1\x0c\x85\x12\xc3\x03\x1d\x2f\x58\x86\x8d\x88\x55\x27\x16\xbe\xe3\x89\xab\x1e\xdd\xd0\x9b\x7b\xe0\xc9\x0c\x36\x04\x39\x60\xb0\x0b\x48\x8e\x27\xe9\xff\xa7\x93\x74\x32\x3e\x7e\xb1\x77\x5d\xd7\x36\x99\xc1\x47\xe6\xa0\x57\xce\xb7\x9b\xce\xdf\xaf\xeb\x8f\x11\x7e\x7a\x75\x35\x85\x49\x8c\x70\xba\x77\x06\x81\x0b\x7b\x17\x3a\xb7\x9c\xbc\xb2\x91\x62\xe3\x43\xcd\x3a\x52\x0e\xd8\x3a\x0a\xbb\x9e\x26\x85\x4b\x54\x47\x6e\xbd\x3e\x78\xf8\x67\x2a\x59\x15\x46\x06\xb3\xf9\xc8\x72\x9e\xc2\x9f\x51\x0a\x0e\xa1\xd7\xb3\xe7\x70\x9b\x38\xd3\xd2\x6d\x32\x84\xdb\xa4\x40\x69\xe9\x36\xd9\xf7\xa5\x5c\x6b\xb9\xe7\xbd\x61\xf5\x63\x42\xf8\xd3\x7f\x85\x18\x6f\xd1\x70\x98\x0a\x7b\x07\xdc\x88\x05\xd9\x90\x18\x86\xbf\xa1\x3a\xff\x43\x65\xac\xfd\x35\xca\xcc\xb4\xe7\x38\x73\xfe\xfd\xf4\xab\xb5\x79\x9a\x38\xd5\x7f\x55\x9c\xac\xb0\x07\xf5\xf9\x8b\xef\x54\x2d\x05\x81\xfa\xe3\x43\xee\x03\xbb\xb2\x8e\xea\x75\x90\x47\xf5\xb8\xef\x8f\x66\xb3\x69\xd4\x90\x93\xcf\x22\xa1\xe1\xec\x97\xd5\x7e\x9e\x8f\xcb\xc6\xb5\x72\xe3\x38\xbb\xf9\x4c\x3c\xb2\x96\x8f\xd6\x5a\xdd\xe8\xd0\x95\xfa\x74\x62\x70\xd9\x23\x79\x22\xa2\xe3\xd2\x09\xf0\xdb\x69\xe4\xf7\x6d\x4b\x14\x13\x57\x68\xe1\x32\xc1\x0f\x0b\x34\x8b\xa3\x68\x3f\x8b\x54\x68\xf8\x12\x0d\x65\xdb\x7b\x63\x79\xed\x26\x7c\x9b\xc2\x2b\xa8\xb1\xf1\x63\x80\x89\x77\xbc\xa3\x50\x81\x6b\x0c\xe5\xef\x28\x4e\x8f\xa3\x6f\xbf\xfd\x24\x14\xa7\xfb\x87\xa3\xa0\x61\x9c\x67\xfd\xb4\x28\x6c\x54\xe6\xf3\x19\x70\x35\x4d\xe3\x77\x9b\xd0\x5f\x37\xfe\x95\x72\xb1\xb5\xa6\x78\x98\xb7\x40\xaf\x69\x84\xd1\x05\xcc\x77\xee\x98\x75\x9a\xcc\xa1\x97\x21\x85\x37\xb1\xc5\x38\x87\x9d\xb5\x70\x01\x9f\xba\x41\x77\x34\x81\x0b\xb8\x4d\x5e\x6e\xaf\xf8\xdd\x6d\x02\x0f\xfb\xea\xd7\xd8\x6c\xd5\xbc\x4d\x23\x7c\x7a\xf8\xb7\x26\xe8\xe9\x3d\x5e\xdf\xae\xfb\x71\xa1\x77\x88\x24\x09\xe2\x25\x8a\xee\xdd\x68\xdd\xc7\x27\xe9\x60\xd0\x9b\x0e\xd7\x1c\xb6\x05\x0d\x46\x53\x6b\x4d\x7d\xad\x26\xde\x4b\xba\x2b\xdc\x7c\x50\x63\x93\xc2\x2b\x15\xbf\x35\x74\xc5\x0c\x6a\x42\x65\x21\xf1\xba\x2b\xbd\xf6\x8e\xcd\x83\x92\x14\xe6\xdb\xdc\xe6\xc1\x56\x03\x56\x69\x6d\x7d\xf4\xac\xb6\x78\x85\x51\xa9\xf6\xd3\x2b\x45\x2f\xd8\xf8\xc0\x76\x64\xfb\x48\x09\x8a\xfb\x7b\xf7\x03\xc1\x97\x16\xdc\x9d\x2a\xcb\x85\xf5\x7f\xb2\xbc\x6c\x0e\xba\xff\x34\xbe\x87\xd7\xbf\xbf\xf6\x31\xdd\x7d\xef\x88\x8e\xb8\xd4\x5d\xba\xc3\x6e\x7c\x63\x5a\x29\x62\x21\x7e\xbb\x70\xf1\xdb\x1a\x22\x13\xf6\x84\x6f\x58\x18\x1f\x0a\x1b\x93\x64\xfc\xc0\x45\x62\x41\x20\x94\x0b\xfd\x09\x38\x83\x7e\xc8\x03\x2e\x0c\x31\x17\x17\x75\x78\x24\xd1\xfa\x59\xf7\xea\xda\x7e\x7d\x66\x74\x58\x1e\x8e\xf5\x77\xeb\x8f\x22\xa5\x8d\x54\xfb\xb4\xd6\x18\xdd\x60\x89\x1d\x99\xe8\x33\xc1\x51\x84\x0d\x86\xd9\x27\xb3\xd7\xf9\x6d\x7d\x43\x4b\xfe\x88\x0a\x4b\xe2\xaf\x57\xe7\xef\xf4\x9d\xae\xb5\x9f\x7b\x93\x21\x24\x97\x31\xcd\xbe\x5e\x9d\xff\xac\xe2\x57\x30\x41\x3c\xf9\x65\xf0\x30\xf8\x57\x00\x00\x00\xff\xff\x09\x07\x56\xdf\x9f\x16\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\x6d\x6f\x1b\xb9\x11\xfe\xae\x5f\x31\xd8\x5c\xe1\x04\x90\xd6\xb2\xeb\x4b\xce\x46\x5c\x20\xb1\x72\x8d\xd1\xbc\xb8\x27\x5f\x5b\xa0\x3e\xac\x66\xc9\xd9\x5d\xd6\x5c\x72\x4b\x72\x25\x2b\x81\xfb\xdb\x0b\x92\xbb\x8a\xde\xdc\xc6\xb9\x43\xeb\x4f\x86\x96\x9c\x79\xe6\x99\x77\x3e\x81\x0b\xd9\x5a\x47\x66\x30\x98\xa3\x11\x98\x4b\x82\x84\xc5\x9f\x32\x85\x35\x25\xf0\x79\x00\xe0\x96\x0d\x41\xf7\x77\x0e\xd6\x19\xa1\xca\x01\x00\x27\xcb\x8c\x68\x9c\xd0\x0a\xce\x21\xf9\x59\x89\x7f\xb6\x04\xdd\x75\xf0\xd7\xe1\x69\x63\xa8\x21\xc5\x89\x83\xd3\xc0\x95\xcd\x3e\x69\x45\xcf\x92\xc1\xfd\xba\xc6\xc6\xe8\x7f\x10\x73\x99\xe0\x51\xdf\x96\xe0\x2b\x64\xb7\xe4\xa0\x3b\x05\x97\x13\x78\x4a\x69\x99\xc2\xc9\xf8\x7b\x2a\xe8\x94\x8d\x18\xa3\xd3\xd1\x09\x7b\x71\x34\xfa\xe1\x05\x3b\x1a\x9d\x9e\x9c\xb2\xe3\xd3\x71\x7e\xfc\x82\xb3\xa8\xea\x09\x7c\xd0\x9c\xec\x86\x4e\xad\xe5\xb7\x9a\xb8\xd0\xe6\x96\x0c\x78\x11\xfb\xcc\xac\xb4\x75\xfe\xe7\x6d\x33\xe3\xb5\x8c\xe9\x56\xb9\x7d\x5a\x55\x5b\xe7\x64\x82\xd6\x02\x5b\xe9\xba\x9f\x8f\x76\x71\x7c\x08\x27\x41\x17\x1d\x14\x3b\x04\x86\x0a\x72\x02\x56\xa1\x2a\x89\x03\x16\x8e\xcc\x02\x0d\xb7\x81\x78\x92\xe4\x08\xb4\x01\xe4\x1c\x94\xe7\x62\x0b\x9b\x47\xf2\x5f\x98\x58\xc7\x94\xe4\x68\xa8\x26\x87\x32\x1b\x27\x0f\x7a\x4c\x28\xeb\x50\x31\x8a\x32\x0b\x6d\xbe\x12\xae\x21\x66\x08\x1d\x81\xab\x68\x2f\x5a\x26\x59\x66\x95\x68\x1a\x72\x76\x1f\x6a\x29\xac\x7b\x1a\xa1\x3f\xdb\x45\x77\xa1\x95\x43\xa1\xc8\xc0\x3b\xa1\xda\x3b\xb8\xd0\xaa\x10\x25\xac\x04\xee\x58\xfb\xf7\x5f\x62\x10\x5d\x7f\x9c\x7c\x3c\x83\x5a\x94\x26\x80\xd3\x30\x73\x54\x37\x12\x1d\x15\x42\xd2\x0c\x16\x15\x29\xb8\x26\x63\xb0\xd0\xa6\x86\xd9\x38\x3d\x3a\x9e\x81\xb0\xa0\x5b\x07\xa8\x38\xb4\x96\x60\xf6\xf9\x77\x81\x8a\x7f\xdd\xcf\x06\x4f\xbc\x10\x9c\x6b\xc1\xc1\x36\xc4\x44\xb1\x14\xaa\x84\xd9\x68\xe4\x8d\x1e\x49\xcc\x49\xda\x19\x60\x89\x42\x45\xe1\x9e\x90\x39\x1a\x2f\x93\xea\xc6\x2d\xd3\x35\x52\xe2\xf1\xc7\x38\x71\x8f\xe7\x2e\x5a\xeb\x74\x0d\x51\x56\x40\x67\xad\x28\x95\xff\xaf\x8b\xfa\xe0\x8f\x14\xae\x8c\x9e\x0b\x4e\xc0\x74\x5d\x23\x58\x6a\xd0\x93\xc2\xe1\x96\x96\xe7\x73\x94\x2d\x41\x83\xc2\x58\x40\xdb\x09\x4b\x21\x24\xed\x41\xa1\xf5\xb9\xd6\xc5\x30\x47\x73\x3e\xcc\xf1\xd3\xf9\x27\xcc\x0f\xb6\xa3\x11\x85\xda\xef\xd9\xc7\x98\xb2\x85\xcc\x07\x85\x4f\x99\x28\x3c\x05\xf2\x68\xba\x6a\x75\xbd\x6c\xe8\xdc\x3a\x2c\x85\x2a\xcf\x3e\xe8\x29\xab\x88\xb7\x92\x86\xde\xd8\xee\x9b\x36\x58\xd2\xda\xb7\x6d\xcc\xa2\xb9\xa3\x2c\x02\xc8\x5a\x23\xd7\xc0\xaf\x50\x0f\x00\x7c\x25\x72\x74\x06\xe2\xea\x6f\x6f\x46\xb9\xd6\xce\x3b\xfc\x47\x89\x8e\xa1\x01\xad\xa0\xcb\x1c\x3d\x27\x03\x6f\xaf\xaf\xaf\xa6\xde\xd5\x05\x0a\xe9\xcf\xf1\x36\x44\x1d\x42\xde\x96\x20\x54\x10\x92\x06\xa1\xd7\x95\xb0\xd0\xa0\x63\x95\x3f\x6f\xdb\xa6\xd1\x36\x16\xa3\x42\xdc\x81\xab\x84\x3d\x83\xca\xb9\xe6\xec\xf0\xb0\x14\x2e\xf5\x58\x53\x6d\xca\xc3\xf0\x4f\x29\xdc\xa1\x77\xa3\x70\x5c\x14\xc5\x61\xfe\xbc\x28\xe8\xf8\x07\x3c\x0e\x92\xdf\xea\x05\xcd\xc9\x0c\x43\xe8\xb5\x8d\x75\x86\xb0\x0e\x52\x7d\x0a\xfb\x98\x00\xad\xe4\xf2\x4b\x78\x46\xd4\x96\x8c\x37\x81\x6b\xb2\xa0\xb4\x03\x43\x72\xe9\xed\x23\x29\xbd\x87\x58\x90\xcd\x5a\x33\xf7\xb1\x34\xd5\xb0\x20\xb0\x95\x6e\x65\xcc\x91\x28\x23\xc8\xf5\xa9\x12\x85\x59\x58\x08\x57\xf9\x54\xea\x85\x74\x02\x86\x21\xb7\xb4\xab\xc8\x2c\x84\xa5\x20\xba\x97\x92\xc2\x8f\xda\xb8\x56\xa1\x23\xb9\x1c\x82\x15\xbe\x1c\x59\xe7\x5d\x96\x1a\x92\x84\x96\xd2\x22\xd2\x3f\x92\xbe\x1a\xa4\x8a\xdc\x57\xc2\x16\xae\xc7\xec\x8f\xe6\x04\xe8\x7b\x54\x2e\xa9\xf6\xce\x71\x15\x3a\x60\x5e\x7e\xb8\x74\xe9\xa0\x42\x0b\x39\x91\x82\x46\x5b\x2b\x7c\xd0\x38\x0d\x0a\x9d\x98\x7b\x2d\xa1\x58\x4a\xb9\x0a\x06\x51\x63\x49\x21\x7f\x74\x51\x08\x26\x50\xc2\xc7\x29\xe8\x18\xde\xab\x48\x19\x06\xe1\x79\xeb\xbe\xb0\x85\x35\x7f\x7e\x92\xc2\x75\x45\x86\x7c\x34\x28\x0d\x68\xea\xe7\x27\x9b\x92\x01\xe7\x28\x64\x08\xdd\x95\xb0\x74\x2d\xaf\x42\x4e\xed\x26\xd5\x3b\xcd\x30\xfc\xef\x34\x48\x8d\x3c\xb8\xbc\xb9\x23\xf0\xb1\x0c\xf1\x28\x14\x46\xd7\x5b\xd9\x51\x20\x13\x52\xb8\xe5\x63\xba\x6d\x97\x0b\xfd\xd5\xd8\xc8\x1a\xa9\x97\x41\x69\x3f\x67\x08\xb5\xa5\x4a\xdb\x0c\x0d\xab\x1e\x53\x3d\x02\x65\x7b\x4a\x48\xcf\xd8\x76\xc7\xf0\xf2\x85\x23\xe6\x5a\x13\x9c\xd8\xfb\xee\x69\x10\x34\x8c\x7c\x6f\xb7\x7f\x6d\x33\xdf\xee\x14\xc9\xc7\x40\x8b\xb1\xfa\x08\x6c\x9d\x8e\x75\x58\xde\x1f\xf0\x34\x4a\x1a\x42\x4e\x0e\x87\x80\xb2\xa9\x70\x08\xc4\xcb\x9d\x39\x45\xdb\xcc\xa7\x9b\xd0\xea\x31\x40\x59\x6b\x0c\x29\xf7\x08\xa4\x9d\x92\x0d\x02\x7d\x00\xd3\x1d\xd6\x8d\x24\x38\x38\x3e\x3a\x3d\x4a\xbf\x4f\xc7\x07\x30\x02\x4b\x14\x2a\x98\x3d\x3b\x3c\x5c\x2c\x16\x5b\x49\xeb\x6b\x59\x97\xce\xf6\xf0\xd9\xf0\x4b\x32\xf8\x12\xb9\x33\x3c\xc4\xf9\x96\xeb\x1a\x85\xca\x6c\x5b\x14\xe2\x6e\xef\xe0\xf9\xe7\x96\x8c\x20\x1b\x04\xc5\xd3\xb1\x06\x85\xf8\x8b\xf7\x60\x21\xa4\x0c\xb9\xaf\xec\x82\x0c\x71\xc8\x97\xc0\xb4\x21\xae\x6c\x0a\x93\x8e\x22\x61\xfb\x70\x4d\xa5\x66\x28\xbb\x01\xb6\xd0\x3a\xed\x58\x4c\xed\x9c\xa5\x1b\x67\x9e\x41\xf2\xf5\xdc\xaf\x5f\xdc\x32\xf7\xb6\xcd\x89\x85\x09\x67\xaf\x8d\x7f\x5a\x7d\x06\x3f\xc4\x3c\xa8\x73\x43\xa6\xb5\x55\x76\x4b\xcb\x6f\x98\xbd\xa6\xd3\xb7\xd0\xb4\xb9\x14\xcc\x4f\x0a\x91\xda\xd6\x92\x81\x03\x4f\xda\x76\x4f\xf5\x85\x5f\x30\xca\x98\xe0\x66\x1f\xfa\x97\x2f\xdf\x7c\x9c\x0c\x2e\x2e\x27\x3f\xc1\xe5\xd5\xfc\x04\x8c\x9f\x26\xd7\xa6\x16\x6f\x9c\x51\xe4\xc8\x42\x27\xca\xa6\x83\xeb\x8a\xe0\xc8\x3a\xb8\xbc\x5a\x39\xcf\x50\x68\x31\x3c\xc0\xf1\x84\x65\xd8\x88\xd8\x75\x62\xe3\x3b\x1a\xbb\xea\xc1\x0b\xbd\xbb\x07\x1e\xcc\x60\x8d\x90\x3d\x0e\x3b\x87\xe4\x68\x9c\xfe\x3e\x1d\xa7\xe3\xc3\xa3\xe7\x3b\xe6\xba\xb6\xc9\x0c\x3e\xb0\x07\xbd\x72\x7e\xdc\x74\xde\xbe\x6e\x3e\x46\xf8\xe9\xd5\xe5\x04\xc6\x31\xc3\xe9\xce\x19\x04\x2e\xec\x6d\x98\xdc\x72\xf2\xcc\x46\x88\x8d\x4f\x35\xeb\x48\x39\x60\xab\x2c\xec\x66\x9a\x14\x2e\x50\x1d\xb8\xd5\xf9\x10\xe1\x5f\xa0\x64\x55\x58\x19\xcc\xfa\x4f\x96\xf3\x14\xfe\x82\x52\x70\x08\xb3\x9e\x3d\x83\x9b\xc4\x99\x96\x6e\x92\x21\xdc\x24\x05\x4a\x4b\x37\xc9\x6e\x2c\xe5\x5a\xcb\x9d\xe8\x0d\xa7\x1f\x22\xc2\x6b\xff\x15\x64\xbc\x45\xc3\x61\x22\xec\x2d\x70\x23\xe6\x64\x43\x61\x18\xfe\x86\xec\xfc\x1f\x99\xb1\xf6\xd7\x30\x33\xd5\x1e\xe3\xd4\xf9\xef\x93\x6f\xe6\xe6\x71\xe4\x54\xff\x53\x72\xb2\xc2\xee\xe5\xe7\xaf\x7e\x52\xb5\x14\x08\xea\xd5\x87\xda\x07\x76\x69\x1d\xd5\xab\x24\x8f\xec\x71\x3f\x1f\x4d\xa7\x93\xc8\x21\x27\x5f\x45\xc2\xc0\xd9\x1f\xab\xfd\x3e\x1f\x8f\x1d\xd6\xca\x1d\xc6\xdd\xcd\x57\xe2\x91\xb5\x7c\xb4\xe2\xea\x5a\x87\xa9\xd4\x97\x13\x83\x8b\x5e\x92\x07\x22\x3a\x2c\x1d\x01\xbf\x1d\x47\xfe\xde\x26\x45\xb1\x70\x85\x11\x2e\x13\x7c\x3f\x41\xd3\xb8\x8a\xf6\xbb\x48\x85\x86\x2f\xd0\x50\xb6\x79\x37\xb6\xd7\x6e\xc3\xb7\x29\xbc\x82\x1a\x1b\xbf\x06\x98\x68\xe3\x2d\x85\x0e\x5c\x63\x68\x7f\x07\x71\x7b\x1c\x7d\xf7\xdd\x67\xa1\x38\xdd\xdd\x1f\x04\x0e\xe3\x3e\xeb\xb7\x45\x61\x23\x33\x5f\x74\xc0\xe5\x24\x8d\xef\x36\x61\xbe\x6e\xfc\x27\xe5\xe2\x68\x4d\x51\x99\xf7\x40\xcf\x69\x14\xa3\x0b\x98\x6d\xd9\x98\x75\x9c\xcc\xa0\xa7\x21\x85\x37\x71\xc4\x38\x83\xad\xb3\x70\x0e\x9f\xbb\x45\x77\x34\x86\x73\xb8\x49\x5e\x6e\x9e\xf8\xc3\x4d\x02\xf7\xbb\xec\xd7\xd8\x6c\xf4\xbc\x75\x27\x7c\xbe\xff\x8f\x2e\xe8\xe1\x3d\xdc\xdf\xae\xfa\x75\xa1\x0f\x88\x24\x09\xe4\x25\x8a\xee\xdc\x68\x35\xc7\x27\xe9\x60\xd0\xbb\x0e\x57\x18\x36\x09\x0d\x4e\x53\x2b\x4e\x7d\xaf\x26\xde\x53\xba\x4d\xdc\x6c\x50\x63\x93\xc2\x2b\x15\xdf\x1a\xba\x66\x06\x35\xa1\xb2\x90\x78\xde\x95\x5e\x45\xc7\xba\xa2\x24\x85\xd9\x26\xb6\x59\xf0\xd5\x80\x55\x5a\x5b\x9f\x3d\xcb\x0d\x5c\x61\x55\xaa\xfd\xf6\x4a\x31\x0a\xd6\x1e\xd8\x0e\x6c\x9f\x29\x81\x71\x6f\x77\xbf\x10\x7c\x6d\xc3\xdd\xea\xb2\x5c\x58\xff\x4f\x96\x97\xcd\xde\xf0\x9f\xc4\xef\xf0\xfa\x8f\x57\x3e\xa7\xbb\xf7\x8e\x18\x88\x0b\xdd\x95\x3b\xec\xd6\x37\xa6\x95\x22\x16\xf2\xb7\x4b\x17\x7f\xad\x21\x32\xe1\x4e\x78\xc3\xc2\xf8\xa3\xb0\xb1\x48\xc6\x07\x2e\x12\x73\x02\xa1\x5c\x98\x4f\xc0\x19\xf4\x4b\x1e\x70\x61\x88\xb9\x78\xa8\x93\x47\x12\xad\xdf\x75\x2f\xaf\xec\xb7\x57\x46\x87\xe5\xfe\x5c\x7f\xb7\x7a\x14\x29\x6d\x84\xda\x97\xb5\xc6\xe8\x06\x4b\xec\xc0\xc4\x98\x09\x81\x22\x6c\x70\xcc\x2e\x98\x9d\xc9\x6f\xe3\x0d\x2d\x79\x8f\x0a\x4b\xe2\xaf\x97\x67\xef\xf4\xad\xae\xb5\xdf\x7b\x93\x21\x24\x17\xb1\xcc\xbe\x5e\x9e\xfd\xac\xe2\x2b\x98\x20\x9e\xfc\xb2\x69\x40\xd0\x9f\xf1\xf0\xca\x9a\xf5\x8b\xc9\x96\x2d\xef\xf1\x96\xd6\xc3\x27\x62\x8e\x77\x40\xc7\x18\xef\x1f\x81\x0c\x59\xdd\x9a\x50\xb8\xde\x8b\xb2\x72\xdd\x4b\xe4\x10\xea\xd6\xba\x7e\x9f\x0f\xee\xca\x97\x80\x0a\x48\xf1\x91\x9f\x53\x1f\xb0\x1a\xd5\x72\xd7\x64\xd5\x4a\x39\xb8\x1f\xfc\x3b\x00\x00\xff\xff\xd6\x94\x77\x23\x65\x17\x00\x00"),
 		},
 		"/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/workers/workers.tf": &vfsgen۰CompressedFileInfo{
 			name:             "workers.tf",
 			modTime:          time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC),
-			uncompressedSize: 2679,
+			uncompressedSize: 2867,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x4d\x6f\x23\x37\x0c\xbd\xcf\xaf\x60\xb5\x1b\x20\x06\x9c\x49\x16\xed\x16\x45\x00\x23\x68\x2f\x45\x2f\xc5\x02\xed\x6d\xb1\x10\xe4\x11\xc7\xd6\x5a\x23\x09\xa2\xc6\x89\x61\xf8\xbf\x17\xfa\xf2\x47\xc6\x6e\x9b\x53\x2c\x3e\x72\xc8\xc7\x47\x4a\x1e\xc9\x8e\xbe\x43\x60\x4e\x74\x1b\x0c\x5c\xe2\x56\x75\xc8\x80\x19\x2b\x91\x18\xec\x1b\x80\xce\x8e\x26\xc0\xd9\xdf\x02\xb6\xc2\xb7\xaf\xd6\x6f\xd0\xf3\x64\x6d\x00\xd6\x96\x82\x11\x03\x9e\xa1\xd8\xc7\x7d\x04\x76\x7a\xa4\x80\x9e\x47\xeb\xe1\x21\x9f\x39\x6b\x75\x39\xc8\x71\x1e\x3e\xee\x53\xa4\x56\x19\x89\x6f\x07\xd6\x00\x38\x2d\x0c\x4c\xbf\x1b\x76\x0e\x1b\x80\x5e\x74\x4a\xab\xa0\x90\x8e\xd6\xaf\xd1\x5c\xce\x77\xdf\x1a\x00\xeb\xd0\x8b\xa0\xcc\x8a\xd3\x8e\x02\x0e\x25\x82\x72\x6f\xc8\xa9\xf3\xca\x05\x3e\x7a\x0d\x3f\x2c\x80\x31\x78\x01\xd6\x8d\x14\xec\xc0\xa3\x9d\xc1\x33\xf4\xd6\x0f\x22\xdc\xb3\x5e\x8b\xd0\x09\xcf\xef\x88\xcd\x53\x00\x4b\xbc\x5b\x0b\x63\x50\xcf\x1a\x80\xa5\xd2\x3a\x7e\xa3\xdb\x75\x1a\x4b\xe5\x6b\x3b\x7a\xbd\x4b\x55\x78\xfb\x1d\xbb\xc0\x95\xbc\xa8\xe2\x74\xdc\x00\xbc\x4f\xe8\x7a\x9e\x0d\x80\xd0\xaf\x62\x47\xdc\xbd\xe1\x31\x58\x2f\x34\x45\x3e\x46\x42\xcf\xa5\x08\xe2\x92\xad\x5b\xb5\x46\x64\xdb\x05\xde\x59\xd3\xab\x55\xab\x0c\x05\xa1\xf5\x83\x5a\x19\x15\x94\x35\xd4\x7a\x34\x12\x3d\x4a\x78\x9e\x60\x27\x98\xa6\x01\xf8\x00\x7f\xf4\x60\x6c\x00\xe7\x91\xd0\x04\x50\x06\xc2\x1a\x61\x10\x6e\x0e\x2a\xc4\xfc\x08\x72\xf3\x23\xc0\x6f\x45\x8c\xc1\x95\x24\x2e\xb1\x17\xa3\x0e\x87\x36\xca\x48\x78\xf9\x2a\x3c\xf2\x4b\x10\x2c\x40\x5b\xbb\x19\xdd\x7d\x13\x6b\xbb\x12\x65\x9e\x0c\xb5\x65\x45\x54\x77\x5b\x36\x87\x33\x5d\xcd\xe6\xb7\xdc\x6b\x12\x11\x30\x8b\xf5\x04\xb1\xa2\xaa\x38\xb1\xa2\xe6\xd0\x34\x89\x5d\x76\x24\x82\x01\x9b\xd0\x56\x27\xc6\x84\x48\xc1\x22\x53\x17\x70\x70\x5a\x04\xe4\xbd\xd2\x58\xa9\x3e\x91\x77\x68\x9a\x0f\xf0\xf7\x1a\x09\x21\x07\x26\x10\x1e\x23\x61\x32\xd6\x93\x58\xec\x15\x05\x58\x5a\x1b\xe6\x10\x2c\xf8\xd1\x40\x11\xe5\x43\x09\x57\x92\xbb\xf8\xd4\x29\xc1\x9c\x56\x35\x46\xd5\x28\x8d\xf7\xec\xe3\xde\x89\xb0\x6e\x07\x2b\x47\x8d\x87\xc7\x4e\x3f\xd6\xe4\x76\x62\xd0\x6d\x18\x9c\x66\x89\x8c\xad\xf0\x91\x8c\x7d\x62\xef\xa4\xfe\xc9\x6c\x9e\x4c\x15\xb9\x45\x4f\xca\x9a\x6b\xc8\x62\xaa\x48\xe1\xbb\x35\x5c\x99\xf7\x62\xca\xed\x2d\x93\xa8\x95\x19\xdf\xb8\xc5\xa1\x8c\x5b\xde\x5e\x2c\x61\x88\xd6\x7c\x83\x3b\x7a\x17\xea\x3b\x59\x83\xa6\xb3\x12\xef\x63\xd4\x8a\x9a\x25\x1f\x67\x29\x94\xd2\x79\xed\x65\xed\xde\xbf\x0a\x1f\xe0\x10\xfb\x37\xd9\xa3\xcb\x95\xe3\x84\x14\xeb\x63\xc0\x96\x2b\x77\x75\x95\xe6\x02\xa5\x22\xb1\xd4\x18\x7d\x60\xb1\x80\xe0\x47\x84\x17\x78\x82\xe7\x6b\x6b\x36\x2f\xe8\xe3\x36\x59\xc0\xc5\xe2\x6e\xd3\xda\xfe\x7a\xa6\xf8\x6f\x6d\xda\x30\x42\x4a\x8f\x44\xbc\x17\x83\xd2\xbb\x48\x99\x72\xdb\x9f\x58\xd6\xde\x6f\xbf\x7f\x81\xe8\x08\x5a\x2c\x51\x53\xdb\x68\xdb\x09\x4d\x29\xe3\x61\xc7\x05\x45\x2e\xea\x64\x0d\x18\x59\x5a\xb6\xa3\x51\xb1\x81\xd8\x86\xfe\x71\xd8\x3d\x08\x32\x8b\x3b\xc9\xe6\x99\xb3\x92\x54\x59\x72\x75\xd9\xb5\x91\x95\xc2\xe5\x53\x2b\xc8\xcc\xd2\xde\xf8\x92\xc0\x65\xb7\xe5\x3d\xf1\xeb\x5f\x7f\xc2\xcf\x9f\x3f\xff\xf8\x04\x82\x92\xfe\x3d\x0e\x36\x60\x3a\x8f\x23\x91\x12\x8c\x79\xc7\x95\xe1\x10\xfd\xff\x48\x32\xc2\x4e\x69\xa6\xe8\xb3\x1b\x53\x7d\x6b\x9a\xeb\x00\xa5\xe9\x49\xc2\xb9\x32\x42\xb9\x61\x67\x13\x94\x77\x4e\x9e\x9d\x1b\x4a\xbf\x22\x75\x80\xcd\xb8\xc4\x9c\xd3\x25\x32\xf6\xd5\x84\xfb\x4f\x4f\xf9\x32\x3a\xc1\x66\xc5\xf1\xea\x04\xfc\xd7\x08\x00\x6c\x7e\x21\x2e\x0d\xf1\xb8\x17\x93\xc6\x5c\x76\xeb\x94\xf4\xf1\x76\xcf\x4e\xc5\x18\x0f\xe7\xf0\xe9\xa9\x3a\xd7\x4b\x5e\xda\x41\x28\xc3\x69\xec\x7b\xf5\x56\xca\xba\x6a\x2b\x7e\x51\x77\x3c\xeb\x6e\x42\x47\x3e\x2e\xc0\xa8\x9d\x29\x78\x3a\x41\x2f\xf1\x7e\x3b\xdd\xdd\x77\x34\x4f\xd7\x76\x52\x4c\x9b\xd5\x5c\x7f\x55\xe1\xd4\x1a\x82\x50\x26\xbc\x63\xed\xf8\xea\x48\xb6\x4a\x30\x86\xd1\x71\x2f\x8e\x77\xfa\x19\xf0\x64\x9b\x80\xf9\x5a\xca\x5b\xe0\x68\x9b\x3a\x10\xdd\x76\x20\xba\xee\xc0\x7b\xba\xe9\xc0\xfb\x5c\xc2\x21\xdd\x72\xe9\x89\x15\x22\x53\x97\x3b\x94\x8c\x72\x0e\x03\x1d\xdb\xd7\xf1\x7a\x74\x1a\x98\xcb\x11\x67\xc0\x8e\xff\xed\x2f\x5f\x3d\x93\xf7\xce\xa1\xf9\x27\x00\x00\xff\xff\x39\x45\xb9\x3c\x77\x0a\x00\x00"),
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\x4c\xd9\x0d\x10\x03\xb6\x9c\xdd\xed\x16\x45\x00\x63\xd1\x5e\x8a\x5e\x8a\x05\xda\xdb\x62\x41\xd0\xe4\xc8\xe2\x86\x22\x09\x0e\xe5\x44\x08\xfc\xdf\x0b\x92\x92\x3f\x22\xbb\x6d\x4e\x31\xe7\xcd\x68\x3e\xde\x1b\x32\x20\xb9\x3e\x48\x04\xe6\x85\x7c\xc2\xc8\x15\xee\xb5\x44\x06\xcc\x3a\x85\xc4\xe0\xb5\x02\x90\xae\xb7\x11\xce\xfe\x36\xb0\x17\xa1\x7e\x76\xe1\x09\x03\xcf\xd6\x0a\xa0\x75\x14\xad\xe8\xf0\x0c\xc5\xde\xbd\x26\xa0\x34\x3d\x45\x0c\x3c\x59\x0f\xab\x72\xe6\x9d\x33\xe3\x41\x89\xb3\x7a\xf7\x9a\x23\xd5\xda\x2a\x7c\x39\xb0\x0a\xc0\x1b\x61\x61\xfe\xdd\x38\x78\xac\x00\x1a\x21\xb5\xd1\x51\x23\x1d\xad\x5f\x93\x79\x3c\x1f\xbe\x55\x00\xce\x63\x10\x51\xdb\x1d\xa7\x81\x22\x76\x63\x04\xed\x5f\x90\x93\x0c\xda\x47\xde\x07\x03\x3f\x6c\x80\x31\xf8\x0c\x4c\xf6\x14\x5d\xc7\x93\x9d\xc1\x23\x34\x2e\x74\x22\xde\xb3\xc6\x88\x28\x45\xe0\x77\xc4\x96\x39\x80\x23\x2e\x5b\x61\x2d\x9a\x45\x05\xb0\xd5\xc6\xa4\x6f\xc8\x41\x1a\x1c\x2b\x6f\x5d\x1f\xcc\x90\xab\x08\xee\x3b\xca\xc8\xb5\xba\xa8\xe2\x74\x5c\x01\xbc\x4d\xe8\x7a\x9e\x15\x80\x30\xcf\x62\x20\xee\x5f\xf0\x18\xac\x11\x86\x52\x3f\x7a\xc2\xc0\x95\x88\xe2\xb2\x5b\xb7\x6a\x4d\xc8\x5a\x46\x2e\x9d\x6d\xf4\xae\xd6\x96\xa2\x30\x66\xa5\x77\x56\x47\xed\x2c\xd5\x01\xad\xc2\x80\x0a\x1e\x67\xd8\x19\xa6\xaa\x00\x7e\x84\x3f\x1a\xb0\x2e\x82\x0f\x48\x68\x23\x68\x0b\xb1\x45\xe8\x84\x5f\x82\x8e\x29\x3f\x82\x32\xfc\x04\x08\x7b\x91\x62\x70\xad\x88\x2b\x6c\x44\x6f\xe2\xa1\x4e\x34\x12\x41\x3d\x8b\x80\xfc\x12\x04\x1b\x30\xce\x3d\xf5\xfe\xbe\x4a\xb5\x5d\x89\xb2\xcc\x86\x69\x64\x23\xa9\xee\xf6\x6c\x09\x67\xbc\x5a\x2c\x6f\xb9\x4f\x49\x24\xc0\x22\xd5\x13\xc5\x8e\x26\xc6\x89\x1d\x95\x12\xff\x6e\x35\xc1\xb3\x18\x20\x3a\x68\x85\x55\x06\x41\xa1\x4f\x5d\xb0\x32\x31\xf1\x59\x10\x68\x4b\x5e\xa7\xc6\xe5\x06\x68\x7a\xcc\x9e\x6d\x8c\x9e\x1e\xd7\x6b\xa5\x49\xf6\x44\x75\x2b\xa8\xd5\xd2\x05\x5f\x4b\xd7\xad\xe3\x3a\x6a\x4f\xab\xd6\x3d\x47\xb7\xd2\x9d\x37\xd8\xa1\x8d\xab\xce\xa9\xde\xe0\xaa\x7c\x82\x56\xce\xae\xb0\xeb\x4d\xce\x79\xfd\xe1\xe3\xc3\xa7\xf5\x87\x0a\xc6\x04\x88\x3b\x3b\x49\x20\x6b\x97\x97\x73\xee\xec\xb7\xea\x50\x55\x99\x19\xec\x38\x44\x06\x6c\x36\xf2\x49\xed\x36\xa6\xf1\x6d\xca\xd8\x23\x76\xde\x88\x88\xbc\xd1\x06\x27\x9a\x9c\x06\x7f\xa8\xaa\xd4\x15\x24\x84\x12\x98\x40\x04\x4c\xc3\x56\x69\x16\x99\x01\x8d\xa6\x08\x5b\xe7\xe2\x32\xb5\x2d\xf4\x16\x46\x41\xad\xc6\x70\x63\x72\x17\x9f\x3a\x25\x58\xd2\x9a\x8c\x89\xf1\xda\xe0\x3d\x7b\xf7\xea\x45\x6c\xeb\xd2\xa2\xc3\x5a\x9a\xf5\x94\xdc\x20\x3a\x53\xc7\xce\x1b\x96\x07\xb9\x17\x21\x0d\xf2\x35\x4f\xfe\xa4\xdc\xd9\x5e\x39\x99\x26\xe4\x1e\x03\x69\x67\xaf\x21\x47\xd3\x84\x14\x41\xb6\x70\x65\x57\x8d\xa6\x42\xcd\x71\x8b\x18\x6d\xfb\x17\xee\xb0\x1b\x57\x45\xd9\xbc\x2c\x63\x88\x5a\xfe\x84\x03\xbd\x09\xf5\x9d\x9c\x45\x2b\x9d\xc2\xfb\x14\x75\x42\x2d\xb2\x8f\x77\x14\xc7\xd2\xf9\x34\xcb\x69\x7a\xff\x2a\x5a\x80\x43\x9a\xdf\xec\x0e\xd8\xee\x3c\x27\xa4\x54\x1f\x03\xb6\xdd\xf9\xab\xd7\x40\x29\x50\x69\x12\x5b\x83\xc9\x07\x36\x1b\x88\xa1\x47\xf8\x0c\x0f\xf0\x78\xed\x8a\x28\x97\xcb\x71\x13\x6e\xe0\xe2\xd2\x29\xb4\xfd\x7a\xa6\xd6\x6f\x75\xde\x8e\x42\xa9\x80\x44\xbc\x11\x9d\x36\x43\x6a\x99\xf6\xfb\x9f\x58\xe1\xde\x6f\xbf\x7f\x81\xe4\x08\x46\x6c\xd1\x50\x5d\x19\x27\x85\xa1\x9c\x71\x37\x70\x41\xa9\x17\xd3\x56\xe8\x30\x75\x69\x5b\xf7\x56\xa7\x01\x62\x1d\x9b\x75\x37\xac\x04\xd9\xcd\x9d\x62\xcb\xd2\xb3\x31\xa9\x71\x41\x4f\x8b\xba\x4e\x5d\x19\x7b\xf9\x50\x0b\xb2\x8b\x2c\xeb\x2f\x19\x3c\xee\xe5\xb2\xe3\x7e\xfd\xeb\x4f\xf8\xf9\xd3\xa7\x8f\x0f\x20\x28\xf3\x3f\x60\xe7\x22\xe6\xf3\x24\x89\x9c\x60\xca\x3b\xad\x3b\x8f\x18\xfe\x47\x92\x09\x76\x4a\x33\x47\x5f\xdc\x50\xf5\x2d\x35\x4f\x02\xca\xea\xc9\xc4\xb9\x22\xa1\x32\xb0\x33\x05\x95\x7d\x59\xb4\x73\x83\xe9\x57\xa8\x0e\xf0\xd4\x6f\xb1\xe4\x74\x89\x4c\x73\xb5\xf1\xfe\xfd\x43\xb9\x48\x4f\xb0\xc5\xe8\x78\x55\x01\xff\x25\x01\x80\xa7\x5f\x88\x2b\x4b\x3c\xed\xf4\xcc\x31\x5f\xdc\xa4\x56\x21\xbd\x4c\x8a\xd3\x68\x4c\x87\x4b\x78\xff\x30\x39\x4f\x0f\x14\xe5\x3a\xa1\x2d\xa7\xbe\x69\xf4\xcb\x58\xd6\x55\xdb\xe8\x97\x78\xc7\x0b\xef\x66\xed\x28\xc7\x23\x30\x71\x67\x0e\x9e\x2b\xe8\x73\xba\x9b\x4f\xef\x8e\x3b\x5a\xe6\x27\x47\x66\x4c\x5d\xd8\x3c\xfd\x9a\x88\x33\xd5\x10\x85\xb6\xf1\x4d\xd7\x8e\x2f\xa6\x6c\x9b\x1a\x8c\xb1\xf7\x3c\x88\xe3\x7b\xe4\x0c\x78\xb2\xcd\xc0\xbc\x55\xea\x16\x38\xd9\xe6\x0e\x44\xb7\x1d\x88\xae\x3b\xf0\x86\x6e\x3a\xf0\xa6\x94\x70\xc8\x37\x74\x7e\x1e\xc6\xd4\xa9\xcb\x1d\x4a\x56\x7b\x8f\x91\x8e\xe3\x93\x7c\x3a\x3a\x09\xe6\x52\xe2\x0c\xd8\xf1\xbf\xd7\xcb\x17\xdb\xec\xad\x76\xa8\xfe\x09\x00\x00\xff\xff\xc7\x72\x4c\x58\x33\x0b\x00\x00"),
 		},
 	}
 	fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
diff --git a/pkg/platform/packet/packet.go b/pkg/platform/packet/packet.go
index a5ff0907..77dacc1c 100644
--- a/pkg/platform/packet/packet.go
+++ b/pkg/platform/packet/packet.go
@@ -20,6 +20,8 @@ import (
 	"os"
 	"path/filepath"
 	"sort"
+	"strconv"
+	"strings"
 	"text/template"
 
 	"github.com/hashicorp/hcl/v2"
@@ -33,21 +35,31 @@ import (
 	"github.com/kinvolk/lokomotive/pkg/terraform"
 )
 
+type nodeRole int
+
+const (
+	controller = iota
+	worker
+)
+
 type workerPool struct {
-	Name           string `hcl:"pool_name,label"`
-	Count          int    `hcl:"count"`
-	DisableBGP     bool   `hcl:"disable_bgp,optional"`
-	IPXEScriptURL  string `hcl:"ipxe_script_url,optional"`
-	OSArch         string `hcl:"os_arch,optional"`
-	OSChannel      string `hcl:"os_channel,optional"`
-	OSVersion      string `hcl:"os_version,optional"`
-	NodeType       string `hcl:"node_type,optional"`
-	Labels         string `hcl:"labels,optional"`
-	Taints         string `hcl:"taints,optional"`
-	SetupRaid      bool   `hcl:"setup_raid,optional"`
-	SetupRaidHDD   bool   `hcl:"setup_raid_hdd,optional"`
-	SetupRaidSSD   bool   `hcl:"setup_raid_ssd,optional"`
-	SetupRaidSSDFS bool   `hcl:"setup_raid_ssd_fs,optional"`
+	Name                  string            `hcl:"pool_name,label"`
+	Count                 int               `hcl:"count"`
+	DisableBGP            bool              `hcl:"disable_bgp,optional"`
+	IPXEScriptURL         string            `hcl:"ipxe_script_url,optional"`
+	OSArch                string            `hcl:"os_arch,optional"`
+	OSChannel             string            `hcl:"os_channel,optional"`
+	OSVersion             string            `hcl:"os_version,optional"`
+	NodeType              string            `hcl:"node_type,optional"`
+	Labels                string            `hcl:"labels,optional"`
+	Taints                string            `hcl:"taints,optional"`
+	ReservationIDs        map[string]string `hcl:"reservation_ids,optional"`
+	ReservationIDsDefault string            `hcl:"reservation_ids_default,optional"`
+	SetupRaid             bool              `hcl:"setup_raid,optional"`
+	SetupRaidHDD          bool              `hcl:"setup_raid_hdd,optional"`
+	SetupRaidSSD          bool              `hcl:"setup_raid_ssd,optional"`
+	SetupRaidSSDFS        bool              `hcl:"setup_raid_ssd_fs,optional"`
+	NodesDependOn         []string          // Not exposed to the user
 }
 
 type config struct {
@@ -76,6 +88,7 @@ type config struct {
 	ReservationIDs           map[string]string `hcl:"reservation_ids,optional"`
 	ReservationIDsDefault    string            `hcl:"reservation_ids_default,optional"`
 	CertsValidityPeriodHours int               `hcl:"certs_validity_period_hours,optional"`
+	NodesDependOn            []string          // Not exposed to the user
 
 	WorkerPools []workerPool `hcl:"worker_pool,block"`
 }
@@ -89,6 +102,7 @@ func (c *config) LoadConfig(configBody *hcl.Body, evalContext *hcl.EvalContext)
 	if configBody == nil {
 		return hcl.Diagnostics{}
 	}
+
 	if diags := gohcl.DecodeBody(*configBody, evalContext, c); len(diags) != 0 {
 		return diags
 	}
@@ -189,6 +203,10 @@ func createTerraformConfigFile(cfg *config, terraformPath string) error {
 		return errors.Wrapf(err, "failed to marshal tags")
 	}
 
+	// Add explicit terraform dependencies for nodes with specific hw
+	// reservation UUIDs.
+	cfg.terraformAddDeps()
+
 	terraformCfg := struct {
 		Config          config
 		Tags            string
@@ -237,6 +255,101 @@ func (c *config) terraformSmartApply(ex *terraform.Executor, dnsProvider dns.DNS
 	return ex.Apply()
 }
 
+// terraformAddDeps adds explicit dependencies to cluster nodes so nodes
+// with a specific hw reservation UUID are created before nodes that don't have
+// a specific hw reservation UUID.
+// The function modifies c.NodesDependOn and c.workerPools[].NodesDependOn,
+// assigning to them a slice, of all Terraform targets needed to be created
+// first. For example:
+//
+//	// Suppose worker pool "example" is the only to use a specific hw
+//	// reservation IDs. IOW, the controllers (c.NodesDependOn) depends on
+//	// worker pool "example" to be created first.
+//	// Then, after calling this function, the attribute will be:
+// 	c.NodesDependOn = []string{"module.worker-example.device_ids"}
+//
+//
+// The explicit Terraform dependency is needed to guarantees that nodes using
+// hardware reservation "next-available" won't use reservation IDS that another
+// worker pool may specify with a specific UUID, and thus fail to create the
+// node. This race condition is best explained here, if you want more info:
+// https://github.com/terraform-providers/terraform-provider-packet/issues/176
+// https://github.com/terraform-providers/terraform-provider-packet/pull/208
+func (c *config) terraformAddDeps() {
+	// Nodes with specific hw reservation IDs.
+	nodesWithRes := make([]string, 0)
+
+	// Note that dependencies expressed in Terraform are using the module
+	// output "device_ids". And it is very important to keep it this way.
+	//
+	// If we modify it to depend only on the module, for example (just
+	// "module.packet" instead of "module.packet.device_ids") it
+	// seems to work fine. However, it breaks if the dependency later
+	// becomes on the controller and another worker pool (e.g.
+	// [ "module.packet-cluster", "module.worker-1"]) as the resources aren't of
+	// the same *type*. In that case, Terraform throws this error:
+	//
+	// 	The given value is not suitable for child module variable
+	// 	"nodes_depend_on" defined at ...:
+	//	all list elements must have the same type.
+	//
+	// Therefore, using the output of the resources ids, this issue is
+	// solved: all elements of the list (no matter if the dependency is on
+	// workers, controller or both) will always have the same type and work
+	// correctly, they are just resources ids (strings).
+	// Also, it makes nodes depend on nodes, that is the strict dependency
+	// that we really have, instead of depending in the whole module. So, it
+	// allows Terraform to handle parallelization, and we only add
+	// fine-grained dependencies.
+
+	if len(c.ReservationIDs) > 0 {
+		// Use a dummy tf output to wait on controllers nodes.
+		tfTarget := clusterTarget(c.ClusterName, "device_ids")
+		nodesWithRes = append(nodesWithRes, tfTarget)
+	}
+
+	for _, w := range c.WorkerPools {
+		if len(w.ReservationIDs) > 0 {
+			// Use a dummy tf output to wait on workers nodes.
+			tfTarget := poolTarget(w.Name, "device_ids")
+			nodesWithRes = append(nodesWithRes, tfTarget)
+		}
+	}
+
+	// Collected all nodes with reservations, create a dependency on others
+	// to them, so those nodes are created first.
+
+	if len(c.ReservationIDs) == 0 {
+		c.NodesDependOn = nodesWithRes
+	}
+
+	for i := range c.WorkerPools {
+		if len(c.WorkerPools[i].ReservationIDs) > 0 {
+			continue
+		}
+
+		c.WorkerPools[i].NodesDependOn = nodesWithRes
+	}
+}
+
+// poolToTarget returns a string that can be used as "-target" argument to Terraform.
+// For example:
+//	// target will be "module.worker-pool1.ex".
+//	target := poolTarget("pool1", "ex")
+//nolint: unparam
+func poolTarget(name, resource string) string {
+	return fmt.Sprintf("module.worker-%v.%v", name, resource)
+}
+
+// clusterTarget returns a string that can be used as "-target" argument to Terraform.
+// For example:
+//	// target will be "module.packet-clusterName.ex".
+//	target := clusterTarget("clusterName", "ex")
+//nolint: unparam
+func clusterTarget(name, resource string) string {
+	return fmt.Sprintf("module.packet-%v.%v", name, resource)
+}
+
 func (c *config) GetExpectedNodes() int {
 	workers := 0
 
@@ -253,6 +366,7 @@ func (c *config) checkValidConfig() hcl.Diagnostics {
 
 	diagnostics = append(diagnostics, c.checkNotEmptyWorkers()...)
 	diagnostics = append(diagnostics, c.checkWorkerPoolNamesUnique()...)
+	diagnostics = append(diagnostics, c.checkReservationIDs()...)
 
 	return diagnostics
 }
@@ -288,9 +402,131 @@ func (c *config) checkWorkerPoolNamesUnique() hcl.Diagnostics {
 		diagnostics = append(diagnostics, &hcl.Diagnostic{
 			Severity: hcl.DiagError,
 			Summary:  "Worker pools name should be unique",
-			Detail:   fmt.Sprintf("Worker pool %v is duplicated", w.Name),
+			Detail:   fmt.Sprintf("Worker pool %q is duplicated", w.Name),
+		})
+	}
+
+	return diagnostics
+}
+
+// checkReservationIDs checks that reservations configured for controllers and
+// workers are valid according to checkEachReservation().
+func (c *config) checkReservationIDs() hcl.Diagnostics {
+	var diagnostics hcl.Diagnostics
+
+	d := checkEachReservation(c.ReservationIDs, c.ReservationIDsDefault, c.ClusterName, controller)
+	diagnostics = append(diagnostics, d...)
+
+	for _, w := range c.WorkerPools {
+		d := checkEachReservation(w.ReservationIDs, w.ReservationIDsDefault, w.Name, worker)
+		diagnostics = append(diagnostics, d...)
+	}
+
+	return diagnostics
+}
+
+// checkEachReservation checks that hardware reservations are in the correct
+// format and, when it will cause problems, that reservation IDs values in this
+// pool are not mixed between using "next-available" and specific UUIDs, as this
+// can't work reliably.
+// For more info, see comment when calling terraformCreateReservations().
+func checkEachReservation(reservationIDs map[string]string, resDefault, name string, role nodeRole) hcl.Diagnostics {
+	var diagnostics hcl.Diagnostics
+
+	errorPrefix := "Worker pool"
+	if role == controller {
+		errorPrefix = "Cluster"
+	}
+
+	// The following (several) checks try to avoid this: having a worker
+	// pool that a node uses specific UUID as hardware reservation ID and
+	// another node in the same pool that uses "next-available".
+	// All different variations that in the end result in that are checked
+	// below, and the reason is simple: we can't guarantee for those cases
+	// that nodes can be created reliably. Creation granularity is per pool,
+	// so if one pool mixes both, we can't guarantee that another pool
+	// created later that needs specific UUIDs won't have them used by the
+	// instances using "next-available" in the previous worker pool created.
+	// This can be solved in two ways: adding more granularity, or forbidding
+	// those cases. We opt for the second option, for simplicity, given that
+	// in the rare case that the user needs to mix them, it can specify another
+	// identical worker pool with "next-available".
+
+	// Avoid cases that set (to non default values) reservation_ids and
+	// reservation_ids_default.
+	if len(reservationIDs) > 0 && resDefault != "" {
+		diagnostics = append(diagnostics, &hcl.Diagnostic{
+			Severity: hcl.DiagError,
+			Summary:  fmt.Sprintf("%v can't set both: reservation_ids and reservation_ids_default", errorPrefix),
+			Detail:   fmt.Sprintf("%v: %q sets both, instead add an entry in reservations_ids for each node", errorPrefix, name),
+		})
+	}
+
+	// Check reservation_ids map doesn't use "next-available" as a value.
+	for _, v := range reservationIDs {
+		if v != "next-available" {
+			continue
+		}
+
+		diagnostics = append(diagnostics, &hcl.Diagnostic{
+			Severity: hcl.DiagError,
+			Summary:  fmt.Sprintf("%v reservations_ids entries can't use \"next-available\"", errorPrefix),
+			Detail:   fmt.Sprintf("%v: %q uses it, use specific UUIDs or reservations_ids_default only", errorPrefix, name),
 		})
 	}
 
+	// Check format is:
+	// controller-<int> or worker-<int>
+	// If not, Terraform code will silently ignore it. We don't want that.
+	resPrefix := "worker-"
+	if role == controller {
+		resPrefix = "controller-"
+	}
+
+	d := checkResFormat(reservationIDs, name, errorPrefix, resPrefix)
+	diagnostics = append(diagnostics, d...)
+
+	return diagnostics
+}
+
+// checkResFormat checks that format for every key in reservationIDs is:
+// <resPrefix>-<int>. resPrefix can't contain a "-" character.
+func checkResFormat(reservationIDs map[string]string, name, errorPrefix, resPrefix string) hcl.Diagnostics {
+	var diagnostics hcl.Diagnostics
+
+	for key := range reservationIDs {
+		hclErr := &hcl.Diagnostic{
+			Severity: hcl.DiagError,
+			Summary:  "Invalid reservation ID",
+			Detail: fmt.Sprintf("%v: %q used %q, format should be \"%v<int>\"",
+				errorPrefix, name, key, resPrefix),
+		}
+
+		// The expected format is: <resPrefix>-<int>.
+		// Let's check it is this way.
+
+		if !strings.HasPrefix(key, resPrefix) {
+			diagnostics = append(diagnostics, hclErr)
+			// Don't duplicate the same error, show it one per key.
+			continue
+		}
+
+		resEntry := strings.Split(key, "-")
+		if len(resEntry) != 2 { //nolint:gomnd
+			diagnostics = append(diagnostics, hclErr)
+			// Don't duplicate the same error, show it one per key.
+			continue
+		}
+
+		// Check a valid number is used after "controller-" or
+		// "worker-".
+		index := resEntry[1]
+		if _, err := strconv.Atoi(index); err != nil {
+			diagnostics = append(diagnostics, hclErr)
+			// Don't duplicate the same error, show it one per key.
+			continue
+		}
+	}
+
 	return diagnostics
 }
diff --git a/pkg/platform/packet/template.go b/pkg/platform/packet/template.go
index e5836001..437f943c 100644
--- a/pkg/platform/packet/template.go
+++ b/pkg/platform/packet/template.go
@@ -77,11 +77,11 @@ module "packet-{{.Config.ClusterName}}" {
   {{- end }}
 
   {{- if .Config.ReservationIDs }}
-    reservation_ids = {
+  reservation_ids = {
       {{- range $key, $value := .Config.ReservationIDs }}
       {{ $key }} = "{{ $value }}"
       {{- end }}
-    }
+  }
   {{- end }}
 
   {{- if .Config.ReservationIDsDefault }}
@@ -90,6 +90,14 @@ module "packet-{{.Config.ClusterName}}" {
   {{- if .Config.CertsValidityPeriodHours }}
   certs_validity_period_hours = {{.Config.CertsValidityPeriodHours}}
   {{- end }}
+
+  {{- if .Config.NodesDependOn }}
+  nodes_depend_on = [
+    {{- range $dep := .Config.NodesDependOn }}
+    {{ $dep }},
+    {{- end }}
+  ]
+  {{- end }}
 }
 
 {{ range $index, $pool := .Config.WorkerPools }}
@@ -162,16 +170,25 @@ module "worker-{{ $pool.Name }}" {
   disable_bgp = true
   {{- end}}
 
-  {{- if $.Config.ReservationIDs }}
-    reservation_ids = {
-      {{- range $key, $value := $.Config.ReservationIDs }}
-      {{ $key }} = "{{ $value }}"
-      {{- end }}
-    }
+  {{- if $pool.ReservationIDs }}
+  reservation_ids = {
+    {{- range $key, $value := $pool.ReservationIDs }}
+    {{ $key }} = "{{ $value }}"
+    {{- end }}
+  }
+  {{- end }}
+  {{- if $pool.ReservationIDsDefault }}
+  reservation_ids_default = "{{$pool.ReservationIDsDefault}}"
   {{- end }}
-  {{- if $.Config.ReservationIDsDefault }}
-  reservation_ids_default = "{{$.Config.ReservationIDsDefault}}"
+
+  {{- if $pool.NodesDependOn }}
+  nodes_depend_on = [
+    {{- range $dep := $pool.NodesDependOn }}
+    {{ $dep }},
+    {{- end }}
+  ]
   {{- end }}
+
 }
 {{ end }}
 


Test patch:
diff --git a/pkg/platform/packet/packet_test.go b/pkg/platform/packet/packet_test.go
new file mode 100644
index 00000000..5182b938
--- /dev/null
+++ b/pkg/platform/packet/packet_test.go
@@ -0,0 +1,262 @@
+package packet
+
+import (
+	"sort"
+	"testing"
+)
+
+func TestCheckNotEmptyWorkersEmpty(t *testing.T) {
+	c := config{}
+
+	if d := c.checkNotEmptyWorkers(); !d.HasErrors() {
+		t.Errorf("Expected to fail with empty workers")
+	}
+}
+
+func TestCheckNotEmptyWorkers(t *testing.T) {
+	c := config{WorkerPools: []workerPool{{Name: "test"}}}
+
+	if d := c.checkNotEmptyWorkers(); d.HasErrors() {
+		t.Errorf("Should not fail with no duplicated worker pool names")
+	}
+}
+
+func TestCheckWorkerPoolNamesUniqueDup(t *testing.T) {
+	c := config{
+		WorkerPools: []workerPool{
+			{
+				Name: "dup",
+			},
+			{
+				Name: "dup",
+			},
+		},
+	}
+
+	if d := c.checkWorkerPoolNamesUnique(); !d.HasErrors() {
+		t.Error("Should fail with duplicated worker pool names")
+	}
+}
+
+func TestCheckWorkerPoolNamesUniqueNotDup(t *testing.T) {
+	c := config{
+		WorkerPools: []workerPool{
+			{
+				Name: "not",
+			},
+			{
+				Name: "dup",
+			},
+		},
+	}
+
+	if d := c.checkWorkerPoolNamesUnique(); d.HasErrors() {
+		t.Error("Should work with no duplicated worker pool names")
+	}
+}
+
+func TestCheckResFormatPrefixValidInput(t *testing.T) {
+	r := map[string]string{"worker-2": "", "worker-3": ""}
+
+	if d := checkResFormat(r, "", "", "worker"); d.HasErrors() {
+		t.Errorf("Validation failed and shouldn't for: %v", r)
+	}
+}
+
+func TestCheckResFormatPrefixInvalidInput(t *testing.T) {
+	r := map[string]string{"broken-1": "", "worker-1-2": "", "worker-a": ""}
+
+	if d := checkResFormat(r, "", "", "worker"); !d.HasErrors() {
+		t.Errorf("Should fail with res: %v", r)
+	}
+}
+
+func TestCheckEachReservationValidInput(t *testing.T) {
+	cases := []struct {
+		role           nodeRole
+		resDefault     string
+		reservationIDs map[string]string
+	}{
+		{
+			// Test validates worker config.
+			role: worker,
+			reservationIDs: map[string]string{
+				"worker-2": "",
+				"worker-3": "",
+			},
+		},
+		{
+			// Test validates controller config.
+			role: controller,
+			reservationIDs: map[string]string{
+				"controller-2": "",
+				"controller-3": "",
+			},
+		},
+		{
+			// Test works if resDefault is set and no
+			// reservationIDs.
+			role:       controller,
+			resDefault: "next-available",
+		},
+	}
+
+	for _, tc := range cases {
+		if d := checkEachReservation(tc.reservationIDs, tc.resDefault, "", tc.role); d.HasErrors() {
+			t.Errorf("Should not fail with valid input: %v", tc)
+		}
+	}
+}
+
+func TestCheckEachReservationInvalidInput(t *testing.T) {
+	cases := []struct {
+		role           nodeRole
+		resDefault     string
+		reservationIDs map[string]string
+	}{
+		{
+			// Test if nodeRole is worker, reservation should be
+			// "worker-" not "controller".
+			role: worker,
+			reservationIDs: map[string]string{
+				"controller-1": "",
+			},
+		},
+		{
+			// Idem previous but vice-versa.
+			role: controller,
+			reservationIDs: map[string]string{
+				"worker-3": "",
+			},
+		},
+		{
+			// Test if resDefault is set to next-available,
+			// reservationIDs should be empty.
+			role:       worker,
+			resDefault: "next-available",
+			reservationIDs: map[string]string{
+				"worker-3": "",
+			},
+		},
+		{
+			// Test reservationIDs should never be set to
+			// "next-available".
+			role: worker,
+			reservationIDs: map[string]string{
+				"worker-3": "next-available",
+			},
+		},
+	}
+
+	for _, tc := range cases {
+		if d := checkEachReservation(tc.reservationIDs, tc.resDefault, "", tc.role); !d.HasErrors() {
+			t.Errorf("No error detected in invalid input: %v", tc)
+		}
+	}
+}
+
+//nolint: funlen
+func TestTerraformAddDeps(t *testing.T) {
+	type testCase struct {
+		// Config to test
+		cfg config
+		// Expected config after running the test
+		exp config
+	}
+
+	var cases []testCase
+
+	base := config{
+		ClusterName: "c",
+		WorkerPools: []workerPool{
+			{
+				Name: "1",
+			},
+			{
+				Name: "2",
+			},
+		},
+	}
+
+	// Test WorkerPool w/o res depends on 1 WorkerPool with res
+	test := base
+	test.WorkerPools[0].ReservationIDs = map[string]string{"worker-0": "dummy"}
+	exp := test
+	exp.WorkerPools[1].NodesDependOn = []string{poolTarget("1", "worker_nodes_ids")}
+
+	cases = append(cases, testCase{test, exp})
+
+	// Test 2 WorkerPools w/o res depend on 2 WorkerPool with rest
+	test = base
+	test.WorkerPools[0].ReservationIDs = map[string]string{"worker-0": "dummy"}
+	test.WorkerPools = append(test.WorkerPools, workerPool{Name: "3"})
+	exp = test
+	exp.WorkerPools[1].NodesDependOn = []string{poolTarget("1", "worker_nodes_ids")}
+
+	cases = append(cases, testCase{test, exp})
+
+	// Test 1 WorkerPools w/o res depend on 2 WorkerPool with res
+	test = base
+	test.WorkerPools[0].ReservationIDs = map[string]string{"worker-0": "dummy"}
+	test.WorkerPools[1].ReservationIDs = map[string]string{"worker-0": "dummy"}
+	test.WorkerPools = append(test.WorkerPools, workerPool{Name: "3"})
+	exp = test
+	exp.WorkerPools[2].NodesDependOn = []string{
+		poolTarget("1", "worker_nodes_ids"),
+		poolTarget("2", "worker_nodes_ids"),
+	}
+
+	cases = append(cases, testCase{test, exp})
+
+	// Test 2 WorkerPools w/o res depend on controllers
+	test = base
+	test.ReservationIDs = map[string]string{"controller-0": "dummy"}
+	exp = test
+	exp.WorkerPools[0].NodesDependOn = []string{clusterTarget("1", "device_ids")}
+	exp.WorkerPools[1].NodesDependOn = []string{clusterTarget("1", "device_ids")}
+
+	cases = append(cases, testCase{test, exp})
+
+	// Test 1 WorkerPools w/o res depends on controllers and WorkerPool with
+	// res
+	test = base
+	test.ReservationIDs = map[string]string{"controller-0": "dummy"}
+	test.WorkerPools[0].ReservationIDs = map[string]string{"worker-0": "dummy"}
+	exp = test
+	exp.WorkerPools[1].NodesDependOn = []string{clusterTarget("1", "device_ids"), poolTarget("1", "device_ids")}
+
+	cases = append(cases, testCase{test, exp})
+
+	for tcIdx, tc := range cases {
+		test := tc.cfg
+		exp := tc.exp
+
+		test.terraformAddDeps()
+
+		for i, w := range test.WorkerPools {
+			ret := w.NodesDependOn
+			expRet := exp.WorkerPools[i].NodesDependOn
+
+			if equal := cmpSliceString(ret, expRet); !equal {
+				t.Errorf("In test %v, expected %v, got %v", tcIdx, expRet, ret)
+			}
+		}
+	}
+}
+
+func cmpSliceString(a, b []string) bool {
+	if len(a) != len(b) {
+		return false
+	}
+
+	sort.Strings(a)
+	sort.Strings(b)
+
+	for index, elem := range a {
+		if elem != b[index] {
+			return false
+		}
+	}
+
+	return true
+}