github.com/bradfeehan/terraform@v0.7.0-rc3.0.20170529055808-34b45c5ad841/builtin/providers/kubernetes/resource_kubernetes_service_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 api "k8s.io/kubernetes/pkg/api/v1" 13 kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" 14 "k8s.io/kubernetes/pkg/util/intstr" 15 ) 16 17 func TestAccKubernetesService_basic(t *testing.T) { 18 var conf api.Service 19 name := 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_service.test", 24 Providers: testAccProviders, 25 CheckDestroy: testAccCheckKubernetesServiceDestroy, 26 Steps: []resource.TestStep{ 27 { 28 Config: testAccKubernetesServiceConfig_basic(name), 29 Check: resource.ComposeAggregateTestCheckFunc( 30 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 31 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.name", name), 32 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.generation"), 33 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.resource_version"), 34 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.self_link"), 35 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.uid"), 36 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 37 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "1"), 38 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.cluster_ip"), 39 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.name", ""), 40 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.node_port", "0"), 41 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.port", "8080"), 42 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.protocol", "TCP"), 43 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.target_port", "80"), 44 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.session_affinity", "None"), 45 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.type", "ClusterIP"), 46 testAccCheckServicePorts(&conf, []api.ServicePort{ 47 { 48 Port: int32(8080), 49 Protocol: api.ProtocolTCP, 50 TargetPort: intstr.FromInt(80), 51 }, 52 }), 53 ), 54 }, 55 { 56 Config: testAccKubernetesServiceConfig_modified(name), 57 Check: resource.ComposeAggregateTestCheckFunc( 58 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 59 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.name", name), 60 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.generation"), 61 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.resource_version"), 62 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.self_link"), 63 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.uid"), 64 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 65 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "1"), 66 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.cluster_ip"), 67 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.name", ""), 68 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.node_port", "0"), 69 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.port", "8081"), 70 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.protocol", "TCP"), 71 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.target_port", "80"), 72 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.session_affinity", "None"), 73 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.type", "ClusterIP"), 74 testAccCheckServicePorts(&conf, []api.ServicePort{ 75 { 76 Port: int32(8081), 77 Protocol: api.ProtocolTCP, 78 TargetPort: intstr.FromInt(80), 79 }, 80 }), 81 ), 82 }, 83 }, 84 }) 85 } 86 87 func TestAccKubernetesService_loadBalancer(t *testing.T) { 88 var conf api.Service 89 name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)) 90 91 resource.Test(t, resource.TestCase{ 92 PreCheck: func() { testAccPreCheck(t) }, 93 IDRefreshName: "kubernetes_service.test", 94 Providers: testAccProviders, 95 CheckDestroy: testAccCheckKubernetesServiceDestroy, 96 Steps: []resource.TestStep{ 97 { 98 Config: testAccKubernetesServiceConfig_loadBalancer(name), 99 Check: resource.ComposeAggregateTestCheckFunc( 100 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 101 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.name", name), 102 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 103 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "1"), 104 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "1"), 105 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.port.0.node_port"), 106 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.port", "8888"), 107 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.protocol", "TCP"), 108 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.target_port", "80"), 109 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.cluster_ip"), 110 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.#", "2"), 111 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.1452553500", "10.0.0.4"), 112 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.3371212991", "10.0.0.3"), 113 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_name", "ext-name-"+name), 114 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_ip", "12.0.0.120"), 115 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.#", "2"), 116 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.138364083", "10.0.0.5/32"), 117 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.445311837", "10.0.0.6/32"), 118 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.%", "1"), 119 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.App", "MyApp"), 120 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.session_affinity", "ClientIP"), 121 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.type", "LoadBalancer"), 122 testAccCheckServicePorts(&conf, []api.ServicePort{ 123 { 124 Port: int32(8888), 125 Protocol: api.ProtocolTCP, 126 TargetPort: intstr.FromInt(80), 127 }, 128 }), 129 ), 130 }, 131 { 132 Config: testAccKubernetesServiceConfig_loadBalancer_modified(name), 133 Check: resource.ComposeAggregateTestCheckFunc( 134 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 135 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.name", name), 136 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 137 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.cluster_ip"), 138 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.#", "2"), 139 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.1452553500", "10.0.0.4"), 140 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.563283338", "10.0.0.5"), 141 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_name", "ext-name-modified-"+name), 142 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_ip", "12.0.0.125"), 143 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.#", "2"), 144 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.2271073252", "10.0.0.1/32"), 145 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_source_ranges.2515041290", "10.0.0.2/32"), 146 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "1"), 147 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.port.0.node_port"), 148 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.port", "9999"), 149 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.protocol", "TCP"), 150 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.target_port", "81"), 151 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.%", "2"), 152 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.App", "MyModifiedApp"), 153 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.NewSelector", "NewValue"), 154 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.session_affinity", "ClientIP"), 155 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.type", "LoadBalancer"), 156 testAccCheckServicePorts(&conf, []api.ServicePort{ 157 { 158 Port: int32(9999), 159 Protocol: api.ProtocolTCP, 160 TargetPort: intstr.FromInt(81), 161 }, 162 }), 163 ), 164 }, 165 }, 166 }) 167 } 168 169 func TestAccKubernetesService_nodePort(t *testing.T) { 170 var conf api.Service 171 name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)) 172 173 resource.Test(t, resource.TestCase{ 174 PreCheck: func() { testAccPreCheck(t) }, 175 IDRefreshName: "kubernetes_service.test", 176 Providers: testAccProviders, 177 CheckDestroy: testAccCheckKubernetesServiceDestroy, 178 Steps: []resource.TestStep{ 179 { 180 Config: testAccKubernetesServiceConfig_nodePort(name), 181 Check: resource.ComposeAggregateTestCheckFunc( 182 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 183 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.name", name), 184 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 185 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.#", "1"), 186 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.cluster_ip"), 187 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.#", "2"), 188 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.1452553500", "10.0.0.4"), 189 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_ips.563283338", "10.0.0.5"), 190 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.external_name", "ext-name-"+name), 191 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.load_balancer_ip", "12.0.0.125"), 192 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.#", "2"), 193 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.name", "first"), 194 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.port.0.node_port"), 195 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.port", "10222"), 196 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.protocol", "TCP"), 197 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.0.target_port", "22"), 198 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.1.name", "second"), 199 resource.TestCheckResourceAttrSet("kubernetes_service.test", "spec.0.port.1.node_port"), 200 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.1.port", "10333"), 201 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.1.protocol", "TCP"), 202 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.port.1.target_port", "33"), 203 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.%", "1"), 204 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.selector.App", "MyApp"), 205 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.session_affinity", "ClientIP"), 206 resource.TestCheckResourceAttr("kubernetes_service.test", "spec.0.type", "NodePort"), 207 testAccCheckServicePorts(&conf, []api.ServicePort{ 208 { 209 Name: "first", 210 Port: int32(10222), 211 Protocol: api.ProtocolTCP, 212 TargetPort: intstr.FromInt(22), 213 }, 214 { 215 Name: "second", 216 Port: int32(10333), 217 Protocol: api.ProtocolTCP, 218 TargetPort: intstr.FromInt(33), 219 }, 220 }), 221 ), 222 }, 223 }, 224 }) 225 } 226 227 func TestAccKubernetesService_importBasic(t *testing.T) { 228 resourceName := "kubernetes_service.test" 229 name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)) 230 231 resource.Test(t, resource.TestCase{ 232 PreCheck: func() { testAccPreCheck(t) }, 233 Providers: testAccProviders, 234 CheckDestroy: testAccCheckKubernetesServiceDestroy, 235 Steps: []resource.TestStep{ 236 { 237 Config: testAccKubernetesServiceConfig_basic(name), 238 }, 239 240 { 241 ResourceName: resourceName, 242 ImportState: true, 243 ImportStateVerify: true, 244 }, 245 }, 246 }) 247 } 248 249 func TestAccKubernetesService_generatedName(t *testing.T) { 250 var conf api.Service 251 prefix := "tf-acc-test-gen-" 252 253 resource.Test(t, resource.TestCase{ 254 PreCheck: func() { testAccPreCheck(t) }, 255 IDRefreshName: "kubernetes_service.test", 256 Providers: testAccProviders, 257 CheckDestroy: testAccCheckKubernetesServiceDestroy, 258 Steps: []resource.TestStep{ 259 { 260 Config: testAccKubernetesServiceConfig_generatedName(prefix), 261 Check: resource.ComposeAggregateTestCheckFunc( 262 testAccCheckKubernetesServiceExists("kubernetes_service.test", &conf), 263 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.annotations.%", "0"), 264 testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{}), 265 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.labels.%", "0"), 266 testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}), 267 resource.TestCheckResourceAttr("kubernetes_service.test", "metadata.0.generate_name", prefix), 268 resource.TestMatchResourceAttr("kubernetes_service.test", "metadata.0.name", regexp.MustCompile("^"+prefix)), 269 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.generation"), 270 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.resource_version"), 271 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.self_link"), 272 resource.TestCheckResourceAttrSet("kubernetes_service.test", "metadata.0.uid"), 273 ), 274 }, 275 }, 276 }) 277 } 278 279 func TestAccKubernetesService_importGeneratedName(t *testing.T) { 280 resourceName := "kubernetes_service.test" 281 prefix := "tf-acc-test-gen-import-" 282 283 resource.Test(t, resource.TestCase{ 284 PreCheck: func() { testAccPreCheck(t) }, 285 Providers: testAccProviders, 286 CheckDestroy: testAccCheckKubernetesServiceDestroy, 287 Steps: []resource.TestStep{ 288 { 289 Config: testAccKubernetesServiceConfig_generatedName(prefix), 290 }, 291 292 { 293 ResourceName: resourceName, 294 ImportState: true, 295 ImportStateVerify: true, 296 }, 297 }, 298 }) 299 } 300 301 func testAccCheckServicePorts(svc *api.Service, expected []api.ServicePort) resource.TestCheckFunc { 302 return func(s *terraform.State) error { 303 if len(expected) == 0 && len(svc.Spec.Ports) == 0 { 304 return nil 305 } 306 307 ports := svc.Spec.Ports 308 309 // Ignore NodePorts as these are assigned randomly 310 for k, _ := range ports { 311 ports[k].NodePort = 0 312 } 313 314 if !reflect.DeepEqual(ports, expected) { 315 return fmt.Errorf("Service ports don't match.\nExpected: %#v\nGiven: %#v", 316 expected, svc.Spec.Ports) 317 } 318 319 return nil 320 } 321 } 322 323 func testAccCheckKubernetesServiceDestroy(s *terraform.State) error { 324 conn := testAccProvider.Meta().(*kubernetes.Clientset) 325 326 for _, rs := range s.RootModule().Resources { 327 if rs.Type != "kubernetes_service" { 328 continue 329 } 330 namespace, name := idParts(rs.Primary.ID) 331 resp, err := conn.CoreV1().Services(namespace).Get(name) 332 if err == nil { 333 if resp.Name == rs.Primary.ID { 334 return fmt.Errorf("Service still exists: %s", rs.Primary.ID) 335 } 336 } 337 } 338 339 return nil 340 } 341 342 func testAccCheckKubernetesServiceExists(n string, obj *api.Service) resource.TestCheckFunc { 343 return func(s *terraform.State) error { 344 rs, ok := s.RootModule().Resources[n] 345 if !ok { 346 return fmt.Errorf("Not found: %s", n) 347 } 348 349 conn := testAccProvider.Meta().(*kubernetes.Clientset) 350 namespace, name := idParts(rs.Primary.ID) 351 out, err := conn.CoreV1().Services(namespace).Get(name) 352 if err != nil { 353 return err 354 } 355 356 *obj = *out 357 return nil 358 } 359 } 360 361 func testAccKubernetesServiceConfig_basic(name string) string { 362 return fmt.Sprintf(` 363 resource "kubernetes_service" "test" { 364 metadata { 365 annotations { 366 TestAnnotationOne = "one" 367 TestAnnotationTwo = "two" 368 } 369 labels { 370 TestLabelOne = "one" 371 TestLabelTwo = "two" 372 TestLabelThree = "three" 373 } 374 name = "%s" 375 } 376 spec { 377 port { 378 port = 8080 379 target_port = 80 380 } 381 } 382 }`, name) 383 } 384 385 func testAccKubernetesServiceConfig_modified(name string) string { 386 return fmt.Sprintf(` 387 resource "kubernetes_service" "test" { 388 metadata { 389 annotations { 390 TestAnnotationOne = "one" 391 Different = "1234" 392 } 393 labels { 394 TestLabelOne = "one" 395 TestLabelThree = "three" 396 } 397 name = "%s" 398 } 399 spec { 400 port { 401 port = 8081 402 target_port = 80 403 } 404 } 405 }`, name) 406 } 407 408 func testAccKubernetesServiceConfig_loadBalancer(name string) string { 409 return fmt.Sprintf(` 410 resource "kubernetes_service" "test" { 411 metadata { 412 name = "%s" 413 } 414 spec { 415 external_name = "ext-name-%s" 416 external_ips = ["10.0.0.3", "10.0.0.4"] 417 load_balancer_ip = "12.0.0.120" 418 load_balancer_source_ranges = ["10.0.0.5/32", "10.0.0.6/32"] 419 selector { 420 App = "MyApp" 421 } 422 session_affinity = "ClientIP" 423 port { 424 port = 8888 425 target_port = 80 426 } 427 type = "LoadBalancer" 428 } 429 }`, name, name) 430 } 431 432 func testAccKubernetesServiceConfig_loadBalancer_modified(name string) string { 433 return fmt.Sprintf(` 434 resource "kubernetes_service" "test" { 435 metadata { 436 name = "%s" 437 } 438 spec { 439 external_name = "ext-name-modified-%s" 440 external_ips = ["10.0.0.4", "10.0.0.5"] 441 load_balancer_ip = "12.0.0.125" 442 load_balancer_source_ranges = ["10.0.0.1/32", "10.0.0.2/32"] 443 selector { 444 App = "MyModifiedApp" 445 NewSelector = "NewValue" 446 } 447 session_affinity = "ClientIP" 448 port { 449 port = 9999 450 target_port = 81 451 } 452 type = "LoadBalancer" 453 } 454 }`, name, name) 455 } 456 457 func testAccKubernetesServiceConfig_nodePort(name string) string { 458 return fmt.Sprintf(` 459 resource "kubernetes_service" "test" { 460 metadata { 461 name = "%s" 462 } 463 spec { 464 external_name = "ext-name-%s" 465 external_ips = ["10.0.0.4", "10.0.0.5"] 466 load_balancer_ip = "12.0.0.125" 467 selector { 468 App = "MyApp" 469 } 470 session_affinity = "ClientIP" 471 port { 472 name = "first" 473 port = 10222 474 target_port = 22 475 } 476 port { 477 name = "second" 478 port = 10333 479 target_port = 33 480 } 481 type = "NodePort" 482 } 483 }`, name, name) 484 } 485 486 func testAccKubernetesServiceConfig_generatedName(prefix string) string { 487 return fmt.Sprintf(` 488 resource "kubernetes_service" "test" { 489 metadata { 490 generate_name = "%s" 491 } 492 spec { 493 port { 494 port = 8080 495 target_port = 80 496 } 497 } 498 }`, prefix) 499 }