Skip to content

Commit 2ddd848

Browse files
authored
Merge pull request #72 from phillc/master
Add test for adding a tls port
2 parents 14369c7 + bff0c06 commit 2ddd848

File tree

5 files changed

+165
-18
lines changed

5 files changed

+165
-18
lines changed

e2e/Makefile

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@ IMG ?= linode/linode-cloud-controller-manager:latest
44
imports: $(GOPATH)/bin/goimports
55
goimports -w test
66

7-
.PHONY: test
8-
test: $(GOPATH)/bin/ginkgo
7+
.PHONY: test reuse-and-test
8+
9+
reuse-and-test: SUITE_ARGS='--reuse'
10+
11+
test reuse-and-test: $(GOPATH)/bin/ginkgo
912
@if [ -z "${LINODE_API_TOKEN}" ]; then\
1013
echo "Skipping Test, LINODE_API_TOKEN is not set";\
1114
else \
1215
go list -m; \
13-
ginkgo -r --v --progress --trace --cover -- --v=3 --image=${IMG}; \
16+
ginkgo -r --v --progress --trace --cover $(TEST_ARGS) -- --v=3 --image=${IMG} $(SUITE_ARGS); \
1417
fi
1518

19+
20+
1621
install-terraform:
1722
sudo apt-get install wget unzip
1823
wget https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip

