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