Skip to content
This repository was archived by the owner on Dec 16, 2020. It is now read-only.

Commit 87ac1cf

Browse files
authored
Merge pull request #7 from gruntwork-io/yori-use-kube-provider
Use kubernetes provider
2 parents 4b428cd + b756945 commit 87ac1cf

13 files changed

+56
-202
lines changed

examples/k8s-namespace-with-service-account/main.tf

+10-13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1010

1111
provider "kubernetes" {
12+
version = "~> 1.5"
1213
config_context = "${var.kubectl_config_context_name}"
1314
config_path = "${var.kubectl_config_path}"
1415
}
@@ -23,9 +24,7 @@ module "namespace" {
2324
# source = "git::[email protected]:gruntwork-io/terraform-kubernetes-helm.git//modules/k8s-namespace?ref=v0.0.1"
2425
source = "../../modules/k8s-namespace"
2526

26-
kubectl_config_context_name = "${var.kubectl_config_context_name}"
27-
kubectl_config_path = "${var.kubectl_config_path}"
28-
name = "${var.name}"
27+
name = "${var.name}"
2928
}
3029

3130
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -38,11 +37,10 @@ module "service_account_access_all" {
3837
# source = "git::[email protected]:gruntwork-io/terraform-kubernetes-helm.git//modules/k8s-service-account?ref=v0.0.1"
3938
source = "../../modules/k8s-service-account"
4039

41-
kubectl_config_context_name = "${var.kubectl_config_context_name}"
42-
kubectl_config_path = "${var.kubectl_config_path}"
43-
name = "${var.name}-admin"
44-
namespace = "${module.namespace.name}"
45-
rbac_roles = ["${module.namespace.rbac_access_all_role}"]
40+
name = "${var.name}-admin"
41+
namespace = "${module.namespace.name}"
42+
num_rbac_roles = 1
43+
rbac_roles = ["${module.namespace.rbac_access_all_role}"]
4644

4745
# How to tag the service account with a label
4846
labels = {
@@ -56,11 +54,10 @@ module "service_account_access_read_only" {
5654
# source = "git::[email protected]:gruntwork-io/terraform-kubernetes-helm.git//modules/k8s-service-account?ref=v0.0.1"
5755
source = "../../modules/k8s-service-account"
5856

59-
kubectl_config_context_name = "${var.kubectl_config_context_name}"
60-
kubectl_config_path = "${var.kubectl_config_path}"
61-
name = "${var.name}-read-only"
62-
namespace = "${module.namespace.name}"
63-
rbac_roles = ["${module.namespace.rbac_access_read_only_role}"]
57+
name = "${var.name}-read-only"
58+
namespace = "${module.namespace.name}"
59+
num_rbac_roles = 1
60+
rbac_roles = ["${module.namespace.rbac_access_read_only_role}"]
6461

6562
# How to tag the service account with a label
6663
labels = {

modules/k8s-namespace/dependencies.tf

-26
This file was deleted.

modules/k8s-namespace/main.tf

+18-22
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,32 @@ resource "kubernetes_namespace" "namespace" {
2929
# This defines two default RBAC roles scoped to the namespace:
3030
# - namespace-access-all : Admin level permissions on all resources in the namespace.
3131
# - namespace-access-read-only: Read only permissions on all resources in the namespace.
32-
# NOTE: replace below with resources from the Terraform Kubernetes provider when they become available.
33-
# - Open PR: https://github.com/terraform-providers/terraform-provider-kubernetes/pull/235
3432
# ---------------------------------------------------------------------------------------------------------------------
3533

36-
locals {
37-
kubectl_config_options = "${var.kubectl_config_context_name != "" ? "--context ${var.kubectl_config_context_name}" : ""} ${var.kubectl_config_path != "" ? "--kubeconfig ${var.kubectl_config_path}" : ""}"
38-
}
39-
40-
resource "null_resource" "rbac_role_access_all" {
41-
provisioner "local-exec" {
42-
command = "echo '${data.template_file.rbac_role_access_all.rendered}' | kubectl auth reconcile ${local.kubectl_config_options} -f -"
34+
resource "kubernetes_role" "rbac_role_access_all" {
35+
metadata {
36+
name = "${var.name}-access-all"
37+
namespace = "${var.name}"
38+
labels = "${var.labels}"
39+
annotations = "${var.annotations}"
4340
}
4441

45-
provisioner "local-exec" {
46-
command = "echo '${data.template_file.rbac_role_access_all.rendered}' | kubectl delete ${local.kubectl_config_options} -f -"
47-
when = "destroy"
42+
rule {
43+
api_groups = ["*"]
44+
resources = ["*"]
45+
verbs = ["*"]
4846
}
49-
50-
depends_on = ["kubernetes_namespace.namespace"]
5147
}
5248

53-
resource "null_resource" "rbac_role_access_read_only" {
54-
provisioner "local-exec" {
55-
command = "echo '${data.template_file.rbac_role_access_read_only.rendered}' | kubectl auth reconcile ${local.kubectl_config_options} -f -"
49+
resource "kubernetes_role" "rbac_role_access_read_only" {
50+
metadata {
51+
name = "${var.name}-access-read-only"
52+
namespace = "${var.name}"
5653
}
5754

58-
provisioner "local-exec" {
59-
command = "echo '${data.template_file.rbac_role_access_read_only.rendered}' | kubectl delete ${local.kubectl_config_options} -f -"
60-
when = "destroy"
55+
rule {
56+
api_groups = ["*"]
57+
resources = ["*"]
58+
verbs = ["get", "list", "watch"]
6159
}
62-
63-
depends_on = ["kubernetes_namespace.namespace"]
6460
}

modules/k8s-namespace/outputs.tf

+2-4
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@ output "name" {
55

66
output "rbac_access_all_role" {
77
description = "The name of the RBAC role that grants admin level permissions on the namespace."
8-
value = "${var.name}-access-all"
9-
depends_on = ["null_resource.rbac_role_access_all"]
8+
value = "${kubernetes_role.rbac_role_access_all.metadata.0.name}"
109
}
1110

1211
output "rbac_access_read_only_role" {
1312
description = "The name of the RBAC role that grants read only permissions on the namespace."
14-
value = "${var.name}-access-read-only"
15-
depends_on = ["null_resource.rbac_role_access_read_only"]
13+
value = "${kubernetes_role.rbac_role_access_read_only.metadata.0.name}"
1614
}

modules/k8s-namespace/templates/rbac_role_access_all.json

-15
This file was deleted.

modules/k8s-namespace/templates/rbac_role_access_read_only.json

-15
This file was deleted.

modules/k8s-namespace/variables.tf

-10
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,3 @@ variable "annotations" {
2323
type = "map"
2424
default = {}
2525
}
26-
27-
variable "kubectl_config_context_name" {
28-
description = "The config context to use when authenticating to the Kubernetes cluster. If empty, defaults to the current context specified in the kubeconfig file."
29-
default = ""
30-
}
31-
32-
variable "kubectl_config_path" {
33-
description = "The path to the config file to use for kubectl. If empty, defaults to $HOME/.kube/config"
34-
default = ""
35-
}

modules/k8s-service-account/dependencies.tf

-31
This file was deleted.

modules/k8s-service-account/main.tf

+18-11
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,28 @@ resource "kubernetes_service_account" "service_account" {
3131

3232
# ---------------------------------------------------------------------------------------------------------------------
3333
# BIND THE PROVIDED ROLES TO THE SERVICE ACCOUNT
34-
# NOTE: replace below with resources from the Terraform Kubernetes provider when they become available.
35-
# - Open PR: https://github.com/terraform-providers/terraform-provider-kubernetes/pull/235
3634
# ---------------------------------------------------------------------------------------------------------------------
3735

38-
locals {
39-
kubectl_config_options = "${var.kubectl_config_context_name != "" ? "--context ${var.kubectl_config_context_name}" : ""} ${var.kubectl_config_path != "" ? "--kubeconfig ${var.kubectl_config_path}" : ""}"
40-
}
36+
resource "kubernetes_role_binding" "service_account_role_binding" {
37+
count = "${var.num_rbac_roles}"
38+
39+
metadata {
40+
name = "${var.name}-${element(var.rbac_roles, count.index)}-role-binding"
41+
namespace = "${var.namespace}"
42+
labels = "${var.labels}"
43+
annotations = "${var.annotations}"
44+
}
4145

42-
resource "null_resource" "rbac_role_binding" {
43-
provisioner "local-exec" {
44-
command = "echo '${data.template_file.rbac_role_binding_list.rendered}' | kubectl auth reconcile ${local.kubectl_config_options} -f -"
46+
role_ref {
47+
api_group = "rbac.authorization.k8s.io"
48+
kind = "Role"
49+
name = "${element(var.rbac_roles, count.index)}"
4550
}
4651

47-
provisioner "local-exec" {
48-
command = "echo '${data.template_file.rbac_role_binding_list.rendered}' | kubectl delete ${local.kubectl_config_options} -f -"
49-
when = "destroy"
52+
subject {
53+
api_group = ""
54+
kind = "ServiceAccount"
55+
name = "${kubernetes_service_account.service_account.metadata.0.name}"
56+
namespace = "${var.namespace}"
5057
}
5158
}

modules/k8s-service-account/templates/rbac_role_binding.json

-22
This file was deleted.

modules/k8s-service-account/templates/rbac_role_binding_list.json

-5
This file was deleted.

modules/k8s-service-account/variables.tf

+7-10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ variable "namespace" {
1616
# These variables have defaults, but may be overridden by the operator.
1717
# ---------------------------------------------------------------------------------------------------------------------
1818

19+
# Workaround terraform limitation where resource count can not include interpolated lists.
20+
# See: https://github.com/hashicorp/terraform/issues/17421
21+
variable "num_rbac_roles" {
22+
description = "Number of RBAC roles to bind. This should match the number of items in the list passed to rbac_roles."
23+
default = 0
24+
}
25+
1926
variable "rbac_roles" {
2027
description = "List of names of the RBAC roles that should be bound to the service account. If this list is non-empty, you must also pass in num_rbac_roles specifying the number of roles."
2128
type = "list"
@@ -50,13 +57,3 @@ variable "secrets_for_pods" {
5057
type = "list"
5158
default = []
5259
}
53-
54-
variable "kubectl_config_context_name" {
55-
description = "The config context to use when authenticating to the Kubernetes cluster. If empty, defaults to the current context specified in the kubeconfig file."
56-
default = ""
57-
}
58-
59-
variable "kubectl_config_path" {
60-
description = "The path to the config file to use for kubectl. If empty, defaults to $HOME/.kube/config"
61-
default = ""
62-
}

test/k8s_namespace_with_service_account_test.go

+1-18
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"fmt"
77
"path/filepath"
8-
"strings"
98
"testing"
109
"text/template"
1110
"time"
@@ -57,23 +56,7 @@ func TestK8SNamespaceWithServiceAccount(t *testing.T) {
5756

5857
defer test_structure.RunTestStage(t, "cleanup", func() {
5958
k8sNamespaceTerratestOptions := test_structure.LoadTerraformOptions(t, workingDir)
60-
61-
// We extract out the outputs before destroying so that we can validate these resources are destroyed. This is
62-
// to test that the null_resource provisioners ran on destroy to destroy those resources.
63-
rbacAccessAllRole := terraform.Output(t, k8sNamespaceTerratestOptions, "rbac_access_all_role")
64-
rbacAccessAllRoleDeleteString := fmt.Sprintf("role.rbac.authorization.k8s.io \"%s\" deleted", rbacAccessAllRole)
65-
rbacAccessReadOnlyRole := terraform.Output(t, k8sNamespaceTerratestOptions, "rbac_access_read_only_role")
66-
rbacAccessReadOnlyRoleDeleteString := fmt.Sprintf("role.rbac.authorization.k8s.io \"%s\" deleted", rbacAccessReadOnlyRole)
67-
accessAllServiceAccount := terraform.Output(t, k8sNamespaceTerratestOptions, "service_account_access_all")
68-
accessAllServiceAccountDeleteString := fmt.Sprintf("rolebinding.rbac.authorization.k8s.io \"%s-role-binding\" deleted", accessAllServiceAccount)
69-
accessROServiceAccount := terraform.Output(t, k8sNamespaceTerratestOptions, "service_account_access_read_only")
70-
accessROServiceAccountDeleteString := fmt.Sprintf("rolebinding.rbac.authorization.k8s.io \"%s-role-binding\" deleted", accessROServiceAccount)
71-
72-
out := terraform.Destroy(t, k8sNamespaceTerratestOptions)
73-
assert.True(t, strings.Contains(out, rbacAccessAllRoleDeleteString))
74-
assert.True(t, strings.Contains(out, rbacAccessReadOnlyRoleDeleteString))
75-
assert.True(t, strings.Contains(out, accessAllServiceAccountDeleteString))
76-
assert.True(t, strings.Contains(out, accessROServiceAccountDeleteString))
59+
terraform.Destroy(t, k8sNamespaceTerratestOptions)
7760
})
7861

7962
test_structure.RunTestStage(t, "terraform_apply", func() {

0 commit comments

Comments
 (0)