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 }