From 9a1013a19c122564ceea8bca53a835970e9dcc0d Mon Sep 17 00:00:00 2001 From: Imran Pochi Date: Thu, 25 Feb 2021 18:35:59 +0530 Subject: [PATCH] baremetal: node-specific labels This commit introduces a new field in Baremetal configuration named `node_specific_labels`. This feature adds the ability to provide specific set of labels unique to the node. Signed-off-by: Imran Pochi --- .../flatcar-linux/kubernetes/controller.tf | 1 + .../flatcar-linux/kubernetes/variables.tf | 6 ++ .../flatcar-linux/kubernetes/worker.tf | 2 +- assets/terraform-modules/controller/main.tf | 4 +- .../terraform-modules/controller/variables.tf | 6 ++ .../baremetal-cluster.lokocfg.envsubst | 14 +++ .../platforms/baremetal.md | 88 ++++++++++++------- pkg/assets/generated_assets.go | 20 ++--- pkg/platform/baremetal/baremetal.go | 10 ++- pkg/platform/baremetal/template.go | 14 +++ .../baremetal_kubelet_labels_test.go | 82 +++++++++++++++++ 11 files changed, 198 insertions(+), 49 deletions(-) create mode 100644 test/components/kubernetes/baremetal_kubelet_labels_test.go diff --git a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/controller.tf b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/controller.tf index 04ce2395e..1b56b20d7 100644 --- a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/controller.tf +++ b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/controller.tf @@ -9,6 +9,7 @@ module "controller" { ssh_keys = var.ssh_keys apiserver = format("%s.%s", var.cluster_name, var.k8s_domain_name) ca_cert = module.bootkube.ca_cert + kubelet_labels = lookup(var.node_specific_labels, var.controller_names[count.index], {}) clc_snippets = lookup(var.clc_snippets, var.controller_names[count.index], []) set_standard_hostname = true } diff --git a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/variables.tf b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/variables.tf index a05774532..4d96e6536 100644 --- a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/variables.tf +++ b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/variables.tf @@ -203,3 +203,9 @@ variable "install_to_smallest_disk" { type = bool default = false } + +variable "node_specific_labels" { + type = map(map(string)) + description = "Map of node specific labels map." + default = {} +} diff --git a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/worker.tf b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/worker.tf index 15eae7c7a..b42de956d 100644 --- a/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/worker.tf +++ b/assets/terraform-modules/bare-metal/flatcar-linux/kubernetes/worker.tf @@ -7,7 +7,7 @@ module "worker" { cluster_domain_suffix = var.cluster_domain_suffix ca_cert = module.bootkube.ca_cert apiserver = format("%s.%s", var.cluster_name, var.k8s_domain_name) - kubelet_labels = var.labels + kubelet_labels = merge(lookup(var.node_specific_labels, var.worker_names[count.index], {}), var.labels) cluster_name = var.cluster_name clc_snippets = lookup(var.clc_snippets, var.worker_names[count.index], []) set_standard_hostname = true diff --git a/assets/terraform-modules/controller/main.tf b/assets/terraform-modules/controller/main.tf index 2583b4192..f0b2d32e0 100644 --- a/assets/terraform-modules/controller/main.tf +++ b/assets/terraform-modules/controller/main.tf @@ -47,10 +47,10 @@ data "ct_config" "config" { kubelet_image_tag = var.kubelet_image_tag kubelet_docker_extra_args = [] hostname = var.set_standard_hostname == true ? "${var.cluster_name}-controller-${var.count_index}" : "" - kubelet_labels = { + kubelet_labels = merge(var.kubelet_labels, { "node.kubernetes.io/master" = "", "node.kubernetes.io/controller" = "true", - } + }) kubelet_taints = { "node-role.kubernetes.io/master" = ":NoSchedule" } diff --git a/assets/terraform-modules/controller/variables.tf b/assets/terraform-modules/controller/variables.tf index ea84cec38..dfd41822c 100644 --- a/assets/terraform-modules/controller/variables.tf +++ b/assets/terraform-modules/controller/variables.tf @@ -83,3 +83,9 @@ variable "set_standard_hostname" { description = "Sets the hostname if true. Hostname is set as -controller-" default = false } + +variable "kubelet_labels" { + type = map(string) + description = "Node labels passed to kubelet --node-labels flag. E.g. { { \"node.kubernetes.io/node\" = \"\" }" + default = {} +} diff --git a/ci/baremetal/baremetal-cluster.lokocfg.envsubst b/ci/baremetal/baremetal-cluster.lokocfg.envsubst index d62ba0040..5544e8fdc 100644 --- a/ci/baremetal/baremetal-cluster.lokocfg.envsubst +++ b/ci/baremetal/baremetal-cluster.lokocfg.envsubst @@ -41,6 +41,20 @@ cluster "bare-metal" { "roleofnode" = "testing", } + node_specific_labels = { + "node1" = { + "testkey": "testvalue" + } + + "node2" = { + "ingressnode": "yes" + } + + "node3" = { + "storagenode": "yes" + } + } + conntrack_max_per_core = 65000 install_to_smallest_disk = "true" diff --git a/docs/configuration-reference/platforms/baremetal.md b/docs/configuration-reference/platforms/baremetal.md index 7f465c71d..5b903ad10 100644 --- a/docs/configuration-reference/platforms/baremetal.md +++ b/docs/configuration-reference/platforms/baremetal.md @@ -80,6 +80,20 @@ cluster "bare-metal" { "testlabel" = "" } + node_specific_labels = { + "node1" = { + "key1": "value1" + } + + "node2" = { + "key2": "value2" + } + + "node3" = { + "key3": "value3" + } + } + network_mtu = 1500 controller_domains = var.controller_domains @@ -144,41 +158,47 @@ os_version = var.custom_default_os_version ## Attribute reference -| Argument | Description | Default | Type | Required | -|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|--------------|----------| -| `asset_dir` | Location where Lokomotive stores cluster assets. | - | string | true | -| `cached_install` | Whether the operating system should PXE boot and install from matchbox /assets cache. Note that the admin must have downloaded the `os_version` into matchbox assets. | "false" | string | false | -| `cluster_name` | Name of the cluster. | - | string | true | -| `controller_domains` | Ordered list of controller FQDNs. Example: ["node1.example.com"] | - | list(string) | true | -| `controller_macs` | Ordered list of controller identifying MAC addresses. Example: ["52:54:00:a1:9c:ae"] | - | list(string) | true | -| `controller_names` | Ordered list of controller names. Example: ["node1"] | - | list(string) | true | -| `k8s_domain_name` | Domain name which will be used for cluster DNS entries. E.g. If you set it to "example.com", then .example.com must be set to point to controller IP addresses. Example: "mercury.example.com" | - | string | true | -| `labels` | Map of extra Kubernetes Node labels for worker nodes. | - | map(string) | false | -| `matchbox_ca_path` | Path to the CA to verify and authenticate client certificates. | - | string | true | -| `matchbox_client_cert_path` | Path to the server TLS certificate file. | - | string | true | -| `matchbox_client_key_path` | Path to the server TLS key file. | - | string | true | -| `matchbox_endpoint` | Matchbox API endpoint. | - | string | true | -| `matchbox_http_endpoint` | Matchbox HTTP read-only endpoint. Example: "http://matchbox.example.com:8080" | - | string | true | -| `network_mtu` | Physical Network MTU. | 1500 | number | false | -| `worker_names` | Ordered list of worker names. Example: ["node2", "node3"] | - | list(string) | true | -| `worker_macs` | Ordered list of worker identifying MAC addresses. Example ["52:54:00:b2:2f:86", "52:54:00:c3:61:77"] | - | list(string) | true | -| `worker_domains` | Ordered list of worker FQDNs. Example ["node2.example.com", "node3.example.com"] | - | list(string) | true | -| `ssh_pubkeys` | List of SSH public keys for user `core`. Each element must be specified in a valid OpenSSH public key format, as defined in RFC 4253 Section 6.6, e.g. "ssh-rsa AAAAB3N...". | - | list(string) | true | -| `os_version` | Flatcar Container Linux version to install. Version such as "2303.3.1" or "current". | "current" | string | false | -| `os_channel` | Flatcar Container Linux channel to install from ("stable", "beta", "alpha", "edge"). | "stable" | string | false | -| `encrypt_pod_traffic` | Enable in-cluster pod traffic encryption. If true `network_mtu` is reduced by 60 to make room for the encryption header. | false | bool | false | -| `ignore_x509_cn_check` | Ignore check of common name in x509 certificates. If any application is built pre golang 1.15 then API server rejects x509 from such application, enable this to get around apiserver. | false | bool | false | -| `install_to_smallest_disk` | Installs Flatcar Container Linux to the smallest disk. | false | bool | false | -| `install_disk` | Disk device where Flatcar Container Linux should be installed. | "/dev/sda" | string | false | -| `kernel_args` | Additional kernel args to provide at PXE boot. | ["kvm-intel.nested=1"] | list(string) | false | + + + + + +| Argument | Description | Default | Type | Required | +|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|-------------------|----------| +| `asset_dir` | Location where Lokomotive stores cluster assets. | - | string | true | +| `cached_install` | Whether the operating system should PXE boot and install from matchbox /assets cache. Note that the admin must have downloaded the `os_version` into matchbox assets. | "false" | string | false | +| `cluster_name` | Name of the cluster. | - | string | true | +| `controller_domains` | Ordered list of controller FQDNs. Example: ["node1.example.com"] | - | list(string) | true | +| `controller_macs` | Ordered list of controller identifying MAC addresses. Example: ["52:54:00:a1:9c:ae"] | - | list(string) | true | +| `controller_names` | Ordered list of controller names. Example: ["node1"] | - | list(string) | true | +| `k8s_domain_name` | Domain name which will be used for cluster DNS entries. E.g. If you set it to "example.com", then .example.com must be set to point to controller IP addresses. Example: "mercury.example.com" | - | string | true | +| `labels` | Map of extra Kubernetes Node labels for worker nodes. | - | map(string) | false | +| `node_specific_labels` | Map of map of extra Kubernetes Node labels specific to a Node. Node specific labels provided will be appended along with `labels`. | - | map(map(string)) | false | +| `matchbox_ca_path` | Path to the CA to verify and authenticate client certificates. | - | string | true | +| `matchbox_client_cert_path` | Path to the server TLS certificate file. | - | string | true | +| `matchbox_client_key_path` | Path to the server TLS key file. | - | string | true | +| `matchbox_endpoint` | Matchbox API endpoint. | - | string | true | +| `matchbox_http_endpoint` | Matchbox HTTP read-only endpoint. Example: "http://matchbox.example.com:8080" | - | string | true | +| `network_mtu` | Physical Network MTU. | 1500 | number | false | +| `worker_names` | Ordered list of worker names. Example: ["node2", "node3"] | - | list(string) | true | +| `worker_macs` | Ordered list of worker identifying MAC addresses. Example ["52:54:00:b2:2f:86", "52:54:00:c3:61:77"] | - | list(string) | true | +| `worker_domains` | Ordered list of worker FQDNs. Example ["node2.example.com", "node3.example.com"] | - | list(string) | true | +| `ssh_pubkeys` | List of SSH public keys for user `core`. Each element must be specified in a valid OpenSSH public key format, as defined in RFC 4253 Section 6.6, e.g. "ssh-rsa AAAAB3N...". | - | list(string) | true | +| `os_version` | Flatcar Container Linux version to install. Version such as "2303.3.1" or "current". | "current" | string | false | +| `os_channel` | Flatcar Container Linux channel to install from ("stable", "beta", "alpha", "edge"). | "stable" | string | false | +| `encrypt_pod_traffic` | Enable in-cluster pod traffic encryption. If true `network_mtu` is reduced by 60 to make room for the encryption header. | false | bool | false | +| `ignore_x509_cn_check` | Ignore check of common name in x509 certificates. If any application is built pre golang 1.15 then API server rejects x509 from such application, enable this to get around apiserver. | false | bool | false | +| `install_to_smallest_disk` | Installs Flatcar Container Linux to the smallest disk. | false | bool | false | +| `install_disk` | Disk device where Flatcar Container Linux should be installed. | "/dev/sda" | string | false | +| `kernel_args` | Additional kernel args to provide at PXE boot. | ["kvm-intel.nested=1"] | list(string) | false | | `download_protocol` | Protocol iPXE uses to download the kernel and initrd. iPXE must be compiled with crypto support for https. Unused if `cached_install` is true. Use `http` if the iPXE boot using `https` is slow or does not work due to SSL settings. | "https" | string | false | -| `network_ip_autodetection_method` | Method to detect host IPv4 address. Accepted values include 'first-found', 'can-reach=', 'interface=', 'skip-interface=, 'cidr='. | "first-found" | string | false | -| `oidc` | OIDC configuration block. | - | object | false | -| `oidc.issuer_url` | URL of the provider which allows the API server to discover public signing keys. Only URLs which use the https:// scheme are accepted. | - | string | false | -| `oidc.client_id` | A client id that all tokens must be issued for. | "clusterauth" | string | false | -| `oidc.username_claim` | JWT claim to use as the user name. | "email" | string | false | -| `oidc.groups_claim` | JWT claim to use as the user’s group. | "groups" | string | false | -| `conntrack_max_per_core` | Maximum number of entries in conntrack table per CPU on all nodes in the cluster. If you require more fain-grained control over this value, set it to 0 and add CLC snippet setting `net.netfilter.nf_conntrack_max` sysctl setting per node pool. See [Flatcar documentation about sysctl](https://docs.flatcar-linux.org/os/other-settings/#tuning-sysctl-parameters) for more details. | 32768 | number | false | +| `network_ip_autodetection_method` | Method to detect host IPv4 address. Accepted values include 'first-found', 'can-reach=', 'interface=', 'skip-interface=, 'cidr='. | "first-found" | string | false | +| `oidc` | OIDC configuration block. | - | object | false | +| `oidc.issuer_url` | URL of the provider which allows the API server to discover public signing keys. Only URLs which use the https:// scheme are accepted. | - | string | false | +| `oidc.client_id` | A client id that all tokens must be issued for. | "clusterauth" | string | false | +| `oidc.username_claim` | JWT claim to use as the user name. | "email" | string | false | +| `oidc.groups_claim` | JWT claim to use as the user’s group. | "groups" | string | false | +| `conntrack_max_per_core` | Maximum number of entries in conntrack table per CPU on all nodes in the cluster. If you require more fain-grained control over this value, set it to 0 and add CLC snippet setting `net.netfilter.nf_conntrack_max` sysctl setting per node pool. See [Flatcar documentation about sysctl](https://docs.flatcar-linux.org/os/other-settings/#tuning-sysctl-parameters) for more details. | 32768 | number | false | ## Applying diff --git a/pkg/assets/generated_assets.go b/pkg/assets/generated_assets.go index 172d47e5f..ca55a1fae 100644 --- a/pkg/assets/generated_assets.go +++ b/pkg/assets/generated_assets.go @@ -5977,9 +5977,9 @@ var vfsgenAssets = func() http.FileSystem { "/terraform-modules/bare-metal/flatcar-linux/kubernetes/controller.tf": &vfsgen۰CompressedFileInfo{ name: "controller.tf", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 677, + uncompressedSize: 776, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x52\xcb\x6a\xc3\x30\x10\xbc\xfb\x2b\x16\x43\x20\x85\xa0\x5e\x7b\xf1\x97\x84\x20\x14\x69\xdb\x08\xdb\x5a\xa3\x5d\x85\x3e\xe8\xbf\x17\x4b\x09\x51\x6c\x43\x8d\x4f\x9a\x19\xcd\xec\xac\x46\x72\x69\x40\x68\x2d\x05\x89\x34\x0c\x18\x5b\xf8\x69\x00\x98\x52\xb4\x08\xcb\xaf\x83\x56\xa9\xd7\xf2\x57\x92\x06\xc0\x52\x0a\xb2\xe2\x43\x07\x03\x86\x0f\xb9\xec\xaf\x26\xaa\x87\x42\x07\x33\x22\xbf\xcc\xba\x21\xb1\xdc\x0e\x9e\x74\x59\x50\x81\xd9\xe3\xae\x67\x5d\xf9\xfd\xeb\xe1\x02\xeb\x6f\x0a\xcb\x71\x8a\x47\xff\xc6\xda\xd1\x68\x7c\x78\xd8\xa4\x20\xda\x07\x87\x9f\xcf\xf4\x0c\xa8\x0c\x54\xc9\xe7\xdb\x19\xe3\xd5\x5b\xd4\x7e\x82\x0e\x4a\xa7\xea\x4c\x24\x7d\x3a\xa3\xda\x26\xce\x25\xf3\x45\xf7\xf8\xc5\x9b\xb9\xee\x60\x03\x60\x26\x3f\xeb\x30\x2e\x79\xef\x14\x47\x23\xfb\x76\xc7\x6a\xc7\xed\x61\xd5\xd9\x61\x6b\xc2\xdc\xba\xd1\x16\xe3\x6a\x5f\x1b\xd9\x0b\x31\x8f\x6b\x35\x07\x3f\x4d\x28\xfc\xbc\x60\xa2\x3e\x4d\xa5\xfc\x8a\x73\x4b\xb3\x58\xc7\xb1\xea\xf0\x74\x80\xe3\x69\x4e\xc3\x28\x9a\xc5\x04\x67\xa2\xd3\x17\x62\x29\x8f\xa1\x03\x89\x09\x9b\xdf\xe6\x2f\x00\x00\xff\xff\xc0\x0c\x09\x70\xa5\x02\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x52\xd1\x6a\xc3\x30\x0c\x7c\xcf\x57\x88\x40\xa1\x83\xe2\xbd\xee\x25\x5f\x52\x8a\x71\x6d\x75\x35\x71\xac\x60\xc9\x65\x5b\xe9\xbf\x8f\x24\x2d\x75\x93\xc0\x16\xf2\x92\xe8\x4e\x77\x3a\xa9\x23\x97\x03\x42\x6d\x29\x4a\xa2\x10\x30\xd5\x70\xad\x00\x98\x72\xb2\x08\xf3\xa7\x81\x5a\xa9\xf7\xe9\x2d\x28\x15\x80\xa5\x1c\x65\x81\x87\x06\x02\xc6\x4f\x39\x6f\x2f\x26\xa9\x27\x43\x47\xd3\x21\xbf\x0d\xbc\x90\x59\xee\x3f\x5e\x78\x23\xa1\x28\x8e\x1a\x0f\x3e\xeb\x42\xef\x4f\x0d\x17\x59\xff\x50\x9c\x8f\x33\x69\xb4\x1f\xac\x1d\x75\xc6\xc7\xa7\x4c\x8e\xa2\x7d\x74\xf8\xf5\x0a\x1f\x0b\x6a\x2c\x14\xce\x87\xee\x8c\xe9\xe2\x2d\x6a\xdf\x43\x03\x53\xa6\xea\x48\x24\x6d\x3e\xa2\x5a\x07\x0e\x21\xf3\x59\xb7\xf8\xcd\xab\xbe\x1e\xc5\x0a\xc0\xf4\x7e\xe0\x61\x9a\xe3\x4e\x94\x3a\x23\xdb\x7a\xc3\x6a\xc3\xf5\x6e\x91\xd9\x6e\x6d\xc2\x31\x75\xa3\x2d\xa6\xc5\xbe\x56\xbc\x4f\xc0\x0a\x60\xf8\x0c\x28\x3a\x98\x23\x06\x2e\x17\x4c\xd4\xe6\x7e\x0c\x3f\x92\x43\xcd\x3d\x5a\x7f\xf2\xf6\x8e\xbc\xbb\x9a\xad\x65\x5f\x64\x79\xd8\xc1\xf5\x36\xdd\x82\xd5\x1c\x7d\xdf\xa3\xf0\xeb\x0d\x3d\x25\x4a\xcc\xbf\x5a\xef\x0f\x43\x6b\x46\xd1\x2c\x26\x3a\x93\x9c\x3e\x13\xcb\x74\x6f\x0d\x48\xca\x58\xdd\xaa\xdf\x00\x00\x00\xff\xff\x6b\xfd\x08\x61\x08\x03\x00\x00"), }, "/terraform-modules/bare-metal/flatcar-linux/kubernetes/groups.tf": &vfsgen۰CompressedFileInfo{ name: "groups.tf", @@ -6012,9 +6012,9 @@ var vfsgenAssets = func() http.FileSystem { "/terraform-modules/bare-metal/flatcar-linux/kubernetes/variables.tf": &vfsgen۰CompressedFileInfo{ name: "variables.tf", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 5813, + uncompressedSize: 5953, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x58\x5b\x6f\xe3\xb6\x12\x7e\xf7\xaf\x18\x64\x1f\x92\x00\xb1\xe2\x64\xbb\x37\xa3\x7d\x58\x38\x29\xba\x38\x4d\x36\xed\x66\x4f\x0f\x50\x14\xc2\x98\x1c\x59\x84\x29\x52\xe5\x50\xbe\xa0\xe8\x7f\x3f\x20\x25\xd9\xb2\x2d\xef\x49\x4e\x93\x97\x00\x36\x39\xf3\xcd\x37\xdf\x5c\xe8\x05\x3a\x85\x53\x4d\x70\x22\x74\xc5\x9e\x5c\x6a\xb0\xa0\x13\xf8\x6b\x00\xe0\xd7\x25\x41\xf3\xf7\x03\xb0\x77\xca\xcc\x06\x00\x92\x58\x38\x55\x7a\x65\x0d\xfc\x00\x27\x5f\x8d\xfa\xb3\x22\x68\xae\x43\xbc\x3e\xf8\x7b\x30\x78\x05\x53\x74\x34\x2c\xc8\xa3\x1e\x0c\xb6\x7e\x0a\xf4\x22\x9f\xda\x55\x9a\x7b\x5f\xa6\x64\x64\x69\x95\xf1\xcf\xf1\x78\xd7\x58\x80\x9f\x1e\x1f\x1f\xc0\x11\xca\xa1\x35\x7a\x0d\xad\x2d\x38\xa3\x64\x96\x40\xb0\x3f\xbe\xbc\x6c\xfd\x25\xb4\xc2\xa2\xd4\x94\x08\x5b\x8c\xdf\x8f\xde\x8f\xce\x23\xcc\x2d\x30\xcb\xa9\xc8\xd1\x18\xd2\xff\x03\x4c\x86\x95\xf6\xcd\xc7\x27\xec\xc3\xed\x93\x43\x94\x3f\x6a\xf4\x02\x1d\x4c\xac\xf1\xa8\x0c\x39\xf8\x59\x99\x6a\x05\x8d\x0f\xf0\x16\x94\x61\x8f\x5a\x43\xe6\x6c\x01\x67\xb5\xa5\x0b\x98\x92\xc7\x0b\x40\x5d\xe6\x78\x01\x24\x67\xd4\x03\x74\x41\x8e\x95\x35\xcf\x01\x2a\x2a\xe7\xc8\xf8\x67\x20\x6d\x9c\x74\x91\x9e\x65\xd6\x41\x43\x24\x9c\x5e\x5f\x7d\xb8\x4a\xde\x24\xa3\x53\x18\x02\x13\x45\xc6\x79\x7c\x79\xb9\x5c\x2e\x93\xac\x36\x3a\xd4\xc1\x54\x62\xdd\xec\xd2\x91\x26\x64\xe2\xcb\xf3\x46\x1f\x05\x8a\x5c\x19\xe2\xc1\x2b\x78\x24\xe7\x30\xb3\xae\x38\x65\x10\xae\x92\x04\x27\x31\x2a\x5e\xb3\xa7\xe2\x04\xa4\x25\x06\x63\x3d\x94\xce\x96\xe4\xf4\x1a\xb8\x2a\x4b\xeb\x3c\x68\xc5\x9e\xc1\x66\x50\x60\xc9\xc0\x16\x96\x04\xd2\x82\xcf\x15\x27\x5d\xd2\x84\x35\xde\x59\xad\x1b\x85\x73\x1f\x75\xc1\xd6\x59\xcd\xdf\xf9\x21\x4d\x9f\x9d\x24\x47\x32\x9e\x0a\x0e\xb7\x16\xa3\xe8\xb9\x91\xdd\xef\xc6\x4a\xba\xfa\x63\x3f\x69\x1d\xff\x05\x8a\x97\x75\xaf\x24\x19\xaf\xb2\xb5\x32\x33\xb8\xfb\x38\x01\x94\xd2\x11\xf3\x16\xd2\x9b\xeb\xf1\x9b\xef\xc6\xa3\xd1\x18\xaf\xc6\x1f\xc4\x18\xe9\x5b\xf0\xa4\x2d\x50\x99\x97\x45\xf8\xe3\x2f\x37\xf7\xbb\x04\x75\xcb\xf1\x00\xcd\xd2\xba\xf9\xcb\x25\xaa\xb6\x76\x98\xa4\xeb\x0b\x08\xff\x5e\x1f\x73\xff\x32\x79\x6a\xbc\x3f\x3d\x47\xd3\xeb\xf1\x75\x36\x7e\xff\xf6\x02\x36\x1f\x89\xd7\xe3\xb7\x57\xe3\x77\xef\x8e\x21\x7d\xb1\x94\x35\x60\x0f\xd2\x75\xdd\x4d\x57\x43\xdb\x37\x33\x28\xb4\x48\xd9\xa8\xb2\x24\xdf\x0b\xab\xc0\xf2\xac\x0b\xad\x07\xdb\x1d\x96\x75\x67\x6c\xfa\x44\x93\x40\x6f\xb7\x35\xbf\xdf\xb1\x26\xd6\x64\x6a\x06\x1b\xc7\x07\x5d\xf0\xaf\xbf\x77\x61\x6a\x9c\x92\x3e\x0a\xf0\x28\x6d\x01\x9a\xcd\xa0\xbe\x0d\xa1\x27\xb6\x1a\xb3\x92\x38\x39\xe6\xf7\x55\x28\x89\x4c\xcd\x2a\x87\xc1\x52\x17\xc8\xfc\x3d\x37\x59\xec\x0c\xe0\x3d\xaf\x93\x6d\x3d\xdd\xdc\x7f\x89\x74\xc0\x32\x57\x22\x07\x47\x6c\xf5\xa2\x26\x07\x77\x3a\x43\xe8\xdb\x46\x50\x02\xbf\x45\x80\x0c\x68\x24\xcc\xab\x29\xd5\x48\x4e\x19\x96\x4a\x6b\x10\xb6\x28\x2a\xa3\x04\x7a\x82\xa5\xf2\x79\xec\x9f\xfb\x03\xb5\x19\xf1\xdd\xbc\x9f\x9f\x1c\x9b\x3f\x3b\x34\x33\xe7\xe9\x9c\xd6\xff\x87\x40\xbf\x7c\xf9\x09\xca\x6a\xaa\x95\x80\x60\x20\x72\x5d\x31\x39\x38\x15\xd6\xd1\xe9\x9e\xea\x90\x99\x7c\x2a\x95\xeb\xe5\xef\x01\x43\x60\x81\x21\xa9\x1c\x09\x6f\xdd\x1a\x96\x39\x39\x82\x19\x19\x72\xe8\x49\x42\xb4\xc0\xc0\xb9\xad\xb4\x84\x29\x41\xa9\x51\x90\x84\x33\x51\x4b\x8d\x81\x49\x38\xf2\xfc\xc4\xc8\x0d\xf9\x20\x8d\xb4\xf0\x55\x3f\xa6\x7c\xcd\x4a\xa0\x86\xfb\xfa\x20\xdc\x3d\x7e\x4d\x0e\x4d\x9b\xaa\x98\x92\xeb\x37\xad\xca\x14\x2b\x6f\x25\x79\x12\xc1\x6c\x5a\x90\xcf\xad\xec\x75\x77\x17\xbf\x8a\x24\x6c\xae\x80\xcf\x09\x72\xcb\x1e\x3e\x3d\x2c\xbe\x6b\x1b\xd3\xd1\xf0\x0e\x16\x8b\x4c\x39\xf6\xc3\xcc\x56\x46\xee\xa5\xa3\xb4\x32\x15\x4a\xf6\x67\x63\xf2\xe9\xe6\xd7\xda\xa3\x43\x33\xa3\x88\x89\x59\xcd\x0c\xfc\xab\x9a\x92\x33\xe4\x89\xa1\xb4\xf2\x19\x48\xae\x46\xc9\x75\x32\x4a\x46\x97\x57\x6f\xf7\x90\x30\xb9\x85\x12\x74\x14\xcd\xf7\xdf\xdf\x7e\xbe\x19\x3c\x09\x52\x63\x8a\x93\xc1\x63\x4e\x70\x15\x69\xab\x8b\x68\x4a\xa1\x10\xc9\x2d\x48\x46\x9d\x86\x32\x4b\xb1\x54\xf1\x23\x77\x11\x79\xbe\x1a\xf9\xfc\xe8\x85\x20\x69\x69\x38\x19\x04\x30\x83\x4e\xd8\x3d\x21\xd7\xe1\xbe\xee\x86\xfb\x0a\x6c\x8c\x67\x77\xdf\x6e\xf7\xfa\xa6\xbb\x70\x95\x65\x6a\xd5\x9b\x91\x5f\x2a\x72\x8a\xea\x1a\x6b\x26\x4a\xdb\x0c\x08\xea\x7b\x1b\xdc\x68\x78\x19\x27\xc7\x74\xbd\x81\x0d\x37\x0d\x36\xc5\x9b\x5e\xa1\x6d\x10\x77\xdd\x3f\x32\x6b\x93\x06\x7e\xc2\x0b\x91\xec\x9c\x39\x87\xa7\xe7\x79\xe7\xe2\x5e\xa6\xa5\x5d\x1a\x6d\x51\xa6\xa5\xb3\xde\x0a\xfb\xac\x65\x3e\x2e\xb0\x3d\x1b\xf2\x43\x63\x0b\xd4\xc3\x7f\x6e\xdb\xe6\x50\x71\x54\x48\xeb\x30\xb2\x34\x0f\x2a\xd1\xb1\xc9\x2a\xa3\xbc\x93\x1b\x52\x62\x6f\x8e\xf6\x2f\x36\x4d\xfb\xcf\x4a\x39\xe2\xda\xa8\xb0\x45\xa9\x34\xc9\x9a\x71\xe1\xd6\xa5\xb7\xed\x92\x9b\xc0\x57\x53\x31\x49\x50\x19\x08\x14\x39\xc9\xb4\x5d\xc8\x15\x83\x77\x15\x25\xfb\xe3\x77\xe7\x54\x1f\x05\x53\x6b\xf5\x01\x01\x19\x6a\xa6\xc3\xf0\x7f\xcb\xc9\xe7\xe4\x62\x84\x61\xfd\x46\x1f\xb6\x98\x7a\x37\x6f\xd9\x08\x31\x4c\xad\xf5\x4d\xec\x9d\x87\x4d\xfb\x00\x83\xcb\xa6\xb9\x46\x70\x09\xdc\x5b\x4f\xe0\x73\xac\x1b\x10\xca\x42\x19\x28\x2a\xf6\x90\xe3\x82\x36\xb4\x52\x4d\xec\xf6\xcd\x03\xca\x78\xbb\x35\x5a\xdb\xdc\x8f\xbf\x01\x90\x4a\xc5\xf3\xe7\x08\xe0\x52\xd2\xe2\x92\x25\xf6\x68\xe0\x46\xf1\x1c\x24\x85\xda\x0f\xa9\xac\x73\x18\xa0\xb5\xc1\x96\xce\x66\x4a\xd3\x66\x78\xb4\x9f\xf7\xb2\x56\x57\x44\xeb\xae\x6f\x1b\x8f\x7b\x4d\x1a\x9f\x4f\xa9\x0d\x6f\xa0\xa7\x47\xd1\x87\xfe\xf6\xe1\xd7\xdb\xc9\xc7\xc7\xdb\x9b\x31\x7c\x29\x49\xa8\x6c\x0d\x68\xe0\xf3\xed\x1d\xa8\x02\x67\x04\x2a\x4e\x85\xa0\x69\x64\x98\x22\x53\x6c\x03\x9d\xf8\xe2\xca\xd2\xe0\xc6\x42\x5d\xc0\xa2\x58\xa2\xa3\xd4\xe1\xf2\x02\x56\x64\xce\xc1\x3a\xd0\x14\x72\x37\xd5\x68\xe6\x9b\xfb\x2d\xb8\xe8\x67\x2f\xd0\xba\x5e\x52\x74\x33\xee\x6d\x49\x1f\xa5\x54\x75\x4b\xdb\x94\x96\x9b\x55\x05\x99\xba\x9e\x4a\x67\x17\x4a\x12\xa0\xdf\xe8\xaf\x67\x78\x1e\x6c\x18\x5d\xb2\x7e\xff\x63\x17\x11\x99\xf0\x3f\x75\x14\x0a\x4f\x99\xd9\x37\x6b\x67\x07\xeb\x6d\xbc\x09\x15\x07\x3a\xad\x03\x34\xa8\xd7\x5e\x09\x86\x8d\xb1\x48\x71\xc9\xde\x11\x16\x0c\x67\x13\xd4\x4a\xd8\xf3\xc3\x75\xb1\xae\xc3\x3e\x5c\x38\x9b\x39\x9a\xc5\x5c\xf4\x12\xd6\x80\x08\xbc\x77\x66\xd6\xc7\xed\x2d\xf8\x19\xd7\xe4\xe0\x4c\x76\xda\x52\xe8\x20\x3d\xfb\x4c\x6f\x8b\x08\x67\xf7\x3a\xae\xe2\x08\x8d\x49\x67\x69\xd8\x23\x48\xa6\x61\xf4\x69\xf2\xbd\x10\x6f\xea\xf3\xf5\x54\x21\x9d\x41\x7d\x07\x9a\x3b\xad\xde\xea\xd9\xd2\x38\x3f\x02\x2e\x0e\xbd\x09\x39\xaf\xb2\xb8\xbb\xf2\x4e\x11\x91\xf3\x9c\x2e\x50\x2b\xa9\xfc\x3a\x2d\xc9\x29\x2b\xd3\xdc\x56\xae\x5f\x6b\xff\x6e\x4e\x86\xcd\xbe\xad\x5b\xd1\xb1\x0d\xca\x40\x7d\xfb\xd8\x7a\xb6\xcf\xd5\xfb\x77\x6f\x47\x7b\x7a\xdf\x59\x09\x52\x5a\x79\x87\x69\xa6\xf1\x88\xfc\x6f\xc3\xf7\x10\xbf\x87\x32\x74\xba\x58\xa4\x81\xb4\x61\x87\xb4\xe1\xc6\xe0\x3f\x17\x7f\x1c\x3c\x69\x58\xdc\xbc\xc3\x2c\x53\xe2\x5b\x2a\x53\x66\xd8\xfe\xec\x57\x86\xad\xb2\xbe\x01\x8d\x15\x65\x4d\x0f\x9e\x6f\xcc\x9d\xdd\x0e\x3e\x33\xd6\x51\xba\x7a\x33\xfa\x90\x0a\x93\x8a\x9c\xc4\xbc\x17\xcb\xa7\x78\x10\x26\xf7\x10\xcf\xc4\x34\x85\x5b\x3b\xb9\xfb\x07\x40\x84\x35\xc6\x3b\x14\xf3\xb4\xc0\x55\x50\x51\x1a\xf6\x9d\x5e\x28\xc3\xe1\xe6\xf0\xb0\xc0\xd5\xb0\x24\x37\x0c\x87\x61\x81\xba\xa2\xcd\x4e\x38\x2c\x9d\x5d\xad\x13\xb8\xc3\x95\x2a\xaa\xa2\x51\x4f\x90\xdd\xfd\xc7\xc7\xf0\x7a\x33\xf5\x22\xdf\xd4\x26\x8a\x39\x94\xe4\x60\xf2\xf0\x35\xae\x5a\x70\x36\x8a\x8f\xe0\xd8\x6a\x83\x48\xb5\x2a\x94\x07\xe4\xa1\xaa\x9f\x77\x35\x75\xb5\x7e\xb7\x78\x94\xe9\x38\x8f\x9a\x3a\x7f\xe2\x43\xa3\x1d\xa6\xde\xa6\x5c\x84\xca\x64\xdf\x19\xac\xfb\xe9\x68\xa6\xde\xb1\x1f\x15\x43\x48\xa1\xf0\x1b\x43\x10\x0c\x3d\x37\x3b\xff\x0d\x00\x00\xff\xff\x8a\x0a\x11\x06\xb5\x16\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x58\x5b\x6f\xe3\xb6\x12\x7e\xf7\xaf\x18\x64\x1f\x92\x00\xb1\xe2\xa4\xdd\x9b\xd1\x3e\x2c\x9c\x14\x5d\x9c\x26\x9b\x76\xb3\xa7\x07\x28\x0a\x61\x4c\x8e\x2c\xc2\x14\xa9\x72\x28\x5f\x50\xf4\xbf\x1f\x90\x92\x6c\xd9\x96\x73\x92\xb3\x9b\x97\x00\x36\x67\xe6\x9b\x6f\xee\x5e\xa0\x53\x38\xd5\x04\x27\x42\x57\xec\xc9\xa5\x06\x0b\x3a\x81\xbf\x07\x00\x7e\x5d\x12\x34\x7f\x3f\x02\x7b\xa7\xcc\x6c\x00\x20\x89\x85\x53\xa5\x57\xd6\xc0\x8f\x70\xf2\xc5\xa8\xbf\x2a\x82\x46\x1c\xa2\xf8\xe0\x9f\xc1\xe0\x15\x4c\xd1\xd1\xb0\x20\x8f\x7a\x30\xd8\xda\x29\xd0\x8b\x7c\x6a\x57\x69\xee\x7d\x99\x92\x91\xa5\x55\xc6\xbf\xc4\xe2\x5d\xa3\x01\x7e\x7e\x7c\x7c\x00\x47\x28\x87\xd6\xe8\x35\xb4\xba\xe0\x8c\x92\x59\x02\x41\xff\xf8\xf2\xb2\xb5\x97\xd0\x0a\x8b\x52\x53\x22\x6c\x31\x7e\x37\x7a\x37\x3a\x8f\x30\xb7\xc0\x2c\xa7\x22\x47\x63\x48\xff\x0f\x30\x19\x56\xda\x37\x1f\x9f\xb0\x0f\xd2\x27\x87\x28\x7f\xd2\xe8\x05\x3a\x98\x58\xe3\x51\x19\x72\xf0\x8b\x32\xd5\x0a\x1a\x1b\xe0\x2d\x28\xc3\x1e\xb5\x86\xcc\xd9\x02\xce\x6a\x4d\x17\x30\x25\x8f\x17\x80\xba\xcc\xf1\x02\x48\xce\xa8\x07\xe8\x82\x1c\x2b\x6b\x5e\x02\x54\x54\xce\x91\xf1\x2f\x40\xda\x18\xe9\x22\x3d\xcb\xac\x83\x86\x48\x38\xbd\xbe\x7a\x7f\x95\xbc\x4e\x46\xa7\x30\x04\x26\x8a\x8c\xf3\xf8\xf2\x72\xb9\x5c\x26\x59\xad\x74\xa8\x83\xaa\xc4\xba\xd9\xa5\x23\x4d\xc8\xc4\x97\xe7\x4d\x7e\x14\x28\x72\x65\x88\x07\xaf\xe0\x91\x9c\xc3\xcc\xba\xe2\x94\x41\xb8\x4a\x12\x9c\x44\xaf\x78\xcd\x9e\x8a\x13\x90\x96\x18\x8c\xf5\x50\x3a\x5b\x92\xd3\x6b\xe0\xaa\x2c\xad\xf3\xa0\x15\x7b\x06\x9b\x41\x81\x25\x03\x5b\x58\x12\x48\x0b\x3e\x57\x9c\x74\x49\x13\xd6\x78\x67\xb5\x6e\x32\x9c\xfb\xa8\x0b\xba\xce\x6a\xfe\xce\x0f\x69\xfa\xe4\x24\x39\x92\xf1\x55\x30\xb8\xd5\x18\x93\x9e\x9b\xb4\xfb\xc3\x58\x49\x57\x7f\xee\x07\xad\x63\xbf\x40\xf1\x6d\xcd\x2b\x49\xc6\xab\x6c\xad\xcc\x0c\xee\x3e\x4c\x00\xa5\x74\xc4\xbc\x85\xf4\xfa\x7a\xfc\xfa\xfb\xf1\x68\x34\xc6\xab\xf1\x7b\x31\x46\x7a\x0a\x9e\xb4\x05\x2a\xf3\x6d\x11\xfe\xf4\xeb\xcd\xfd\x2e\x41\xdd\x72\x3c\x40\xb3\xb4\x6e\xfe\xed\x02\x55\x6b\x3b\x0c\xd2\xf5\x05\x84\x7f\xdf\x1d\x33\xff\x6d\xe2\xd4\x58\x7f\x7e\x8c\xa6\xd7\xe3\xeb\x6c\xfc\xee\xcd\x05\x6c\x3e\x12\xdf\x8d\xdf\x5c\x8d\xdf\xbe\x3d\x86\xf4\x9b\x85\xac\x01\x7b\x10\xae\xeb\x6e\xb8\x1a\xda\x9e\x8c\xa0\xd0\x22\x65\xa3\xca\x92\x7c\x2f\xac\x02\xcb\xb3\x2e\xb4\x1e\x6c\x77\x58\xd6\x9d\xb1\xe9\x13\x4d\x00\xbd\xdd\xd6\xfc\x7e\xc7\x9a\x58\x93\xa9\x19\x6c\x0c\x1f\x74\xc1\xbf\xff\xd9\x85\xa9\x71\x4a\xfa\x28\xc0\xa3\xb4\x05\x68\x36\x83\x5a\x1a\x42\x4f\x6c\x73\xcc\x4a\xe2\xe4\x98\xdd\x57\xa1\x24\x32\x35\xab\x1c\x06\x4d\x5d\x20\xf3\x77\xdc\x44\xb1\x33\x80\xf7\xac\x4e\xb6\xf5\x74\x73\xff\x39\xd2\x01\xcb\x5c\x89\x1c\x1c\xb1\xd5\x8b\x9a\x1c\xdc\xe9\x0c\xa1\x6f\x1b\x41\x09\xfc\x1e\x01\x32\xa0\x91\x30\xaf\xa6\x54\x23\x39\x65\x58\x2a\xad\x41\xd8\xa2\xa8\x8c\x12\xe8\x09\x96\xca\xe7\xb1\x7f\xee\x0f\xd4\x66\xc4\x77\xe3\x7e\x7e\x72\x6c\xfe\xec\xd0\xcc\x9c\xa7\x73\x5a\xff\x1f\x09\xfa\xf9\xf3\xcf\x50\x56\x53\xad\x04\x04\x05\x91\xeb\x8a\xc9\xc1\xa9\xb0\x8e\x4e\xf7\xb2\x0e\x99\xc9\xa7\x52\xb9\x5e\xfe\x1e\x30\x38\x16\x18\x92\xca\x91\xf0\xd6\xad\x61\x99\x93\x23\x98\x91\x21\x87\x9e\x24\x44\x0d\x0c\x9c\xdb\x4a\x4b\x98\x12\x94\x1a\x05\x49\x38\x13\x75\xaa\x31\x30\x09\x47\x9e\x9f\xe9\xb9\x21\x1f\x52\x23\x2d\x7c\xd5\x8f\x29\x5f\xb3\x12\xa8\xe1\xbe\x7e\x08\x77\x8f\x5f\x92\x43\xd5\xa6\x2a\xa6\xe4\xfa\x55\xab\x32\xc5\xca\x5b\x49\x9e\x44\x50\x9b\x16\xe4\x73\x2b\x7b\xcd\xdd\xc5\xaf\x22\x09\x1b\x11\xf0\x39\x41\x6e\xd9\xc3\xc7\x87\xc5\xf7\x6d\x63\x3a\xea\xde\xc1\x62\x91\x29\xc7\x7e\x98\xd9\xca\xc8\xbd\x70\x94\x56\xa6\x42\xc9\xfe\x68\x4c\x3e\xde\xfc\x56\x5b\x74\x68\x66\x14\x31\x31\xab\x99\x81\x7f\x55\x53\x72\x86\x3c\x31\x94\x56\xbe\x00\xc9\xd5\x28\xb9\x4e\x46\xc9\xe8\xf2\xea\xcd\x1e\x12\x26\xb7\x50\x82\x8e\xa2\xf9\xe1\x87\xdb\x4f\x37\x83\x67\x41\x6a\x54\x71\x32\x78\xcc\x09\xae\x22\x6d\x75\x11\x4d\x29\x14\x22\xb9\x05\xc9\x98\xa7\xa1\xcc\x52\x2c\x55\xfc\xc8\x5d\x44\x9e\xaf\x46\x3e\x3f\x2a\x10\x52\x5a\x1a\x4e\x06\x01\xcc\xa0\xe3\x76\x8f\xcb\xb5\xbb\xdf\x75\xdd\x7d\x05\x36\xfa\xb3\xbb\x6f\xb7\x7b\x7d\xd3\x5d\xb8\xca\x32\xb5\xea\x8d\xc8\xaf\x15\x39\x45\x75\x8d\x35\x13\xa5\x6d\x06\x04\xb5\xdc\x06\x37\x1a\x5e\xc6\xc9\x31\x5d\x6f\x60\xc3\x4d\x83\x4d\xf1\xa6\x57\x68\x1b\x92\xbb\xee\x1f\x99\xb5\x49\x03\x3f\xe1\x85\x48\x76\xde\x9c\xc3\xf3\xe3\xbc\x23\xb8\x17\x69\x69\x97\x46\x5b\x94\x69\xe9\xac\xb7\xc2\xbe\x68\x99\x8f\x0b\x6c\xcf\x86\xfc\xd0\xe8\x02\xf5\xf0\x9f\xdb\xb6\x39\x54\x1c\x33\xa4\x35\x18\x59\x9a\x87\x2c\xd1\xb1\xc9\x2a\xa3\xbc\x93\x1b\x52\x62\x6f\x8e\xfa\x2f\x36\x4d\xfb\xaf\x4a\x39\xe2\x5a\xa9\xb0\x45\xa9\x34\xc9\x9a\x71\xe1\xd6\xa5\xb7\xed\x92\x9b\xc0\x17\x53\x31\x49\x50\x19\x08\x14\x39\xc9\xb4\x5d\xc8\x15\x83\x77\x15\x25\xfb\xe3\x77\xe7\x55\x1f\x05\x53\x6b\xf5\x01\x01\x19\x6a\xa6\x43\xf7\x7f\xcf\xc9\xe7\xe4\xa2\x87\x61\xfd\x46\x1f\xb6\x98\x7a\x37\x6f\xd9\x08\x3e\x4c\xad\xf5\x8d\xef\x9d\xc3\xa6\x3d\xc0\xe0\xb2\x69\xae\x11\x5c\x02\xf7\xd6\x13\xf8\x1c\xeb\x06\x84\xb2\x50\x06\x8a\x8a\x3d\xe4\xb8\xa0\x0d\xad\x54\x13\xbb\xbd\x79\x40\x19\x6f\xb7\x4a\x6b\x9d\xfb\xfe\x37\x00\x52\xa9\x78\xfe\x92\x04\xb8\x94\xb4\xb8\x64\x89\x3d\x39\x70\xa3\x78\x0e\x92\x42\xed\x87\x50\xd6\x31\x0c\xd0\x5a\x67\x4b\x67\x33\xa5\x69\x33\x3c\xda\xcf\x7b\x59\xab\x2b\xa2\x35\xd7\xb7\x8d\xc7\xbd\x26\x8d\xe7\x53\x6a\xc3\x0d\xf4\x7c\x2f\xfa\xd0\xdf\x3e\xfc\x76\x3b\xf9\xf0\x78\x7b\x33\x86\xcf\x25\x09\x95\xad\x01\x0d\x7c\xba\xbd\x03\x55\xe0\x8c\x40\xc5\xa9\x10\x72\x1a\x19\xa6\xc8\x14\xdb\x40\xc7\xbf\xb8\xb2\x34\xb8\xb1\x50\x17\xb0\x28\x96\xe8\x28\x75\xb8\xbc\x80\x15\x99\x73\xb0\x0e\x34\x85\xd8\x4d\x35\x9a\xf9\x46\xbe\x05\x17\xed\xec\x39\x5a\xd7\x4b\x8a\x6e\xc6\xbd\x2d\xe9\x83\x94\xaa\x6e\x69\x9b\xd2\x72\xb3\xaa\x20\x53\xd7\x53\xe9\xec\x42\x49\x02\xf4\x9b\xfc\xeb\x19\x9e\x07\x1b\x46\x97\xac\x3f\xfe\xdc\x45\x44\x26\xfc\x4f\x1d\x85\xc2\x53\x66\xf6\x64\xed\xec\x60\xbd\x8d\x92\x50\x71\xa0\xd3\x3a\x40\x83\x7a\xed\x95\x60\xd8\x28\x8b\x14\x97\xec\x1d\x61\xc1\x70\x36\x41\xad\x84\x3d\x3f\x5c\x17\xeb\x3a\xec\xc3\x85\xb3\x99\xa3\x59\x8c\x45\x2f\x61\x0d\x88\xc0\x7b\x67\x66\x7d\xd8\x4a\xc1\x2f\xb8\x26\x07\x67\xb2\xd3\x96\x42\x07\xe9\xd9\x67\x7a\x5b\x44\x78\xbb\xd7\x71\x15\x47\x68\x4c\x3a\x4b\xc3\x1e\x41\x32\x0d\xa3\x4f\x93\xef\x85\x78\x53\xbf\xaf\xa7\x0a\xe9\x0c\x6a\x19\x68\x64\xda\x7c\xab\x67\x4b\x63\xfc\x08\xb8\x38\xf4\x26\xe4\xbc\xca\xe2\xee\xca\x3b\x45\x44\xce\x73\xba\x40\xad\xa4\xf2\xeb\xb4\x24\xa7\xac\x4c\x73\x5b\xb9\xfe\x5c\xfb\x77\xf3\x32\x6c\xf6\x6d\xdd\x8a\x8e\x6e\x50\x06\x6a\xe9\x63\xeb\xd9\x3e\x57\xef\xde\xbe\x19\xed\xe5\xfb\xce\x4a\x90\xd2\xca\x3b\x4c\x33\x8d\x47\xd2\xff\x36\x7c\x0f\xf1\x7b\x28\x43\xa7\x8b\x45\x1a\x48\x1b\x76\x48\x1b\x6e\x14\x7e\x7d\xf2\xc7\xc1\x93\x86\xc5\xcd\x3b\xcc\x32\x25\x9e\xca\x32\x65\x86\xed\xcf\x7e\x65\xd8\x2a\x6b\x09\x68\xb4\x28\x6b\x7a\xf0\x3c\x31\x77\x76\x3b\xf8\xcc\x58\x47\xe9\xea\xf5\xe8\x7d\x2a\x4c\x2a\x72\x12\xf3\x5e\x2c\x1f\xe3\x43\x98\xdc\x43\x7c\x13\xc3\x14\xa4\x76\x62\xf7\x15\x40\x84\x35\xc6\x3b\x14\xf3\xb4\xc0\x55\xc8\xa2\x34\xec\x3b\xbd\x50\x86\xc3\xcd\xe3\x61\x81\xab\x61\x49\x6e\x18\x1e\xc3\x02\x75\x45\x9b\x9d\x70\x58\x3a\xbb\x5a\x27\x70\x87\x2b\x55\x54\x45\x93\x3d\x21\xed\xee\x3f\x3c\x86\xeb\xcd\xd4\x8b\x7c\x53\x9b\x28\xe6\x50\x92\x83\xc9\xc3\x97\xb8\x6a\xc1\xd9\x28\x1e\xc1\xb1\xd5\x86\x24\xd5\xaa\x50\x1e\x90\x87\xaa\x3e\xef\x6a\xea\xea\xfc\xdd\xe2\x51\xa6\x63\x3c\xe6\xd4\xf9\x33\x0f\x8d\x76\x98\x7a\x9b\x72\x11\x2a\x93\x7d\x67\xb0\xee\x87\xa3\x99\x7a\xc7\x7e\x54\x0c\x2e\x85\xc2\x6f\x14\x41\x50\xf4\x15\xd1\x09\x07\x77\xca\x71\xa0\x29\x91\x3e\x7d\xce\x77\x4e\xfa\xe3\x37\x7d\x50\x08\xad\xc2\xf6\xc2\x2f\xb0\x3c\x76\xd4\xff\x37\x00\x00\xff\xff\x06\x54\x66\xac\x41\x17\x00\x00"), }, "/terraform-modules/bare-metal/flatcar-linux/kubernetes/versions.tf": &vfsgen۰CompressedFileInfo{ name: "versions.tf", @@ -6026,9 +6026,9 @@ var vfsgenAssets = func() http.FileSystem { "/terraform-modules/bare-metal/flatcar-linux/kubernetes/worker.tf": &vfsgen۰CompressedFileInfo{ name: "worker.tf", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 650, + uncompressedSize: 726, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\xdd\x6a\xc3\x30\x0c\x85\xef\xfd\x14\x22\x50\xc8\xa0\x78\xb7\xbb\xc9\x93\x94\x22\x9c\x44\x59\x4c\x1c\x3b\x58\x76\xd7\x31\xf6\xee\xc3\xf1\x42\xf3\x67\x7c\xa5\x73\x0e\xfa\x24\x8d\xae\x8d\x86\xa0\xf8\x72\x7e\x20\x5f\xc0\x8f\x00\x60\x17\x7d\x43\xb0\x7f\x15\x14\x52\xbe\xe7\xff\x6f\x17\x00\x8d\x8b\x36\x1c\xbc\x50\x81\x21\xfb\x19\xfa\xf2\xa1\xbc\xcc\x6e\xb4\x6a\x24\x7e\x5b\x32\xa8\x6d\x4b\xcf\x6d\x66\x16\xe4\x2c\x24\x9b\x89\x1c\xc8\x63\x6b\x19\x99\xfc\x43\x37\x84\x7a\x82\x0a\x32\xb4\xac\x9d\x0b\x43\xac\x49\x9e\x1b\xd3\x24\xdc\xe3\x40\xdf\x7c\x80\x4b\x54\x8b\xb8\xee\xe4\x46\xa5\x2d\x72\xec\x3a\xfd\x5c\x7c\xa7\x62\x0a\x29\x6c\xc8\x1f\x66\x3f\xc1\xcb\x46\x01\xa0\x26\x9d\xf8\xc8\xef\x23\x9d\xf3\xa3\x0a\x65\x71\x61\x79\xe1\xe2\xba\xe9\x9b\xd6\x96\x2b\xc3\x07\x2f\x14\xa9\x98\x56\x99\x1a\x18\x0a\x68\x54\x4d\x86\x77\x13\xe6\xe2\x6a\xbe\x94\x3a\xec\x61\x2d\xce\xde\x06\xd9\xea\x69\xa2\xc0\xdb\x83\x3a\x37\xc4\xa9\xcc\x91\x97\x27\xa3\xad\x4f\x7c\x5b\x9d\xf1\x7e\x85\xdb\x3d\x81\x32\x05\xe4\xa0\x6c\xab\x7c\x8b\xbd\xe3\x90\x59\x2a\x08\x3e\x92\xf8\x15\xe2\x2f\x00\x00\xff\xff\xfc\x17\xcc\xf5\x8a\x02\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x92\xd1\x8a\xea\x30\x10\x86\xef\xfb\x14\x43\x41\x50\x90\x9c\xdb\x73\xd3\x27\x11\x19\x62\x3a\xd5\xd0\x34\x09\x99\xc4\x75\x11\xdf\x7d\x49\x63\xd9\x68\x85\x2d\xbd\xca\xff\x4d\xe7\xcb\x4c\x27\xd7\x27\x43\xd0\x7e\xb9\x30\x52\x68\xe1\xde\x00\xb0\x4b\x41\x11\xbc\x3f\x1d\xb4\x42\xfc\x2b\xef\x13\x6f\x00\x94\x4b\x36\xae\x58\xe8\xc0\x90\x3d\xc7\xcb\xf6\x2a\x83\x28\x34\x5a\x39\x11\xef\x96\x1a\xd4\xb6\xa7\xdb\x6b\xcd\x1c\x88\x39\xc8\x98\x49\x1c\x29\x60\x6f\x19\x99\xc2\x55\x2b\x42\xed\xa1\x83\x22\x2d\x4e\xce\xc5\x31\x9d\x48\x7c\x06\xf3\x4d\xf8\x82\x23\x7d\xf3\x4a\x2e\x5b\x2d\x61\xdd\xc9\x4d\x52\x5b\xe4\x34\x0c\xfa\xb6\x70\x1f\xc3\x5c\x24\x51\x51\x58\xdd\xfd\x83\x5e\x01\x1b\x00\xe9\x75\xf6\xa3\xf0\x5e\x32\xb8\x30\xc9\xb8\x6d\x37\x2c\x36\xdc\xee\x5f\xfa\xe6\xb1\x95\x93\xf1\x3f\x2f\x16\xf9\x30\x8f\x32\x37\x30\x14\xd1\xc8\x13\x19\xae\x25\x28\x9c\x69\x6b\x9c\x1b\x93\x9f\x97\x60\x5d\x4f\xc8\x9e\x94\x1e\xb4\x7a\xf2\xe5\xb3\xf5\x7a\x0e\xd5\x0a\x8e\x7b\xb8\x3f\x76\x85\x29\xfc\xae\x9a\x55\xc6\x57\x33\xad\xc3\x99\x55\xc8\x56\x7b\x4f\x91\x5f\x7f\x8e\x5f\xaf\x9a\xf9\xd3\xe7\x70\xcc\x0a\x4c\x11\x39\x4a\xdb\xcb\xd0\xe3\xc5\x71\x2c\x2e\x1d\xc4\x90\xa8\x79\x34\xcd\x4f\x00\x00\x00\xff\xff\x40\xd4\x60\xe0\xd6\x02\x00\x00"), }, "/terraform-modules/bootkube": &vfsgen۰DirInfo{ name: "bootkube", @@ -6222,9 +6222,9 @@ var vfsgenAssets = func() http.FileSystem { "/terraform-modules/controller/main.tf": &vfsgen۰CompressedFileInfo{ name: "main.tf", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 2101, + uncompressedSize: 2128, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\x0c\xd8\x0d\x60\x03\xfa\x48\xda\x4b\x61\xac\xd0\x43\x91\x1e\xdb\x05\x72\x5c\x04\x04\x43\x8d\x6d\xae\x29\x52\xe5\x8c\x02\xa7\xa9\xff\x7b\x41\x4a\xb2\xec\x44\x29\xb6\xf5\xc9\x1c\xbe\x37\xf3\xc0\x79\x33\xb2\x5e\x2b\x4b\xf0\x9a\x01\x1c\xfa\x27\xb4\xc8\x32\xe0\x9f\xbd\x09\x28\xe3\x59\x7b\xb7\x35\x3b\xa8\xe1\xf3\xe7\xfb\x3f\x7e\xcb\xe8\x85\x18\xdb\x66\x93\x01\xf4\xce\x30\xc5\x3f\x05\x38\xd5\xe2\x66\xa2\x97\x84\xe1\xd9\x68\xcc\x00\x00\x9a\xe0\x3b\xe3\x12\x6c\x06\xde\xdd\x16\xda\x3b\x0e\xde\x5a\x0c\x65\xac\x90\xae\x01\x62\x14\x1d\xd3\x06\xfe\x1e\x23\x00\x5f\x1f\x86\x74\x8f\xe7\xc8\xaf\xde\x35\x86\x8d\x77\x5f\x14\xef\xef\x8f\x86\x98\xea\x0a\x59\x57\x51\x40\x70\xc8\x48\xd5\x2c\xfd\x4c\xbb\x3f\xa2\x7e\x60\x15\xf8\x4b\xc0\xba\x7a\x32\xae\x6a\x0f\x8d\x09\x50\x74\xf0\x96\xad\xf7\xa8\x0f\x9d\x37\x8e\x0b\x42\x1d\x90\xe9\xff\x64\x31\x4e\x69\x36\xcf\x58\xb4\xca\x99\x2d\x12\x53\x16\x9f\x30\x03\x78\xf2\x9e\x23\x10\x6a\x60\x6c\x3b\xab\x18\xb7\xc6\xe2\x4a\x7c\x7a\xed\x14\xef\xcb\xd6\x37\xbd\xc5\x53\x35\x5d\x52\x35\x31\xca\x17\xd5\xda\x92\xdb\xce\x8a\x3c\xf5\x6c\x4e\x26\x4d\xab\x76\x28\xe3\x13\x43\x0d\xcf\x2a\x94\x0b\x37\x4b\x0c\x56\x3b\x58\x66\xb0\x1a\x9e\x6f\x32\xc6\x45\x85\x91\xf0\xfe\x66\x81\x90\x0a\x2c\x12\x86\x02\xa7\x75\x7c\x14\x64\xdd\xc8\xe8\x1d\x0c\x04\x35\x7c\xdd\xfa\x00\x06\x8c\x83\xa0\xdc\x0e\x57\x91\x3c\xbb\x86\xa4\xf6\xbd\xe3\x35\x6c\x60\xeb\x43\xab\x78\x25\x6e\xa8\x88\x29\x6e\x9a\xf2\x86\x44\x9e\x8a\x69\xdb\x13\x63\x48\xba\x72\x30\x43\xb0\x71\x24\xff\xf2\x0e\xd7\x8f\x53\xd5\xef\x6f\x43\x44\x2f\xb4\x20\x49\x1f\x9e\x05\x6a\x10\xf1\xf8\xe9\x75\x10\xdc\x3b\x96\xc6\x35\x78\x3c\x89\x19\xda\xf8\x56\x19\x17\xa1\x23\xec\x42\xe7\xa9\x58\xa6\x97\x43\x68\x52\x7f\x12\x59\xca\xf7\x43\xca\x78\x5b\xef\x99\x3b\xda\x54\xd5\x98\x2a\x25\xb9\x2d\xf1\xa8\xda\xce\x62\xa9\x7d\x9b\xc7\xc8\xdd\x22\xee\xee\x0a\x57\x96\xe5\xac\xd4\x38\xc3\x46\x59\x39\xc2\xa1\x86\x6f\xde\xb8\x95\xc8\x45\x3e\x76\x28\x87\xa1\x67\xb1\x53\x69\x97\x94\x57\x8d\x9c\xfb\x33\x34\xe7\x2c\xe0\x86\x36\x3f\xfe\xf4\xf3\xad\xc8\xe7\x14\xeb\xc7\xf5\xd9\x0d\xe4\x4c\xd7\x21\x27\x27\x24\x39\x43\xee\x8f\x57\x54\x7e\x81\x9a\x6c\x7c\x19\x8b\xe5\xe3\xf9\x31\x3b\x65\x59\xa3\x58\x81\xd0\x2c\x07\xae\x00\x31\xfd\x89\x0d\xed\x02\x32\xbf\xc8\x2e\x18\xc7\x50\xc3\x56\x59\xc2\xa8\x69\x5c\x4f\xdf\x6f\x17\xe7\x9b\xa5\x89\x25\xda\xcb\x03\xbe\x10\xbc\xfb\xd5\xf0\x8d\xbc\x43\xa7\x7d\x33\x38\x7e\x82\xae\x13\x71\xf2\x49\x34\xc1\xb8\x65\xa5\xe9\xe0\x3c\x5c\xcb\xf7\xd7\xd4\x64\x3d\x49\xfd\x76\x6b\x8e\xb0\x40\xbd\xbc\xff\x70\xf8\xe1\x82\xf9\x1f\x56\xc0\xc7\xb4\xb7\x9b\xa6\xf1\xfa\x80\x41\xe2\x91\x83\x92\x2a\xec\x92\x0f\x86\x4f\xc0\xde\x13\x5f\xaa\x80\x37\x89\x09\x59\x12\x2b\xd7\xa8\xd0\xc8\x33\xb8\xae\x81\x43\x8f\xf0\xcb\xf2\xcc\xcd\x9b\xa5\x58\x98\x5c\xd8\x80\x10\x57\xfa\xac\x7a\x42\x1b\x45\xbd\x8e\x5f\x06\x91\x7a\x3d\x6f\xff\xd2\xf8\xaa\x55\xb1\x82\x18\xb5\x09\x91\xff\x0b\x76\x16\x20\x22\x36\x6a\x1d\xf1\xa7\xab\xc2\xac\x8c\xe3\x77\x85\x8b\xe0\xed\x47\xd5\x6b\x10\x9b\xdf\xfd\x83\xde\x63\xb4\xa7\x38\xe7\x7c\x37\x67\xda\x3b\xad\x78\x35\x8c\xcb\x14\x9f\x16\xa9\x96\x53\x64\x9d\x9d\xb2\x7f\x02\x00\x00\xff\xff\x3b\x69\x1d\x21\x35\x08\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\x0c\xd8\x0d\x60\x03\xfa\x48\xda\x4b\x61\xac\xd0\x43\x91\x1e\xdb\x05\x72\x5c\x04\x04\x43\x8e\x6c\xae\x29\x52\x25\x47\x81\xd3\x54\xff\xbd\x20\x25\x59\x76\x56\x29\xd2\xfa\x64\x0d\xdf\x9b\x79\xe2\xbc\x19\x19\x27\x85\x09\xf0\x9a\x01\x1c\xfb\x27\x34\x48\xdc\xe3\x9f\xbd\xf6\xc8\xe3\xb3\x74\xb6\xd1\x7b\xa8\xe1\xf3\xe7\xfb\x3f\x7e\xcb\xc2\x4b\x20\x6c\xd5\x2e\x03\xe8\xad\xa6\x10\xff\x14\x60\x45\x8b\xbb\x99\x5e\x06\xf4\xcf\x5a\x62\x06\x00\xa0\xbc\xeb\xb4\x4d\xb0\x05\x78\x77\x5b\x48\x67\xc9\x3b\x63\xd0\x97\xb1\x42\x3a\x06\x88\x51\xb4\x14\x76\xf0\xf7\x14\x01\xf8\xfa\x30\xa6\x7b\x3c\x47\x7e\x75\x56\x69\xd2\xce\x7e\x11\x74\xb8\x3f\xe9\x40\xa1\xae\x90\x64\x15\x05\x78\x8b\x84\xa1\x5a\xa4\x9f\x69\xf7\x27\x94\x0f\x24\x3c\x7d\xf1\x58\x57\x4f\xda\x56\xed\x51\x69\x0f\x45\x07\x6f\xd9\xf2\x80\xf2\xd8\x39\x6d\xa9\x08\x28\x3d\x52\xf8\x3f\x59\xb4\x15\x92\xf4\x33\x16\xad\xb0\xba\xc1\x40\x21\x8b\x57\x98\x01\x3c\x39\x47\x11\x08\x35\x10\xb6\x9d\x11\x84\x8d\x36\xb8\x61\x9f\x5e\x3b\x41\x87\xb2\x75\xaa\x37\x38\x54\xf3\x61\xa8\x66\x46\xf9\x22\x5a\x53\x52\xdb\x19\x96\xa7\x9e\x2d\xc9\xb8\x6e\xc5\x1e\x79\xbc\x62\xa8\xe1\x59\xf8\x72\xe5\x64\x8d\x41\x62\x0f\xeb\x0c\x12\xe3\xf5\xcd\xc6\xb8\xa8\x30\x11\xbe\x3f\x59\x21\xa4\x02\xab\x84\xb1\xc0\xb0\x8d\x97\x82\x24\x15\x8f\xde\x41\x1f\xa0\x86\xaf\x8d\xf3\xa0\x41\x5b\xf0\xc2\xee\x71\x13\xc9\x8b\x6b\x02\x97\xae\xb7\xb4\x85\x1d\x34\xce\xb7\x82\x36\xec\x26\x14\x31\xc5\x8d\x2a\x6f\x02\xcb\x53\x31\x69\xfa\x40\xe8\x93\xae\x1c\xf4\x18\x54\x36\xf0\xbf\x9c\xc5\xed\xe3\x5c\xf5\xe3\x6d\x88\xe8\x95\x16\x24\xe9\xe3\xb5\x40\x0d\x2c\x3e\x7e\x7a\x1d\x05\xf7\x96\xb8\xb6\x0a\x4f\x03\x5b\xa0\xca\xb5\x42\xdb\x08\x9d\x60\x17\x3a\x87\x62\x9d\x5e\x8e\xa1\x59\xfd\xc0\xb2\x94\xef\x87\x94\xf1\xb6\x3e\x10\x75\x61\x57\x55\x53\xaa\x94\xe4\xb6\xc4\x93\x68\x3b\x83\xa5\x74\x6d\x1e\x23\x77\xab\xb8\xbb\x2b\x5c\x59\x96\x8b\x52\x6d\x35\x69\x61\xf8\x04\x87\x1a\xbe\x39\x6d\x37\x2c\x67\xf9\xd4\xa1\x1c\xc6\x9e\xc5\x4e\xa5\x5d\x52\x5e\x35\x72\xe9\xcf\xd8\x9c\xb3\x80\x9b\xb0\xfb\xf1\xa7\x9f\x6f\x59\xbe\xa4\xd8\x3e\x6e\xcf\x6e\x08\x56\x77\x1d\x52\x72\x42\x92\x33\xe6\x7e\x7f\x45\xe5\x17\xa8\xd9\xc6\x97\xb1\x58\x3e\x3e\x3f\x66\x43\x96\x29\x41\x02\x98\x24\x3e\x72\x19\xb0\xf9\x4f\x6c\x68\xe7\x91\xe8\x85\x77\x5e\x5b\x82\x1a\x1a\x61\x02\x46\x4d\xd3\x7a\xfa\xb8\x5d\xac\x53\x6b\x13\x1b\xc2\x81\x1f\xf1\x25\xc0\x77\xbf\x1a\xbe\x05\x67\xd1\x4a\xa7\x46\xc7\xcf\xd0\x6d\x22\xce\x3e\x89\x26\x98\xb6\x2c\xd7\x1d\x9c\x87\x6b\xfd\xfc\x9a\x9a\xac\xc7\x43\xdf\x34\xfa\x04\x2b\xd4\xcb\xf3\x77\x87\x1f\x2e\x98\xff\x61\x05\xbc\x4f\x7b\xbb\x69\x94\x93\x47\xf4\x1c\x4f\xe4\x05\x17\x7e\x9f\x7c\x30\x7e\x02\x0e\x2e\xd0\xa5\x0a\x78\x93\x38\x20\xf1\x40\xc2\x2a\xe1\x15\x3f\x83\xeb\x1a\xc8\xf7\x08\xbf\xac\xcf\xdc\xb2\x59\x8a\x95\xc9\x85\x1d\x30\x76\xa5\xcf\x88\x27\x34\x51\x54\x8b\x7e\x5a\x4e\xd7\x47\x73\xaf\x01\x58\x72\xc1\xf2\x5d\x28\xb5\xab\x5a\x11\x6b\xb3\x49\x35\x63\xf9\xbf\x60\x17\x69\x2c\x62\xe3\x5b\x4c\xf8\x61\x7b\xa5\x89\x84\xb6\x69\x60\xae\x2a\x17\xde\x99\xf7\xca\xd7\xc0\x76\xbf\xbb\x07\x79\xc0\xe8\xdc\xf1\x0d\x87\xb5\x11\x94\xce\x4a\x41\x9b\x71\x92\xe6\xf8\xbc\x63\x25\x9f\x23\xdb\x6c\xc8\xfe\x09\x00\x00\xff\xff\x72\x3a\x04\x8d\x50\x08\x00\x00"), }, "/terraform-modules/controller/output-node.tf": &vfsgen۰CompressedFileInfo{ name: "output-node.tf", @@ -6275,9 +6275,9 @@ var vfsgenAssets = func() http.FileSystem { "/terraform-modules/controller/variables.tf": &vfsgen۰CompressedFileInfo{ name: "variables.tf", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 2353, + uncompressedSize: 2545, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x56\x61\x6f\xdb\x36\x10\xfd\xee\x5f\x71\x70\x3f\x64\x03\x6a\xd6\x69\xb2\x7e\x6a\x0b\x78\x4e\x8a\x06\xeb\xd2\xac\xde\xb7\x61\x50\xcf\xe4\x49\x26\x4c\x91\x2a\x8f\x34\x92\x0d\xfd\xef\x03\x29\x39\x55\x6c\x65\x89\x6d\xc0\x80\x41\xe8\xde\x3d\xbe\x77\xf7\xac\x17\xf0\x85\xbe\x45\xed\x49\xc1\x06\xbd\xc6\xa5\x21\x16\xa3\xed\x4f\x18\x2b\xcb\xc5\x3f\xce\xd2\x18\xfe\x1d\x01\x84\xbb\x86\xa0\xfb\xbc\x03\x0e\x5e\xdb\x6a\x04\xa0\x88\xa5\xd7\x4d\xd0\xce\xc2\x3b\x18\x5f\xb8\x1a\xb5\x05\x8b\x35\x41\xe9\x3c\x84\x15\xe5\xaf\x34\x91\x03\x79\x01\x97\xa2\x12\x70\x42\xb7\x58\x37\x86\x84\x74\xf5\xc9\x78\xf4\x7d\xd4\xeb\xda\x3d\x59\x24\x88\x43\x3a\xcf\xdb\xba\xdc\x5a\xec\x62\xba\x68\x43\xa1\xad\xa2\xdb\x21\x48\x1b\xeb\x25\xf9\x7d\xc8\xab\x54\x00\x0d\x32\x93\x02\x64\xc8\x30\x22\xc3\x40\xe9\x5d\xdd\x1e\x80\xb3\x50\x3b\x15\xcd\x40\x5b\x1b\xbc\x33\x86\x3c\x17\xf9\xd1\x43\x9a\x5f\xe7\x73\x70\x25\xfc\x80\x01\xeb\x14\x31\x68\xfb\x40\xd3\x9d\xae\xd8\x68\x26\xbf\x21\x7f\x88\x7a\x1f\xfe\xb8\xb8\x06\xe7\xe1\xea\x06\x50\x29\x4f\xcc\xd9\xbe\x75\x5c\x92\xa1\x00\xc1\x41\xe4\xce\x51\x34\x6b\x6d\xab\x74\xf4\x5b\x5c\x92\xb7\x14\x88\x61\x76\x73\x05\x6d\xd7\x3d\x11\xb0\x90\xe4\x07\xaf\xfe\x18\x99\x1e\xee\x7c\x06\xa9\x5a\x97\x5a\x62\xa0\x74\xf3\x9b\xcb\xdf\x13\x8f\x1a\x43\xa6\xb3\x74\x2e\x70\xf0\xd8\x64\xae\xd2\xd9\x52\x57\x7d\xea\x2d\x9d\x17\xf0\x39\xa3\xa3\x19\x1e\xf5\x84\x92\x0a\x0a\x5d\x63\x45\x07\xcf\xde\x85\x93\x6b\xf2\x90\x8b\xdb\xd9\xef\x09\x96\xec\x43\x6d\xc9\x83\x8f\xd6\x26\xe9\xb6\xdd\xc4\x38\x43\x95\x18\x4d\xe8\x3a\x8c\xbf\x45\xbc\x13\xda\xbd\x5a\x6b\xbb\x71\x66\xfd\x6a\xfb\xec\x8e\xaa\x3b\x84\x03\x56\x47\xf3\x0d\x58\x1d\x4f\x77\x33\x15\xa7\xe7\x62\x3a\x59\x91\xa9\xcf\x1f\xd9\x64\x95\x33\xa1\xe0\x58\x96\x7a\x70\xff\x9e\x5a\xe9\x16\x00\x5a\x00\x01\x37\xed\x42\x06\x77\x3f\x9e\xc8\x30\x99\x3c\x6c\x07\xa5\xc1\x6a\x88\xf1\x76\x6b\x8c\x93\x68\x76\x18\x33\xaf\x8a\x35\xdd\xf1\x10\x49\xa3\x39\xfc\xd4\x32\xfd\x79\x9f\xea\x27\xcd\x21\xed\xea\x62\xf1\x11\x9a\xb8\x34\x5a\x42\x02\xca\x8a\x46\x26\x0f\x5f\xa5\xf3\xf4\x55\xc0\x25\xca\x15\x90\xa1\x9a\x6c\x80\x3a\x72\x80\x25\x01\x37\x24\x75\xa9\x49\xa5\x01\x47\xd8\xa0\xd1\x0a\x3e\x37\x64\x1f\xc2\x75\x73\xff\x32\xdd\x57\x51\xa9\x6d\x5b\xf0\xe5\xc3\x1c\xce\x5f\xff\x72\x06\x0b\x92\x99\xcf\x1b\xf1\xe6\x25\x50\x0e\x5a\xe6\xd5\xc4\x33\xc2\x6c\x36\x9b\xfd\x7a\x76\x2d\x84\x38\x19\x10\xe5\xaf\xbf\x1f\x71\xce\x72\x91\xb6\x5a\x4b\x2a\x74\x73\x88\x75\xbd\x1c\x49\x09\xd6\x19\x79\x71\xbd\x80\x45\x8b\xf7\xb4\x8d\x96\xa1\x41\x8f\x35\xb5\x19\xb7\x67\xe4\xe9\x54\x9c\x89\xa9\x38\x9d\xee\x8d\x9d\x2c\xd8\xea\xa6\xa1\x70\x84\x91\x97\xb7\xc1\x23\xcc\x3f\xcd\x61\x8b\x91\x18\x6a\x2b\x4d\x54\x74\x9f\xbc\x39\x66\xa2\xc7\x54\xf5\x0c\x3d\xbb\x0b\x1e\x99\x2e\x0b\x17\xbd\xa4\xa4\xe3\x56\xa8\xfe\xfe\x3e\x27\x44\xba\xba\xf1\xff\xb1\x3a\x30\x42\xfe\xc4\x07\x31\xfb\x24\xa5\xcd\xa9\x78\x3d\x15\xbb\x11\xc1\x14\x0a\x0e\x68\x15\x7a\x55\xac\x1c\x87\xc7\xb4\x59\x3a\x67\x06\x94\xc9\xf6\xac\x08\xb6\xa5\xa0\x4b\x08\x3e\x92\x80\x8f\xf7\x27\x0c\xdc\xce\xd6\xdb\xfe\xab\xc5\xfb\xc9\x8f\xbf\xd5\xc9\xdb\xde\x0b\xc2\xfb\x7d\xf2\x25\x1a\xa6\xd1\xf7\xd1\x7f\x01\x00\x00\xff\xff\xf7\x44\xa5\x17\x31\x09\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x56\x51\x6f\xdb\x36\x10\x7e\xf7\xaf\x38\xa8\x0f\xd9\x80\x8a\x75\x9a\xac\x4f\x4d\x01\xcf\x49\xd1\x60\x9d\x9b\xd5\x7b\x5b\x06\xf5\x24\x9d\x6c\xc2\x14\xa9\xf2\x48\x23\x59\x90\xff\x3e\x90\x92\x53\xc5\x96\x9b\x38\x01\x02\x18\x14\xef\xbb\x8f\xdf\xdd\x7d\xe4\x2b\xf8\x4a\xdf\xbd\xb4\x54\xc2\x1a\xad\xc4\x5c\x11\x8b\xd1\xe6\x27\x24\xa5\xe6\xec\x3f\xa3\x29\x81\xbb\x11\x80\xbb\x6d\x08\xba\xbf\x33\x60\x67\xa5\x5e\x8c\x00\x4a\xe2\xc2\xca\xc6\x49\xa3\xe1\x0c\x92\x73\x53\xa3\xd4\xa0\xb1\x26\xa8\x8c\x05\xb7\xa4\xf8\x5f\x28\xcf\x8e\xac\x80\x0b\xb1\x10\x70\x44\x37\x58\x37\x8a\x44\x61\xea\xa3\x64\x74\x3f\xea\x65\xed\x76\x66\x01\xe2\x90\xcc\xd3\x36\x2e\xa6\x16\xdb\x98\xc6\x6b\x97\x49\x5d\xd2\xcd\x10\xa4\xf6\x75\x4e\x76\x17\xf2\x32\x04\x40\x83\xcc\x54\x02\x32\x44\x18\x11\x61\xa0\xb2\xa6\x6e\x17\xc0\x68\xa8\x4d\xe9\xd5\x40\x5a\xed\xac\x51\x8a\x2c\x67\x71\xeb\x21\xc9\x67\x71\x1d\x4c\x05\x3f\x60\x40\x9b\x92\x18\xa4\x7e\xa4\xe9\x56\x56\x6c\x24\x93\x5d\x93\x3d\x44\xbd\x8f\x7f\x9d\xcf\xc0\x58\xb8\xbc\x02\x2c\x4b\x4b\xcc\xb1\x7c\x2b\x9f\x93\x22\x07\xce\x80\xe7\xae\xa2\xa8\x56\x52\x2f\xc2\xd2\x1f\x3e\x27\xab\xc9\x11\xc3\xe4\xea\x12\xda\xac\x3b\x22\x60\x56\x90\x1d\x3c\xfa\x3e\x32\x3d\xdc\xe9\x04\x42\xb4\xac\x64\x81\x8e\xc2\xc9\xaf\x2e\xfe\x0c\x3c\x6a\x74\x91\x4e\x6e\x8c\x63\x67\xb1\x89\x5c\x0b\xa3\x2b\xb9\xe8\x53\x6f\xe9\xbc\x82\x2f\x11\x1d\xd5\x70\xab\x07\x94\x10\x90\xc9\x1a\x17\x74\x70\xef\x9d\x9b\x62\x45\x16\x62\x70\xdb\xfb\x3d\xc1\x42\xf9\x50\x6a\xb2\x60\xbd\xd6\x41\xba\x4d\x36\x91\x44\xa8\x0a\xbd\x72\x5d\x86\xe4\xbb\xc7\x5b\x21\xcd\x9b\x95\xd4\x6b\xa3\x56\x6f\x36\x7b\xb7\x54\xdd\x22\xec\x70\xf1\x62\xbe\x0e\x17\x2f\xa7\xbb\x1e\x8b\xe3\x53\x31\x4e\x97\xa4\xea\xd3\x3d\x93\x5c\x46\x4f\xc8\xd8\x57\x95\x1c\x9c\xbf\xa7\x46\xba\x05\x80\x16\x40\xc0\x55\x3b\x90\xce\x3c\xb4\x27\x32\xa4\xe9\xe3\x74\x50\x29\x5c\x0c\x31\xde\x4c\x8d\x32\x05\xaa\x2d\xc6\xcc\xcb\x6c\x45\xb7\x3c\x44\x52\x49\x76\xbf\xb4\x4c\x7f\xdd\xa5\xfa\x59\xb2\x0b\xb3\x3a\x9f\x7f\x82\xc6\xe7\x4a\x16\x10\x80\xa2\xa2\x9e\xc9\xc2\xb7\xc2\x58\xfa\x26\xe0\x02\x8b\x25\x90\xa2\x9a\xb4\x83\xda\xb3\x83\x9c\x80\x1b\x2a\x64\x25\xa9\x0c\x0d\x8e\xb0\x46\x25\x4b\xf8\xd2\x90\x7e\x0c\xd7\xf5\xfd\xeb\x70\xde\x92\x2a\xa9\xdb\x80\xaf\x1f\xa7\x70\xfa\xf6\xb7\x13\x98\x53\x11\xf9\xbc\x13\xef\x5e\x03\x45\xa3\x65\x5e\xa6\x96\x11\x26\x93\xc9\xe4\xf7\x93\x99\x10\xe2\x68\x40\x94\x7f\xfe\xdd\x53\x39\xcd\x59\x98\x6a\x59\x50\x26\x9b\x43\x4a\xd7\xf3\x91\xe0\x60\x5d\x21\xcf\x67\x73\x98\xb7\x78\x4f\x97\x51\x33\x34\x68\xb1\xa6\xd6\xe3\x76\x0a\x79\x3c\x16\x27\x62\x2c\x8e\xc7\x3b\x6d\x57\x64\xac\x65\xd3\x90\x7b\x41\x21\x2f\x6e\x9c\x45\x98\x7e\x9e\xc2\x06\x23\x30\x94\xba\x50\xbe\xa4\x07\xe7\x8d\x36\xe3\x2d\x86\xa8\x67\xe8\xd9\x1d\xf0\x85\xee\x32\x37\xde\x16\x14\x74\xdc\x08\xd5\x9f\xdf\xe7\x98\x48\x17\x97\xfc\x8c\xd5\x81\x16\xf2\x37\x3e\xb2\xd9\x27\x29\xad\x8f\xc5\xdb\xb1\xd8\xb6\x08\x26\x97\xb1\x43\x5d\xa2\x2d\xb3\xa5\x61\xb7\x4f\x9b\xdc\x18\x35\xa0\x4c\x2c\xcf\x92\x60\x13\x0a\xb2\x02\x67\x3d\x09\xf8\xf4\xb0\xc2\xc0\x6d\x6f\xbd\xef\x3f\x2d\x3e\xa4\x3f\xae\xd5\xf4\x7d\xef\x81\xf0\x61\x97\x7c\x85\x8a\x69\x58\x3b\x85\x39\xa9\xc1\x36\xab\xb1\xd9\xdf\x65\x33\x53\x12\xb4\xb1\x9b\xf7\x45\x6f\x0e\xd2\x34\xdc\xf3\x69\xf7\x3d\x1a\x59\xfb\x6e\xba\x83\x3b\xb8\x4e\xc2\x47\xb1\x7a\xb8\x23\x43\xa1\xc3\xd2\x75\x02\x67\x70\x9d\x5c\x27\x70\xbf\x7b\x84\xbb\xfb\xd1\xfd\xe8\xff\x00\x00\x00\xff\xff\xb5\x48\xa4\x88\xf1\x09\x00\x00"), }, "/terraform-modules/controller/versions.tf": &vfsgen۰CompressedFileInfo{ name: "versions.tf", diff --git a/pkg/platform/baremetal/baremetal.go b/pkg/platform/baremetal/baremetal.go index 99768b8b2..e8e073725 100644 --- a/pkg/platform/baremetal/baremetal.go +++ b/pkg/platform/baremetal/baremetal.go @@ -30,6 +30,9 @@ import ( "github.com/kinvolk/lokomotive/pkg/terraform" ) +// Labels represent the map of key value string pairs added the kubelet. +type Labels map[string]string + type config struct { AssetDir string `hcl:"asset_dir"` CachedInstall string `hcl:"cached_install,optional"` @@ -51,7 +54,8 @@ type config struct { WorkerNames []string `hcl:"worker_names"` WorkerMacs []string `hcl:"worker_macs"` WorkerDomains []string `hcl:"worker_domains"` - Labels map[string]string `hcl:"labels,optional"` + Labels Labels `hcl:"labels,optional"` + NodeSpecificLabels map[string]Labels `hcl:"node_specific_labels,optional"` OIDC *oidc.Config `hcl:"oidc,block"` EncryptPodTraffic bool `hcl:"encrypt_pod_traffic,optional"` IgnoreX509CNCheck bool `hcl:"ignore_x509_cn_check,optional"` @@ -220,7 +224,8 @@ func createTerraformConfigFile(cfg *config, terraformPath string) error { WorkerDomains string DisableSelfHostedKubelet bool KubeAPIServerExtraFlags []string - Labels map[string]string + Labels Labels + NodeSpecificLabels map[string]Labels EncryptPodTraffic bool IgnoreX509CNCheck bool ConntrackMaxPerCore int @@ -252,6 +257,7 @@ func createTerraformConfigFile(cfg *config, terraformPath string) error { DisableSelfHostedKubelet: cfg.DisableSelfHostedKubelet, KubeAPIServerExtraFlags: cfg.KubeAPIServerExtraFlags, Labels: cfg.Labels, + NodeSpecificLabels: cfg.NodeSpecificLabels, EncryptPodTraffic: cfg.EncryptPodTraffic, IgnoreX509CNCheck: cfg.IgnoreX509CNCheck, ConntrackMaxPerCore: cfg.ConntrackMaxPerCore, diff --git a/pkg/platform/baremetal/template.go b/pkg/platform/baremetal/template.go index e5fddfced..daf056317 100644 --- a/pkg/platform/baremetal/template.go +++ b/pkg/platform/baremetal/template.go @@ -65,6 +65,20 @@ module "bare-metal-{{.ClusterName}}" { } {{- end}} + {{- if .NodeSpecificLabels}} + node_specific_labels = { + {{- range $nodeName, $mapOfLabels := .NodeSpecificLabels}} + {{- if $mapOfLabels }} + "{{$nodeName}}" = { + {{- range $key, $value := $mapOfLabels }} + "{{$key}}" = "{{$value}}", + {{- end }} + } + {{- end }} + {{- end }} + } + {{- end }} + ignore_x509_cn_check = {{.IgnoreX509CNCheck}} conntrack_max_per_core = {{.ConntrackMaxPerCore}} diff --git a/test/components/kubernetes/baremetal_kubelet_labels_test.go b/test/components/kubernetes/baremetal_kubelet_labels_test.go new file mode 100644 index 000000000..9166ac860 --- /dev/null +++ b/test/components/kubernetes/baremetal_kubelet_labels_test.go @@ -0,0 +1,82 @@ +// Copyright 2021 The Lokomotive Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build baremetal +// +build e2e + +package kubernetes_test + +import ( + "context" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + pkglabels "k8s.io/apimachinery/pkg/labels" + + testutil "github.com/kinvolk/lokomotive/test/components/util" +) + +func Test_Baremetal_NodeSpecificLabels(t *testing.T) { + // This map is copied from file ci/baremetal/baremetal-cluster.lokocfg.envsubst + // the field is `node_specific_labels`. + // The node name keys are constructed as follows: --. + // The labels include the labels common to every worker node derived from `labels` and + // labels specific to the node. + nodeNamesAndExpectedLabelsInCI := map[string]map[string]string{ + "mercury-controller-0": { + "testkey": "testvalue", + "node.kubernetes.io/master": "", + "node.kubernetes.io/controller": "true", + }, + "mercury-worker-0": { + "ingressnode": "yes", + "testing.io": "yes", + "roleofnode": "testing", + }, + "mercury-worker-1": { + "storagenode": "yes", + "testing.io": "yes", + "roleofnode": "testing", + }, + } + + client := testutil.CreateKubeClient(t) + + nodes, err := client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) + if err != nil { + t.Fatalf("could not list nodes: %v", err) + } + + if len(nodes.Items) != len(nodeNamesAndExpectedLabelsInCI) { + t.Errorf("expected %d worker nodes, got: %d", len(nodeNamesAndExpectedLabelsInCI), len(nodes.Items)) + } + + for nodeName, labelsMap := range nodeNamesAndExpectedLabelsInCI { + labels := pkglabels.Set(labelsMap).String() + + nodes, err := client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{ + LabelSelector: labels, + }) + if err != nil { + t.Errorf("expected node with name %q not found: %v", nodeName, err) + } + + // Currently we assume that the labels added to the node in CI are unique to the worker node. + // This check confirms that the expected set of labels as per CI configuration were + // present on the correct node. + if len(nodes.Items) == 1 && nodes.Items[0].Name != nodeName { + t.Errorf("expected node %q to have the labels %s", nodes.Items[0].Name, labels) + } + } +}