From 551c4f42aac9eae8d63c07e754227e774f1667bc Mon Sep 17 00:00:00 2001 From: Phil Sautter Date: Thu, 29 Apr 2021 21:00:21 -0700 Subject: [PATCH 1/4] Add service acceptance tests --- test/acceptance/service_test.go | 77 +++++++++++++++++++ test/acceptance/testdata/Service/service.tf | 29 +++++++ .../testdata/Service/service_modified.tf | 35 +++++++++ test/acceptance/testdata/Service/variables.tf | 16 ++++ 4 files changed, 157 insertions(+) create mode 100644 test/acceptance/service_test.go create mode 100644 test/acceptance/testdata/Service/service.tf create mode 100644 test/acceptance/testdata/Service/service_modified.tf create mode 100644 test/acceptance/testdata/Service/variables.tf diff --git a/test/acceptance/service_test.go b/test/acceptance/service_test.go new file mode 100644 index 00000000..a1b384ae --- /dev/null +++ b/test/acceptance/service_test.go @@ -0,0 +1,77 @@ +// +build acceptance + +package acceptance + +import ( + "testing" + + tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" +) + +// This test case tests a Service but also is a demonstration of some the assert functions +// available in the test helper +func TestKubernetesManifest_Service(t *testing.T) { + name := randName() + namespace := randName() + + tf := tfhelper.RequireNewWorkingDir(t) + tf.SetReattachInfo(reattachInfo) + defer func() { + tf.RequireDestroy(t) + tf.Close() + k8shelper.AssertNamespacedResourceDoesNotExist(t, "v1", "services", namespace, name) + }() + + k8shelper.CreateNamespace(t, namespace) + defer k8shelper.DeleteNamespace(t, namespace) + + tfvars := TFVARS{ + "namespace": namespace, + "name": name, + } + tfconfig := loadTerraformConfig(t, "Service/service.tf", tfvars) + tf.RequireSetConfig(t, tfconfig) + tf.RequireInit(t) + tf.RequireApply(t) + + k8shelper.AssertNamespacedResourceExists(t, "v1", "services", namespace, name) + + tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.ports[0].name": "http", + "kubernetes_manifest.test.object.spec.ports[0].port": "80", + "kubernetes_manifest.test.object.spec.ports[0].targetPort": "8080", + "kubernetes_manifest.test.object.spec.ports[0].protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + }) + + tfconfigModified := loadTerraformConfig(t, "Service/service_modified.tf", tfvars) + tf.RequireSetConfig(t, tfconfigModified) + tf.RequireApply(t) + + tfstate = tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.metadata.annotations.test": "1", + "kubernetes_manifest.test.object.metadata.labels.test": "2", + "kubernetes_manifest.test.object.spec.ports[0].name": "https", + "kubernetes_manifest.test.object.spec.ports[0].port": "443", + "kubernetes_manifest.test.object.spec.ports[0].targetPort": "8443", + "kubernetes_manifest.test.object.spec.ports[0].protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + }) + + // tfstate.AssertAttributeEqual(t, "kubernetes_manifest.test.object.data.fizz", "buzz") + + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.metadata.labels.test") + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.spec") +} diff --git a/test/acceptance/testdata/Service/service.tf b/test/acceptance/testdata/Service/service.tf new file mode 100644 index 00000000..9a4e5019 --- /dev/null +++ b/test/acceptance/testdata/Service/service.tf @@ -0,0 +1,29 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + } + + spec = { + ports = [{ + name = "http", + port = 80, + targetPort = 8080, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "LoadBalancer" + } + } +} diff --git a/test/acceptance/testdata/Service/service_modified.tf b/test/acceptance/testdata/Service/service_modified.tf new file mode 100644 index 00000000..8c1c40c8 --- /dev/null +++ b/test/acceptance/testdata/Service/service_modified.tf @@ -0,0 +1,35 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + annotations = { + test = "1" + } + labels = { + test = "2" + } + } + + spec = { + ports = [{ + name = "https", + port = 443, + targetPort = 8443, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "LoadBalancer" + } + } +} diff --git a/test/acceptance/testdata/Service/variables.tf b/test/acceptance/testdata/Service/variables.tf new file mode 100644 index 00000000..de8a3e19 --- /dev/null +++ b/test/acceptance/testdata/Service/variables.tf @@ -0,0 +1,16 @@ +# These variable declarations are only used for interactive testing. +# The test code will template in different variable declarations with a default value when running the test. +# +# To set values for interactive runs, create a var-file and set values in it. +# If the name of the var-file ends in '.auto.tfvars' (e.g. myvalues.auto.tfvars) +# it will be automatically picked up and used by Terraform. +# +# DO NOT check in any files named *.auto.tfvars when making changes to tests. + +variable "name" { + type = string +} + +variable "namespace" { + type = string +} From e251cd14799652f7b22a03eab7ee8230a7ee716b Mon Sep 17 00:00:00 2001 From: Phil Sautter Date: Fri, 30 Apr 2021 08:51:54 -0700 Subject: [PATCH 2/4] Fix service acc test --- test/acceptance/service_test.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test/acceptance/service_test.go b/test/acceptance/service_test.go index a1b384ae..4b552cda 100644 --- a/test/acceptance/service_test.go +++ b/test/acceptance/service_test.go @@ -3,6 +3,7 @@ package acceptance import ( + "encoding/json" "testing" tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" @@ -38,14 +39,14 @@ func TestKubernetesManifest_Service(t *testing.T) { tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ - "kubernetes_manifest.test.object.metadata.namespace": namespace, - "kubernetes_manifest.test.object.metadata.name": name, - "kubernetes_manifest.test.object.spec.ports[0].name": "http", - "kubernetes_manifest.test.object.spec.ports[0].port": "80", - "kubernetes_manifest.test.object.spec.ports[0].targetPort": "8080", - "kubernetes_manifest.test.object.spec.ports[0].protocol": "TCP", - "kubernetes_manifest.test.object.spec.selector.app": "test", - "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.ports.0.name": "http", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("80"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8080"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "LoadBalancer", }) tfconfigModified := loadTerraformConfig(t, "Service/service_modified.tf", tfvars) @@ -58,10 +59,10 @@ func TestKubernetesManifest_Service(t *testing.T) { "kubernetes_manifest.test.object.metadata.name": name, "kubernetes_manifest.test.object.metadata.annotations.test": "1", "kubernetes_manifest.test.object.metadata.labels.test": "2", - "kubernetes_manifest.test.object.spec.ports[0].name": "https", - "kubernetes_manifest.test.object.spec.ports[0].port": "443", - "kubernetes_manifest.test.object.spec.ports[0].targetPort": "8443", - "kubernetes_manifest.test.object.spec.ports[0].protocol": "TCP", + "kubernetes_manifest.test.object.spec.ports.0.name": "https", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("443"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8443"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", "kubernetes_manifest.test.object.spec.selector.app": "test", "kubernetes_manifest.test.object.spec.type": "LoadBalancer", }) From ec9d790c58ff059e66030a386a57e37b10c53053 Mon Sep 17 00:00:00 2001 From: Phil Sautter Date: Fri, 30 Apr 2021 08:56:44 -0700 Subject: [PATCH 3/4] Add testdata/*/*.tfvars --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6b24c5ee..5d075dab 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ *.log **/terraform-provider-kubernetes* /terraform-provider-kubernetes* +/test/acceptance/testdata/*/*.tfvars \ No newline at end of file From 0dc238f045ae1a9d10fa410e71830c6734f611f0 Mon Sep 17 00:00:00 2001 From: Phil Sautter Date: Fri, 30 Apr 2021 15:37:14 -0700 Subject: [PATCH 4/4] the rest of the owl --- test/acceptance/service_cluster_ip_test.go | 76 ++++++++++++++++++ test/acceptance/service_external_name_test.go | 72 +++++++++++++++++ test/acceptance/service_load_balancer_test.go | 76 ++++++++++++++++++ test/acceptance/service_node_port_test.go | 79 +++++++++++++++++++ test/acceptance/service_test.go | 6 +- test/acceptance/testdata/Service/service.tf | 2 - .../testdata/Service/service_modified.tf | 2 - .../testdata/Service_ClusterIP/service.tf | 28 +++++++ .../Service_ClusterIP/service_modified.tf | 34 ++++++++ .../testdata/Service_ClusterIP/variables.tf | 16 ++++ .../testdata/Service_ExternalName/service.tf | 22 ++++++ .../Service_ExternalName/service_modified.tf | 28 +++++++ .../Service_ExternalName/variables.tf | 16 ++++ .../testdata/Service_LoadBalancer/service.tf | 29 +++++++ .../Service_LoadBalancer/service_modified.tf | 34 ++++++++ .../Service_LoadBalancer/variables.tf | 16 ++++ .../testdata/Service_NodePort/service.tf | 28 +++++++ .../Service_NodePort/service_modified.tf | 35 ++++++++ .../testdata/Service_NodePort/variables.tf | 16 ++++ 19 files changed, 607 insertions(+), 8 deletions(-) create mode 100644 test/acceptance/service_cluster_ip_test.go create mode 100644 test/acceptance/service_external_name_test.go create mode 100644 test/acceptance/service_load_balancer_test.go create mode 100644 test/acceptance/service_node_port_test.go create mode 100644 test/acceptance/testdata/Service_ClusterIP/service.tf create mode 100644 test/acceptance/testdata/Service_ClusterIP/service_modified.tf create mode 100644 test/acceptance/testdata/Service_ClusterIP/variables.tf create mode 100644 test/acceptance/testdata/Service_ExternalName/service.tf create mode 100644 test/acceptance/testdata/Service_ExternalName/service_modified.tf create mode 100644 test/acceptance/testdata/Service_ExternalName/variables.tf create mode 100644 test/acceptance/testdata/Service_LoadBalancer/service.tf create mode 100644 test/acceptance/testdata/Service_LoadBalancer/service_modified.tf create mode 100644 test/acceptance/testdata/Service_LoadBalancer/variables.tf create mode 100644 test/acceptance/testdata/Service_NodePort/service.tf create mode 100644 test/acceptance/testdata/Service_NodePort/service_modified.tf create mode 100644 test/acceptance/testdata/Service_NodePort/variables.tf diff --git a/test/acceptance/service_cluster_ip_test.go b/test/acceptance/service_cluster_ip_test.go new file mode 100644 index 00000000..e6b2a3e0 --- /dev/null +++ b/test/acceptance/service_cluster_ip_test.go @@ -0,0 +1,76 @@ +// +build acceptance + +package acceptance + +import ( + "encoding/json" + "testing" + + tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" +) + +// This test case tests a Service but also is a demonstration of some the assert functions +// available in the test helper +func TestKubernetesManifest_Service_ClusterIP(t *testing.T) { + name := randName() + namespace := randName() + + tf := tfhelper.RequireNewWorkingDir(t) + tf.SetReattachInfo(reattachInfo) + defer func() { + tf.RequireDestroy(t) + tf.Close() + k8shelper.AssertNamespacedResourceDoesNotExist(t, "v1", "services", namespace, name) + }() + + k8shelper.CreateNamespace(t, namespace) + defer k8shelper.DeleteNamespace(t, namespace) + + tfvars := TFVARS{ + "namespace": namespace, + "name": name, + } + tfconfig := loadTerraformConfig(t, "Service_ClusterIP/service.tf", tfvars) + tf.RequireSetConfig(t, tfconfig) + tf.RequireInit(t) + tf.RequireApply(t) + + k8shelper.AssertNamespacedResourceExists(t, "v1", "services", namespace, name) + + tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.ports.0.name": "http", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("80"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8080"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "ClusterIP", + }) + + tfconfigModified := loadTerraformConfig(t, "Service_ClusterIP/service_modified.tf", tfvars) + tf.RequireSetConfig(t, tfconfigModified) + tf.RequireApply(t) + + tfstate = tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.metadata.annotations.test": "1", + "kubernetes_manifest.test.object.metadata.labels.test": "2", + "kubernetes_manifest.test.object.spec.ports.0.name": "https", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("443"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8443"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "ClusterIP", + }) + + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.metadata.labels.test") + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.spec") +} diff --git a/test/acceptance/service_external_name_test.go b/test/acceptance/service_external_name_test.go new file mode 100644 index 00000000..f34c3d51 --- /dev/null +++ b/test/acceptance/service_external_name_test.go @@ -0,0 +1,72 @@ +// +build acceptance + +package acceptance + +import ( + "testing" + + tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" +) + +// This test case tests a Service but also is a demonstration of some the assert functions +// available in the test helper +func TestKubernetesManifest_Service_ExternalName(t *testing.T) { + name := randName() + namespace := randName() + + tf := tfhelper.RequireNewWorkingDir(t) + tf.SetReattachInfo(reattachInfo) + defer func() { + tf.RequireDestroy(t) + tf.Close() + k8shelper.AssertNamespacedResourceDoesNotExist(t, "v1", "services", namespace, name) + }() + + k8shelper.CreateNamespace(t, namespace) + defer k8shelper.DeleteNamespace(t, namespace) + + tfvars := TFVARS{ + "namespace": namespace, + "name": name, + } + tfconfig := loadTerraformConfig(t, "Service_ExternalName/service.tf", tfvars) + tf.RequireSetConfig(t, tfconfig) + tf.RequireInit(t) + tf.RequireApply(t) + + k8shelper.AssertNamespacedResourceExists(t, "v1", "services", namespace, name) + + tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "ExternalName", + "kubernetes_manifest.test.object.spec.externalName": "terraform.kubernetes.test.com", + }) + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.object.spec.ports.0") + + tfconfigModified := loadTerraformConfig(t, "Service_ExternalName/service_modified.tf", tfvars) + tf.RequireSetConfig(t, tfconfigModified) + tf.RequireApply(t) + + tfstate = tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.metadata.annotations.test": "1", + "kubernetes_manifest.test.object.metadata.labels.test": "2", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "ExternalName", + "kubernetes_manifest.test.object.spec.externalName": "kubernetes-alpha.terraform.test.com", + }) + + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.metadata.labels.test") + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.spec") + +} diff --git a/test/acceptance/service_load_balancer_test.go b/test/acceptance/service_load_balancer_test.go new file mode 100644 index 00000000..e51d0c49 --- /dev/null +++ b/test/acceptance/service_load_balancer_test.go @@ -0,0 +1,76 @@ +// +build acceptance + +package acceptance + +import ( + "encoding/json" + "testing" + + tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" +) + +// This test case tests a Service but also is a demonstration of some the assert functions +// available in the test helper +func TestKubernetesManifest_Service_LoadBalancer(t *testing.T) { + name := randName() + namespace := randName() + + tf := tfhelper.RequireNewWorkingDir(t) + tf.SetReattachInfo(reattachInfo) + defer func() { + tf.RequireDestroy(t) + tf.Close() + k8shelper.AssertNamespacedResourceDoesNotExist(t, "v1", "services", namespace, name) + }() + + k8shelper.CreateNamespace(t, namespace) + defer k8shelper.DeleteNamespace(t, namespace) + + tfvars := TFVARS{ + "namespace": namespace, + "name": name, + } + tfconfig := loadTerraformConfig(t, "Service_LoadBalancer/service.tf", tfvars) + tf.RequireSetConfig(t, tfconfig) + tf.RequireInit(t) + tf.RequireApply(t) + + k8shelper.AssertNamespacedResourceExists(t, "v1", "services", namespace, name) + + tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.ports.0.name": "http", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("80"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8080"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + }) + + tfconfigModified := loadTerraformConfig(t, "Service_LoadBalancer/service_modified.tf", tfvars) + tf.RequireSetConfig(t, tfconfigModified) + tf.RequireApply(t) + + tfstate = tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.metadata.annotations.test": "1", + "kubernetes_manifest.test.object.metadata.labels.test": "2", + "kubernetes_manifest.test.object.spec.ports.0.name": "https", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("443"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8443"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + }) + + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.metadata.labels.test") + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.spec") +} diff --git a/test/acceptance/service_node_port_test.go b/test/acceptance/service_node_port_test.go new file mode 100644 index 00000000..c49e2bce --- /dev/null +++ b/test/acceptance/service_node_port_test.go @@ -0,0 +1,79 @@ +// +build acceptance + +package acceptance + +import ( + "encoding/json" + "testing" + + tfstatehelper "github.com/hashicorp/terraform-provider-kubernetes-alpha/test/helper/state" +) + +// This test case tests a Service but also is a demonstration of some the assert functions +// available in the test helper +func TestKubernetesManifest_Service_NodePort(t *testing.T) { + name := randName() + namespace := randName() + + tf := tfhelper.RequireNewWorkingDir(t) + tf.SetReattachInfo(reattachInfo) + defer func() { + tf.RequireDestroy(t) + tf.Close() + k8shelper.AssertNamespacedResourceDoesNotExist(t, "v1", "services", namespace, name) + }() + + k8shelper.CreateNamespace(t, namespace) + defer k8shelper.DeleteNamespace(t, namespace) + + tfvars := TFVARS{ + "namespace": namespace, + "name": name, + } + tfconfig := loadTerraformConfig(t, "Service_NodePort/service.tf", tfvars) + tf.RequireSetConfig(t, tfconfig) + tf.RequireInit(t) + tf.RequireApply(t) + + k8shelper.AssertNamespacedResourceExists(t, "v1", "services", namespace, name) + + tfstate := tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.spec.ports.0.name": "http", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("80"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8080"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "NodePort", + }) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.spec.ports.0.nodePort") + + tfconfigModified := loadTerraformConfig(t, "Service_NodePort/service_modified.tf", tfvars) + tf.RequireSetConfig(t, tfconfigModified) + tf.RequireApply(t) + + tfstate = tfstatehelper.NewHelper(tf.RequireState(t)) + tfstate.AssertAttributeValues(t, tfstatehelper.AttributeValues{ + "kubernetes_manifest.test.object.metadata.namespace": namespace, + "kubernetes_manifest.test.object.metadata.name": name, + "kubernetes_manifest.test.object.metadata.annotations.test": "1", + "kubernetes_manifest.test.object.metadata.labels.test": "2", + "kubernetes_manifest.test.object.spec.ports.0.name": "https", + "kubernetes_manifest.test.object.spec.ports.0.port": json.Number("443"), + "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8443"), + "kubernetes_manifest.test.object.spec.ports.0.nodePort": json.Number("32767"), + "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", + "kubernetes_manifest.test.object.spec.selector.app": "test", + "kubernetes_manifest.test.object.spec.type": "NodePort", + }) + + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) + tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) + + tfstate.AssertAttributeNotEmpty(t, "kubernetes_manifest.test.object.metadata.labels.test") + + tfstate.AssertAttributeDoesNotExist(t, "kubernetes_manifest.test.spec") +} diff --git a/test/acceptance/service_test.go b/test/acceptance/service_test.go index 4b552cda..11f8a9f5 100644 --- a/test/acceptance/service_test.go +++ b/test/acceptance/service_test.go @@ -46,7 +46,7 @@ func TestKubernetesManifest_Service(t *testing.T) { "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8080"), "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", "kubernetes_manifest.test.object.spec.selector.app": "test", - "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + "kubernetes_manifest.test.object.spec.type": "ClusterIP", }) tfconfigModified := loadTerraformConfig(t, "Service/service_modified.tf", tfvars) @@ -64,11 +64,9 @@ func TestKubernetesManifest_Service(t *testing.T) { "kubernetes_manifest.test.object.spec.ports.0.targetPort": json.Number("8443"), "kubernetes_manifest.test.object.spec.ports.0.protocol": "TCP", "kubernetes_manifest.test.object.spec.selector.app": "test", - "kubernetes_manifest.test.object.spec.type": "LoadBalancer", + "kubernetes_manifest.test.object.spec.type": "ClusterIP", }) - // tfstate.AssertAttributeEqual(t, "kubernetes_manifest.test.object.data.fizz", "buzz") - tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.labels", 1) tfstate.AssertAttributeLen(t, "kubernetes_manifest.test.object.metadata.annotations", 1) diff --git a/test/acceptance/testdata/Service/service.tf b/test/acceptance/testdata/Service/service.tf index 9a4e5019..71f513e8 100644 --- a/test/acceptance/testdata/Service/service.tf +++ b/test/acceptance/testdata/Service/service.tf @@ -11,7 +11,6 @@ resource "kubernetes_manifest" "test" { name = var.name namespace = var.namespace } - spec = { ports = [{ name = "http", @@ -23,7 +22,6 @@ resource "kubernetes_manifest" "test" { selector = { app = "test" } - type = "LoadBalancer" } } } diff --git a/test/acceptance/testdata/Service/service_modified.tf b/test/acceptance/testdata/Service/service_modified.tf index 8c1c40c8..1d264ff4 100644 --- a/test/acceptance/testdata/Service/service_modified.tf +++ b/test/acceptance/testdata/Service/service_modified.tf @@ -17,7 +17,6 @@ resource "kubernetes_manifest" "test" { test = "2" } } - spec = { ports = [{ name = "https", @@ -29,7 +28,6 @@ resource "kubernetes_manifest" "test" { selector = { app = "test" } - type = "LoadBalancer" } } } diff --git a/test/acceptance/testdata/Service_ClusterIP/service.tf b/test/acceptance/testdata/Service_ClusterIP/service.tf new file mode 100644 index 00000000..9482756a --- /dev/null +++ b/test/acceptance/testdata/Service_ClusterIP/service.tf @@ -0,0 +1,28 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + } + spec = { + ports = [{ + name = "http", + port = 80, + targetPort = 8080, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "ClusterIP" + } + } +} diff --git a/test/acceptance/testdata/Service_ClusterIP/service_modified.tf b/test/acceptance/testdata/Service_ClusterIP/service_modified.tf new file mode 100644 index 00000000..c3a804be --- /dev/null +++ b/test/acceptance/testdata/Service_ClusterIP/service_modified.tf @@ -0,0 +1,34 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + annotations = { + test = "1" + } + labels = { + test = "2" + } + } + spec = { + ports = [{ + name = "https", + port = 443, + targetPort = 8443, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "ClusterIP" + } + } +} diff --git a/test/acceptance/testdata/Service_ClusterIP/variables.tf b/test/acceptance/testdata/Service_ClusterIP/variables.tf new file mode 100644 index 00000000..de8a3e19 --- /dev/null +++ b/test/acceptance/testdata/Service_ClusterIP/variables.tf @@ -0,0 +1,16 @@ +# These variable declarations are only used for interactive testing. +# The test code will template in different variable declarations with a default value when running the test. +# +# To set values for interactive runs, create a var-file and set values in it. +# If the name of the var-file ends in '.auto.tfvars' (e.g. myvalues.auto.tfvars) +# it will be automatically picked up and used by Terraform. +# +# DO NOT check in any files named *.auto.tfvars when making changes to tests. + +variable "name" { + type = string +} + +variable "namespace" { + type = string +} diff --git a/test/acceptance/testdata/Service_ExternalName/service.tf b/test/acceptance/testdata/Service_ExternalName/service.tf new file mode 100644 index 00000000..139196b2 --- /dev/null +++ b/test/acceptance/testdata/Service_ExternalName/service.tf @@ -0,0 +1,22 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + } + spec = { + selector = { + app = "test" + } + type = "ExternalName" + externalName = "terraform.kubernetes.test.com" + } + } +} diff --git a/test/acceptance/testdata/Service_ExternalName/service_modified.tf b/test/acceptance/testdata/Service_ExternalName/service_modified.tf new file mode 100644 index 00000000..2750a411 --- /dev/null +++ b/test/acceptance/testdata/Service_ExternalName/service_modified.tf @@ -0,0 +1,28 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + annotations = { + test = "1" + } + labels = { + test = "2" + } + } + spec = { + selector = { + app = "test" + } + type = "ExternalName" + externalName = "kubernetes-alpha.terraform.test.com" + } + } +} diff --git a/test/acceptance/testdata/Service_ExternalName/variables.tf b/test/acceptance/testdata/Service_ExternalName/variables.tf new file mode 100644 index 00000000..de8a3e19 --- /dev/null +++ b/test/acceptance/testdata/Service_ExternalName/variables.tf @@ -0,0 +1,16 @@ +# These variable declarations are only used for interactive testing. +# The test code will template in different variable declarations with a default value when running the test. +# +# To set values for interactive runs, create a var-file and set values in it. +# If the name of the var-file ends in '.auto.tfvars' (e.g. myvalues.auto.tfvars) +# it will be automatically picked up and used by Terraform. +# +# DO NOT check in any files named *.auto.tfvars when making changes to tests. + +variable "name" { + type = string +} + +variable "namespace" { + type = string +} diff --git a/test/acceptance/testdata/Service_LoadBalancer/service.tf b/test/acceptance/testdata/Service_LoadBalancer/service.tf new file mode 100644 index 00000000..9a4e5019 --- /dev/null +++ b/test/acceptance/testdata/Service_LoadBalancer/service.tf @@ -0,0 +1,29 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + } + + spec = { + ports = [{ + name = "http", + port = 80, + targetPort = 8080, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "LoadBalancer" + } + } +} diff --git a/test/acceptance/testdata/Service_LoadBalancer/service_modified.tf b/test/acceptance/testdata/Service_LoadBalancer/service_modified.tf new file mode 100644 index 00000000..c79ad917 --- /dev/null +++ b/test/acceptance/testdata/Service_LoadBalancer/service_modified.tf @@ -0,0 +1,34 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + annotations = { + test = "1" + } + labels = { + test = "2" + } + } + spec = { + ports = [{ + name = "https", + port = 443, + targetPort = 8443, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "LoadBalancer" + } + } +} diff --git a/test/acceptance/testdata/Service_LoadBalancer/variables.tf b/test/acceptance/testdata/Service_LoadBalancer/variables.tf new file mode 100644 index 00000000..de8a3e19 --- /dev/null +++ b/test/acceptance/testdata/Service_LoadBalancer/variables.tf @@ -0,0 +1,16 @@ +# These variable declarations are only used for interactive testing. +# The test code will template in different variable declarations with a default value when running the test. +# +# To set values for interactive runs, create a var-file and set values in it. +# If the name of the var-file ends in '.auto.tfvars' (e.g. myvalues.auto.tfvars) +# it will be automatically picked up and used by Terraform. +# +# DO NOT check in any files named *.auto.tfvars when making changes to tests. + +variable "name" { + type = string +} + +variable "namespace" { + type = string +} diff --git a/test/acceptance/testdata/Service_NodePort/service.tf b/test/acceptance/testdata/Service_NodePort/service.tf new file mode 100644 index 00000000..eb18c512 --- /dev/null +++ b/test/acceptance/testdata/Service_NodePort/service.tf @@ -0,0 +1,28 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + } + spec = { + ports = [{ + name = "http", + port = 80, + targetPort = 8080, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + }] + selector = { + app = "test" + } + type = "NodePort" + } + } +} diff --git a/test/acceptance/testdata/Service_NodePort/service_modified.tf b/test/acceptance/testdata/Service_NodePort/service_modified.tf new file mode 100644 index 00000000..23e8744a --- /dev/null +++ b/test/acceptance/testdata/Service_NodePort/service_modified.tf @@ -0,0 +1,35 @@ +provider "kubernetes-alpha" { +} + +resource "kubernetes_manifest" "test" { + provider = kubernetes-alpha + + manifest = { + apiVersion = "v1" + kind = "Service" + metadata = { + name = var.name + namespace = var.namespace + annotations = { + test = "1" + } + labels = { + test = "2" + } + } + spec = { + ports = [{ + name = "https", + port = 443, + targetPort = 8443, + # Protcol is required for serverside apply per https://github.com/kubernetes-sigs/structured-merge-diff/issues/130 + protocol = "TCP" + nodePort = 32767 + }] + selector = { + app = "test" + } + type = "NodePort" + } + } +} diff --git a/test/acceptance/testdata/Service_NodePort/variables.tf b/test/acceptance/testdata/Service_NodePort/variables.tf new file mode 100644 index 00000000..de8a3e19 --- /dev/null +++ b/test/acceptance/testdata/Service_NodePort/variables.tf @@ -0,0 +1,16 @@ +# These variable declarations are only used for interactive testing. +# The test code will template in different variable declarations with a default value when running the test. +# +# To set values for interactive runs, create a var-file and set values in it. +# If the name of the var-file ends in '.auto.tfvars' (e.g. myvalues.auto.tfvars) +# it will be automatically picked up and used by Terraform. +# +# DO NOT check in any files named *.auto.tfvars when making changes to tests. + +variable "name" { + type = string +} + +variable "namespace" { + type = string +}