e2e/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,5 @@ Come back here and run the tests
5151
cd e2e
5252
make test
5353
```
54+
55+
To save time on multiple runs by allowing the cluster to remain, use `make reuse-and-test`

e2e/test/ccm_e2e_test.go

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"k8s.io/apimachinery/pkg/util/intstr"
1818
)
1919

20-
var _ = Describe("CloudControllerManager", func() {
20+
var _ = Describe("e2e tests", func() {
2121
var (
2222
err error
2323
f *framework.Invocation
@@ -82,6 +82,11 @@ var _ = Describe("CloudControllerManager", func() {
8282
Expect(err).NotTo(HaveOccurred())
8383
}
8484

85+
var updateServiceWithAnnotations = func(labels map[string]string, annotations map[string]string, ports []core.ServicePort, isSessionAffinityClientIP bool) {
86+
err = f.LoadBalancer.UpdateService(labels, annotations, ports, isSessionAffinityClientIP)
87+
Expect(err).NotTo(HaveOccurred())
88+
}
89+
8590
var deleteNodeBalancer = func(id int) {
8691
err = getLinodeClient().DeleteNodeBalancer(context.Background(), id)
8792
Expect(err).NotTo(HaveOccurred())
@@ -453,6 +458,101 @@ var _ = Describe("CloudControllerManager", func() {
453458
})
454459
})
455460

461+
Context("With HTTP updating to have HTTPS", func() {
462+
var (
463+
pods []string
464+
labels map[string]string
465+
annotations map[string]string
466+
secretName string
467+
)
468+
BeforeEach(func() {
469+
pods = []string{"tls-pod"}
470+
secretName = "tls-secret-1"
471+
labels = map[string]string{
472+
"app": "test-loadbalancer",
473+
}
474+
annotations = map[string]string{
475+
annLinodeDefaultProtocol: "https",
476+
annLinodePortConfigPrefix + "80": `{"protocol": "http"}`,
477+
}
478+
ports := []core.ContainerPort{
479+
{
480+
Name: "alpha",
481+
ContainerPort: 8080,
482+
},
483+
}
484+
servicePorts := []core.ServicePort{
485+
{
486+
Name: "http",
487+
Port: 80,
488+
TargetPort: intstr.FromInt(8080),
489+
Protocol: "TCP",
490+
},
491+
}
492+
493+
By("Creating Pod")
494+
createPodWithLabel(pods, ports, framework.TestServerImage, labels, false)
495+
496+
By("Creating Service")
497+
createServiceWithAnnotations(labels, annotations, servicePorts, false)
498+
499+
By("Creating Secret")
500+
err = f.LoadBalancer.CreateTLSSecret(secretName)
501+
Expect(err).NotTo(HaveOccurred())
502+
503+
By("Updating the Service")
504+
updateAnnotations := map[string]string{
505+
annLinodeDefaultProtocol: "https",
506+
annLinodePortConfigPrefix + "80": `{"protocol": "http"}`,
507+
annLinodePortConfigPrefix + "443": `{"tls-secret-name": "` + secretName + `", "protocol": "https"}`,
508+
}
509+
updateServicePorts := []core.ServicePort{
510+
{
511+
Name: "http",
512+
Port: 80,
513+
TargetPort: intstr.FromInt(8080),
514+
Protocol: "TCP",
515+
},
516+
{
517+
Name: "https",
518+
Port: 443,
519+
TargetPort: intstr.FromInt(8080),
520+
Protocol: "TCP",
521+
},
522+
}
523+
updateServiceWithAnnotations(labels, updateAnnotations, updateServicePorts, false)
524+
})
525+
526+
AfterEach(func() {
527+
By("Deleting the Secrets")
528+
deletePods(pods)
529+
530+
By("Deleting the Service")
531+
deleteService()
532+
533+
By("Deleting the Secret")
534+
deleteSecret(secretName)
535+
})
536+
537+
It("should reach the pods", func() {
538+
By("Checking TCP Response")
539+
eps, err := f.LoadBalancer.GetHTTPEndpoints()
540+
Expect(err).NotTo(HaveOccurred())
541+
Expect(len(eps)).Should(BeNumerically("==", 2))
542+
543+
// in order of the spec
544+
http80, https443 := eps[0], eps[1]
545+
546+
waitForResponse := func(endpoint string, fn func(string, string) error) {
547+
By("Waiting for Response from the LoadBalancer url: " + endpoint)
548+
err := fn(endpoint, pods[0])
549+
Expect(err).NotTo(HaveOccurred())
550+
}
551+
waitForResponse(http80, framework.WaitForHTTPResponse)
552+
waitForResponse(https443, framework.WaitForHTTPSResponse)
553+
})
554+
})
555+
456556
Context("With SessionAffinity", func() {
457557
var (
458558
pods []string

e2e/test/ccm_suite_test.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ import (
2424

2525
var (
2626
useExisting = false
27-
dlt = false
28-
ClusterName = rand.WithUniqSuffix("ccm-linode")
27+
reuse = false
28+
clusterName string
2929
)
3030

3131
func init() {
3232
flag.StringVar(&framework.Image, "image", framework.Image, "registry/repository:tag")
3333
flag.StringVar(&framework.ApiToken, "api-token", os.Getenv("LINODE_API_TOKEN"), "linode api token")
34-
flag.BoolVar(&dlt, "delete", dlt, "Delete cluster after test")
35-
flag.BoolVar(&useExisting, "use-existing", useExisting, "Use existing kubernetes cluster")
34+
flag.BoolVar(&reuse, "reuse", reuse, "Create a cluster and continue to use it")
35+
flag.BoolVar(&useExisting, "use-existing", useExisting, "Use an existing kubernetes cluster")
3636
flag.StringVar(&framework.KubeConfigFile, "kubeconfig", filepath.Join(homedir.HomeDir(), ".kube/config"), "To use existing cluster provide kubeconfig file")
3737
}
3838

@@ -68,12 +68,27 @@ var getLinodeClient = func() *linodego.Client {
6868
}
6969

7070
var _ = BeforeSuite(func() {
71+
if reuse {
72+
clusterName = "ccm-linode-for-reuse"
73+
} else {
74+
clusterName = rand.WithUniqSuffix("ccm-linode")
75+
}
76+
77+
dir, err := os.Getwd()
78+
Expect(err).NotTo(HaveOccurred())
79+
kubeConfigFile := filepath.Join(dir, clusterName+".conf")
80+
81+
if reuse {
82+
if _, err := os.Stat(kubeConfigFile); !os.IsNotExist(err) {
83+
useExisting = true
84+
framework.KubeConfigFile = kubeConfigFile
85+
}
86+
}
87+
7188
if !useExisting {
72-
err := framework.CreateCluster(ClusterName)
73-
Expect(err).NotTo(HaveOccurred())
74-
dir, err := os.Getwd()
89+
err := framework.CreateCluster(clusterName)
7590
Expect(err).NotTo(HaveOccurred())
76-
framework.KubeConfigFile = filepath.Join(dir, ClusterName+".conf")
91+
framework.KubeConfigFile = kubeConfigFile
7792
}
7893

7994
By("Using kubeconfig from " + framework.KubeConfigFile)
@@ -93,8 +108,11 @@ var _ = BeforeSuite(func() {
93108
})
94109

95110
var _ = AfterSuite(func() {
96-
if dlt || !useExisting {
97-
err := framework.DeleteCluster(ClusterName)
111+
if !(useExisting || reuse) {
112+
By("Deleting cluster")
113+
err := framework.DeleteCluster(clusterName)
98114
Expect(err).NotTo(HaveOccurred())
115+
} else {
116+
By("Not deleting cluster")
99117
}
100118
})

e2e/test/framework/service.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"k8s.io/apimachinery/pkg/util/wait"
1414
)
1515

16-
func (i *lbInvocation) CreateService(selector, annotations map[string]string, ports []core.ServicePort, isSessionAffinityClientIP bool) error {
16+
func (i *lbInvocation) createOrUpdateService(selector, annotations map[string]string, ports []core.ServicePort, isSessionAffinityClientIP bool, isCreate bool) error {
1717
var sessionAffinity core.ServiceAffinity = "None"
1818
if isSessionAffinityClientIP {
1919
sessionAffinity = "ClientIP"
@@ -35,14 +35,36 @@ func (i *lbInvocation) CreateService(selector, annotations map[string]string, po
3535
},
3636
}
3737

38-
_, err := i.kubeClient.CoreV1().Services(i.Namespace()).Create(svc)
39-
if err != nil {
40-
return err
38+
service := i.kubeClient.CoreV1().Services(i.Namespace())
39+
if isCreate {
40+
_, err := service.Create(svc)
41+
if err != nil {
42+
return err
43+
}
44+
} else {
45+
options := metav1.GetOptions{}
46+
resource, err := service.Get(TestServerResourceName, options)
47+
if err != nil {
48+
return err
49+
}
50+
svc.ObjectMeta.ResourceVersion = resource.ResourceVersion
51+
svc.Spec.ClusterIP = resource.Spec.ClusterIP
52+
_, err = service.Update(svc)
53+
if err != nil {
54+
return err
55+
}
4156
}
4257

4358
return i.waitForServerReady()
4459
}
4560

61+
func (i *lbInvocation) CreateService(selector, annotations map[string]string, ports []core.ServicePort, isSessionAffinityClientIP bool) error {
62+
return i.createOrUpdateService(selector, annotations, ports, isSessionAffinityClientIP, true)
63+
}
64+
func (i *lbInvocation) UpdateService(selector, annotations map[string]string, ports []core.ServicePort, isSessionAffinityClientIP bool) error {
65+
return i.createOrUpdateService(selector, annotations, ports, isSessionAffinityClientIP, false)
66+
}
67+
4668
func (i *lbInvocation) DeleteService() error {
4769
err := i.kubeClient.CoreV1().Services(i.Namespace()).Delete(TestServerResourceName, nil)
4870
return err

0 commit comments

Comments
 (0)