Skip to content

Commit

Permalink
Merge pull request #617 from spidernet-io/bz/e2e/G00005
Browse files Browse the repository at this point in the history
[E2E] G00005, create `egressgateway` using empty `DefaultEIP`
  • Loading branch information
weizhoublue authored Jul 28, 2023
2 parents c6fd7fa + 4c86291 commit 0c557e5
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 156 deletions.
4 changes: 4 additions & 0 deletions test/e2e/common/egressgateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ func DeleteEgressGateway(f *framework.Framework, gateway *egressv1beta1.EgressGa
return f.DeleteResource(gateway, opts...)
}

func UpdateEgressGateway(f *framework.Framework, gateway *egressv1beta1.EgressGateway, opts ...client.UpdateOption) error {
return f.UpdateResource(gateway, opts...)
}

// DeleteEgressGatewayIfExists delete egressGateway if its exists
func DeleteEgressGatewayIfExists(f *framework.Framework, name string, duration time.Duration) error {
gateway := new(egressv1beta1.EgressGateway)
Expand Down
12 changes: 12 additions & 0 deletions test/e2e/egressgateway/egressgateway_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"

v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"

Expand All @@ -29,6 +30,7 @@ var (
err error
c client.WithWatch
allNodes []string
nodeObjs []*v1.Node
enableV4, enableV6 bool
)

Expand All @@ -38,9 +40,19 @@ var _ = BeforeSuite(func() {
f, err = framework.NewFramework(GinkgoT(), []func(scheme *runtime.Scheme) error{egressgatewayv1beta1.AddToScheme})
Expect(err).NotTo(HaveOccurred(), "failed to NewFramework, details: %w", err)
c = f.KClient

// all nodes
allNodes = f.Info.KindNodeList
Expect(allNodes).NotTo(BeEmpty())

for i, node := range allNodes {
GinkgoWriter.Printf("%dTh node: %s\n", i, node)
getNode, err := f.GetNode(node)
Expect(err).NotTo(HaveOccurred())
nodeObjs = append(nodeObjs, getNode)
}
Expect(len(nodeObjs) > 2).To(BeTrue(), "test case needs at lest 3 nodes")

enableV4, enableV6, err = common.GetIPVersion(f)
Expect(err).NotTo(HaveOccurred())
GinkgoWriter.Printf("enableV4: %v, enableV6: %v\n", enableV4, enableV6)
Expand Down
271 changes: 115 additions & 156 deletions test/e2e/egressgateway/egressgateway_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,23 @@
package egressgateway_test

import (
"errors"
"time"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"

v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/spidernet-io/egressgateway/pkg/constant"
egressv1beta1 "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1"
"github.com/spidernet-io/egressgateway/test/e2e/common"
"github.com/spidernet-io/egressgateway/test/e2e/tools"
)

var _ = Describe("egressGateway", Label("egressGateway"), func() {
var ErrNotNeed = errors.New("not need this case")
var _ = Describe("Operate egressGateway", Label("egressGateway"), func() {
var labels map[string]string
var name string
var (
Expand All @@ -31,7 +35,6 @@ var _ = Describe("egressGateway", Label("egressGateway"), func() {
//var notGatewayNodes, gatewayNodes []string

BeforeEach(func() {
//eg = new(egressv1beta1.EgressGateway)
// single Ippools
singleIpv4Pool, singleIpv6Pool = make([]string, 0), make([]string, 0)
// range Ippools
Expand Down Expand Up @@ -62,38 +65,31 @@ var _ = Describe("egressGateway", Label("egressGateway"), func() {
DeferCleanup(func() {
// delete egressgateway if its exists
Expect(common.DeleteEgressGatewayIfExists(f, name, time.Second*10)).NotTo(HaveOccurred())

// delete nodes labels1
//Expect(common.UnLabelNodes(f, allNodes, labels1)).NotTo(HaveOccurred())
})
})

DescribeTable("Failed to create egressGateway", func(checkCreateEG func() (error, bool)) {
err, need := checkCreateEG()
if need {
Expect(err).To(HaveOccurred())
}

DescribeTable("Failed to create egressGateway", func(checkCreateEG func() error) {
Expect(checkCreateEG()).To(HaveOccurred())
},
Entry("When `Ippools` is invalid", Label("G00001"), func() (error, bool) {
return common.CreateEgressGateway(f, common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: []string{invalidIPv4}, IPv6: []string{invalidIPv6}}, egressv1beta1.NodeSelector{})), true
Entry("When `Ippools` is invalid", Label("G00001"), func() error {
return common.CreateEgressGateway(f, common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: []string{invalidIPv4}, IPv6: []string{invalidIPv6}}, egressv1beta1.NodeSelector{}))
}),
// todo bzsuni
PEntry("When `NodeSelector` is empty", Label("G00002"), func() (error, bool) {
return common.CreateEgressGateway(f, common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: singleIpv4Pool, IPv6: singleIpv6Pool}, egressv1beta1.NodeSelector{})), true
PEntry("When `NodeSelector` is empty", Label("G00002"), func() error {
return common.CreateEgressGateway(f, common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: singleIpv4Pool, IPv6: singleIpv6Pool}, egressv1beta1.NodeSelector{}))
}),
Entry("When `defaultEIP` is not in `Ippools`", Label("G00003"), func() (error, bool) {
Entry("When `defaultEIP` is not in `Ippools`", Label("G00003"), func() error {
return common.CreateEgressGateway(f,
common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: singleIpv6Pool, IPv6: singleIpv6Pool, Ipv4DefaultEIP: badDefaultIPv4, Ipv6DefaultEIP: badDefaultIPv6},
egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: labelSelector})), true
egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: labelSelector}))
}),
Entry("When the number of `Ippools.IPv4` is not same with `Ippools.IPv6` in dual cluster", Label("G00004"), func() (error, bool) {
Entry("When the number of `Ippools.IPv4` is not same with `Ippools.IPv6` in dual cluster", Label("G00004"), func() error {
if enableV4 && enableV6 {
return common.CreateEgressGateway(f,
common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: singleIpv4Pool, IPv6: []string{}},
egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: labelSelector})), true
egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: labelSelector}))
}
return nil, false
return ErrNotNeed
}),
)

Expand Down Expand Up @@ -121,142 +117,105 @@ var _ = Describe("egressGateway", Label("egressGateway"), func() {
}),
)

Context("edit egressGateway", func() {
//var eg *egressv1beta1.EgressGateway
//
//BeforeEach(func() {
// // generate egressGateway yaml
// common.GenerateEgressGatewayYaml(name,egressv1beta1.Ippools{IPv4: })
// // create egressGateway
// common.CreateEgressGateway(f)
//
//})
//It("hello", Label("a"), func() {
// GinkgoWriter.Printf("a=%v\n", a)
//})
})

//DescribeTable("create egressGateway", func(createEG func() error) {
// Expect(createEG()).NotTo(HaveOccurred())
//},
// Entry("single ip in ippools", func() error {
// return common.CreateEgressGateway(f, common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{Policy: common.RANDOM, IPv4: ipv4Pool, IPv6: ipv6Pool}, egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: labelSelector}))
// }),
//)

//PDescribeTable("create egressgateway", Serial, func(getParams func() *egressGatewayFields) {
// // get params
// p := getParams()
// yaml := common.GenerateEgressGatewayYaml(p.name, p.matchLabels)
//
// if p.labelMatched {
// gatewayNodes, notGatewayNodes = labelNodes(allNodes, labels1, labels2)
// }
//
// if p.ok {
// By("G00001, create egressgateway")
// GinkgoWriter.Printf("create egressgateway %s \n", p.name)
// Expect(common.CreateEgressGateway(f, yaml)).NotTo(HaveOccurred())
// egressGatewayObj, err = common.WaitEgressGatewayUpdatedStatus(f, p.name, gatewayNodes, time.Minute)
// Expect(err).NotTo(HaveOccurred())
//
// GinkgoWriter.Printf("succeeded to create egressgateway: %v\n", egressGatewayObj.Name)
//
// if p.labelMatched == false {
// // have no matched nodes, we expect the number of gatewayNodes is zero
// Expect(gatewayNodes).To(BeEmpty())
// Expect(egressGatewayObj.Status.NodeList).To(BeEmpty())
//
// // label node, check if the egressgateway cr upgraded succeeded
// GinkgoWriter.Println("label node...")
// gatewayNodes, notGatewayNodes = labelNodes(allNodes, labels1, labels2)
//
// // wait egressgateway updated
// egressGatewayObj, err = common.WaitEgressGatewayUpdatedStatus(f, p.name, gatewayNodes, time.Minute)
// Expect(err).NotTo(HaveOccurred())
//
// // check after labeled nodes
// GinkgoWriter.Println("check after labeled node...")
// check(egressGatewayObj, gatewayNodes)
//
// } else {
// check(egressGatewayObj, gatewayNodes)
//
// // G00002: change egressgateway matchLabels, check if status of the egressgateway cr been upgraded succeeded
// By("G00002, edit egressgateway")
// GinkgoWriter.Printf("change egressgateway %s matchLabels\n", p.name)
// Expect(common.EditEgressGatewayMatchLabels(f, egressGatewayObj, labels2)).NotTo(HaveOccurred())
// egressGatewayObj, err = common.WaitEgressGatewayUpdatedMatchLabels(f, p.name, labels2, time.Second*10)
// Expect(err).NotTo(HaveOccurred())
// Expect(egressGatewayObj).NotTo(BeNil())
// GinkgoWriter.Printf("changed egressgateway: %v\n", egressGatewayObj)
//
// gatewayNodes, err = common.GetNodesByMatchLabels(f, labels2)
// Expect(err).NotTo(HaveOccurred())
// GinkgoWriter.Printf("gatewayNodes: %v\n", gatewayNodes)
//
// notGatewayNodes, err = common.GetUnmatchedNodes(f, gatewayNodes)
// Expect(err).NotTo(HaveOccurred())
// GinkgoWriter.Printf("notGatewayNodes: %v\n", notGatewayNodes)
//
// // wait egressgateway updated by given timeout
// egressGatewayObj, err = common.WaitEgressGatewayUpdatedStatus(f, p.name, gatewayNodes, time.Minute)
// Expect(err).NotTo(HaveOccurred())
// GinkgoWriter.Printf("egressgatewayObj: %v\n", egressGatewayObj)
//
// // check
// check(egressGatewayObj, gatewayNodes)
// }
//
// // G00003: delete egressgateway until finish
// Expect(common.DeleteEgressGatewayUntilFinish(f, egressGatewayObj, time.Second*20)).NotTo(HaveOccurred())
//
// } else {
// Expect(common.CreateEgressGateway(f, yaml)).To(HaveOccurred())
// }
//},
// Entry("failed to create egressGateway with name not 'default'", func() *egressGatewayFields {
// gatewayFields.name = "badname"
// return &gatewayFields
// }),
// Entry("succeeded to create egressGateway with not matched labelSelector", func() *egressGatewayFields {
// gatewayFields.ok = true
// return &gatewayFields
// }),
// Entry("succeeded to create egressGateway with matched labelSelector", func() *egressGatewayFields {
// gatewayFields.ok = true
// gatewayFields.labelMatched = true
// return &gatewayFields
// }),
//)
})

