Skip to content

Commit 31f2748

Browse files
committed
save
1 parent 3835ec4 commit 31f2748

File tree

10 files changed

+580
-378
lines changed

10 files changed

+580
-378
lines changed

controllers/gateway/utils.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ func updateGatewayClassLastProcessedConfig(ctx context.Context, k8sClient client
3535
return nil
3636
}
3737

38+
if gwClass.Annotations == nil {
39+
gwClass.Annotations = make(map[string]string)
40+
}
41+
3842
gwClassOld := gwClass.DeepCopy()
3943
gwClass.Annotations[gatewayClassAnnotationLastProcessedConfig] = calculatedVersion
4044
gwClass.Annotations[gatewayClassAnnotationLastProcessedConfigTimestamp] = strconv.FormatInt(time.Now().Unix(), 10)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package gateway
2+
3+
import (
4+
"context"
5+
corev1 "k8s.io/api/core/v1"
6+
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
7+
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
8+
"sigs.k8s.io/aws-load-balancer-controller/test/framework"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
)
11+
12+
type ALBInstanceTestStack struct {
13+
albResourceStack *albResourceStack
14+
}
15+
16+
func (s *ALBInstanceTestStack) Deploy(ctx context.Context, f *framework.Framework, spec elbv2gw.LoadBalancerConfigurationSpec) error {
17+
dp := buildDeploymentSpec(f.Options.TestImageRegistry)
18+
svc := buildServiceSpec()
19+
gwc := buildGatewayClassSpec("gateway.k8s.aws/alb")
20+
gw := buildGatewaySpec(gwc)
21+
lbc := buildLoadBalancerConfig(spec)
22+
httpr := buildHTTPRoute()
23+
s.albResourceStack = newALBResourceStack(dp, svc, gwc, gw, lbc, httpr, "service-instance-e2e", false)
24+
25+
return s.albResourceStack.Deploy(ctx, f)
26+
}
27+
28+
func (s *ALBInstanceTestStack) ScaleDeployment(ctx context.Context, f *framework.Framework, numReplicas int32) error {
29+
return s.albResourceStack.ScaleDeployment(ctx, f, numReplicas)
30+
}
31+
32+
func (s *ALBInstanceTestStack) Cleanup(ctx context.Context, f *framework.Framework) {
33+
s.albResourceStack.Cleanup(ctx, f)
34+
}
35+
36+
func (s *ALBInstanceTestStack) GetLoadBalancerIngressHostName() string {
37+
return s.albResourceStack.GetLoadBalancerIngressHostname()
38+
}
39+
40+
func (s *ALBInstanceTestStack) GetWorkerNodes(ctx context.Context, f *framework.Framework) ([]corev1.Node, error) {
41+
allNodes := &corev1.NodeList{}
42+
err := f.K8sClient.List(ctx, allNodes)
43+
if err != nil {
44+
return nil, err
45+
}
46+
nodeList := []corev1.Node{}
47+
for _, node := range allNodes.Items {
48+
if _, notarget := node.Labels["node.kubernetes.io/exclude-from-external-load-balancers"]; !notarget {
49+
nodeList = append(nodeList, node)
50+
}
51+
}
52+
return nodeList, nil
53+
}
54+
55+
func (s *ALBInstanceTestStack) ApplyNodeLabels(ctx context.Context, f *framework.Framework, node *corev1.Node, labels map[string]string) error {
56+
f.Logger.Info("applying node labels", "node", k8s.NamespacedName(node))
57+
oldNode := node.DeepCopy()
58+
for key, value := range labels {
59+
node.Labels[key] = value
60+
}
61+
if err := f.K8sClient.Patch(ctx, node, client.MergeFrom(oldNode)); err != nil {
62+
f.Logger.Info("failed to update node", "node", k8s.NamespacedName(node))
63+
return err
64+
}
65+
return nil
66+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package gateway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
9+
"sigs.k8s.io/aws-load-balancer-controller/test/framework/http"
10+
"sigs.k8s.io/aws-load-balancer-controller/test/framework/utils"
11+
"sigs.k8s.io/aws-load-balancer-controller/test/framework/verifier"
12+
)
13+
14+
var _ = Describe("test k8s alb gateway reconciled by the aws load balancer controller", func() {
15+
var (
16+
ctx context.Context
17+
stack ALBInstanceTestStack
18+
dnsName string
19+
lbARN string
20+
)
21+
BeforeEach(func() {
22+
ctx = context.Background()
23+
stack = ALBInstanceTestStack{}
24+
})
25+
AfterEach(func() {
26+
stack.Cleanup(ctx, tf)
27+
})
28+
Context("with ALB instance target configuration", func() {
29+
BeforeEach(func() {})
30+
It("should provision internet-facing load balancer resources", func() {
31+
interf := elbv2gw.LoadBalancerSchemeInternetFacing
32+
lbcSpec := elbv2gw.LoadBalancerConfigurationSpec{
33+
Scheme: &interf,
34+
}
35+
By("deploying stack", func() {
36+
err := stack.Deploy(ctx, tf, lbcSpec)
37+
Expect(err).NotTo(HaveOccurred())
38+
})
39+
40+
By("checking service status for lb dns name", func() {
41+
dnsName = stack.GetLoadBalancerIngressHostName()
42+
Expect(dnsName).ToNot(BeEmpty())
43+
})
44+
45+
By("querying AWS loadbalancer from the dns name", func() {
46+
var err error
47+
lbARN, err = tf.LBManager.FindLoadBalancerByDNSName(ctx, dnsName)
48+
Expect(err).NotTo(HaveOccurred())
49+
Expect(lbARN).ToNot(BeEmpty())
50+
})
51+
52+
By("verifying AWS loadbalancer resources", func() {
53+
nodeList, err := stack.GetWorkerNodes(ctx, tf)
54+
Expect(err).ToNot(HaveOccurred())
55+
err = verifier.VerifyAWSLoadBalancerResources(ctx, tf, lbARN, verifier.LoadBalancerExpectation{
56+
Type: "application",
57+
Scheme: "internet-facing",
58+
TargetType: "instance",
59+
Listeners: stack.albResourceStack.getListenersPortMap(),
60+
TargetGroups: stack.albResourceStack.getTargetGroupNodePortMap(),
61+
NumTargets: len(nodeList),
62+
TargetGroupHC: &verifier.TargetGroupHC{
63+
Protocol: "HTTP",
64+
Port: "traffic-port",
65+
Interval: 15,
66+
Timeout: 5,
67+
HealthyThreshold: 3,
68+
UnhealthyThreshold: 3,
69+
},
70+
})
71+
Expect(err).NotTo(HaveOccurred())
72+
})
73+
By("waiting for target group targets to be healthy", func() {
74+
nodeList, err := stack.GetWorkerNodes(ctx, tf)
75+
Expect(err).ToNot(HaveOccurred())
76+
err = verifier.WaitUntilTargetsAreHealthy(ctx, tf, lbARN, len(nodeList))
77+
Expect(err).NotTo(HaveOccurred())
78+
})
79+
By("waiting until DNS name is available", func() {
80+
err := utils.WaitUntilDNSNameAvailable(ctx, dnsName)
81+
Expect(err).NotTo(HaveOccurred())
82+
})
83+
By("sending http request to the lb", func() {
84+
url := fmt.Sprintf("http://%v/any-path", dnsName)
85+
err := tf.HTTPVerifier.VerifyURL(url, http.ResponseCodeMatches(200))
86+
Expect(err).NotTo(HaveOccurred())
87+
})
88+
})
89+
})
90+
})
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package gateway
2+
3+
import (
4+
"context"
5+
appsv1 "k8s.io/api/apps/v1"
6+
corev1 "k8s.io/api/core/v1"
7+
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
8+
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
9+
"sigs.k8s.io/aws-load-balancer-controller/test/framework"
10+
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
11+
)
12+
13+
func newALBResourceStack(dp *appsv1.Deployment, svc *corev1.Service, gwc *gwv1.GatewayClass, gw *gwv1.Gateway, lbc *elbv2gw.LoadBalancerConfiguration, httpr *gwv1.HTTPRoute, baseName string, enablePodReadinessGate bool) *albResourceStack {
14+
15+
commonStack := newCommonResourceStack(dp, svc, gwc, gw, lbc, baseName, enablePodReadinessGate)
16+
return &albResourceStack{
17+
httpr: httpr,
18+
commonStack: commonStack,
19+
}
20+
}
21+
22+
// resourceStack containing the deployment and service resources
23+
type albResourceStack struct {
24+
commonStack *commonResourceStack
25+
httpr *gwv1.HTTPRoute
26+
}
27+
28+
func (s *albResourceStack) Deploy(ctx context.Context, f *framework.Framework) error {
29+
return s.commonStack.Deploy(ctx, f, func(ctx context.Context, f *framework.Framework, namespace string) error {
30+
s.httpr.Namespace = namespace
31+
return s.createHTTPRoute(ctx, f)
32+
})
33+
}
34+
35+
func (s *albResourceStack) ScaleDeployment(ctx context.Context, f *framework.Framework, numReplicas int32) error {
36+
return s.commonStack.ScaleDeployment(ctx, f, numReplicas)
37+
}
38+
39+
func (s *albResourceStack) Cleanup(ctx context.Context, f *framework.Framework) {
40+
s.commonStack.Cleanup(ctx, f)
41+
}
42+
43+
func (s *albResourceStack) GetLoadBalancerIngressHostname() string {
44+
return s.commonStack.GetLoadBalancerIngressHostname()
45+
}
46+
47+
func (s *albResourceStack) GetStackName() string {
48+
return s.commonStack.GetStackName()
49+
}
50+
51+
func (s *albResourceStack) getListenersPortMap() map[string]string {
52+
return s.commonStack.getListenersPortMap()
53+
}
54+
55+
func (s *albResourceStack) getTargetGroupNodePortMap() map[string]string {
56+
return s.commonStack.getTargetGroupNodePortMap()
57+
}
58+
59+
func (s *albResourceStack) getHealthCheckNodePort() string {
60+
return s.commonStack.getHealthCheckNodePort()
61+
}
62+
63+
func (s *albResourceStack) waitUntilDeploymentReady(ctx context.Context, f *framework.Framework) error {
64+
return s.commonStack.waitUntilDeploymentReady(ctx, f)
65+
}
66+
67+
func (s *albResourceStack) createHTTPRoute(ctx context.Context, f *framework.Framework) error {
68+
f.Logger.Info("creating http route", "httpr", k8s.NamespacedName(s.httpr))
69+
return f.K8sClient.Create(ctx, s.httpr)
70+
}
71+
72+
func (s *albResourceStack) deleteHTTPRoute(ctx context.Context, f *framework.Framework) error {
73+
return f.K8sClient.Delete(ctx, s.httpr)
74+
}

0 commit comments

Comments
 (0)