github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/kubernetes/resource_kubernetes_namespace_test.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"regexp"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	api "k8s.io/kubernetes/pkg/api/v1"
    14  	kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
    15  )
    16  
    17  func TestAccKubernetesNamespace_basic(t *testing.T) {
    18  	var conf api.Namespace
    19  	nsName := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
    20  
    21  	resource.Test(t, resource.TestCase{
    22  		PreCheck:      func() { testAccPreCheck(t) },
    23  		IDRefreshName: "kubernetes_namespace.test",
    24  		Providers:     testAccProviders,
    25  		CheckDestroy:  testAccCheckKubernetesNamespaceDestroy,
    26  		Steps: []resource.TestStep{
    27  			{
    28  				Config: testAccKubernetesNamespaceConfig_basic(nsName),
    29  				Check: resource.ComposeAggregateTestCheckFunc(
    30  					testAccCheckKubernetesNamespaceExists("kubernetes_namespace.test", &conf),
    31  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.%", "2"),
    32  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.TestAnnotationOne", "one"),
    33  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.TestAnnotationTwo", "two"),
    34  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{"TestAnnotationOne": "one", "TestAnnotationTwo": "two"}),
    35  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.%", "3"),
    36  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.TestLabelOne", "one"),
    37  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.TestLabelTwo", "two"),
    38  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.TestLabelThree", "three"),
    39  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{"TestLabelOne": "one", "TestLabelTwo": "two", "TestLabelThree": "three"}),
    40  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.name", nsName),
    41  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.generation"),
    42  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.resource_version"),
    43  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.self_link"),
    44  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.uid"),
    45  				),
    46  			},
    47  			{
    48  				Config: testAccKubernetesNamespaceConfig_smallerLists(nsName),
    49  				Check: resource.ComposeAggregateTestCheckFunc(
    50  					testAccCheckKubernetesNamespaceExists("kubernetes_namespace.test", &conf),
    51  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.%", "2"),
    52  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.TestAnnotationOne", "one"),
    53  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.Different", "1234"),
    54  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{"TestAnnotationOne": "one", "Different": "1234"}),
    55  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.%", "2"),
    56  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.TestLabelOne", "one"),
    57  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.TestLabelThree", "three"),
    58  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{"TestLabelOne": "one", "TestLabelThree": "three"}),
    59  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.name", nsName),
    60  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.generation"),
    61  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.resource_version"),
    62  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.self_link"),
    63  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.uid"),
    64  				),
    65  			},
    66  			{
    67  				Config: testAccKubernetesNamespaceConfig_noLists(nsName),
    68  				Check: resource.ComposeAggregateTestCheckFunc(
    69  					testAccCheckKubernetesNamespaceExists("kubernetes_namespace.test", &conf),
    70  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.%", "0"),
    71  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{}),
    72  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.%", "0"),
    73  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}),
    74  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.name", nsName),
    75  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.generation"),
    76  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.resource_version"),
    77  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.self_link"),
    78  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.uid"),
    79  				),
    80  			},
    81  		},
    82  	})
    83  }
    84  
    85  func TestAccKubernetesNamespace_importBasic(t *testing.T) {
    86  	resourceName := "kubernetes_namespace.test"
    87  	nsName := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
    88  
    89  	resource.Test(t, resource.TestCase{
    90  		PreCheck:     func() { testAccPreCheck(t) },
    91  		Providers:    testAccProviders,
    92  		CheckDestroy: testAccCheckKubernetesNamespaceDestroy,
    93  		Steps: []resource.TestStep{
    94  			{
    95  				Config: testAccKubernetesNamespaceConfig_basic(nsName),
    96  			},
    97  
    98  			{
    99  				ResourceName:      resourceName,
   100  				ImportState:       true,
   101  				ImportStateVerify: true,
   102  			},
   103  		},
   104  	})
   105  }
   106  
   107  func TestAccKubernetesNamespace_generatedName(t *testing.T) {
   108  	var conf api.Namespace
   109  	prefix := "tf-acc-test-gen-"
   110  
   111  	resource.Test(t, resource.TestCase{
   112  		PreCheck:      func() { testAccPreCheck(t) },
   113  		IDRefreshName: "kubernetes_namespace.test",
   114  		Providers:     testAccProviders,
   115  		CheckDestroy:  testAccCheckKubernetesNamespaceDestroy,
   116  		Steps: []resource.TestStep{
   117  			{
   118  				Config: testAccKubernetesNamespaceConfig_generatedName(prefix),
   119  				Check: resource.ComposeAggregateTestCheckFunc(
   120  					testAccCheckKubernetesNamespaceExists("kubernetes_namespace.test", &conf),
   121  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.annotations.%", "0"),
   122  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{}),
   123  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.labels.%", "0"),
   124  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}),
   125  					resource.TestCheckResourceAttr("kubernetes_namespace.test", "metadata.0.generate_name", prefix),
   126  					resource.TestMatchResourceAttr("kubernetes_namespace.test", "metadata.0.name", regexp.MustCompile("^"+prefix)),
   127  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.generation"),
   128  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.resource_version"),
   129  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.self_link"),
   130  					resource.TestCheckResourceAttrSet("kubernetes_namespace.test", "metadata.0.uid"),
   131  				),
   132  			},
   133  		},
   134  	})
   135  }
   136  
   137  func TestAccKubernetesNamespace_importGeneratedName(t *testing.T) {
   138  	resourceName := "kubernetes_namespace.test"
   139  	prefix := "tf-acc-test-gen-import-"
   140  
   141  	resource.Test(t, resource.TestCase{
   142  		PreCheck:     func() { testAccPreCheck(t) },
   143  		Providers:    testAccProviders,
   144  		CheckDestroy: testAccCheckKubernetesNamespaceDestroy,
   145  		Steps: []resource.TestStep{
   146  			{
   147  				Config: testAccKubernetesNamespaceConfig_generatedName(prefix),
   148  			},
   149  
   150  			{
   151  				ResourceName:      resourceName,
   152  				ImportState:       true,
   153  				ImportStateVerify: true,
   154  			},
   155  		},
   156  	})
   157  }
   158  
   159  func testAccCheckMetaAnnotations(om *meta_v1.ObjectMeta, expected map[string]string) resource.TestCheckFunc {
   160  	return func(s *terraform.State) error {
   161  		if len(expected) == 0 && len(om.Annotations) == 0 {
   162  			return nil
   163  		}
   164  		if !reflect.DeepEqual(om.Annotations, expected) {
   165  			return fmt.Errorf("%s annotations don't match.\nExpected: %q\nGiven: %q",
   166  				om.Name, expected, om.Annotations)
   167  		}
   168  		return nil
   169  	}
   170  }
   171  
   172  func testAccCheckMetaLabels(om *meta_v1.ObjectMeta, expected map[string]string) resource.TestCheckFunc {
   173  	return func(s *terraform.State) error {
   174  		if len(expected) == 0 && len(om.Labels) == 0 {
   175  			return nil
   176  		}
   177  		if !reflect.DeepEqual(om.Labels, expected) {
   178  			return fmt.Errorf("%s labels don't match.\nExpected: %q\nGiven: %q",
   179  				om.Name, expected, om.Labels)
   180  		}
   181  		return nil
   182  	}
   183  }
   184  
   185  func testAccCheckKubernetesNamespaceDestroy(s *terraform.State) error {
   186  	conn := testAccProvider.Meta().(*kubernetes.Clientset)
   187  
   188  	for _, rs := range s.RootModule().Resources {
   189  		if rs.Type != "kubernetes_namespace" {
   190  			continue
   191  		}
   192  
   193  		resp, err := conn.CoreV1().Namespaces().Get(rs.Primary.ID, meta_v1.GetOptions{})
   194  		if err == nil {
   195  			if resp.Name == rs.Primary.ID {
   196  				return fmt.Errorf("Namespace still exists: %s", rs.Primary.ID)
   197  			}
   198  		}
   199  	}
   200  
   201  	return nil
   202  }
   203  
   204  func testAccCheckKubernetesNamespaceExists(n string, obj *api.Namespace) resource.TestCheckFunc {
   205  	return func(s *terraform.State) error {
   206  		rs, ok := s.RootModule().Resources[n]
   207  		if !ok {
   208  			return fmt.Errorf("Not found: %s", n)
   209  		}
   210  
   211  		conn := testAccProvider.Meta().(*kubernetes.Clientset)
   212  		out, err := conn.CoreV1().Namespaces().Get(rs.Primary.ID, meta_v1.GetOptions{})
   213  		if err != nil {
   214  			return err
   215  		}
   216  
   217  		*obj = *out
   218  		return nil
   219  	}
   220  }
   221  
   222  func testAccKubernetesNamespaceConfig_basic(nsName string) string {
   223  	return fmt.Sprintf(`
   224  resource "kubernetes_namespace" "test" {
   225  	metadata {
   226  		annotations {
   227  			TestAnnotationOne = "one"
   228  			TestAnnotationTwo = "two"
   229  		}
   230  		labels {
   231  			TestLabelOne = "one"
   232  			TestLabelTwo = "two"
   233  			TestLabelThree = "three"
   234  		}
   235  		name = "%s"
   236  	}
   237  }`, nsName)
   238  }
   239  
   240  func testAccKubernetesNamespaceConfig_smallerLists(nsName string) string {
   241  	return fmt.Sprintf(`
   242  resource "kubernetes_namespace" "test" {
   243  	metadata {
   244  		annotations {
   245  			TestAnnotationOne = "one"
   246  			Different = "1234"
   247  		}
   248  		labels {
   249  			TestLabelOne = "one"
   250  			TestLabelThree = "three"
   251  		}
   252  		name = "%s"
   253  	}
   254  }`, nsName)
   255  }
   256  
   257  func testAccKubernetesNamespaceConfig_noLists(nsName string) string {
   258  	return fmt.Sprintf(`
   259  resource "kubernetes_namespace" "test" {
   260  	metadata {
   261  		name = "%s"
   262  	}
   263  }`, nsName)
   264  }
   265  
   266  func testAccKubernetesNamespaceConfig_generatedName(prefix string) string {
   267  	return fmt.Sprintf(`
   268  resource "kubernetes_namespace" "test" {
   269  	metadata {
   270  		generate_name = "%s"
   271  	}
   272  }`, prefix)
   273  }