// some egressgateway fields and assertions used to verify
type egressGatewayFields struct {
name string
matchLabels map[string]string

// expect assertion result
ok, labelMatched bool
}
Context("Edit egressGateway", func() {
var eg *egressv1beta1.EgressGateway
var v4DefaultEip, v6DefaultEip string
var nodeA, nodeB *v1.Node
var nodeAName, nodeBName string
var nodeALabel, nodeBLabel *metav1.LabelSelector

BeforeEach(func() {
// node
nodeA = nodeObjs[0]
nodeB = nodeObjs[1]
nodeAName = nodeA.Name
nodeBName = nodeB.Name
nodeALabel = &metav1.LabelSelector{MatchLabels: nodeA.Labels}
nodeBLabel = &metav1.LabelSelector{MatchLabels: nodeB.Labels}
GinkgoWriter.Printf("nodeA: %s, labels: %s\n", nodeAName, common.YamlMarshal(nodeALabel))
GinkgoWriter.Printf("nodeB: %s, labels: %s\n", nodeBName, common.YamlMarshal(nodeBLabel))

// generate egressGateway yaml
GinkgoWriter.Println("GenerateEgressGatewayYaml")
eg = common.GenerateEgressGatewayYaml(name, egressv1beta1.Ippools{IPv4: rangeIpv4Pool, IPv6: rangeIpv6Pool}, egressv1beta1.NodeSelector{Policy: common.AVERAGE_SELECTION, Selector: nodeALabel})

// create egressGateway
GinkgoWriter.Println("CreateEgressGateway")
Expect(common.CreateEgressGateway(f, eg)).NotTo(HaveOccurred())

// wait `DefaultEip` updated in egressGateway status
GinkgoWriter.Println("WaitEgressGatewayDefaultEIPUpdated")
v4DefaultEip, v6DefaultEip, err = common.WaitEgressGatewayDefaultEIPUpdated(f, name, enableV4, enableV6, time.Second*10)
Expect(err).NotTo(HaveOccurred())

DeferCleanup(func() {

})
})

func labelNodes(allNodes []string, labels1, labels2 map[string]string) (gatewayNodes, notGatewayNodes []string) {
// label nodes[0]
Expect(err).NotTo(HaveOccurred())
gatewayNodes = []string{allNodes[0]}
anotherNodes := []string{allNodes[1]}
GinkgoWriter.Printf("gatewayNodes: %v\n", gatewayNodes)
Expect(common.LabelNodes(f, gatewayNodes, labels1)).NotTo(HaveOccurred())
Expect(common.LabelNodes(f, anotherNodes, labels2)).NotTo(HaveOccurred())
It("`DefaultEip` will be assigned randomly from `Ippools` when the filed is empty", Label("G00005"), func() {
if enableV4 {
GinkgoWriter.Printf("Check DefaultEip %s if within range %v\n", v4DefaultEip, rangeIpv4Pool)
included, err := common.CheckIPIncluded(constant.IPv4, v4DefaultEip, rangeIpv4Pool)
Expect(err).NotTo(HaveOccurred())
Expect(included).To(BeTrue())
}
if enableV6 {
GinkgoWriter.Printf("Check DefaultEip %s if within range %v\n", v6DefaultEip, rangeIpv6Pool)
included, err := common.CheckIPIncluded(constant.IPv6, v6DefaultEip, rangeIpv6Pool)
Expect(err).NotTo(HaveOccurred())
Expect(included).To(BeTrue())
}
})

notGatewayNodes, err = common.GetUnmatchedNodes(f, gatewayNodes)
GinkgoWriter.Printf("notGatewayNodes: %v\n", notGatewayNodes)
Expect(err).NotTo(HaveOccurred())
return
}
DescribeTable("Test update egressGateway", func(expected bool, updateEG func() error) {
// if not expected, error occurred
if !expected {
Expect(updateEG()).To(HaveOccurred())
} else {
// if expected, error not occurred
Expect(updateEG()).NotTo(HaveOccurred())
}
},
Entry("Failed when add invalid `IP` to `Ippools`", Label("G00009"), false, func() error {
Expect(common.GetEgressGateway(f, name, eg)).NotTo(HaveOccurred())
if enableV4 {
eg.Spec.Ippools.IPv4 = append(eg.Spec.Ippools.IPv4, invalidIPv4)
}
if enableV6 {
eg.Spec.Ippools.IPv6 = append(eg.Spec.Ippools.IPv6, invalidIPv6)
}
return common.UpdateEgressGateway(f, eg)
}),
Entry("Succeeded when add valid `IP` to `Ippools`", Label("G00012", "G00013"), true, func() error {
Expect(common.GetEgressGateway(f, name, eg)).NotTo(HaveOccurred())
if enableV4 {
eg.Spec.Ippools.IPv4 = append(eg.Spec.Ippools.IPv4, singleIpv4Pool...)
}
if enableV6 {
eg.Spec.Ippools.IPv6 = append(eg.Spec.Ippools.IPv6, singleIpv6Pool...)
}
return common.UpdateEgressGateway(f, eg)
}),
Entry("Failed when delete `IP` that being used", Label("G00010"), false, func() error {
Expect(common.GetEgressGateway(f, name, eg)).NotTo(HaveOccurred())
if enableV4 {
eg.Spec.Ippools.IPv4 = tools.RemoveValueFromSlice(eg.Spec.Ippools.IPv4, v4DefaultEip)
}
if enableV6 {
eg.Spec.Ippools.IPv6 = tools.RemoveValueFromSlice(eg.Spec.Ippools.IPv6, v6DefaultEip)
}
return common.UpdateEgressGateway(f, eg)
}),
Entry("Failed when add different number of ip to `Ippools.IPv4` and `Ippools.IPv6`", Label("G00011"), false, func() error {
Expect(common.GetEgressGateway(f, name, eg)).NotTo(HaveOccurred())
if enableV4 && enableV6 {
eg.Spec.Ippools.IPv4 = append(eg.Spec.Ippools.IPv4, singleIpv4Pool...)
return common.UpdateEgressGateway(f, eg)
}
return ErrNotNeed
}),
)
})

//func check(egressGateway *egressv1beta1.EgressGateway, gatewayNodes []string) {
// // check egressgateway status.nodelist
// GinkgoWriter.Printf("egressGatewayObj.Status.NodeList: %v\n", egressGateway.Status.NodeList)
// common.CheckEgressGatewayNodeList(f, egressGateway, gatewayNodes)
//}
})
15 changes: 15 additions & 0 deletions test/e2e/tools/tools.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,18 @@ func GetContainerIPV6(container string, duration time.Duration) ([]byte, error)
a := fmt.Sprintf("docker inspect %s | grep -w GlobalIPv6Address | sed 1d | awk '{print $2}' | tr -d '\",' | tr -d '\n'", container)
return ExecCommand(a, duration)
}

func RemoveValueFromSlice[T string | int](slice []T, value T) []T {
ss := make([]T, 0)
index := -1
for i, v := range ss {
if v == value {
index = i
break
}
}
if index != -1 {
ss = append(slice[:index], slice[index+1:]...)
}
return ss
}

0 comments on commit 0c557e5

Please sign in to comment.