1/* 2Copyright 2014 The Kubernetes Authors. 3 4Licensed under the Apache License, Version 2.0 (the "License"); 5you may not use this file except in compliance with the License. 6You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10Unless required by applicable law or agreed to in writing, software 11distributed under the License is distributed on an "AS IS" BASIS, 12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13See the License for the specific language governing permissions and 14limitations under the License. 15*/ 16 17package versioned 18 19import ( 20 "reflect" 21 "testing" 22 23 "k8s.io/api/core/v1" 24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 25 "k8s.io/apimachinery/pkg/util/intstr" 26 "k8s.io/kubectl/pkg/generate" 27) 28 29func TestGenerateService(t *testing.T) { 30 tests := []struct { 31 name string 32 generator generate.Generator 33 params map[string]interface{} 34 expected v1.Service 35 }{ 36 { 37 name: "test1", 38 generator: ServiceGeneratorV2{}, 39 params: map[string]interface{}{ 40 "selector": "foo=bar,baz=blah", 41 "name": "test", 42 "port": "80", 43 "protocol": "TCP", 44 "container-port": "1234", 45 }, 46 expected: v1.Service{ 47 ObjectMeta: metav1.ObjectMeta{ 48 Name: "test", 49 }, 50 Spec: v1.ServiceSpec{ 51 Selector: map[string]string{ 52 "foo": "bar", 53 "baz": "blah", 54 }, 55 Ports: []v1.ServicePort{ 56 { 57 Port: 80, 58 Protocol: "TCP", 59 TargetPort: intstr.FromInt(1234), 60 }, 61 }, 62 }, 63 }, 64 }, 65 { 66 name: "test2", 67 generator: ServiceGeneratorV2{}, 68 params: map[string]interface{}{ 69 "selector": "foo=bar,baz=blah", 70 "name": "test", 71 "port": "80", 72 "protocol": "UDP", 73 "container-port": "foobar", 74 }, 75 expected: v1.Service{ 76 ObjectMeta: metav1.ObjectMeta{ 77 Name: "test", 78 }, 79 Spec: v1.ServiceSpec{ 80 Selector: map[string]string{ 81 "foo": "bar", 82 "baz": "blah", 83 }, 84 Ports: []v1.ServicePort{ 85 { 86 Port: 80, 87 Protocol: "UDP", 88 TargetPort: intstr.FromString("foobar"), 89 }, 90 }, 91 }, 92 }, 93 }, 94 { 95 name: "test3", 96 generator: ServiceGeneratorV2{}, 97 params: map[string]interface{}{ 98 "selector": "foo=bar,baz=blah", 99 "labels": "key1=value1,key2=value2", 100 "name": "test", 101 "port": "80", 102 "protocol": "TCP", 103 "container-port": "1234", 104 }, 105 expected: v1.Service{ 106 ObjectMeta: metav1.ObjectMeta{ 107 Name: "test", 108 Labels: map[string]string{ 109 "key1": "value1", 110 "key2": "value2", 111 }, 112 }, 113 Spec: v1.ServiceSpec{ 114 Selector: map[string]string{ 115 "foo": "bar", 116 "baz": "blah", 117 }, 118 Ports: []v1.ServicePort{ 119 { 120 Port: 80, 121 Protocol: "TCP", 122 TargetPort: intstr.FromInt(1234), 123 }, 124 }, 125 }, 126 }, 127 }, 128 { 129 name: "test4", 130 generator: ServiceGeneratorV2{}, 131 params: map[string]interface{}{ 132 "selector": "foo=bar,baz=blah", 133 "name": "test", 134 "port": "80", 135 "protocol": "UDP", 136 "container-port": "foobar", 137 "external-ip": "1.2.3.4", 138 }, 139 expected: v1.Service{ 140 ObjectMeta: metav1.ObjectMeta{ 141 Name: "test", 142 }, 143 Spec: v1.ServiceSpec{ 144 Selector: map[string]string{ 145 "foo": "bar", 146 "baz": "blah", 147 }, 148 Ports: []v1.ServicePort{ 149 { 150 Port: 80, 151 Protocol: "UDP", 152 TargetPort: intstr.FromString("foobar"), 153 }, 154 }, 155 ExternalIPs: []string{"1.2.3.4"}, 156 }, 157 }, 158 }, 159 { 160 name: "test5", 161 generator: ServiceGeneratorV2{}, 162 params: map[string]interface{}{ 163 "selector": "foo=bar,baz=blah", 164 "name": "test", 165 "port": "80", 166 "protocol": "UDP", 167 "container-port": "foobar", 168 "external-ip": "1.2.3.4", 169 "type": "LoadBalancer", 170 }, 171 expected: v1.Service{ 172 ObjectMeta: metav1.ObjectMeta{ 173 Name: "test", 174 }, 175 Spec: v1.ServiceSpec{ 176 Selector: map[string]string{ 177 "foo": "bar", 178 "baz": "blah", 179 }, 180 Ports: []v1.ServicePort{ 181 { 182 Port: 80, 183 Protocol: "UDP", 184 TargetPort: intstr.FromString("foobar"), 185 }, 186 }, 187 Type: v1.ServiceTypeLoadBalancer, 188 ExternalIPs: []string{"1.2.3.4"}, 189 }, 190 }, 191 }, 192 { 193 name: "test6", 194 generator: ServiceGeneratorV2{}, 195 params: map[string]interface{}{ 196 "selector": "foo=bar,baz=blah", 197 "name": "test", 198 "port": "80", 199 "protocol": "UDP", 200 "container-port": "foobar", 201 "type": string(v1.ServiceTypeNodePort), 202 }, 203 expected: v1.Service{ 204 ObjectMeta: metav1.ObjectMeta{ 205 Name: "test", 206 }, 207 Spec: v1.ServiceSpec{ 208 Selector: map[string]string{ 209 "foo": "bar", 210 "baz": "blah", 211 }, 212 Ports: []v1.ServicePort{ 213 { 214 Port: 80, 215 Protocol: "UDP", 216 TargetPort: intstr.FromString("foobar"), 217 }, 218 }, 219 Type: v1.ServiceTypeNodePort, 220 }, 221 }, 222 }, 223 { 224 name: "test7", 225 generator: ServiceGeneratorV2{}, 226 params: map[string]interface{}{ 227 "selector": "foo=bar,baz=blah", 228 "name": "test", 229 "port": "80", 230 "protocol": "UDP", 231 "container-port": "foobar", 232 "create-external-load-balancer": "true", // ignored when type is present 233 "type": string(v1.ServiceTypeNodePort), 234 }, 235 expected: v1.Service{ 236 ObjectMeta: metav1.ObjectMeta{ 237 Name: "test", 238 }, 239 Spec: v1.ServiceSpec{ 240 Selector: map[string]string{ 241 "foo": "bar", 242 "baz": "blah", 243 }, 244 Ports: []v1.ServicePort{ 245 { 246 Port: 80, 247 Protocol: "UDP", 248 TargetPort: intstr.FromString("foobar"), 249 }, 250 }, 251 Type: v1.ServiceTypeNodePort, 252 }, 253 }, 254 }, 255 { 256 name: "test8", 257 generator: ServiceGeneratorV1{}, 258 params: map[string]interface{}{ 259 "selector": "foo=bar,baz=blah", 260 "name": "test", 261 "port": "80", 262 "protocol": "TCP", 263 "container-port": "1234", 264 }, 265 expected: v1.Service{ 266 ObjectMeta: metav1.ObjectMeta{ 267 Name: "test", 268 }, 269 Spec: v1.ServiceSpec{ 270 Selector: map[string]string{ 271 "foo": "bar", 272 "baz": "blah", 273 }, 274 Ports: []v1.ServicePort{ 275 { 276 Name: "default", 277 Port: 80, 278 Protocol: "TCP", 279 TargetPort: intstr.FromInt(1234), 280 }, 281 }, 282 }, 283 }, 284 }, 285 { 286 name: "test9", 287 generator: ServiceGeneratorV1{}, 288 params: map[string]interface{}{ 289 "selector": "foo=bar,baz=blah", 290 "name": "test", 291 "port": "80", 292 "protocol": "TCP", 293 "container-port": "1234", 294 "session-affinity": "ClientIP", 295 }, 296 expected: v1.Service{ 297 ObjectMeta: metav1.ObjectMeta{ 298 Name: "test", 299 }, 300 Spec: v1.ServiceSpec{ 301 Selector: map[string]string{ 302 "foo": "bar", 303 "baz": "blah", 304 }, 305 Ports: []v1.ServicePort{ 306 { 307 Name: "default", 308 Port: 80, 309 Protocol: "TCP", 310 TargetPort: intstr.FromInt(1234), 311 }, 312 }, 313 SessionAffinity: v1.ServiceAffinityClientIP, 314 }, 315 }, 316 }, 317 { 318 name: "test10", 319 generator: ServiceGeneratorV2{}, 320 params: map[string]interface{}{ 321 "selector": "foo=bar,baz=blah", 322 "name": "test", 323 "port": "80", 324 "protocol": "TCP", 325 "container-port": "1234", 326 "cluster-ip": "10.10.10.10", 327 }, 328 expected: v1.Service{ 329 ObjectMeta: metav1.ObjectMeta{ 330 Name: "test", 331 }, 332 Spec: v1.ServiceSpec{ 333 Selector: map[string]string{ 334 "foo": "bar", 335 "baz": "blah", 336 }, 337 Ports: []v1.ServicePort{ 338 { 339 Port: 80, 340 Protocol: "TCP", 341 TargetPort: intstr.FromInt(1234), 342 }, 343 }, 344 ClusterIP: "10.10.10.10", 345 }, 346 }, 347 }, 348 { 349 name: "test11", 350 generator: ServiceGeneratorV2{}, 351 params: map[string]interface{}{ 352 "selector": "foo=bar,baz=blah", 353 "name": "test", 354 "port": "80", 355 "protocol": "TCP", 356 "container-port": "1234", 357 "cluster-ip": "None", 358 }, 359 expected: v1.Service{ 360 ObjectMeta: metav1.ObjectMeta{ 361 Name: "test", 362 }, 363 Spec: v1.ServiceSpec{ 364 Selector: map[string]string{ 365 "foo": "bar", 366 "baz": "blah", 367 }, 368 Ports: []v1.ServicePort{ 369 { 370 Port: 80, 371 Protocol: "TCP", 372 TargetPort: intstr.FromInt(1234), 373 }, 374 }, 375 ClusterIP: v1.ClusterIPNone, 376 }, 377 }, 378 }, 379 { 380 name: "test12", 381 generator: ServiceGeneratorV1{}, 382 params: map[string]interface{}{ 383 "selector": "foo=bar", 384 "name": "test", 385 "ports": "80,443", 386 "protocol": "TCP", 387 "container-port": "foobar", 388 }, 389 expected: v1.Service{ 390 ObjectMeta: metav1.ObjectMeta{ 391 Name: "test", 392 }, 393 Spec: v1.ServiceSpec{ 394 Selector: map[string]string{ 395 "foo": "bar", 396 }, 397 Ports: []v1.ServicePort{ 398 { 399 Name: "port-1", 400 Port: 80, 401 Protocol: v1.ProtocolTCP, 402 TargetPort: intstr.FromString("foobar"), 403 }, 404 { 405 Name: "port-2", 406 Port: 443, 407 Protocol: v1.ProtocolTCP, 408 TargetPort: intstr.FromString("foobar"), 409 }, 410 }, 411 }, 412 }, 413 }, 414 { 415 name: "test13", 416 generator: ServiceGeneratorV2{}, 417 params: map[string]interface{}{ 418 "selector": "foo=bar", 419 "name": "test", 420 "ports": "80,443", 421 "protocol": "UDP", 422 "target-port": "1234", 423 }, 424 expected: v1.Service{ 425 ObjectMeta: metav1.ObjectMeta{ 426 Name: "test", 427 }, 428 Spec: v1.ServiceSpec{ 429 Selector: map[string]string{ 430 "foo": "bar", 431 }, 432 Ports: []v1.ServicePort{ 433 { 434 Name: "port-1", 435 Port: 80, 436 Protocol: v1.ProtocolUDP, 437 TargetPort: intstr.FromInt(1234), 438 }, 439 { 440 Name: "port-2", 441 Port: 443, 442 Protocol: v1.ProtocolUDP, 443 TargetPort: intstr.FromInt(1234), 444 }, 445 }, 446 }, 447 }, 448 }, 449 { 450 name: "test14", 451 generator: ServiceGeneratorV2{}, 452 params: map[string]interface{}{ 453 "selector": "foo=bar", 454 "name": "test", 455 "ports": "80,443", 456 "protocol": "TCP", 457 }, 458 expected: v1.Service{ 459 ObjectMeta: metav1.ObjectMeta{ 460 Name: "test", 461 }, 462 Spec: v1.ServiceSpec{ 463 Selector: map[string]string{ 464 "foo": "bar", 465 }, 466 Ports: []v1.ServicePort{ 467 { 468 Name: "port-1", 469 Port: 80, 470 Protocol: v1.ProtocolTCP, 471 TargetPort: intstr.FromInt(80), 472 }, 473 { 474 Name: "port-2", 475 Port: 443, 476 Protocol: v1.ProtocolTCP, 477 TargetPort: intstr.FromInt(443), 478 }, 479 }, 480 }, 481 }, 482 }, 483 { 484 name: "test15", 485 generator: ServiceGeneratorV2{}, 486 params: map[string]interface{}{ 487 "selector": "foo=bar", 488 "name": "test", 489 "ports": "80,8080", 490 "protocols": "8080/UDP", 491 }, 492 expected: v1.Service{ 493 ObjectMeta: metav1.ObjectMeta{ 494 Name: "test", 495 }, 496 Spec: v1.ServiceSpec{ 497 Selector: map[string]string{ 498 "foo": "bar", 499 }, 500 Ports: []v1.ServicePort{ 501 { 502 Name: "port-1", 503 Port: 80, 504 Protocol: v1.ProtocolTCP, 505 TargetPort: intstr.FromInt(80), 506 }, 507 { 508 Name: "port-2", 509 Port: 8080, 510 Protocol: v1.ProtocolUDP, 511 TargetPort: intstr.FromInt(8080), 512 }, 513 }, 514 }, 515 }, 516 }, 517 { 518 name: "test16", 519 generator: ServiceGeneratorV2{}, 520 params: map[string]interface{}{ 521 "selector": "foo=bar", 522 "name": "test", 523 "ports": "80,8080,8081", 524 "protocols": "8080/UDP,8081/TCP", 525 }, 526 expected: v1.Service{ 527 ObjectMeta: metav1.ObjectMeta{ 528 Name: "test", 529 }, 530 Spec: v1.ServiceSpec{ 531 Selector: map[string]string{ 532 "foo": "bar", 533 }, 534 Ports: []v1.ServicePort{ 535 { 536 Name: "port-1", 537 Port: 80, 538 Protocol: v1.ProtocolTCP, 539 TargetPort: intstr.FromInt(80), 540 }, 541 { 542 Name: "port-2", 543 Port: 8080, 544 Protocol: v1.ProtocolUDP, 545 TargetPort: intstr.FromInt(8080), 546 }, 547 { 548 Name: "port-3", 549 Port: 8081, 550 Protocol: v1.ProtocolTCP, 551 TargetPort: intstr.FromInt(8081), 552 }, 553 }, 554 }, 555 }, 556 }, 557 { 558 name: "test17", 559 generator: ServiceGeneratorV2{}, 560 params: map[string]interface{}{ 561 "selector": "foo=bar,baz=blah", 562 "name": "test", 563 "protocol": "TCP", 564 "container-port": "1234", 565 "cluster-ip": "None", 566 }, 567 expected: v1.Service{ 568 ObjectMeta: metav1.ObjectMeta{ 569 Name: "test", 570 }, 571 Spec: v1.ServiceSpec{ 572 Selector: map[string]string{ 573 "foo": "bar", 574 "baz": "blah", 575 }, 576 Ports: []v1.ServicePort{}, 577 ClusterIP: v1.ClusterIPNone, 578 }, 579 }, 580 }, 581 { 582 name: "test18", 583 generator: ServiceGeneratorV2{}, 584 params: map[string]interface{}{ 585 "selector": "foo=bar", 586 "name": "test", 587 "cluster-ip": "None", 588 }, 589 expected: v1.Service{ 590 ObjectMeta: metav1.ObjectMeta{ 591 Name: "test", 592 }, 593 Spec: v1.ServiceSpec{ 594 Selector: map[string]string{ 595 "foo": "bar", 596 }, 597 Ports: []v1.ServicePort{}, 598 ClusterIP: v1.ClusterIPNone, 599 }, 600 }, 601 }, 602 { 603 generator: ServiceGeneratorV2{}, 604 params: map[string]interface{}{ 605 "selector": "foo=bar,baz=blah", 606 "name": "test", 607 "port": "80", 608 "protocol": "SCTP", 609 "container-port": "1234", 610 }, 611 expected: v1.Service{ 612 ObjectMeta: metav1.ObjectMeta{ 613 Name: "test", 614 }, 615 Spec: v1.ServiceSpec{ 616 Selector: map[string]string{ 617 "foo": "bar", 618 "baz": "blah", 619 }, 620 Ports: []v1.ServicePort{ 621 { 622 Port: 80, 623 Protocol: "SCTP", 624 TargetPort: intstr.FromInt(1234), 625 }, 626 }, 627 }, 628 }, 629 }, 630 { 631 generator: ServiceGeneratorV2{}, 632 params: map[string]interface{}{ 633 "selector": "foo=bar,baz=blah", 634 "labels": "key1=value1,key2=value2", 635 "name": "test", 636 "port": "80", 637 "protocol": "SCTP", 638 "container-port": "1234", 639 }, 640 expected: v1.Service{ 641 ObjectMeta: metav1.ObjectMeta{ 642 Name: "test", 643 Labels: map[string]string{ 644 "key1": "value1", 645 "key2": "value2", 646 }, 647 }, 648 Spec: v1.ServiceSpec{ 649 Selector: map[string]string{ 650 "foo": "bar", 651 "baz": "blah", 652 }, 653 Ports: []v1.ServicePort{ 654 { 655 Port: 80, 656 Protocol: "SCTP", 657 TargetPort: intstr.FromInt(1234), 658 }, 659 }, 660 }, 661 }, 662 }, 663 { 664 generator: ServiceGeneratorV1{}, 665 params: map[string]interface{}{ 666 "selector": "foo=bar,baz=blah", 667 "name": "test", 668 "port": "80", 669 "protocol": "SCTP", 670 "container-port": "1234", 671 }, 672 expected: v1.Service{ 673 ObjectMeta: metav1.ObjectMeta{ 674 Name: "test", 675 }, 676 Spec: v1.ServiceSpec{ 677 Selector: map[string]string{ 678 "foo": "bar", 679 "baz": "blah", 680 }, 681 Ports: []v1.ServicePort{ 682 { 683 Name: "default", 684 Port: 80, 685 Protocol: "SCTP", 686 TargetPort: intstr.FromInt(1234), 687 }, 688 }, 689 }, 690 }, 691 }, 692 { 693 generator: ServiceGeneratorV1{}, 694 params: map[string]interface{}{ 695 "selector": "foo=bar,baz=blah", 696 "name": "test", 697 "port": "80", 698 "protocol": "SCTP", 699 "container-port": "1234", 700 "session-affinity": "ClientIP", 701 }, 702 expected: v1.Service{ 703 ObjectMeta: metav1.ObjectMeta{ 704 Name: "test", 705 }, 706 Spec: v1.ServiceSpec{ 707 Selector: map[string]string{ 708 "foo": "bar", 709 "baz": "blah", 710 }, 711 Ports: []v1.ServicePort{ 712 { 713 Name: "default", 714 Port: 80, 715 Protocol: "SCTP", 716 TargetPort: intstr.FromInt(1234), 717 }, 718 }, 719 SessionAffinity: v1.ServiceAffinityClientIP, 720 }, 721 }, 722 }, 723 { 724 generator: ServiceGeneratorV2{}, 725 params: map[string]interface{}{ 726 "selector": "foo=bar,baz=blah", 727 "name": "test", 728 "port": "80", 729 "protocol": "SCTP", 730 "container-port": "1234", 731 "cluster-ip": "10.10.10.10", 732 }, 733 expected: v1.Service{ 734 ObjectMeta: metav1.ObjectMeta{ 735 Name: "test", 736 }, 737 Spec: v1.ServiceSpec{ 738 Selector: map[string]string{ 739 "foo": "bar", 740 "baz": "blah", 741 }, 742 Ports: []v1.ServicePort{ 743 { 744 Port: 80, 745 Protocol: "SCTP", 746 TargetPort: intstr.FromInt(1234), 747 }, 748 }, 749 ClusterIP: "10.10.10.10", 750 }, 751 }, 752 }, 753 { 754 generator: ServiceGeneratorV2{}, 755 params: map[string]interface{}{ 756 "selector": "foo=bar,baz=blah", 757 "name": "test", 758 "port": "80", 759 "protocol": "SCTP", 760 "container-port": "1234", 761 "cluster-ip": "None", 762 }, 763 expected: v1.Service{ 764 ObjectMeta: metav1.ObjectMeta{ 765 Name: "test", 766 }, 767 Spec: v1.ServiceSpec{ 768 Selector: map[string]string{ 769 "foo": "bar", 770 "baz": "blah", 771 }, 772 Ports: []v1.ServicePort{ 773 { 774 Port: 80, 775 Protocol: "SCTP", 776 TargetPort: intstr.FromInt(1234), 777 }, 778 }, 779 ClusterIP: v1.ClusterIPNone, 780 }, 781 }, 782 }, 783 { 784 generator: ServiceGeneratorV1{}, 785 params: map[string]interface{}{ 786 "selector": "foo=bar", 787 "name": "test", 788 "ports": "80,443", 789 "protocol": "SCTP", 790 "container-port": "foobar", 791 }, 792 expected: v1.Service{ 793 ObjectMeta: metav1.ObjectMeta{ 794 Name: "test", 795 }, 796 Spec: v1.ServiceSpec{ 797 Selector: map[string]string{ 798 "foo": "bar", 799 }, 800 Ports: []v1.ServicePort{ 801 { 802 Name: "port-1", 803 Port: 80, 804 Protocol: v1.ProtocolSCTP, 805 TargetPort: intstr.FromString("foobar"), 806 }, 807 { 808 Name: "port-2", 809 Port: 443, 810 Protocol: v1.ProtocolSCTP, 811 TargetPort: intstr.FromString("foobar"), 812 }, 813 }, 814 }, 815 }, 816 }, 817 { 818 generator: ServiceGeneratorV2{}, 819 params: map[string]interface{}{ 820 "selector": "foo=bar", 821 "name": "test", 822 "ports": "80,443", 823 "protocol": "SCTP", 824 }, 825 expected: v1.Service{ 826 ObjectMeta: metav1.ObjectMeta{ 827 Name: "test", 828 }, 829 Spec: v1.ServiceSpec{ 830 Selector: map[string]string{ 831 "foo": "bar", 832 }, 833 Ports: []v1.ServicePort{ 834 { 835 Name: "port-1", 836 Port: 80, 837 Protocol: v1.ProtocolSCTP, 838 TargetPort: intstr.FromInt(80), 839 }, 840 { 841 Name: "port-2", 842 Port: 443, 843 Protocol: v1.ProtocolSCTP, 844 TargetPort: intstr.FromInt(443), 845 }, 846 }, 847 }, 848 }, 849 }, 850 { 851 generator: ServiceGeneratorV2{}, 852 params: map[string]interface{}{ 853 "selector": "foo=bar", 854 "name": "test", 855 "ports": "80,8080", 856 "protocols": "8080/SCTP", 857 }, 858 expected: v1.Service{ 859 ObjectMeta: metav1.ObjectMeta{ 860 Name: "test", 861 }, 862 Spec: v1.ServiceSpec{ 863 Selector: map[string]string{ 864 "foo": "bar", 865 }, 866 Ports: []v1.ServicePort{ 867 { 868 Name: "port-1", 869 Port: 80, 870 Protocol: v1.ProtocolTCP, 871 TargetPort: intstr.FromInt(80), 872 }, 873 { 874 Name: "port-2", 875 Port: 8080, 876 Protocol: v1.ProtocolSCTP, 877 TargetPort: intstr.FromInt(8080), 878 }, 879 }, 880 }, 881 }, 882 }, 883 { 884 generator: ServiceGeneratorV2{}, 885 params: map[string]interface{}{ 886 "selector": "foo=bar", 887 "name": "test", 888 "ports": "80,8080,8081,8082", 889 "protocols": "8080/UDP,8081/TCP,8082/SCTP", 890 }, 891 expected: v1.Service{ 892 ObjectMeta: metav1.ObjectMeta{ 893 Name: "test", 894 }, 895 Spec: v1.ServiceSpec{ 896 Selector: map[string]string{ 897 "foo": "bar", 898 }, 899 Ports: []v1.ServicePort{ 900 { 901 Name: "port-1", 902 Port: 80, 903 Protocol: v1.ProtocolTCP, 904 TargetPort: intstr.FromInt(80), 905 }, 906 { 907 Name: "port-2", 908 Port: 8080, 909 Protocol: v1.ProtocolUDP, 910 TargetPort: intstr.FromInt(8080), 911 }, 912 { 913 Name: "port-3", 914 Port: 8081, 915 Protocol: v1.ProtocolTCP, 916 TargetPort: intstr.FromInt(8081), 917 }, 918 { 919 Name: "port-4", 920 Port: 8082, 921 Protocol: v1.ProtocolSCTP, 922 TargetPort: intstr.FromInt(8082), 923 }, 924 }, 925 }, 926 }, 927 }, 928 { 929 generator: ServiceGeneratorV2{}, 930 params: map[string]interface{}{ 931 "selector": "foo=bar,baz=blah", 932 "name": "test", 933 "protocol": "SCTP", 934 "container-port": "1234", 935 "cluster-ip": "None", 936 }, 937 expected: v1.Service{ 938 ObjectMeta: metav1.ObjectMeta{ 939 Name: "test", 940 }, 941 Spec: v1.ServiceSpec{ 942 Selector: map[string]string{ 943 "foo": "bar", 944 "baz": "blah", 945 }, 946 Ports: []v1.ServicePort{}, 947 ClusterIP: v1.ClusterIPNone, 948 }, 949 }, 950 }, 951 } 952 for _, tt := range tests { 953 t.Run(tt.name, func(t *testing.T) { 954 obj, err := tt.generator.Generate(tt.params) 955 if !reflect.DeepEqual(obj, &tt.expected) { 956 t.Errorf("expected:\n%#v\ngot\n%#v\n", &tt.expected, obj) 957 } 958 if err != nil { 959 t.Errorf("unexpected error: %v", err) 960 } 961 }) 962 } 963} 964