diff --git a/.circleci/config.yml b/.circleci/config.yml index 2bd27a9..51aa807 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,15 +1,14 @@ defaults: &defaults machine: true environment: - GRUNTWORK_INSTALLER_VERSION: v0.0.21 + GRUNTWORK_INSTALLER_VERSION: v0.0.23 TERRATEST_LOG_PARSER_VERSION: v0.13.13 - KUBERGRUNT_VERSION: v0.3.9 - HELM_VERSION: v2.11.0 - MODULE_CI_VERSION: v0.13.3 - TERRAFORM_VERSION: 0.12.7 + HELM_VERSION: v3.1.2 + MODULE_CI_VERSION: v0.18.4 + TERRAFORM_VERSION: 0.12.20 TERRAGRUNT_VERSION: NONE PACKER_VERSION: NONE - GOLANG_VERSION: 1.11.2 + GOLANG_VERSION: 1.13.8 K8S_VERSION: v1.10.0 KUBECONFIG: /home/circleci/.kube/config @@ -24,9 +23,8 @@ install_gruntwork_utils: &install_gruntwork_utils --terraform-version ${TERRAFORM_VERSION} \ --terragrunt-version ${TERRAGRUNT_VERSION} \ --packer-version ${PACKER_VERSION} \ - --use-go-dep \ --go-version ${GOLANG_VERSION} \ - --go-src-path test + --go-src-path ./test/ install_helm_client: &install_helm_client name: install helm client @@ -45,16 +43,16 @@ jobs: - checkout - restore_cache: keys: - - dep-v1-{{ checksum "test/Gopkg.lock" }} + - gomod-{{ checksum "test/go.sum" }} # Install gruntwork utilities - run: <<: *install_gruntwork_utils - save_cache: - key: dep-v1-{{ checksum "test/Gopkg.lock" }} + key: gomod-{{ checksum "test/go.sum" }} paths: - - ./test/vendor + - $HOME/go/src/ # Fail the build if the pre-commit hooks don't pass. Note: if you run pre-commit install locally, these hooks will # execute automatically every time before you commit, ensuring the build never fails at this step! @@ -87,11 +85,6 @@ jobs: - run: <<: *install_helm_client - # Install kubergrunt - - run: - name: Install kubergrunt - command: gruntwork-install --binary-name "kubergrunt" --repo "https://github.com/gruntwork-io/kubergrunt" --tag "${KUBERGRUNT_VERSION}" - - run: name: update gcloud command: | diff --git a/README.md b/README.md index 5456403..ed8c266 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ using [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engin ## Quickstart -If you want to quickly spin up a GKE Private Cluster with Tiller, you can run the example that is in the root of this -repo. Check out the [gke-private-tiller example documentation](https://github.com/gruntwork-io/terraform-google-gke/blob/master/examples/gke-private-tiller) +If you want to quickly spin up a GKE Public Cluster, you can run the example that is in the root of this +repo. Check out the [gke-basic-helm example documentation](https://github.com/gruntwork-io/terraform-google-gke/blob/master/examples/gke-basic-helm) for instructions. ## What's in this repo @@ -18,7 +18,7 @@ for instructions. This repo has the following folder structure: * [root](https://github.com/gruntwork-io/terraform-google-gke/tree/master): The root folder contains an example of how - to deploy a GKE Private Cluster with Tiller. See [gke-private-tiller](https://github.com/gruntwork-io/terraform-google-gke/blob/master/examples/gke-private-tiller) + to deploy a GKE Public Cluster with and an example chart with [Helm](https://helm.sh/). See [gke-basic-helm](https://github.com/gruntwork-io/terraform-google-gke/blob/master/examples/gke-basic-helm) for the documentation. * [modules](https://github.com/gruntwork-io/terraform-google-gke/tree/master/modules): This folder contains the diff --git a/examples/gke-basic-helm/README.md b/examples/gke-basic-helm/README.md new file mode 100644 index 0000000..268d46b --- /dev/null +++ b/examples/gke-basic-helm/README.md @@ -0,0 +1,88 @@ +# GKE Basic Helm Example + +The root folder contains an example of how to deploy a GKE Public Cluster with an example chart +with [Helm](https://helm.sh/). + +## Overview + +In this guide we will walk through the steps necessary to get up and running with GKE and Helm. Here are the steps: + +1. [Install the necessary tools](#installing-necessary-tools) +1. [Apply the Terraform code](#apply-the-terraform-code) +1. [Verify the Deployed Chart](#verify-the-deployed-chart) +1. [Destroy the Deployed Resources](#destroy-the-deployed-resources) + +## Installing necessary tools + +In addition to `terraform`, this example relies on `gcloud` and `kubectl` and `helm` tools to manage the cluster. + +This means that your system needs to be configured to be able to find `terraform`, `gcloud`, `kubectl` and `helm` +client utilities on the system `PATH`. Here are the installation guides for each tool: + +1. [`gcloud`](https://cloud.google.com/sdk/gcloud/) +1. [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +1. [`terraform`](https://learn.hashicorp.com/terraform/getting-started/install.html) +1. [`helm`](https://docs.helm.sh/using_helm/#installing-helm) (Minimum version v3.0) + +Make sure the binaries are discoverable in your `PATH` variable. See [this Stack Overflow +post](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) for instructions on +setting up your `PATH` on Unix, and [this +post](https://stackoverflow.com/questions/1618280/where-can-i-set-path-to-make-exe-on-windows) for instructions on +Windows. + +## Apply the Terraform Code + +Now that all the prerequisite tools are installed, we are ready to deploy the GKE cluster! + +1. If you haven't already, clone this repo: + - `git clone https://github.com/gruntwork-io/terraform-google-gke.git` +1. Make sure you are in the `gke-basic-helm` example folder: + - `cd examples/gke-basic-helm` +1. Fill in the required variables in `variables.tf` based on your needs +1. Authenticate to GCP: + - `gcloud auth login` + - `gcloud auth application-default login` +1. Initialize terraform: + - `terraform init` +1. Check the terraform plan: + - `terraform plan` +1. Apply the terraform code: + - `terraform apply` + +At the end of the `terraform apply`, you should now have a working GKE cluster and `kubectl` context configured. +So let's verify that in the next step! + +## Verify the Deployed Chart + +The example configures your `kubectl` context, so you can use `kubectl` and `helm` commands without further configuration. + +To see the created resources, run the following commands: + +``` +❯ kubectl get deployments -n default +NAME READY UP-TO-DATE AVAILABLE AGE +nginx 1/1 1 1 92m + +❯ kubectl get service -n default +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +kubernetes ClusterIP 10.2.0.1 443/TCP 113m +nginx LoadBalancer 10.2.5.84 34.77.188.186 80:31588/TCP,443:31332/TCP 99m + +❯ kubectl get pods -n default +NAME READY STATUS RESTARTS AGE +nginx-57454964b8-l4w9w 1/1 Running 0 99m +``` + +If you wish to access the deployed service, you use the `kubectl port-forward` command to forward a local port to the deployed service: + +``` +❯ kubectl port-forward deployment/nginx 8080:8080 -n default +Forwarding from 127.0.0.1:8080 -> 8080 +Forwarding from [::1]:8080 -> 8080 +``` + +You can now access the deployed service by opening your web browser to `http://localhost:8080`. + +## Destroy the deployed resources + +To destroy all resources created by the example, just run `terraform destroy`. diff --git a/examples/gke-basic-tiller/README.md b/examples/gke-basic-tiller/README.md deleted file mode 100644 index d5ec33e..0000000 --- a/examples/gke-basic-tiller/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# GKE Basic Helm Example - -This example shows how to use Terraform to launch a GKE cluster with Helm configured and installed. We achieve this by -utilizing the [k8s-tiller module in the terraform-kubernetes-helm -repository](https://github.com/gruntwork-io/terraform-kubernetes-helm/tree/master/modules/k8s-tiller). -Note that we utilize our `kubergrunt` utility to securely manage TLS certificate key pairs used by Tiller - the server -component of Helm. - -## Background - -We strongly recommend reading [our guide on Helm](https://github.com/gruntwork-io/kubergrunt/blob/master/HELM_GUIDE.md) -before continuing with this guide for a background on Helm, Tiller, and the security model backing it. - -## Overview - -In this guide we will walk through the steps necessary to get up and running with deploying Tiller on GKE using this -module. Here are the steps: - -1. [Install the necessary tools](#installing-necessary-tools) -1. [Apply the Terraform code](#apply-the-terraform-code) -1. [Verify the deployment](#verify-tiller-deployment) -1. [Granting access to additional roles](#granting-access-to-additional-users) -1. [Upgrading the deployed Tiller instance](#upgrading-deployed-tiller) - -## Installing necessary tools - -In addition to `terraform`, this guide relies on the `gcloud` and `kubectl` tools to manage the cluster. In addition -we use `kubergrunt` to manage the TLS certificate key pairs for Tiller. You can read more about the decision behind this -approach in [the Appendix](#appendix-a-why-kubergrunt) of this guide. - -This means that your system needs to be configured to be able to find `terraform`, `gcloud`, `kubectl`, `kubergrunt`, -and `helm` client utilities on the system `PATH`. Here are the installation guides for each tool: - -1. [`gcloud`](https://cloud.google.com/sdk/gcloud/) -1. [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -1. [`terraform`](https://learn.hashicorp.com/terraform/getting-started/install.html) -1. [`helm` client](https://docs.helm.sh/using_helm/#installing-helm) -1. [`kubergrunt`](https://github.com/gruntwork-io/kubergrunt#installation) (Minimum version: v0.3.8) - -Make sure the binaries are discoverable in your `PATH` variable. See [this Stack Overflow -post](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) for instructions on -setting up your `PATH` on Unix, and [this -post](https://stackoverflow.com/questions/1618280/where-can-i-set-path-to-make-exe-on-windows) for instructions on -Windows. - -## Apply the Terraform Code - -Now that all the prerequisite tools are installed, we are ready to deploy the GKE cluster with Tiller installed! - -1. If you haven't already, clone this repo: - - `git clone https://github.com/gruntwork-io/terraform-google-gke.git` -1. Make sure you are in the `gke-basic-tiller` example folder: - - `cd examples/gke-basic-tiller` -1. Initialize terraform: - - `terraform init` -1. Check the terraform plan: - - `terraform plan` -1. Apply the terraform code: - - `terraform apply` - - Fill in the required variables based on your needs. - -**Note:** For simplicity this example installs Tiller into the `kube-system` namespace. However in a production -deployment we strongly recommend you segregate the Tiller resources into a separate namespace. - -This Terraform code will: - -- Deploy a publicly accessible GKE cluster -- Use `kubergrunt` to: - - - Create a new TLS certificate key pair to use as the CA and upload it to Kubernetes as a `Secret` in the - `kube-system` namespace. - - Using the generated CA TLS certificate key pair, create a signed TLS certificate key pair to use to identify the - Tiller server and upload it to Kubernetes as a `Secret` in `kube-system`. - -- Create a new `ServiceAccount` for Tiller in the `kube-system` namespace and bind admin permissions to it. -- Deploy Tiller with the following configurations turned on: - - - TLS verification - - `Secrets` as the storage engine - - Provisioned in the `kube-system` namespace using the `default` service account. - -- Once Tiller is deployed, once again call out to `kubergrunt` to grant access to the provided RBAC entity and configure - the local helm client to use those credentials: - - - Using the CA TLS certificate key pair, create a signed TLS certificate key pair to use to identify the client. - - Upload the certificate key pair to the `kube-system`. - - Grant the RBAC entity access to: - - - Get the client certificate `Secret` (`kubergrunt helm configure` uses this to install the client certificate - key pair locally) - - Get and List pods in `kube-system` namespace (the `helm` client uses this to find the Tiller pod) - - Create a port forward to the Tiller pod (the `helm` client uses this to make requests to the Tiller pod) - - - Install the client certificate key pair to the helm home directory so the client can use it. - -At the end of the `terraform apply`, you should now have a working Tiller deployment with your helm client configured to -access it. So let's verify that in the next step! - -## Verify Tiller Deployment - -To start using `helm` with the configured credentials, you need to specify the following things: - -- enable TLS verification -- use TLS credentials to authenticate -- the namespace where Tiller is deployed - -These are specified through command line arguments. If everything is configured correctly, you should be able to access -the Tiller that was deployed with the following args: - -``` -helm --tls --tls-verify --tiller-namespace NAMESPACE_OF_TILLER version -``` - -If you have access to Tiller, this should return you both the client version and the server version of Helm. - -Note that you need to pass the above CLI argument every time you want to use `helm`. This can be cumbersome, so -`kubergrunt` installs an environment file into your helm home directory that you can dot source to set environment -variables that guide `helm` to use those options: - -``` -. ~/.helm/env -helm version -``` - -## Appendix A: Why kubergrunt? - -This Terraform example is not idiomatic Terraform code in that it relies on an external binary, `kubergrunt` as opposed -to implementing the functionalities using pure Terraform providers. This approach has some noticeable drawbacks: - -- You have to install extra tools to use, so it is not a minimal `terraform init && terraform apply`. -- Portability concerns to setup, as there is no guarantee the tools work cross platform. We make every effort to test - across the major operating systems (Linux, Mac OSX, and Windows), but we can't possibly test every combination and so - there are bound to be portability issues. -- You don't have the declarative Terraform features that you come to love, such as `plan`, updates through `apply`, and - `destroy`. - -That said, we decided to use this approach because of limitations in the existing providers to implement the -functionalities here in pure Terraform code: - -- The [TLS provider](https://www.terraform.io/docs/providers/tls/index.html) stores the certificate key pairs in plain - text into the Terraform state. -- The Kubernetes Secret resource in the provider [also stores the value in plain text in the Terraform - state](https://www.terraform.io/docs/providers/kubernetes/r/secret.html). -- The grant and configure workflows are better suited as CLI tools than in Terraform. - -Note that we intend to implement a pure Terraform version of this in the near future, but we plan to continue to -maintain the `kubergrunt` approach for folks who are wary of leaking secrets into Terraform state. diff --git a/examples/gke-basic-tiller/main.tf b/examples/gke-basic-tiller/main.tf deleted file mode 100644 index ae6cfea..0000000 --- a/examples/gke-basic-tiller/main.tf +++ /dev/null @@ -1,395 +0,0 @@ -# --------------------------------------------------------------------------------------------------------------------- -# DEPLOY A GKE PUBLIC CLUSTER IN GOOGLE CLOUD PLATFORM -# This is an example of how to use the gke-cluster module to deploy a public Kubernetes cluster in GCP with a -# Load Balancer in front of it. -# --------------------------------------------------------------------------------------------------------------------- - -terraform { - # The modules used in this example have been updated with 0.12 syntax, additionally we depend on a bug fixed in - # version 0.12.7. - required_version = ">= 0.12.7" -} - -# --------------------------------------------------------------------------------------------------------------------- -# PREPARE PROVIDERS -# --------------------------------------------------------------------------------------------------------------------- - -provider "google" { - version = "~> 2.9.0" - project = var.project - region = var.region - - scopes = [ - # Default scopes - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/ndev.clouddns.readwrite", - "https://www.googleapis.com/auth/devstorage.full_control", - - # Required for google_client_openid_userinfo - "https://www.googleapis.com/auth/userinfo.email", - ] -} - -provider "google-beta" { - version = "~> 2.9.0" - project = var.project - region = var.region - - scopes = [ - # Default scopes - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/ndev.clouddns.readwrite", - "https://www.googleapis.com/auth/devstorage.full_control", - - # Required for google_client_openid_userinfo - "https://www.googleapis.com/auth/userinfo.email", - ] -} - -# We use this data provider to expose an access token for communicating with the GKE cluster. -data "google_client_config" "client" {} - -# Use this datasource to access the Terraform account's email for Kubernetes permissions. -data "google_client_openid_userinfo" "terraform_user" {} - -provider "kubernetes" { - version = "~> 1.7.0" - - load_config_file = false - host = data.template_file.gke_host_endpoint.rendered - token = data.template_file.access_token.rendered - cluster_ca_certificate = data.template_file.cluster_ca_certificate.rendered -} - -provider "helm" { - # We don't install Tiller automatically, but instead use Kubergrunt as it sets up the TLS certificates much easier. - install_tiller = false - - # Enable TLS so Helm can communicate with Tiller securely. - enable_tls = true - - kubernetes { - host = data.template_file.gke_host_endpoint.rendered - token = data.template_file.access_token.rendered - cluster_ca_certificate = data.template_file.cluster_ca_certificate.rendered - } -} - -# --------------------------------------------------------------------------------------------------------------------- -# DEPLOY A GKE REGIONAL PUBLIC CLUSTER IN GOOGLE CLOUD PLATFORM -# --------------------------------------------------------------------------------------------------------------------- - -module "gke_cluster" { - # When using these modules in your own templates, you will need to use a Git URL with a ref attribute that pins you - # to a specific version of the modules, such as the following example: - # source = "github.com/gruntwork-io/terraform-google-gke.git//modules/gke-cluster?ref=v0.2.0" - source = "../../modules/gke-cluster" - - name = var.cluster_name - - project = var.project - location = var.location - - # We're deploying the cluster in the 'public' subnetwork to allow outbound internet access - # See the network access tier table for full details: - # https://github.com/gruntwork-io/terraform-google-network/tree/master/modules/vpc-network#access-tier - network = module.vpc_network.network - - subnetwork = module.vpc_network.public_subnetwork - cluster_secondary_range_name = module.vpc_network.public_subnetwork_secondary_range_name -} - -# --------------------------------------------------------------------------------------------------------------------- -# CREATE A NODE POOL -# --------------------------------------------------------------------------------------------------------------------- - -resource "google_container_node_pool" "node_pool" { - provider = google-beta - - name = "main-pool" - project = var.project - location = var.location - cluster = module.gke_cluster.name - - initial_node_count = "1" - - autoscaling { - min_node_count = "1" - max_node_count = "5" - } - - management { - auto_repair = "true" - auto_upgrade = "true" - } - - node_config { - image_type = "COS" - machine_type = "n1-standard-1" - - labels = { - all-pools-example = "true" - } - - # Add a public tag to the instances. See the network access tier table for full details: - # https://github.com/gruntwork-io/terraform-google-network/tree/master/modules/vpc-network#access-tier - tags = [ - module.vpc_network.public, - "tiller-example", - ] - - disk_size_gb = "30" - disk_type = "pd-standard" - preemptible = false - - service_account = module.gke_service_account.email - - oauth_scopes = [ - "https://www.googleapis.com/auth/cloud-platform", - ] - } - - lifecycle { - ignore_changes = [initial_node_count] - } - - timeouts { - create = "30m" - update = "30m" - delete = "30m" - } -} - -# --------------------------------------------------------------------------------------------------------------------- -# CREATE A CUSTOM SERVICE ACCOUNT TO USE WITH THE GKE CLUSTER -# --------------------------------------------------------------------------------------------------------------------- - -module "gke_service_account" { - # When using these modules in your own templates, you will need to use a Git URL with a ref attribute that pins you - # to a specific version of the modules, such as the following example: - # source = "github.com/gruntwork-io/terraform-google-gke.git//modules/gke-service-account?ref=v0.2.0" - source = "../../modules/gke-service-account" - - name = var.cluster_service_account_name - project = var.project - description = var.cluster_service_account_description -} - -# --------------------------------------------------------------------------------------------------------------------- -# CREATE A NETWORK TO DEPLOY THE CLUSTER TO -# --------------------------------------------------------------------------------------------------------------------- - -resource "random_string" "suffix" { - length = 4 - special = false - upper = false -} - -module "vpc_network" { - source = "github.com/gruntwork-io/terraform-google-network.git//modules/vpc-network?ref=v0.2.1" - - name_prefix = "${var.cluster_name}-network-${random_string.suffix.result}" - project = var.project - region = var.region - - cidr_block = var.vpc_cidr_block - secondary_cidr_block = var.vpc_secondary_cidr_block -} - -# --------------------------------------------------------------------------------------------------------------------- -# CONFIGURE KUBECTL AND RBAC ROLE PERMISSIONS -# --------------------------------------------------------------------------------------------------------------------- - -# configure kubectl with the credentials of the GKE cluster -resource "null_resource" "configure_kubectl" { - provisioner "local-exec" { - command = "gcloud beta container clusters get-credentials ${module.gke_cluster.name} --region ${var.region} --project ${var.project}" - - # Use environment variables to allow custom kubectl config paths - environment = { - KUBECONFIG = var.kubectl_config_path != "" ? var.kubectl_config_path : "" - } - } - - depends_on = [google_container_node_pool.node_pool] -} - -# Create a ServiceAccount for Tiller -resource "kubernetes_service_account" "tiller" { - metadata { - name = "tiller" - namespace = local.tiller_namespace - } -} - -resource "kubernetes_cluster_role_binding" "user" { - metadata { - name = "admin-user" - } - - role_ref { - kind = "ClusterRole" - name = "cluster-admin" - api_group = "rbac.authorization.k8s.io" - } - - subject { - kind = "User" - name = data.google_client_openid_userinfo.terraform_user.email - api_group = "rbac.authorization.k8s.io" - } - - # We give the Tiller ServiceAccount cluster admin status so that we can deploy anything in any namespace using this - # Tiller instance for testing purposes. In production, you might want to use a more restricted role. - subject { - # this is a workaround for https://github.com/terraform-providers/terraform-provider-kubernetes/issues/204. - # we have to set an empty api_group or the k8s call will fail. It will be fixed in v1.5.2 of the k8s provider. - api_group = "" - - kind = "ServiceAccount" - name = kubernetes_service_account.tiller.metadata[0].name - namespace = local.tiller_namespace - } - - subject { - kind = "Group" - name = "system:masters" - api_group = "rbac.authorization.k8s.io" - } -} - -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# GENERATE TLS CERTIFICATES FOR USE WITH TILLER -# This will use kubergrunt to generate TLS certificates, and upload them as Kubernetes Secrets that can then be used by -# Tiller. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -resource "null_resource" "tiller_tls_certs" { - provisioner "local-exec" { - command = <<-EOF - # Generate CA TLS certs - kubergrunt tls gen --ca --namespace kube-system --secret-name ${local.tls_ca_secret_name} --secret-label gruntwork.io/tiller-namespace=${local.tiller_namespace} --secret-label gruntwork.io/tiller-credentials=true --secret-label gruntwork.io/tiller-credentials-type=ca --tls-subject-json '${jsonencode(var.tls_subject)}' ${local.tls_algorithm_config} ${local.kubectl_auth_config} - - # Then use that CA to generate server TLS certs - kubergrunt tls gen --namespace ${local.tiller_namespace} --ca-secret-name ${local.tls_ca_secret_name} --ca-namespace kube-system --secret-name ${local.tls_secret_name} --secret-label gruntwork.io/tiller-namespace=${local.tiller_namespace} --secret-label gruntwork.io/tiller-credentials=true --secret-label gruntwork.io/tiller-credentials-type=server --tls-subject-json '${jsonencode(var.tls_subject)}' ${local.tls_algorithm_config} ${local.kubectl_auth_config} - EOF - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } -} - -# --------------------------------------------------------------------------------------------------------------------- -# DEPLOY TILLER TO THE GKE CLUSTER -# --------------------------------------------------------------------------------------------------------------------- - -module "tiller" { - source = "github.com/gruntwork-io/terraform-kubernetes-helm.git//modules/k8s-tiller?ref=v0.5.0" - - tiller_tls_gen_method = "none" - tiller_service_account_name = kubernetes_service_account.tiller.metadata[0].name - tiller_service_account_token_secret_name = kubernetes_service_account.tiller.default_secret_name - tiller_tls_secret_name = local.tls_secret_name - namespace = local.tiller_namespace - tiller_image_version = local.tiller_version - - # Kubergrunt will store the private key under the key "tls.pem" in the corresponding Secret resource, which will be - # accessed as a file when mounted into the container. - tiller_tls_key_file_name = "tls.pem" - - dependencies = [null_resource.tiller_tls_certs.id, kubernetes_cluster_role_binding.user.id] -} - -# The Deployment resources created in the module call to `k8s-tiller` will be complete creation before the rollout is -# complete. We use kubergrunt here to wait for the deployment to complete, so that when this resource is done creating, -# any resources that depend on this can assume Tiller is successfully deployed and up at that point. -resource "null_resource" "wait_for_tiller" { - provisioner "local-exec" { - command = "kubergrunt helm wait-for-tiller --tiller-namespace ${local.tiller_namespace} --tiller-deployment-name ${module.tiller.deployment_name} --expected-tiller-version ${local.tiller_version} ${local.kubectl_auth_config}" - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } -} - -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# CONFIGURE OPERATOR HELM CLIENT -# To allow usage of the helm client immediately, we grant access to the admin RBAC user and configure the local helm -# client. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -resource "null_resource" "grant_and_configure_helm" { - provisioner "local-exec" { - command = <<-EOF - kubergrunt helm grant --tiller-namespace ${local.tiller_namespace} --tls-subject-json '${jsonencode(var.client_tls_subject)}' --rbac-user ${data.google_client_openid_userinfo.terraform_user.email} ${local.tls_algorithm_config} ${local.kubectl_auth_config} - - kubergrunt helm configure --helm-home ${pathexpand("~/.helm")} --tiller-namespace ${local.tiller_namespace} --resource-namespace ${local.resource_namespace} --rbac-user ${data.google_client_openid_userinfo.terraform_user.email} ${local.kubectl_auth_config} - EOF - - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } - - depends_on = [null_resource.wait_for_tiller] -} - -# --------------------------------------------------------------------------------------------------------------------- -# COMPUTATIONS -# These locals set constants and compute various useful information used throughout this Terraform module. -# --------------------------------------------------------------------------------------------------------------------- - -locals { - # For this example, we hardcode our tiller namespace to kube-system. In production, you might want to consider using a - # different Namespace. - tiller_namespace = "kube-system" - - # For this example, we setup Tiller to manage the default Namespace. - resource_namespace = "default" - - # We install an older version of Tiller to match the Helm library version used in the Terraform helm provider. - tiller_version = "v2.11.0" - - # We store the CA Secret in the kube-system Namespace, given that only cluster admins should access these. - tls_ca_secret_namespace = "kube-system" - - # We name the TLS Secrets to be compatible with the `kubergrunt helm grant` command - tls_ca_secret_name = "${local.tiller_namespace}-namespace-tiller-ca-certs" - tls_secret_name = "tiller-certs" - tls_algorithm_config = "--tls-private-key-algorithm ${var.private_key_algorithm} ${var.private_key_algorithm == "ECDSA" ? "--tls-private-key-ecdsa-curve ${var.private_key_ecdsa_curve}" : "--tls-private-key-rsa-bits ${var.private_key_rsa_bits}"}" - - # These will be filled in by the shell environment - kubectl_auth_config = "--kubectl-server-endpoint \"$KUBECTL_SERVER_ENDPOINT\" --kubectl-certificate-authority \"$KUBECTL_CA_DATA\" --kubectl-token \"$KUBECTL_TOKEN\"" -} - -# --------------------------------------------------------------------------------------------------------------------- -# WORKAROUNDS -# --------------------------------------------------------------------------------------------------------------------- - -# This is a workaround for the Kubernetes and Helm providers as Terraform doesn't currently support passing in module -# outputs to providers directly. -data "template_file" "gke_host_endpoint" { - template = module.gke_cluster.endpoint -} - -data "template_file" "access_token" { - template = data.google_client_config.client.access_token -} - -data "template_file" "cluster_ca_certificate" { - template = module.gke_cluster.cluster_ca_certificate -} diff --git a/examples/gke-basic-tiller/outputs.tf b/examples/gke-basic-tiller/outputs.tf deleted file mode 100644 index 431590d..0000000 --- a/examples/gke-basic-tiller/outputs.tf +++ /dev/null @@ -1,22 +0,0 @@ -output "cluster_endpoint" { - description = "The IP address of the cluster master." - sensitive = true - value = module.gke_cluster.endpoint -} - -output "client_certificate" { - description = "Public certificate used by clients to authenticate to the cluster endpoint." - value = module.gke_cluster.client_certificate -} - -output "client_key" { - description = "Private key used by clients to authenticate to the cluster endpoint." - sensitive = true - value = module.gke_cluster.client_key -} - -output "cluster_ca_certificate" { - description = "The public certificate that is the root of trust for the cluster." - sensitive = true - value = module.gke_cluster.cluster_ca_certificate -} diff --git a/examples/gke-basic-tiller/variables.tf b/examples/gke-basic-tiller/variables.tf deleted file mode 100644 index a9c9d03..0000000 --- a/examples/gke-basic-tiller/variables.tf +++ /dev/null @@ -1,136 +0,0 @@ -# --------------------------------------------------------------------------------------------------------------------- -# REQUIRED PARAMETERS -# These variables are expected to be passed in by the operator. -# --------------------------------------------------------------------------------------------------------------------- - -variable "project" { - description = "The project ID where all resources will be launched." - type = string -} - -variable "location" { - description = "The location (region or zone) of the GKE cluster." - type = string -} - -variable "region" { - description = "The region for the network. If the cluster is regional, this must be the same region. Otherwise, it should be the region of the zone." - type = string -} - -# --------------------------------------------------------------------------------------------------------------------- -# OPTIONAL PARAMETERS -# These parameters have reasonable defaults. -# --------------------------------------------------------------------------------------------------------------------- - -variable "cluster_name" { - description = "The name of the Kubernetes cluster." - type = string - default = "example-cluster" -} - -variable "cluster_service_account_name" { - description = "The name of the custom service account used for the GKE cluster. This parameter is limited to a maximum of 28 characters." - type = string - default = "example-cluster-sa" -} - -variable "cluster_service_account_description" { - description = "A description of the custom service account used for the GKE cluster." - type = string - default = "Example GKE Cluster Service Account managed by Terraform" -} - -# Kubectl options - -variable "kubectl_config_path" { - description = "Path to the kubectl config file. Defaults to $HOME/.kube/config" - type = string - default = "" -} - -# Tiller TLS settings - -variable "tls_subject" { - description = "The issuer information that contains the identifying information for the Tiller server. Used to generate the TLS certificate keypairs." - type = map(string) - - default = { - common_name = "tiller" - org = "Gruntwork" - } - # Expects the following keys - # - common_name (required) - # - org (required) - # - org_unit - # - city - # - state - # - country -} - -variable "client_tls_subject" { - description = "The issuer information that contains the identifying information for the helm client of the operator. Used to generate the TLS certificate keypairs." - type = map(string) - - default = { - common_name = "admin" - org = "Gruntwork" - } - # Expects the following keys - # - common_name (required) - # - org (required) - # - org_unit - # - city - # - state - # - country -} - -# TLS algorithm configuration - -variable "private_key_algorithm" { - description = "The name of the algorithm to use for private keys. Must be one of: RSA or ECDSA." - type = string - default = "ECDSA" -} - -variable "private_key_ecdsa_curve" { - description = "The name of the elliptic curve to use. Should only be used if var.private_key_algorithm is ECDSA. Must be one of P224, P256, P384 or P521." - type = string - default = "P256" -} - -variable "private_key_rsa_bits" { - description = "The size of the generated RSA key in bits. Should only be used if var.private_key_algorithm is RSA." - type = number - default = 2048 -} - -# Tiller undeploy options - -variable "force_undeploy" { - description = "If true, will remove the Tiller server resources even if there are releases deployed." - type = bool - default = false -} - -variable "undeploy_releases" { - description = "If true, will delete deployed releases from the Tiller instance before undeploying Tiller." - type = bool - default = false -} - -# For the example, we recommend a /16 network for the VPC. Note that when changing the size of the network, -# you will have to adjust the 'cidr_subnetwork_width_delta' in the 'vpc_network' -module accordingly. -variable "vpc_cidr_block" { - description = "The IP address range of the VPC in CIDR notation. A prefix of /16 is recommended. Do not use a prefix higher than /27." - type = string - default = "10.1.0.0/16" -} - -# For the example, we recommend a /16 network for the secondary range. Note that when changing the size of the network, -# you will have to adjust the 'cidr_subnetwork_width_delta' in the 'vpc_network' -module accordingly. -variable "vpc_secondary_cidr_block" { - description = "The IP address range of the VPC's secondary address range in CIDR notation. A prefix of /16 is recommended. Do not use a prefix higher than /27." - type = string - default = "10.2.0.0/16" -} diff --git a/examples/gke-private-tiller/README.md b/examples/gke-private-tiller/README.md deleted file mode 100644 index 0337172..0000000 --- a/examples/gke-private-tiller/README.md +++ /dev/null @@ -1,145 +0,0 @@ -# GKE Private Helm Example - -The root folder of this repo shows an example of Terraform code that launches a GKE private cluster with Helm configured -and Tiller installed. We achieve this by utilizing the [k8s-tiller module in the terraform-kubernetes-helm repository](https://github.com/gruntwork-io/terraform-kubernetes-helm/tree/master/modules/k8s-tiller). Note that we -utilize our `kubergrunt` utility to securely manage TLS certificate key pairs used by Tiller - the server component of -Helm. - -## Background - -We strongly recommend reading [our guide on Helm](https://github.com/gruntwork-io/kubergrunt/blob/master/HELM_GUIDE.md) -before continuing with this guide for a background on Helm, Tiller, and the security model backing it. - -## Overview - -In this guide we will walk through the steps necessary to get up and running with deploying Tiller on GKE using this -module. Here are the steps: - -1. [Install the necessary tools](#installing-necessary-tools) -1. [Apply the Terraform code](#apply-the-terraform-code) -1. [Verify the deployment](#verify-tiller-deployment) -1. [Granting access to additional roles](#granting-access-to-additional-users) -1. [Upgrading the deployed Tiller instance](#upgrading-deployed-tiller) - -## Installing necessary tools - -In addition to `terraform`, this guide relies on the `gcloud` and `kubectl` tools to manage the cluster. In addition -we use `kubergrunt` to manage the TLS certificate key pairs for Tiller. You can read more about the decision behind this -approach in [the Appendix](#appendix-a-why-kubergrunt) of this guide. - -This means that your system needs to be configured to be able to find `terraform`, `gcloud`, `kubectl`, `kubergrunt`, -and `helm` client utilities on the system `PATH`. Here are the installation guides for each tool: - -1. [`gcloud`](https://cloud.google.com/sdk/gcloud/) -1. [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/) -1. [`terraform`](https://learn.hashicorp.com/terraform/getting-started/install.html) -1. [`helm` client](https://docs.helm.sh/using_helm/#installing-helm) -1. [`kubergrunt`](https://github.com/gruntwork-io/kubergrunt#installation) (Minimum version: v0.3.8) - -Make sure the binaries are discoverable in your `PATH` variable. See [this Stack Overflow -post](https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux-unix) for instructions on -setting up your `PATH` on Unix, and [this -post](https://stackoverflow.com/questions/1618280/where-can-i-set-path-to-make-exe-on-windows) for instructions on -Windows. - -## Apply the Terraform Code - -Now that all the prerequisite tools are installed, we are ready to deploy the GKE cluster with Tiller installed! - -1. If you haven't already, clone this repo: - - `git clone https://github.com/gruntwork-io/terraform-google-gke.git` -1. Make sure you are in the root folder of the repo -1. Initialize terraform: - - `terraform init` -1. Check the terraform plan: - - `terraform plan` -1. Apply the terraform code: - - `terraform apply` - - Fill in the required variables based on your needs. - -**Note:** For simplicity this example installs Tiller into the `kube-system` namespace. However in a production -deployment we strongly recommend you segregate the Tiller resources into a separate namespace. - -This Terraform code will: - -- Deploy a publicly accessible GKE cluster -- Use `kubergrunt` to: - - - Create a new TLS certificate key pair to use as the CA and upload it to Kubernetes as a `Secret` in the - `kube-system` namespace. - - Using the generated CA TLS certificate key pair, create a signed TLS certificate key pair to use to identify the - Tiller server and upload it to Kubernetes as a `Secret` in `kube-system`. - -- Create a new `ServiceAccount` for Tiller in the `kube-system` namespace and bind admin permissions to it. -- Deploy Tiller with the following configurations turned on: - - - TLS verification - - `Secrets` as the storage engine - - Provisioned in the `kube-system` namespace using the `default` service account. - -- Once Tiller is deployed, once again call out to `kubergrunt` to grant access to the provided RBAC entity and configure - the local helm client to use those credentials: - - - Using the CA TLS certificate key pair, create a signed TLS certificate key pair to use to identify the client. - - Upload the certificate key pair to the `kube-system`. - - Grant the RBAC entity access to: - - - Get the client certificate `Secret` (`kubergrunt helm configure` uses this to install the client certificate - key pair locally) - - Get and List pods in `kube-system` namespace (the `helm` client uses this to find the Tiller pod) - - Create a port forward to the Tiller pod (the `helm` client uses this to make requests to the Tiller pod) - - - Install the client certificate key pair to the helm home directory so the client can use it. - -At the end of the `terraform apply`, you should now have a working Tiller deployment with your helm client configured to -access it. So let's verify that in the next step! - -## Verify Tiller Deployment - -To start using `helm` with the configured credentials, you need to specify the following things: - -- enable TLS verification -- use TLS credentials to authenticate -- the namespace where Tiller is deployed - -These are specified through command line arguments. If everything is configured correctly, you should be able to access -the Tiller that was deployed with the following args: - -``` -helm --tls --tls-verify --tiller-namespace NAMESPACE_OF_TILLER version -``` - -If you have access to Tiller, this should return you both the client version and the server version of Helm. - -Note that you need to pass the above CLI argument every time you want to use `helm`. This can be cumbersome, so -`kubergrunt` installs an environment file into your helm home directory that you can dot source to set environment -variables that guide `helm` to use those options: - -``` -. ~/.helm/env -helm version -``` - -## Appendix A: Why kubergrunt? - -This Terraform example is not idiomatic Terraform code in that it relies on an external binary, `kubergrunt` as opposed -to implementing the functionalities using pure Terraform providers. This approach has some noticeable drawbacks: - -- You have to install extra tools to use, so it is not a minimal `terraform init && terraform apply`. -- Portability concerns to setup, as there is no guarantee the tools work cross platform. We make every effort to test - across the major operating systems (Linux, Mac OSX, and Windows), but we can't possibly test every combination and so - there are bound to be portability issues. -- You don't have the declarative Terraform features that you come to love, such as `plan`, updates through `apply`, and - `destroy`. - -That said, we decided to use this approach because of limitations in the existing providers to implement the -functionalities here in pure Terraform code: - -- The [TLS provider](https://www.terraform.io/docs/providers/tls/index.html) stores the certificate key pairs in plain - text into the Terraform state. -- The Kubernetes Secret resource in the provider [also stores the value in plain text in the Terraform - state](https://www.terraform.io/docs/providers/kubernetes/r/secret.html). -- The grant and configure workflows are better suited as CLI tools than in Terraform. - -Note that we intend to implement a pure Terraform version of this in the near future, but we plan to continue to -maintain the `kubergrunt` approach for folks who are wary of leaking secrets into Terraform state. diff --git a/main.tf b/main.tf index 89d8b6c..ee5ecf4 100644 --- a/main.tf +++ b/main.tf @@ -1,6 +1,7 @@ # --------------------------------------------------------------------------------------------------------------------- -# DEPLOY A GKE PRIVATE CLUSTER W/ TILLER IN GOOGLE CLOUD PLATFORM -# This is an example of how to use the gke-cluster module to deploy a private Kubernetes cluster in GCP +# DEPLOY A GKE PRIVATE CLUSTER IN GOOGLE CLOUD PLATFORM +# This is an example of how to use the gke-cluster module to deploy a private Kubernetes cluster in GCP. +# Load Balancer in front of it. # --------------------------------------------------------------------------------------------------------------------- terraform { @@ -14,7 +15,7 @@ terraform { # --------------------------------------------------------------------------------------------------------------------- provider "google" { - version = "~> 2.9.0" + version = "~> 3.1.0" project = var.project region = var.region @@ -31,7 +32,7 @@ provider "google" { } provider "google-beta" { - version = "~> 2.9.0" + version = "~> 3.1.0" project = var.project region = var.region @@ -63,16 +64,14 @@ provider "kubernetes" { } provider "helm" { - # We don't install Tiller automatically, but instead use Kubergrunt as it sets up the TLS certificates much easier. - install_tiller = false - - # Enable TLS so Helm can communicate with Tiller securely. - enable_tls = true + # Use provider with Helm 3.x support + version = "~> 1.1.1" kubernetes { host = data.template_file.gke_host_endpoint.rendered token = data.template_file.access_token.rendered cluster_ca_certificate = data.template_file.cluster_ca_certificate.rendered + load_config_file = false } } @@ -92,10 +91,10 @@ module "gke_cluster" { location = var.location network = module.vpc_network.network - # We're deploying the cluster in the 'public' subnetwork to allow outbound internet access + # Deploy the cluster in the 'private' subnetwork, outbound internet access will be provided by NAT # See the network access tier table for full details: # https://github.com/gruntwork-io/terraform-google-network/tree/master/modules/vpc-network#access-tier - subnetwork = module.vpc_network.public_subnetwork + subnetwork = module.vpc_network.private_subnetwork # When creating a private cluster, the 'master_ipv4_cidr_block' has to be defined and the size must be /28 master_ipv4_cidr_block = var.master_ipv4_cidr_block @@ -119,7 +118,7 @@ module "gke_cluster" { }, ] - cluster_secondary_range_name = module.vpc_network.public_subnetwork_secondary_range_name + cluster_secondary_range_name = module.vpc_network.private_subnetwork_secondary_range_name } # --------------------------------------------------------------------------------------------------------------------- @@ -129,7 +128,7 @@ module "gke_cluster" { resource "google_container_node_pool" "node_pool" { provider = google-beta - name = "private-pool" + name = "main-pool" project = var.project location = var.location cluster = module.gke_cluster.name @@ -151,14 +150,14 @@ resource "google_container_node_pool" "node_pool" { machine_type = "n1-standard-1" labels = { - private-pools-example = "true" + all-pools-example = "true" } # Add a private tag to the instances. See the network access tier table for full details: # https://github.com/gruntwork-io/terraform-google-network/tree/master/modules/vpc-network#access-tier tags = [ module.vpc_network.private, - "private-pool-example", + "helm-example", ] disk_size_gb = "30" @@ -209,7 +208,7 @@ resource "random_string" "suffix" { } module "vpc_network" { - source = "github.com/gruntwork-io/terraform-google-network.git//modules/vpc-network?ref=v0.2.1" + source = "github.com/gruntwork-io/terraform-google-network.git//modules/vpc-network?ref=v0.4.0" name_prefix = "${var.cluster_name}-network-${random_string.suffix.result}" project = var.project @@ -237,14 +236,6 @@ resource "null_resource" "configure_kubectl" { depends_on = [google_container_node_pool.node_pool] } -# Create a ServiceAccount for Tiller -resource "kubernetes_service_account" "tiller" { - metadata { - name = "tiller" - namespace = local.tiller_namespace - } -} - resource "kubernetes_cluster_role_binding" "user" { metadata { name = "admin-user" @@ -262,18 +253,6 @@ resource "kubernetes_cluster_role_binding" "user" { api_group = "rbac.authorization.k8s.io" } - # We give the Tiller ServiceAccount cluster admin status so that we can deploy anything in any namespace using this - # Tiller instance for testing purposes. In production, you might want to use a more restricted role. - subject { - # this is a workaround for https://github.com/terraform-providers/terraform-provider-kubernetes/issues/204. - # we have to set an empty api_group or the k8s call will fail. It will be fixed in v1.5.2 of the k8s provider. - api_group = "" - - kind = "ServiceAccount" - name = kubernetes_service_account.tiller.metadata[0].name - namespace = local.tiller_namespace - } - subject { kind = "Group" name = "system:masters" @@ -281,117 +260,18 @@ resource "kubernetes_cluster_role_binding" "user" { } } -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# GENERATE TLS CERTIFICATES FOR USE WITH TILLER -# This will use kubergrunt to generate TLS certificates, and upload them as Kubernetes Secrets that can then be used by -# Tiller. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -resource "null_resource" "tiller_tls_certs" { - provisioner "local-exec" { - command = <<-EOF - kubergrunt tls gen --ca --namespace kube-system --secret-name ${local.tls_ca_secret_name} --secret-label gruntwork.io/tiller-namespace=${local.tiller_namespace} --secret-label gruntwork.io/tiller-credentials=true --secret-label gruntwork.io/tiller-credentials-type=ca --tls-subject-json '${jsonencode(var.tls_subject)}' ${local.tls_algorithm_config} ${local.kubectl_auth_config} - - kubergrunt tls gen --namespace ${local.tiller_namespace} --ca-secret-name ${local.tls_ca_secret_name} --ca-namespace kube-system --secret-name ${local.tls_secret_name} --secret-label gruntwork.io/tiller-namespace=${local.tiller_namespace} --secret-label gruntwork.io/tiller-credentials=true --secret-label gruntwork.io/tiller-credentials-type=server --tls-subject-json '${jsonencode(var.tls_subject)}' ${local.tls_algorithm_config} ${local.kubectl_auth_config} - EOF - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } -} - -# --------------------------------------------------------------------------------------------------------------------- -# DEPLOY TILLER TO THE GKE CLUSTER -# --------------------------------------------------------------------------------------------------------------------- - -module "tiller" { - source = "github.com/gruntwork-io/terraform-kubernetes-helm.git//modules/k8s-tiller?ref=v0.5.0" - - tiller_tls_gen_method = "none" - tiller_service_account_name = kubernetes_service_account.tiller.metadata[0].name - tiller_service_account_token_secret_name = kubernetes_service_account.tiller.default_secret_name - tiller_tls_secret_name = local.tls_secret_name - namespace = local.tiller_namespace - tiller_image_version = local.tiller_version - - # Kubergrunt will store the private key under the key "tls.pem" in the corresponding Secret resource, which will be - # accessed as a file when mounted into the container. - tiller_tls_key_file_name = "tls.pem" - - dependencies = [null_resource.tiller_tls_certs.id, kubernetes_cluster_role_binding.user.id] -} - -# The Deployment resources created in the module call to `k8s-tiller` will be complete creation before the rollout is -# complete. We use kubergrunt here to wait for the deployment to complete, so that when this resource is done creating, -# any resources that depend on this can assume Tiller is successfully deployed and up at that point. -resource "null_resource" "wait_for_tiller" { - provisioner "local-exec" { - command = "kubergrunt helm wait-for-tiller --tiller-namespace ${local.tiller_namespace} --tiller-deployment-name ${module.tiller.deployment_name} --expected-tiller-version ${local.tiller_version} ${local.kubectl_auth_config}" - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } -} - -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# CONFIGURE OPERATOR HELM CLIENT -# To allow usage of the helm client immediately, we grant access to the admin RBAC user and configure the local helm -# client. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -resource "null_resource" "grant_and_configure_helm" { - provisioner "local-exec" { - command = <<-EOF - kubergrunt helm grant --tiller-namespace ${local.tiller_namespace} --tls-subject-json '${jsonencode(var.client_tls_subject)}' --rbac-user ${data.google_client_openid_userinfo.terraform_user.email} ${local.kubectl_auth_config} - - kubergrunt helm configure --helm-home ${pathexpand("~/.helm")} --tiller-namespace ${local.tiller_namespace} --resource-namespace ${local.resource_namespace} --rbac-user ${data.google_client_openid_userinfo.terraform_user.email} ${local.kubectl_auth_config} - EOF - - # Use environment variables for Kubernetes credentials to avoid leaking into the logs - environment = { - KUBECTL_SERVER_ENDPOINT = data.template_file.gke_host_endpoint.rendered - KUBECTL_CA_DATA = base64encode(data.template_file.cluster_ca_certificate.rendered) - KUBECTL_TOKEN = data.template_file.access_token.rendered - } - } - - depends_on = [null_resource.wait_for_tiller] -} - # --------------------------------------------------------------------------------------------------------------------- -# COMPUTATIONS -# These locals set constants and compute various useful information used throughout this Terraform module. +# DEPLOY A SAMPLE CHART +# A chart repository is a location where packaged charts can be stored and shared. Define Bitnami Helm repository location, +# so Helm can install the nginx chart. # --------------------------------------------------------------------------------------------------------------------- -locals { - # For this example, we hardcode our tiller namespace to kube-system. In production, you might want to consider using a - # different Namespace. - tiller_namespace = "kube-system" - - # For this example, we setup Tiller to manage the default Namespace. - resource_namespace = "default" - - # We install an older version of Tiller to match the Helm library version used in the Terraform helm provider. - tiller_version = "v2.11.0" - - # We store the CA Secret in the kube-system Namespace, given that only cluster admins should access these. - tls_ca_secret_namespace = "kube-system" - - # We name the TLS Secrets to be compatible with the `kubergrunt helm grant` command - tls_ca_secret_name = "${local.tiller_namespace}-namespace-tiller-ca-certs" - tls_secret_name = "tiller-certs" - tls_algorithm_config = "--tls-private-key-algorithm ${var.private_key_algorithm} ${var.private_key_algorithm == "ECDSA" ? "--tls-private-key-ecdsa-curve ${var.private_key_ecdsa_curve}" : "--tls-private-key-rsa-bits ${var.private_key_rsa_bits}"}" +resource "helm_release" "nginx" { + depends_on = [google_container_node_pool.node_pool] - # These will be filled in by the shell environment - kubectl_auth_config = "--kubectl-server-endpoint \"$KUBECTL_SERVER_ENDPOINT\" --kubectl-certificate-authority \"$KUBECTL_CA_DATA\" --kubectl-token \"$KUBECTL_TOKEN\"" + repository = "https://charts.bitnami.com/bitnami" + name = "nginx" + chart = "nginx" } # --------------------------------------------------------------------------------------------------------------------- diff --git a/test/Gopkg.lock b/test/Gopkg.lock deleted file mode 100644 index c2cbef1..0000000 --- a/test/Gopkg.lock +++ /dev/null @@ -1,792 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:f28b5363f59b4c568f37ebaecf1d739d0dc5818f57b07f9bda776367ffe046fb" - name = "cloud.google.com/go" - packages = [ - "compute/metadata", - "iam", - "internal", - "internal/optional", - "internal/trace", - "internal/version", - "storage", - ] - pruneopts = "UT" - revision = "28a4bc8c44b3acbcc482cff0cdf7de29a4688b61" - version = "v0.35.1" - -[[projects]] - digest = "1:01db1e6aa4c528606ddf80ddc16efb02fc4e91a5e852e7267761c7dfd40bb6d5" - name = "github.com/aws/aws-sdk-go" - packages = [ - "aws", - "aws/awserr", - "aws/awsutil", - "aws/client", - "aws/client/metadata", - "aws/corehandlers", - "aws/credentials", - "aws/credentials/ec2rolecreds", - "aws/credentials/endpointcreds", - "aws/credentials/processcreds", - "aws/credentials/stscreds", - "aws/crr", - "aws/csm", - "aws/defaults", - "aws/ec2metadata", - "aws/endpoints", - "aws/request", - "aws/session", - "aws/signer/v4", - "internal/ini", - "internal/s3err", - "internal/sdkio", - "internal/sdkrand", - "internal/sdkuri", - "internal/shareddefaults", - "private/protocol", - "private/protocol/ec2query", - "private/protocol/eventstream", - "private/protocol/eventstream/eventstreamapi", - "private/protocol/json/jsonutil", - "private/protocol/jsonrpc", - "private/protocol/query", - "private/protocol/query/queryutil", - "private/protocol/rest", - "private/protocol/restxml", - "private/protocol/xml/xmlutil", - "service/acm", - "service/autoscaling", - "service/cloudwatchlogs", - "service/dynamodb", - "service/ec2", - "service/ecs", - "service/iam", - "service/kms", - "service/rds", - "service/s3", - "service/s3/s3iface", - "service/s3/s3manager", - "service/sns", - "service/sqs", - "service/ssm", - "service/sts", - ] - pruneopts = "UT" - revision = "3afa899153ab972b5e6bf2552721b677e3fdaeb5" - version = "v1.16.20" - -[[projects]] - digest = "1:7b94d37d65c0445053c6f3e73090e3966c1c29127035492c349e14f25c440359" - name = "github.com/boombuler/barcode" - packages = [ - ".", - "qr", - "utils", - ] - pruneopts = "UT" - revision = "3cfea5ab600ae37946be2b763b8ec2c1cf2d272d" - version = "v1.0.0" - -[[projects]] - digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" - name = "github.com/davecgh/go-spew" - packages = ["spew"] - pruneopts = "UT" - revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" - version = "v1.1.1" - -[[projects]] - branch = "master" - digest = "1:ecdc8e0fe3bc7d549af1c9c36acf3820523b707d6c071b6d0c3860882c6f7b42" - name = "github.com/docker/spdystream" - packages = [ - ".", - "spdy", - ] - pruneopts = "UT" - revision = "6480d4af844c189cf5dd913db24ddd339d3a4f85" - -[[projects]] - digest = "1:2cd7915ab26ede7d95b8749e6b1f933f1c6d5398030684e6505940a10f31cfda" - name = "github.com/ghodss/yaml" - packages = ["."] - pruneopts = "UT" - revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" - version = "v1.0.0" - -[[projects]] - branch = "master" - digest = "1:d0557c61d3acd22f04f7b6b675b847381034b229b7dce10b1d31bfa0d7f30017" - name = "github.com/go-errors/errors" - packages = ["."] - pruneopts = "UT" - revision = "d98b870cc4e05f1545532a80e9909be8216095b6" - -[[projects]] - digest = "1:ec6f9bf5e274c833c911923c9193867f3f18788c461f76f05f62bb1510e0ae65" - name = "github.com/go-sql-driver/mysql" - packages = ["."] - pruneopts = "UT" - revision = "72cd26f257d44c1114970e19afddcd812016007e" - version = "v1.4.1" - -[[projects]] - digest = "1:b402bb9a24d108a9405a6f34675091b036c8b056aac843bf6ef2389a65c5cf48" - name = "github.com/gogo/protobuf" - packages = [ - "proto", - "sortkeys", - ] - pruneopts = "UT" - revision = "4cbf7e384e768b4e01799441fdf2a706a5635ae7" - version = "v1.2.0" - -[[projects]] - branch = "master" - digest = "1:1ba1d79f2810270045c328ae5d674321db34e3aae468eb4233883b473c5c0467" - name = "github.com/golang/glog" - packages = ["."] - pruneopts = "UT" - revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998" - -[[projects]] - digest = "1:5d1b5a25486fc7d4e133646d834f6fca7ba1cef9903d40e7aa786c41b89e9e91" - name = "github.com/golang/protobuf" - packages = [ - "proto", - "protoc-gen-go/descriptor", - "ptypes", - "ptypes/any", - "ptypes/duration", - "ptypes/timestamp", - ] - pruneopts = "UT" - revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" - version = "v1.2.0" - -[[projects]] - branch = "master" - digest = "1:0bfbe13936953a98ae3cfe8ed6670d396ad81edf069a806d2f6515d7bb6950df" - name = "github.com/google/btree" - packages = ["."] - pruneopts = "UT" - revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306" - -[[projects]] - branch = "master" - digest = "1:3ee90c0d94da31b442dde97c99635aaafec68d0b8a3c12ee2075c6bdabeec6bb" - name = "github.com/google/gofuzz" - packages = ["."] - pruneopts = "UT" - revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" - -[[projects]] - digest = "1:8f8811f9be822914c3a25c6a071e93beb4c805d7b026cbf298bc577bc1cc945b" - name = "github.com/google/uuid" - packages = ["."] - pruneopts = "UT" - revision = "064e2069ce9c359c118179501254f67d7d37ba24" - version = "0.2" - -[[projects]] - digest = "1:856bd1e35f6da8ce5671a5df09d0e89bf01e9b74b3dabb6d097d39b3813801e1" - name = "github.com/googleapis/gax-go" - packages = ["v2"] - pruneopts = "UT" - revision = "c8a15bac9b9fe955bd9f900272f9a306465d28cf" - version = "v2.0.3" - -[[projects]] - digest = "1:65c4414eeb350c47b8de71110150d0ea8a281835b1f386eacaa3ad7325929c21" - name = "github.com/googleapis/gnostic" - packages = [ - "OpenAPIv2", - "compiler", - "extensions", - ] - pruneopts = "UT" - revision = "7c663266750e7d82587642f65e60bc4083f1f84e" - version = "v0.2.0" - -[[projects]] - branch = "master" - digest = "1:86c1210529e69d69860f2bb3ee9ccce0b595aa3f9165e7dd1388e5c612915888" - name = "github.com/gregjones/httpcache" - packages = [ - ".", - "diskcache", - ] - pruneopts = "UT" - revision = "c63ab54fda8f77302f8d414e19933f2b6026a089" - -[[projects]] - digest = "1:ca55309eddc07bc8324b7f76c9b7d42b08adc87ca73018fc95536c255958aa2d" - name = "github.com/gruntwork-io/gruntwork-cli" - packages = [ - "collections", - "errors", - ] - pruneopts = "UT" - revision = "6a2163138f3d10377f313428e7e367b0a6c0c1c9" - version = "v0.4.2" - -[[projects]] - digest = "1:3675852d75f27d8017dc964b9f2657fe09e869aa282434beb0881de7a309d30e" - name = "github.com/gruntwork-io/terratest" - packages = [ - "modules/aws", - "modules/collections", - "modules/customerrors", - "modules/environment", - "modules/files", - "modules/gcp", - "modules/helm", - "modules/http-helper", - "modules/k8s", - "modules/logger", - "modules/packer", - "modules/random", - "modules/retry", - "modules/shell", - "modules/ssh", - "modules/terraform", - "modules/test-structure", - ] - pruneopts = "UT" - revision = "f3916f7a5f58e3fedf603388d3e3e8052d6a47a3" - version = "v0.16.1" - -[[projects]] - digest = "1:a0cefd27d12712af4b5018dc7046f245e1e3b5760e2e848c30b171b570708f9b" - name = "github.com/imdario/mergo" - packages = ["."] - pruneopts = "UT" - revision = "7c29201646fa3de8506f701213473dd407f19646" - version = "v0.3.7" - -[[projects]] - digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" - name = "github.com/inconshreveable/mousetrap" - packages = ["."] - pruneopts = "UT" - revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - version = "v1.0" - -[[projects]] - digest = "1:bb81097a5b62634f3e9fec1014657855610c82d19b9a40c17612e32651e35dca" - name = "github.com/jmespath/go-jmespath" - packages = ["."] - pruneopts = "UT" - revision = "c2b33e84" - -[[projects]] - digest = "1:3e551bbb3a7c0ab2a2bf4660e7fcad16db089fdcfbb44b0199e62838038623ea" - name = "github.com/json-iterator/go" - packages = ["."] - pruneopts = "UT" - revision = "1624edc4454b8682399def8740d46db5e4362ba4" - version = "v1.1.5" - -[[projects]] - digest = "1:78bbb1ba5b7c3f2ed0ea1eab57bdd3859aec7e177811563edc41198a760b06af" - name = "github.com/mitchellh/go-homedir" - packages = ["."] - pruneopts = "UT" - revision = "ae18d6b8b3205b561c79e8e5f69bff09736185f4" - version = "v1.0.0" - -[[projects]] - digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" - name = "github.com/modern-go/concurrent" - packages = ["."] - pruneopts = "UT" - revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" - version = "1.0.3" - -[[projects]] - digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855" - name = "github.com/modern-go/reflect2" - packages = ["."] - pruneopts = "UT" - revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" - version = "1.0.1" - -[[projects]] - branch = "master" - digest = "1:3bf17a6e6eaa6ad24152148a631d18662f7212e21637c2699bff3369b7f00fa2" - name = "github.com/petar/GoLLRB" - packages = ["llrb"] - pruneopts = "UT" - revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" - -[[projects]] - digest = "1:0e7775ebbcf00d8dd28ac663614af924411c868dca3d5aa762af0fae3808d852" - name = "github.com/peterbourgon/diskv" - packages = ["."] - pruneopts = "UT" - revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" - version = "v2.0.1" - -[[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - pruneopts = "UT" - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - digest = "1:dc56e7178a82f8e84960ed9efa7d4ebd0a6d7864894bfc46f8a35ee5eae7153a" - name = "github.com/pquerna/otp" - packages = [ - ".", - "hotp", - "totp", - ] - pruneopts = "UT" - revision = "be78767b3e392ce45ea73444451022a6fc32ad0d" - version = "v1.1.0" - -[[projects]] - digest = "1:645cabccbb4fa8aab25a956cbcbdf6a6845ca736b2c64e197ca7cbb9d210b939" - name = "github.com/spf13/cobra" - packages = ["."] - pruneopts = "UT" - revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" - version = "v0.0.3" - -[[projects]] - digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" - name = "github.com/spf13/pflag" - packages = ["."] - pruneopts = "UT" - revision = "298182f68c66c05229eb03ac171abe6e309ee79a" - version = "v1.0.3" - -[[projects]] - digest = "1:5da8ce674952566deae4dbc23d07c85caafc6cfa815b0b3e03e41979cedb8750" - name = "github.com/stretchr/testify" - packages = [ - "assert", - "require", - ] - pruneopts = "UT" - revision = "ffdc059bfe9ce6a4e144ba849dbedead332c6053" - version = "v1.3.0" - -[[projects]] - digest = "1:b24d38b282bacf9791408a080f606370efa3d364e4b5fd9ba0f7b87786d3b679" - name = "github.com/urfave/cli" - packages = ["."] - pruneopts = "UT" - revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" - version = "v1.20.0" - -[[projects]] - digest = "1:785adacba41666eb1de74447b5538476b9a9da178bd7d15ba3aeb2879ed07ed3" - name = "go.opencensus.io" - packages = [ - ".", - "exemplar", - "internal", - "internal/tagencoding", - "plugin/ochttp", - "plugin/ochttp/propagation/b3", - "stats", - "stats/internal", - "stats/view", - "tag", - "trace", - "trace/internal", - "trace/propagation", - "trace/tracestate", - ] - pruneopts = "UT" - revision = "2b5032d79456124f42db6b7eb19ac6c155449dc2" - version = "v0.19.0" - -[[projects]] - branch = "master" - digest = "1:30e9f5bea4df0d1a573ed89a85cc680ab05dfc078f6a21e627db236f29650a11" - name = "golang.org/x/crypto" - packages = [ - "curve25519", - "ed25519", - "ed25519/internal/edwards25519", - "internal/chacha20", - "internal/subtle", - "poly1305", - "ssh", - "ssh/agent", - "ssh/terminal", - ] - pruneopts = "UT" - revision = "ff983b9c42bc9fbf91556e191cc8efb585c16908" - -[[projects]] - branch = "master" - digest = "1:470efb06ada11351d90ee09868d84c622cc949a59c165b99d33d555dacbde74b" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp", - "http/httpguts", - "http2", - "http2/hpack", - "idna", - "internal/timeseries", - "trace", - ] - pruneopts = "UT" - revision = "915654e7eabcea33ae277abbecf52f0d8b7a9fdc" - -[[projects]] - digest = "1:f645667d687fc8bf228865a2c5455824ef05bad08841e673673ef2bb89ac5b90" - name = "golang.org/x/oauth2" - packages = [ - ".", - "google", - "internal", - "jws", - "jwt", - ] - pruneopts = "UT" - revision = "d2e6202438beef2727060aa7cabdd924d92ebfd9" - -[[projects]] - branch = "master" - digest = "1:bb644db32f5bc1e327a0f748ec871edc4dc46f19b4fbbc15bfd95b1460646537" - name = "golang.org/x/sys" - packages = [ - "unix", - "windows", - ] - pruneopts = "UT" - revision = "b90733256f2e882e81d52f9126de08df5615afd9" - -[[projects]] - digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" - name = "golang.org/x/text" - packages = [ - "collate", - "collate/build", - "internal/colltab", - "internal/gen", - "internal/tag", - "internal/triegen", - "internal/ucd", - "language", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - ] - pruneopts = "UT" - revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" - version = "v0.3.0" - -[[projects]] - branch = "master" - digest = "1:9fdc2b55e8e0fafe4b41884091e51e77344f7dc511c5acedcfd98200003bff90" - name = "golang.org/x/time" - packages = ["rate"] - pruneopts = "UT" - revision = "85acf8d2951cb2a3bde7632f9ff273ef0379bcbd" - -[[projects]] - branch = "master" - digest = "1:a4df62df5ca682765882afdd14d4c904f2841a2fa455b044f4b04545f66cbd74" - name = "google.golang.org/api" - packages = [ - "compute/v1", - "gensupport", - "googleapi", - "googleapi/internal/uritemplates", - "googleapi/transport", - "internal", - "iterator", - "option", - "oslogin/v1", - "storage/v1", - "transport/http", - "transport/http/internal/propagation", - ] - pruneopts = "UT" - revision = "59f8eae6bc597bfd5d5b292134c4b19d8955ed8a" - -[[projects]] - digest = "1:7bc25c2efff76b31f146caf630c617be9b666c6164f0632050466fbec0500125" - name = "google.golang.org/appengine" - packages = [ - ".", - "cloudsql", - "internal", - "internal/app_identity", - "internal/base", - "internal/datastore", - "internal/log", - "internal/modules", - "internal/remote_api", - "internal/urlfetch", - "urlfetch", - ] - pruneopts = "UT" - revision = "e9657d882bb81064595ca3b56cbe2546bbabf7b1" - version = "v1.4.0" - -[[projects]] - branch = "master" - digest = "1:a7d48ca460ca1b4f6ccd8c95502443afa05df88aee84de7dbeb667a8754e8fa6" - name = "google.golang.org/genproto" - packages = [ - "googleapis/api/annotations", - "googleapis/iam/v1", - "googleapis/rpc/code", - "googleapis/rpc/status", - ] - pruneopts = "UT" - revision = "8819c946db4494a2259bf100a377f51aa585d893" - -[[projects]] - digest = "1:9ab5a33d8cb5c120602a34d2e985ce17956a4e8c2edce7e6961568f95e40c09a" - name = "google.golang.org/grpc" - packages = [ - ".", - "balancer", - "balancer/base", - "balancer/roundrobin", - "binarylog/grpc_binarylog_v1", - "codes", - "connectivity", - "credentials", - "credentials/internal", - "encoding", - "encoding/proto", - "grpclog", - "internal", - "internal/backoff", - "internal/binarylog", - "internal/channelz", - "internal/envconfig", - "internal/grpcrand", - "internal/grpcsync", - "internal/syscall", - "internal/transport", - "keepalive", - "metadata", - "naming", - "peer", - "resolver", - "resolver/dns", - "resolver/passthrough", - "stats", - "status", - "tap", - ] - pruneopts = "UT" - revision = "a02b0774206b209466313a0b525d2c738fe407eb" - version = "v1.18.0" - -[[projects]] - digest = "1:2d1fbdc6777e5408cabeb02bf336305e724b925ff4546ded0fa8715a7267922a" - name = "gopkg.in/inf.v0" - packages = ["."] - pruneopts = "UT" - revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf" - version = "v0.9.1" - -[[projects]] - digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" - name = "gopkg.in/yaml.v2" - packages = ["."] - pruneopts = "UT" - revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" - version = "v2.2.2" - -[[projects]] - branch = "master" - digest = "1:5d9a48e3144dfc06d3c5218b38164102f62300e83ffdd9a2d87b3c0b4135612f" - name = "k8s.io/api" - packages = [ - "admissionregistration/v1alpha1", - "admissionregistration/v1beta1", - "apps/v1", - "apps/v1beta1", - "apps/v1beta2", - "authentication/v1", - "authentication/v1beta1", - "authorization/v1", - "authorization/v1beta1", - "autoscaling/v1", - "autoscaling/v2beta1", - "autoscaling/v2beta2", - "batch/v1", - "batch/v1beta1", - "batch/v2alpha1", - "certificates/v1beta1", - "coordination/v1beta1", - "core/v1", - "events/v1beta1", - "extensions/v1beta1", - "networking/v1", - "policy/v1beta1", - "rbac/v1", - "rbac/v1alpha1", - "rbac/v1beta1", - "scheduling/v1alpha1", - "scheduling/v1beta1", - "settings/v1alpha1", - "storage/v1", - "storage/v1alpha1", - "storage/v1beta1", - ] - pruneopts = "UT" - revision = "173ce66c1e39d1d0f56e0b3347ff2988068aecd0" - -[[projects]] - branch = "release-1.12" - digest = "1:f732c584e8a48a368d35289823fbb450987c5b242f1b96e1cae39774b2c1215c" - name = "k8s.io/apimachinery" - packages = [ - "pkg/api/errors", - "pkg/api/meta", - "pkg/api/resource", - "pkg/apis/meta/v1", - "pkg/apis/meta/v1/unstructured", - "pkg/apis/meta/v1beta1", - "pkg/conversion", - "pkg/conversion/queryparams", - "pkg/fields", - "pkg/labels", - "pkg/runtime", - "pkg/runtime/schema", - "pkg/runtime/serializer", - "pkg/runtime/serializer/json", - "pkg/runtime/serializer/protobuf", - "pkg/runtime/serializer/recognizer", - "pkg/runtime/serializer/streaming", - "pkg/runtime/serializer/versioning", - "pkg/selection", - "pkg/types", - "pkg/util/clock", - "pkg/util/errors", - "pkg/util/framer", - "pkg/util/httpstream", - "pkg/util/httpstream/spdy", - "pkg/util/intstr", - "pkg/util/json", - "pkg/util/naming", - "pkg/util/net", - "pkg/util/runtime", - "pkg/util/sets", - "pkg/util/validation", - "pkg/util/validation/field", - "pkg/util/yaml", - "pkg/version", - "pkg/watch", - "third_party/forked/golang/netutil", - "third_party/forked/golang/reflect", - ] - pruneopts = "UT" - revision = "49ce2735e5074ffc3f8190c8406cf51a96302dad" - -[[projects]] - branch = "release-9.0" - digest = "1:a92af87ab3cdd5289ba3b0b44c3e62051ba532ebb5b4ee3f6da7adf9e1a64169" - name = "k8s.io/client-go" - packages = [ - "discovery", - "kubernetes", - "kubernetes/scheme", - "kubernetes/typed/admissionregistration/v1alpha1", - "kubernetes/typed/admissionregistration/v1beta1", - "kubernetes/typed/apps/v1", - "kubernetes/typed/apps/v1beta1", - "kubernetes/typed/apps/v1beta2", - "kubernetes/typed/authentication/v1", - "kubernetes/typed/authentication/v1beta1", - "kubernetes/typed/authorization/v1", - "kubernetes/typed/authorization/v1beta1", - "kubernetes/typed/autoscaling/v1", - "kubernetes/typed/autoscaling/v2beta1", - "kubernetes/typed/autoscaling/v2beta2", - "kubernetes/typed/batch/v1", - "kubernetes/typed/batch/v1beta1", - "kubernetes/typed/batch/v2alpha1", - "kubernetes/typed/certificates/v1beta1", - "kubernetes/typed/coordination/v1beta1", - "kubernetes/typed/core/v1", - "kubernetes/typed/events/v1beta1", - "kubernetes/typed/extensions/v1beta1", - "kubernetes/typed/networking/v1", - "kubernetes/typed/policy/v1beta1", - "kubernetes/typed/rbac/v1", - "kubernetes/typed/rbac/v1alpha1", - "kubernetes/typed/rbac/v1beta1", - "kubernetes/typed/scheduling/v1alpha1", - "kubernetes/typed/scheduling/v1beta1", - "kubernetes/typed/settings/v1alpha1", - "kubernetes/typed/storage/v1", - "kubernetes/typed/storage/v1alpha1", - "kubernetes/typed/storage/v1beta1", - "pkg/apis/clientauthentication", - "pkg/apis/clientauthentication/v1alpha1", - "pkg/apis/clientauthentication/v1beta1", - "pkg/version", - "plugin/pkg/client/auth/exec", - "plugin/pkg/client/auth/gcp", - "rest", - "rest/watch", - "third_party/forked/golang/template", - "tools/auth", - "tools/clientcmd", - "tools/clientcmd/api", - "tools/clientcmd/api/latest", - "tools/clientcmd/api/v1", - "tools/metrics", - "tools/portforward", - "tools/reference", - "transport", - "transport/spdy", - "util/cert", - "util/connrotation", - "util/flowcontrol", - "util/homedir", - "util/integer", - "util/jsonpath", - ] - pruneopts = "UT" - revision = "701b913670036511e3d752318272c97f1a2a2edd" - -[[projects]] - digest = "1:51314886250b22f73377febaadd972084684122e2e1d3004f388dff60754ba05" - name = "k8s.io/kubernetes" - packages = ["pkg/kubectl/generate"] - pruneopts = "UT" - revision = "721bfa751924da8d1680787490c54b9179b1fed0" - version = "v1.13.3" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/gruntwork-io/terratest/modules/gcp", - "github.com/gruntwork-io/terratest/modules/helm", - "github.com/gruntwork-io/terratest/modules/http-helper", - "github.com/gruntwork-io/terratest/modules/k8s", - "github.com/gruntwork-io/terratest/modules/logger", - "github.com/gruntwork-io/terratest/modules/random", - "github.com/gruntwork-io/terratest/modules/retry", - "github.com/gruntwork-io/terratest/modules/shell", - "github.com/gruntwork-io/terratest/modules/terraform", - "github.com/gruntwork-io/terratest/modules/test-structure", - "github.com/stretchr/testify/assert", - "github.com/stretchr/testify/require", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/test/Gopkg.toml b/test/Gopkg.toml deleted file mode 100644 index e5813b3..0000000 --- a/test/Gopkg.toml +++ /dev/null @@ -1,30 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - name = "github.com/gruntwork-io/terratest" - version = "0.16.1" - -[prune] - go-tests = true - unused-packages = true diff --git a/test/README.md b/test/README.md index ee4b75d..efd43a3 100644 --- a/test/README.md +++ b/test/README.md @@ -26,18 +26,17 @@ clean up. ### Prerequisites - Install the latest version of [Go](https://golang.org/). -- Install [dep](https://github.com/golang/dep) for Go dependency management. - Install [Terraform](https://www.terraform.io/downloads.html). - Configure your GCP credentials using one of the [options supported by the Google Cloud SDK](https://cloud.google.com/sdk/docs/authorizing). ### One-time setup -Download Go dependencies using dep: +Download Go dependencies: ``` cd test -dep ensure +go mod download ``` diff --git a/test/gke_basic_tiller_test.go b/test/gke_basic_helm_test.go similarity index 82% rename from test/gke_basic_tiller_test.go rename to test/gke_basic_helm_test.go index 8cc293c..55a969c 100644 --- a/test/gke_basic_tiller_test.go +++ b/test/gke_basic_helm_test.go @@ -19,36 +19,37 @@ import ( "github.com/stretchr/testify/require" ) -func TestGKEBasicTiller(t *testing.T) { +func TestGKEBasicHelm(t *testing.T) { t.Parallel() // Uncomment any of the following to skip that section during the test - // os.Setenv("SKIP_create_test_copy_of_examples", "true") - // os.Setenv("SKIP_create_terratest_options", "true") - // os.Setenv("SKIP_terraform_apply", "true") - // os.Setenv("SKIP_wait_for_workers", "true") - // os.Setenv("SKIP_helm_install", "true") - // os.Setenv("SKIP_cleanup", "true") + //os.Setenv("SKIP_create_test_copy_of_examples", "true") + //os.Setenv("SKIP_create_terratest_options", "true") + //os.Setenv("SKIP_terraform_apply", "true") + //os.Setenv("SKIP_wait_for_workers", "true") + //os.Setenv("SKIP_helm_install", "true") + //os.Setenv("SKIP_cleanup", "true") // Create a directory path that won't conflict workingDir := filepath.Join(".", "stages", t.Name()) test_structure.RunTestStage(t, "create_test_copy_of_examples", func() { - testFolder := test_structure.CopyTerraformFolderToTemp(t, "..", "examples") + // The example is the root example + testFolder := test_structure.CopyTerraformFolderToTemp(t, "../", ".") logger.Logf(t, "path to test folder %s\n", testFolder) - terraformModulePath := filepath.Join(testFolder, "gke-basic-tiller") - test_structure.SaveString(t, workingDir, "gkeBasicTillerTerraformModulePath", terraformModulePath) + terraformModulePath := filepath.Join(testFolder, ".") + test_structure.SaveString(t, workingDir, "gkeBasicHelmTerraformModulePath", terraformModulePath) }) test_structure.RunTestStage(t, "create_terratest_options", func() { - gkeBasicTillerTerraformModulePath := test_structure.LoadString(t, workingDir, "gkeBasicTillerTerraformModulePath") + gkeBasicHelmTerraformModulePath := test_structure.LoadString(t, workingDir, "gkeBasicHelmTerraformModulePath") tmpKubeConfigPath := k8s.CopyHomeKubeConfigToTemp(t) - kubectlOptions := k8s.NewKubectlOptions("", tmpKubeConfigPath) + kubectlOptions := k8s.NewKubectlOptions("", tmpKubeConfigPath, "kube-system") uniqueID := random.UniqueId() project := gcp.GetGoogleProjectIDFromEnvVar(t) region := gcp.GetRandomRegion(t, project, nil, nil) - gkeClusterTerratestOptions := createTestGKEBasicTillerTerraformOptions(t, uniqueID, project, region, - gkeBasicTillerTerraformModulePath, tmpKubeConfigPath) + gkeClusterTerratestOptions := createTestGKEBasicHelmTerraformOptions(uniqueID, project, region, + gkeBasicHelmTerraformModulePath, tmpKubeConfigPath) test_structure.SaveString(t, workingDir, "uniqueID", uniqueID) test_structure.SaveString(t, workingDir, "project", project) test_structure.SaveString(t, workingDir, "region", region) @@ -60,6 +61,7 @@ func TestGKEBasicTiller(t *testing.T) { gkeClusterTerratestOptions := test_structure.LoadTerraformOptions(t, workingDir) terraform.Destroy(t, gkeClusterTerratestOptions) + // Delete the kubectl entry we created kubectlOptions := test_structure.LoadKubectlOptions(t, workingDir) err := os.Remove(kubectlOptions.ConfigPath) require.NoError(t, err) @@ -75,6 +77,7 @@ func TestGKEBasicTiller(t *testing.T) { verifyGkeNodesAreReady(t, kubectlOptions) }) + // Do an additional helm install test_structure.RunTestStage(t, "helm_install", func() { // Path to the helm chart we will test helmChartPath := "charts/minimal-pod" @@ -99,10 +102,6 @@ func TestGKEBasicTiller(t *testing.T) { "image": "nginx:1.15.8", "fullnameOverride": podName, }, - EnvVars: map[string]string{ - "HELM_TLS_VERIFY": "true", - "HELM_TLS_ENABLE": "true", - }, KubectlOptions: kubectlOptions, } @@ -134,6 +133,7 @@ func verifyNginxPod(t *testing.T, kubectlOptions *k8s.KubectlOptions, podName st http_helper.HttpGetWithRetryWithCustomValidation( t, endpoint, + nil, retries, sleep, func(statusCode int, body string) bool { diff --git a/test/gke_cluster_test.go b/test/gke_cluster_test.go index 5abe6f5..38d2068 100644 --- a/test/gke_cluster_test.go +++ b/test/gke_cluster_test.go @@ -72,11 +72,11 @@ func TestGKECluster(t *testing.T) { test_structure.RunTestStage(t, "create_terratest_options", func() { gkeClusterTerraformModulePath := test_structure.LoadString(t, workingDir, "gkeClusterTerraformModulePath") tmpKubeConfigPath := k8s.CopyHomeKubeConfigToTemp(t) - kubectlOptions := k8s.NewKubectlOptions("", tmpKubeConfigPath) + kubectlOptions := k8s.NewKubectlOptions("", tmpKubeConfigPath, "kube-system") uniqueID := random.UniqueId() project := gcp.GetGoogleProjectIDFromEnvVar(t) region := gcp.GetRandomRegion(t, project, nil, nil) - gkeClusterTerratestOptions := createTestGKEClusterTerraformOptions(t, uniqueID, project, region, gkeClusterTerraformModulePath) + gkeClusterTerratestOptions := createTestGKEClusterTerraformOptions(uniqueID, project, region, gkeClusterTerraformModulePath) if testCase.overrideDefaultSA { gkeClusterTerratestOptions.Vars["override_default_node_pool_service_account"] = "1" } @@ -127,8 +127,10 @@ func TestGKECluster(t *testing.T) { test_structure.RunTestStage(t, "terraform_verify_plan_noop", func() { gkeClusterTerratestOptions := test_structure.LoadTerraformOptions(t, workingDir) - exitCode := terraform.InitAndPlan(t, gkeClusterTerratestOptions) - assert.Equal(t, exitCode, 0) + planResult := terraform.InitAndPlan(t, gkeClusterTerratestOptions) + resourceCount := terraform.GetResourceCount(t, planResult) + assert.Equal(t, 0, resourceCount.Change) + assert.Equal(t, 0, resourceCount.Add) }) }) } diff --git a/test/go.mod b/test/go.mod new file mode 100644 index 0000000..571b623 --- /dev/null +++ b/test/go.mod @@ -0,0 +1,8 @@ +module github.com/gruntwork-io/terraform-google-gke/test + +go 1.13 + +require ( + github.com/gruntwork-io/terratest v0.26.1 + github.com/stretchr/testify v1.4.0 +) diff --git a/test/go.sum b/test/go.sum new file mode 100644 index 0000000..97b72dc --- /dev/null +++ b/test/go.sum @@ -0,0 +1,563 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1 h1:MXnqY6SlWySaZAqNnXThOvjRFdiiOuKtC6i7baFdNdU= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20200109221225-a4f60165b7a3 h1:2EQbDt6zX40xsToT0KdsmAm4wfA+fPJfv9Yk/PwTxZk= +github.com/docker/cli v0.0.0-20200109221225-a4f60165b7a3/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7 h1:Cvj7S8I4Xpx78KAl6TwTmMHuHlZ/0SM60NUneGJQ7IE= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= +github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0 h1:skJKxRtNmevLqnayafdLe2AsenqRupVmzZSqrvb5caU= +github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.0.0-20200110202235-f4fb41bf00a3 h1:lvfj3UTMJS9ZD1T4mUjvZTe24RqIe9fYUqpeOza+0Hs= +github.com/google/go-containerregistry v0.0.0-20200110202235-f4fb41bf00a3/go.mod h1:2wIuQute9+hhWqvL3vEI7YB0EKluF4WcPzI1eAliazk= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gruntwork-io/gruntwork-cli v0.5.1 h1:mVmVsFubUSLSCO8bGigI63HXzvzkC0uWXzm4dd9pXRg= +github.com/gruntwork-io/gruntwork-cli v0.5.1/go.mod h1:IBX21bESC1/LGoV7jhXKUnTQTZgQ6dYRsoj/VqxUSZQ= +github.com/gruntwork-io/terratest v0.26.1 h1:T+R6sxhr4hTkbhOl9EIp/xTJm6070YcM5sCG0tR4xXg= +github.com/gruntwork-io/terratest v0.26.1/go.mod h1:ONEOU6Fv3a1rN16Z5t5yWbV57DkVC7665yRyvu3aWnk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= +github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.0 h1:J8lpUdobwIeCI7OiSxHqEwJUKvJwicL5+3v1oe2Yb4k= +github.com/pkg/errors v0.9.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= +github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vdemeester/k8s-pkg-credentialprovider v0.0.0-20200107171650-7c61ffa44238/go.mod h1:JwQJCMWpUDqjZrB5jpw0f5VbN7U95zxFy1ZDpoEarGo= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200109152110-61a87790db17 h1:nVJ3guKA9qdkEQ3TUdXI9QSINo2CUPM/cySEvw2w8I0= +golang.org/x/crypto v0.0.0-20200109152110-61a87790db17/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50 h1:YvQ10rzcqWXLlJZ3XCUoO25savxmscf4+SC+ZqiCHhA= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191205215504-7b8c8591a921/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200113040837-eac381796e91/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f h1:2wh8dWY8959cBGQvk1RD+/eQBgRYYDaZ+hT0/zsARoA= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM= +k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= +k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= +k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg= +k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg= +k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= +k8s.io/cloud-provider v0.17.0/go.mod h1:Ze4c3w2C0bRsjkBUoHpFi+qWe3ob1wI2/7cUn+YQIDE= +k8s.io/code-generator v0.0.0-20191121015212-c4c8f8345c7e/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= +k8s.io/csi-translation-lib v0.17.0/go.mod h1:HEF7MEz7pOLJCnxabi45IPkhSsE/KmxPQksuCrHKWls= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.0/go.mod h1:DdzaepJ3RtRy+e5YhNtrCYwlgyK87j/5+Yfp0L9Syp8= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/test/terratest_options.go b/test/terratest_options.go index 5cc4f3b..724bd97 100644 --- a/test/terratest_options.go +++ b/test/terratest_options.go @@ -2,14 +2,11 @@ package test import ( "fmt" - "strings" - "testing" - "github.com/gruntwork-io/terratest/modules/terraform" + "strings" ) -func createTestGKEBasicTillerTerraformOptions( - t *testing.T, +func createTestGKEBasicHelmTerraformOptions( uniqueID, project string, region string, @@ -25,17 +22,7 @@ func createTestGKEBasicTillerTerraformOptions( "project": project, "cluster_name": gkeClusterName, "cluster_service_account_name": gkeServiceAccountName, - "tls_subject": map[string]string{ - "common_name": "tiller", - "org": "Gruntwork", - }, - "client_tls_subject": map[string]string{ - "common_name": "helm", - "org": "Gruntwork", - }, - "force_undeploy": true, - "undeploy_releases": true, - "kubectl_config_path": kubeConfigPath, + "kubectl_config_path": kubeConfigPath, } terratestOptions := terraform.Options{ @@ -47,7 +34,6 @@ func createTestGKEBasicTillerTerraformOptions( } func createTestGKEClusterTerraformOptions( - t *testing.T, uniqueID, project string, region string, diff --git a/variables.tf b/variables.tf index ffe997f..fbf38a2 100644 --- a/variables.tf +++ b/variables.tf @@ -49,76 +49,6 @@ variable "kubectl_config_path" { default = "" } -# Tiller TLS settings - -variable "tls_subject" { - description = "The issuer information that contains the identifying information for the Tiller server. Used to generate the TLS certificate keypairs." - type = map(string) - - default = { - common_name = "tiller" - org = "Gruntwork" - } - # Expects the following keys - # - common_name (required) - # - org (required) - # - org_unit - # - city - # - state - # - country -} - -variable "client_tls_subject" { - description = "The issuer information that contains the identifying information for the helm client of the operator. Used to generate the TLS certificate keypairs." - type = map(string) - - default = { - common_name = "admin" - org = "Gruntwork" - } - # Expects the following keys - # - common_name (required) - # - org (required) - # - org_unit - # - city - # - state - # - country -} - -# TLS algorithm configuration - -variable "private_key_algorithm" { - description = "The name of the algorithm to use for private keys. Must be one of: RSA or ECDSA." - type = string - default = "ECDSA" -} - -variable "private_key_ecdsa_curve" { - description = "The name of the elliptic curve to use. Should only be used if var.private_key_algorithm is ECDSA. Must be one of P224, P256, P384 or P521." - type = string - default = "P256" -} - -variable "private_key_rsa_bits" { - description = "The size of the generated RSA key in bits. Should only be used if var.private_key_algorithm is RSA." - type = number - default = 2048 -} - -# Tiller undeploy options - -variable "force_undeploy" { - description = "If true, will remove the Tiller server resources even if there are releases deployed." - type = bool - default = false -} - -variable "undeploy_releases" { - description = "If true, will delete deployed releases from the Tiller instance before undeploying Tiller." - type = bool - default = false -} - variable "master_ipv4_cidr_block" { description = "The IP range in CIDR notation (size must be /28) to use for the hosted master network. This range will be used for assigning internal IP addresses to the master or set of masters, as well as the ILB VIP. This range must not overlap with any other ranges in use within the cluster's network." type = string