diff --git a/.kitchen.yml b/.kitchen.yml index da159806dc..6bf414c21f 100644 --- a/.kitchen.yml +++ b/.kitchen.yml @@ -104,6 +104,20 @@ suites: systems: - name: stub_domains_private backend: local + - name: "upstream_nameservers" + driver: + root_module_directory: test/fixtures/upstream_nameservers + verifier: + systems: + - name: upstream_nameservers + backend: local + - name: "stub_domains_upstream_nameservers" + driver: + root_module_directory: test/fixtures/stub_domains_upstream_nameservers + verifier: + systems: + - name: stub_domains_upstream_nameservers + backend: local - name: "workload_metadata_config" driver: root_module_directory: test/fixtures/workload_metadata_config diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f8b1fd3b0..2f1269c5f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ Extending the adopted spec, each change should have a link to its corresponding ## [Unreleased] +## [v3.0.0] - 2019-07-08 + ### Added * Add configuration flag for enable BinAuthZ Admission controller [#160] [#188] @@ -16,15 +18,16 @@ Extending the adopted spec, each change should have a link to its corresponding * Support to scale the default node cluster. [#149] * Support for configuring the network policy provider. [#159] * Support for database encryption. [#165] -* Submodules for public and private clusters with beta features. [#124] [#188] +* Submodules for public and private clusters with beta features. [#124] [#188] [#203] * Support for configuring cluster IPv4 CIDRs. [#193] * Support for configuring IP Masquerade. [#187] * Support for v2.9 of the Google providers. [#198] +* Support for upstreamNameservers. [#207] ### Fixed -* Dropped support for v2.7 of the Google providers; these versions were - incompatible with the guest accelerator. [#198] +* Dropped support for versions of the Google provider earlier than v2.9; these versions multiple + incompatibilities with the module. [#198] ## [v2.1.0] - 2019-05-30 @@ -131,7 +134,8 @@ Extending the adopted spec, each change should have a link to its corresponding * Initial release of module. -[Unreleased]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.1.0...HEAD +[Unreleased]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v3.0.0...HEAD +[v3.0.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.1.0...v3.0.0 [v2.1.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.0.1...v2.1.0 [v2.0.1]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v2.0.0...v2.0.1 [v2.0.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v1.0.1...v2.0.0 @@ -142,6 +146,8 @@ Extending the adopted spec, each change should have a link to its corresponding [v0.3.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.2.0...v0.3.0 [v0.2.0]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/compare/v0.1.0...v0.2.0 +[#207]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/207 +[#203]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/203 [#198]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/198 [#197]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/197 [#193]: https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/pull/193 diff --git a/README.md b/README.md index 1d068e03ab..f175e8d507 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,11 @@ Then perform the following commands on the root folder: - `terraform apply` to apply the infrastructure build - `terraform destroy` to destroy the built infrastructure +## Upgrade to v3.0.0 + +v3.0.0 is a breaking release. Refer to the +[Upgrading to v3.0 guide][upgrading-to-v3.0] for details. + ## Upgrade to v2.0.0 v2.0.0 is a breaking release. Refer to the @@ -154,6 +159,7 @@ In either case, upgrading to module version `v1.0.0` will trigger a recreation o | service\_account | The service account to run nodes as if not overridden in `node_pools`. The default value will cause a cluster-specific service account to be created. | string | `"create"` | no | | stub\_domains | Map of stub domains and their resolvers to forward DNS queries for a certain domain to an external DNS server | map | `` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs @@ -198,7 +204,7 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog - [kubectl](https://github.com/kubernetes/kubernetes/releases) 1.9.x #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x -- [terraform-provider-google](https://github.com/terraform-providers/terraform-provider-google) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP][terraform-provider-google] v2.9 ### Configure a Service Account In order to execute this module you must have a Service Account with the @@ -366,3 +372,5 @@ command. * Dockerfiles - hadolint. Can be found in homebrew [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md +[upgrading-to-v3.0]: docs/upgrading_to_v3.0.md +[terraform-provider-google]: https://github.com/terraform-providers/terraform-provider-google diff --git a/autogen/README.md b/autogen/README.md index 53b7d4b615..e43b896ede 100644 --- a/autogen/README.md +++ b/autogen/README.md @@ -111,6 +111,11 @@ Then perform the following commands on the root folder: - `terraform apply` to apply the infrastructure build - `terraform destroy` to destroy the built infrastructure +## Upgrade to v3.0.0 + +v3.0.0 is a breaking release. Refer to the +[Upgrading to v3.0 guide][upgrading-to-v3.0] for details. + ## Upgrade to v2.0.0 v2.0.0 is a breaking release. Refer to the @@ -142,9 +147,9 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x {% if private_cluster or beta_cluster %} -- [terraform-provider-google-beta](https://github.com/terraform-providers/terraform-provider-google-beta) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP Beta][terraform-provider-google-beta] v2.9 {% else %} -- [terraform-provider-google](https://github.com/terraform-providers/terraform-provider-google) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP][terraform-provider-google] v2.9 {% endif %} ### Configure a Service Account @@ -317,3 +322,13 @@ command. {% else %} [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md {% endif %} +{% if private_cluster or beta_cluster %} +[upgrading-to-v3.0]: ../../docs/upgrading_to_v3.0.md +{% else %} +[upgrading-to-v3.0]: docs/upgrading_to_v3.0.md +{% endif %} +{% if private_cluster or beta_cluster %} +[terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta +{% else %} +[terraform-provider-google]: https://github.com/terraform-providers/terraform-provider-google +{% endif %} diff --git a/autogen/cluster_regional.tf b/autogen/cluster_regional.tf index 847d2808fe..6dcd2e01ed 100644 --- a/autogen/cluster_regional.tf +++ b/autogen/cluster_regional.tf @@ -107,6 +107,7 @@ resource "google_container_cluster" "primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" {% if beta_cluster %} + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" {% endif %} } diff --git a/autogen/cluster_zonal.tf b/autogen/cluster_zonal.tf index c03c57a0f8..24ed5671e6 100644 --- a/autogen/cluster_zonal.tf +++ b/autogen/cluster_zonal.tf @@ -39,10 +39,10 @@ resource "google_container_cluster" "zonal_primary" { monitoring_service = "${var.monitoring_service}" {% if beta_cluster %} - enable_binary_authorization = "${var.enable_binary_authorization}" - pod_security_policy_config = "${var.pod_security_policy_config}" - {% endif %} + enable_binary_authorization = "${var.enable_binary_authorization}" + pod_security_policy_config = "${var.pod_security_policy_config}" + {% endif %} master_authorized_networks_config = ["${var.master_authorized_networks_config}"] master_auth { @@ -108,6 +108,7 @@ resource "google_container_cluster" "zonal_primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" {% if beta_cluster %} + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" {% endif %} } diff --git a/autogen/dns.tf b/autogen/dns.tf index 1b0d83eb23..24a3f34844 100644 --- a/autogen/dns.tf +++ b/autogen/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,49 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs @@ -218,7 +224,7 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog - [kubectl](https://github.com/kubernetes/kubernetes/releases) 1.9.x #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x -- [terraform-provider-google-beta](https://github.com/terraform-providers/terraform-provider-google-beta) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP Beta][terraform-provider-google-beta] v2.9 ### Configure a Service Account In order to execute this module you must have a Service Account with the @@ -386,3 +392,5 @@ command. * Dockerfiles - hadolint. Can be found in homebrew [upgrading-to-v2.0]: ../../docs/upgrading_to_v2.0.md +[upgrading-to-v3.0]: ../../docs/upgrading_to_v3.0.md +[terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta diff --git a/modules/beta-private-cluster/cluster_regional.tf b/modules/beta-private-cluster/cluster_regional.tf index 97ca1475af..4142486488 100644 --- a/modules/beta-private-cluster/cluster_regional.tf +++ b/modules/beta-private-cluster/cluster_regional.tf @@ -102,6 +102,7 @@ resource "google_container_cluster" "primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" } } diff --git a/modules/beta-private-cluster/cluster_zonal.tf b/modules/beta-private-cluster/cluster_zonal.tf index f9bded28f8..9df66bfbc1 100644 --- a/modules/beta-private-cluster/cluster_zonal.tf +++ b/modules/beta-private-cluster/cluster_zonal.tf @@ -38,8 +38,8 @@ resource "google_container_cluster" "zonal_primary" { logging_service = "${var.logging_service}" monitoring_service = "${var.monitoring_service}" - enable_binary_authorization = "${var.enable_binary_authorization}" - pod_security_policy_config = "${var.pod_security_policy_config}" + enable_binary_authorization = "${var.enable_binary_authorization}" + pod_security_policy_config = "${var.pod_security_policy_config}" master_authorized_networks_config = ["${var.master_authorized_networks_config}"] @@ -103,6 +103,7 @@ resource "google_container_cluster" "zonal_primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" } } diff --git a/modules/beta-private-cluster/dns.tf b/modules/beta-private-cluster/dns.tf index 25effe580a..91b41efac4 100644 --- a/modules/beta-private-cluster/dns.tf +++ b/modules/beta-private-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,49 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs @@ -209,7 +215,7 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog - [kubectl](https://github.com/kubernetes/kubernetes/releases) 1.9.x #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x -- [terraform-provider-google-beta](https://github.com/terraform-providers/terraform-provider-google-beta) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP Beta][terraform-provider-google-beta] v2.9 ### Configure a Service Account In order to execute this module you must have a Service Account with the @@ -377,3 +383,5 @@ command. * Dockerfiles - hadolint. Can be found in homebrew [upgrading-to-v2.0]: docs/upgrading_to_v2.0.md +[upgrading-to-v3.0]: ../../docs/upgrading_to_v3.0.md +[terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta diff --git a/modules/beta-public-cluster/cluster_regional.tf b/modules/beta-public-cluster/cluster_regional.tf index 88f2aa089c..b651323baf 100644 --- a/modules/beta-public-cluster/cluster_regional.tf +++ b/modules/beta-public-cluster/cluster_regional.tf @@ -102,6 +102,7 @@ resource "google_container_cluster" "primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" } } diff --git a/modules/beta-public-cluster/cluster_zonal.tf b/modules/beta-public-cluster/cluster_zonal.tf index 66d0352011..dca12fd9ce 100644 --- a/modules/beta-public-cluster/cluster_zonal.tf +++ b/modules/beta-public-cluster/cluster_zonal.tf @@ -38,8 +38,8 @@ resource "google_container_cluster" "zonal_primary" { logging_service = "${var.logging_service}" monitoring_service = "${var.monitoring_service}" - enable_binary_authorization = "${var.enable_binary_authorization}" - pod_security_policy_config = "${var.pod_security_policy_config}" + enable_binary_authorization = "${var.enable_binary_authorization}" + pod_security_policy_config = "${var.pod_security_policy_config}" master_authorized_networks_config = ["${var.master_authorized_networks_config}"] @@ -103,6 +103,7 @@ resource "google_container_cluster" "zonal_primary" { node_config { service_account = "${lookup(var.node_pools[0], "service_account", local.service_account)}" + workload_metadata_config = "${local.cluster_node_metadata_config["${var.node_metadata == "UNSPECIFIED" ? "unspecified" : "specified"}"]}" } } diff --git a/modules/beta-public-cluster/dns.tf b/modules/beta-public-cluster/dns.tf index 25effe580a..91b41efac4 100644 --- a/modules/beta-public-cluster/dns.tf +++ b/modules/beta-public-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,49 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = <` | no | | subnetwork | The subnetwork to host the cluster in (required) | string | n/a | yes | +| upstream\_nameservers | If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf | list | `` | no | | zones | The zones to host the cluster in (optional if regional cluster / required if zonal) | list | `` | no | ## Outputs @@ -207,7 +213,7 @@ The [project factory](https://github.com/terraform-google-modules/terraform-goog - [kubectl](https://github.com/kubernetes/kubernetes/releases) 1.9.x #### Terraform and Plugins - [Terraform](https://www.terraform.io/downloads.html) 0.11.x -- [terraform-provider-google-beta](https://github.com/terraform-providers/terraform-provider-google-beta) v2.3, v2.6, v2.9 +- [Terraform Provider for GCP Beta][terraform-provider-google-beta] v2.9 ### Configure a Service Account In order to execute this module you must have a Service Account with the @@ -375,3 +381,5 @@ command. * Dockerfiles - hadolint. Can be found in homebrew [upgrading-to-v2.0]: ../../docs/upgrading_to_v2.0.md +[upgrading-to-v3.0]: ../../docs/upgrading_to_v3.0.md +[terraform-provider-google-beta]: https://github.com/terraform-providers/terraform-provider-google-beta diff --git a/modules/private-cluster/cluster_zonal.tf b/modules/private-cluster/cluster_zonal.tf index b410c08048..1ee89f7e93 100644 --- a/modules/private-cluster/cluster_zonal.tf +++ b/modules/private-cluster/cluster_zonal.tf @@ -38,7 +38,6 @@ resource "google_container_cluster" "zonal_primary" { logging_service = "${var.logging_service}" monitoring_service = "${var.monitoring_service}" - master_authorized_networks_config = ["${var.master_authorized_networks_config}"] master_auth { diff --git a/modules/private-cluster/dns.tf b/modules/private-cluster/dns.tf index 25effe580a..91b41efac4 100644 --- a/modules/private-cluster/dns.tf +++ b/modules/private-cluster/dns.tf @@ -20,7 +20,7 @@ Delete default kube-dns configmap *****************************************/ resource "null_resource" "delete_default_kube_dns_configmap" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config || local.upstream_nameservers_config ? 1 : 0}" provisioner "local-exec" { command = "${path.module}/scripts/kubectl_wrapper.sh https://${local.cluster_endpoint} ${data.google_client_config.default.access_token} ${local.cluster_ca_certificate} ${path.module}/scripts/delete-default-resource.sh kube-system configmap kube-dns" @@ -33,7 +33,7 @@ resource "null_resource" "delete_default_kube_dns_configmap" { Create kube-dns confimap *****************************************/ resource "kubernetes_config_map" "kube-dns" { - count = "${local.custom_kube_dns_config ? 1 : 0}" + count = "${local.custom_kube_dns_config && !local.upstream_nameservers_config ? 1 : 0}" metadata { name = "kube-dns" @@ -52,3 +52,49 @@ EOF depends_on = ["null_resource.delete_default_kube_dns_configmap", "data.google_client_config.default", "google_container_cluster.primary", "google_container_node_pool.pools", "google_container_cluster.zonal_primary", "google_container_node_pool.zonal_pools"] } + +resource "kubernetes_config_map" "kube-dns-upstream-namservers" { + count = "${!local.custom_kube_dns_config && local.upstream_nameservers_config ? 1 : 0}" + + metadata { + name = "kube-dns" + namespace = "kube-system" + + labels { + maintained_by = "terraform" + } + } + + data { + upstreamNameservers = < {}, + "httpLoadBalancing" => {}, + "kubernetesDashboard" => { + "disabled" => true, + }, + "networkPolicyConfig" => {}, + }) + end + end + end +end diff --git a/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb b/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb new file mode 100644 index 0000000000..5223cbd2d4 --- /dev/null +++ b/test/integration/stub_domains_upstream_nameservers/controls/kubectl.rb @@ -0,0 +1,92 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'kubeclient' +require 'rest-client' + +require 'base64' + +kubernetes_endpoint = attribute('kubernetes_endpoint') +client_token = attribute('client_token') +ca_certificate = attribute('ca_certificate') + +control "kubectl" do + title "Kubernetes configuration" + + describe "kubernetes" do + let(:kubernetes_http_endpoint) { "https://#{kubernetes_endpoint}/api" } + let(:client) do + cert_store = OpenSSL::X509::Store.new + cert_store.add_cert(OpenSSL::X509::Certificate.new(Base64.decode64(ca_certificate))) + Kubeclient::Client.new( + kubernetes_http_endpoint, + "v1", + ssl_options: { + cert_store: cert_store, + verify_ssl: OpenSSL::SSL::VERIFY_PEER, + }, + auth_options: { + bearer_token: Base64.decode64(client_token), + }, + ) + end + + describe "configmap" do + describe "kube-dns" do + let(:kubedns_configmap) { client.get_config_map("kube-dns", "kube-system") } + + it "is created by Terraform" do + expect(kubedns_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "reflects the stub_domains configuration" do + expect(JSON.parse(kubedns_configmap.data.stubDomains)).to eq({ + "example.com" => [ + "10.254.154.11", + "10.254.154.12", + ], + "example.net" => [ + "10.254.154.11", + "10.254.154.12", + ], + }) + end + + it "reflects the upstream_nameservers configuration" do + expect(JSON.parse(kubedns_configmap.data.upstreamNameservers)).to eq(["8.8.8.8", "8.8.4.4"]) + end + end + + describe "ipmasq" do + let(:ipmasq_configmap) { client.get_config_map("ip-masq-agent", "kube-system") } + + it "is created by Terraform" do + expect(ipmasq_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "is configured properly" do + expect(YAML.load(ipmasq_configmap.data.config)).to eq({ + "nonMasqueradeCIDRs" => [ + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + ], + "resyncInterval" => "60s", + "masqLinkLocal" => false, + }) + end + end + end + end +end diff --git a/test/integration/stub_domains_upstream_nameservers/inspec.yml b/test/integration/stub_domains_upstream_nameservers/inspec.yml new file mode 100644 index 0000000000..a14a4d1bd7 --- /dev/null +++ b/test/integration/stub_domains_upstream_nameservers/inspec.yml @@ -0,0 +1,20 @@ +name: stub_domains_upstream_nameservers +attributes: + - name: project_id + required: true + type: string + - name: location + required: true + type: string + - name: cluster_name + required: true + type: string + - name: kubernetes_endpoint + required: true + type: string + - name: client_token + required: true + type: string + - name: ca_certificate + required: true + type: string diff --git a/test/integration/upstream_nameservers/controls/gcloud.rb b/test/integration/upstream_nameservers/controls/gcloud.rb new file mode 100644 index 0000000000..03612e151e --- /dev/null +++ b/test/integration/upstream_nameservers/controls/gcloud.rb @@ -0,0 +1,50 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +project_id = attribute('project_id') +location = attribute('location') +cluster_name = attribute('cluster_name') + +control "gcloud" do + title "Google Compute Engine GKE configuration" + describe command("gcloud --project=#{project_id} container clusters --zone=#{location} describe #{cluster_name} --format=json") do + its(:exit_status) { should eq 0 } + its(:stderr) { should eq '' } + + let!(:data) do + if subject.exit_status == 0 + JSON.parse(subject.stdout) + else + {} + end + end + + describe "cluster" do + it "is running" do + expect(data['status']).to eq 'RUNNING' + end + + it "has the expected addon settings" do + expect(data['addonsConfig']).to eq({ + "horizontalPodAutoscaling" => {}, + "httpLoadBalancing" => {}, + "kubernetesDashboard" => { + "disabled" => true, + }, + "networkPolicyConfig" => {}, + }) + end + end + end +end diff --git a/test/integration/upstream_nameservers/controls/kubectl.rb b/test/integration/upstream_nameservers/controls/kubectl.rb new file mode 100644 index 0000000000..36612a02aa --- /dev/null +++ b/test/integration/upstream_nameservers/controls/kubectl.rb @@ -0,0 +1,79 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'kubeclient' +require 'rest-client' + +require 'base64' + +kubernetes_endpoint = attribute('kubernetes_endpoint') +client_token = attribute('client_token') +ca_certificate = attribute('ca_certificate') + +control "kubectl" do + title "Kubernetes configuration" + + describe "kubernetes" do + let(:kubernetes_http_endpoint) { "https://#{kubernetes_endpoint}/api" } + let(:client) do + cert_store = OpenSSL::X509::Store.new + cert_store.add_cert(OpenSSL::X509::Certificate.new(Base64.decode64(ca_certificate))) + Kubeclient::Client.new( + kubernetes_http_endpoint, + "v1", + ssl_options: { + cert_store: cert_store, + verify_ssl: OpenSSL::SSL::VERIFY_PEER, + }, + auth_options: { + bearer_token: Base64.decode64(client_token), + }, + ) + end + + describe "configmap" do + describe "kube-dns" do + let(:kubedns_configmap) { client.get_config_map("kube-dns", "kube-system") } + + it "is created by Terraform" do + expect(kubedns_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "reflects the upstream_nameservers configuration" do + expect(JSON.parse(kubedns_configmap.data.upstreamNameservers)).to eq(["8.8.8.8", "8.8.4.4"]) + end + end + + describe "ipmasq" do + let(:ipmasq_configmap) { client.get_config_map("ip-masq-agent", "kube-system") } + + it "is created by Terraform" do + expect(ipmasq_configmap.metadata.labels.maintained_by).to eq "terraform" + end + + it "is configured properly" do + expect(YAML.load(ipmasq_configmap.data.config)).to eq({ + "nonMasqueradeCIDRs" => [ + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + ], + "resyncInterval" => "60s", + "masqLinkLocal" => false, + }) + end + end + end + end +end diff --git a/test/integration/upstream_nameservers/inspec.yml b/test/integration/upstream_nameservers/inspec.yml new file mode 100644 index 0000000000..dd51197410 --- /dev/null +++ b/test/integration/upstream_nameservers/inspec.yml @@ -0,0 +1,20 @@ +name: upstream_nameservers +attributes: + - name: project_id + required: true + type: string + - name: location + required: true + type: string + - name: cluster_name + required: true + type: string + - name: kubernetes_endpoint + required: true + type: string + - name: client_token + required: true + type: string + - name: ca_certificate + required: true + type: string diff --git a/variables.tf b/variables.tf index a4630b3102..acf9e8e006 100644 --- a/variables.tf +++ b/variables.tf @@ -206,6 +206,12 @@ variable "stub_domains" { default = {} } +variable "upstream_nameservers" { + type = "list" + description = "If specified, the values replace the nameservers taken by default from the node’s /etc/resolv.conf" + default = [] +} + variable "non_masquerade_cidrs" { type = "list" description = "List of strings in CIDR notation that specify the IP address ranges that do not use IP masquerading."