Skip to content

Commit

Permalink
Merge 0011cb8 into 2acd70b
Browse files Browse the repository at this point in the history
  • Loading branch information
Dyanngg authored Mar 24, 2022
2 parents 2acd70b + 0011cb8 commit 33af3b3
Show file tree
Hide file tree
Showing 32 changed files with 706 additions and 797 deletions.
3 changes: 2 additions & 1 deletion ci/jenkins/test-mc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,12 @@ function deliver_multicluster_controller {
leader_ip=$(kubectl get nodes -o wide --no-headers=true ${LEADER_CLUSTER_CONFIG} | awk -v role="$CONTROL_PLANE_NODE_ROLE" '$3 == role {print $6}')
sed -i "s|<LEADER_CLUSTER_IP>|${leader_ip}|" ./multicluster/test/yamls/east-member-cluster.yml
sed -i "s|<LEADER_CLUSTER_IP>|${leader_ip}|" ./multicluster/test/yamls/west-member-cluster.yml
rsync -avr --progress --inplace -e "ssh -o StrictHostKeyChecking=no" ./multicluster/test/yamls/test-acnp-copy-span-ns-isolation.yml jenkins@["${leader_ip}"]:"${WORKDIR}"/test-acnp-copy-span-ns-isolation.yml

for kubeconfig in "${membercluter_kubeconfigs[@]}"
do
ip=$(kubectl get nodes -o wide --no-headers=true ${EAST_CLUSTER_CONFIG} | awk -v role="$CONTROL_PLANE_NODE_ROLE" '$3 == role {print $6}')
rsync -avr --progress --inplace -e "ssh -o StrictHostKeyChecking=no" ./multicluster/test/yamls/test-east-serviceexport.yml jenkins@[${ip}]:${WORKDIR}/serviceexport.yml
rsync -avr --progress --inplace -e "ssh -o StrictHostKeyChecking=no" ./multicluster/test/yamls/test-east-serviceexport.yml jenkins@["${ip}"]:"${WORKDIR}"/serviceexport.yml
done
}

Expand Down
167 changes: 167 additions & 0 deletions multicluster/test/e2e/antreapolicy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
// Copyright 2022 Antrea Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package e2e

import (
"fmt"
"testing"
"time"

log "github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"

antreae2e "antrea.io/antrea/test/e2e"
)

const (
// Provide enough time for policies to be enforced & deleted by the CNI plugin.
networkPolicyDelay = 2 * time.Second
acnpIsolationResourceExport = "test-acnp-copy-span-ns-isolation.yml"
acnpName = "antrea-mc-strict-namespace-isolation"
)

var (
allPodsPerCluster []antreae2e.Pod
perNamespacePods, perClusterNamespaces []string
podsByNamespace map[string][]antreae2e.Pod
clusterK8sUtilsMap map[string]*antreae2e.KubernetesUtils
)

func failOnError(err error, t *testing.T) {
if err != nil {
log.Errorf("%+v", err)
for _, k8sUtils := range clusterK8sUtilsMap {
k8sUtils.Cleanup(perClusterNamespaces)
}
t.Fatalf("test failed: %v", err)
}
}

// initializeForPolicyTest creates three Pods in three test Namespaces for each test cluster.
func initializeForPolicyTest(t *testing.T, data *MCTestData) {
perNamespacePods = []string{"a", "b", "c"}
perClusterNamespaces = []string{"x", "y", "z"}

allPodsPerCluster = []antreae2e.Pod{}
podsByNamespace = make(map[string][]antreae2e.Pod)
clusterK8sUtilsMap = make(map[string]*antreae2e.KubernetesUtils)

for _, podName := range perNamespacePods {
for _, ns := range perClusterNamespaces {
allPodsPerCluster = append(allPodsPerCluster, antreae2e.NewPod(ns, podName))
podsByNamespace[ns] = append(podsByNamespace[ns], antreae2e.NewPod(ns, podName))
}
}
for clusterName := range data.clusterTestDataMap {
d := data.clusterTestDataMap[clusterName]
k8sUtils, err := antreae2e.NewKubernetesUtils(&d)
failOnError(err, t)
_, err = k8sUtils.Bootstrap(perClusterNamespaces, perNamespacePods)
failOnError(err, t)
clusterK8sUtilsMap[clusterName] = k8sUtils
}
}

// tearDownForPolicyTest deletes the test Namespaces specific for policy tests.
func tearDownForPolicyTest() {
for _, k8sUtils := range clusterK8sUtilsMap {
k8sUtils.Cleanup(perClusterNamespaces)
}
}

func testMCAntreaPolicy(t *testing.T, data *MCTestData) {
data.testAntreaPolicyCopySpanNSIsolation(t)
}

// testAntreaPolicyCopySpanNSIsolation tests that after applying a ResourceExport of an ACNP
// for Namespace isolation, strict Namespace isolation is enforced in each of the member clusters.
func (data *MCTestData) testAntreaPolicyCopySpanNSIsolation(t *testing.T) {
setup := func() {
err := data.deployACNPResourceExport(acnpIsolationResourceExport)
failOnError(err, t)
}
teardown := func() {
err := data.deleteACNPResourceExport(acnpIsolationResourceExport)
failOnError(err, t)
}
reachability := antreae2e.NewReachability(allPodsPerCluster, antreae2e.Dropped)
reachability.ExpectAllSelfNamespace(antreae2e.Connected)
testStep := &antreae2e.TestStep{
Name: "Port 80",
Reachability: reachability,
Ports: []int32{80},
Protocol: v1.ProtocolTCP,
}
testCaseList := []*antreae2e.TestCase{
{
Name: "ACNP strict Namespace isolation for all clusters",
Steps: []*antreae2e.TestStep{testStep},
},
}
executeTestsOnAllMemberClusters(t, testCaseList, setup, teardown)
}

func executeTestsOnAllMemberClusters(t *testing.T, testList []*antreae2e.TestCase, setup, teardown func()) {
setup()
time.Sleep(networkPolicyDelay)
for _, testCase := range testList {
log.Infof("Running test case %s", testCase.Name)
for _, step := range testCase.Steps {
log.Infof("Running step %s of test case %s", step.Name, testCase.Name)
reachability := step.Reachability
if reachability != nil {
for clusterName, k8sUtils := range clusterK8sUtilsMap {
if clusterName == leaderCluster {
// skip traffic test for the leader cluster
continue
}
if _, err := k8sUtils.GetACNP(acnpName); err != nil {
t.Errorf("Failed to get ACNP to be replicated in cluster %s", clusterName)
}
start := time.Now()
k8sUtils.Validate(allPodsPerCluster, reachability, step.Ports, step.Protocol)
step.Duration = time.Now().Sub(start)
_, wrong, _ := step.Reachability.Summary()
if wrong != 0 {
t.Errorf("Failure in cluster %s -- %d wrong results", clusterName, wrong)
reachability.PrintSummary(true, true, true)
}
}
}
}
}
teardown()
}

func (data *MCTestData) deployACNPResourceExport(reFileName string) error {
var rc int
var err error
log.Infof("Creating ResourceExport %s in the leader cluster", reFileName)
rc, _, _, err = provider.RunCommandOnNode(leaderCluster, fmt.Sprintf("kubectl apply -f %s", reFileName))
if err != nil || rc != 0 {
return fmt.Errorf("error when deploying the ACNP ResourceExport in leader cluster: %v", err)
}
return nil
}

func (data *MCTestData) deleteACNPResourceExport(reFileName string) error {
var rc int
var err error
rc, _, _, err = provider.RunCommandOnNode(leaderCluster, fmt.Sprintf("kubectl delete -f %s", reFileName))
if err != nil || rc != 0 {
return fmt.Errorf("error when deleting the ACNP ResourceExport in leader cluster: %v", err)
}
return nil
}
16 changes: 8 additions & 8 deletions multicluster/test/e2e/fixtures.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2021 Antrea Authors
// Copyright 2022 Antrea Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -26,7 +26,7 @@ func createDirectory(path string) error {
return os.Mkdir(path, 0700)
}

func (data *TestData) setupLogDirectoryForTest(testName string) error {
func (data *MCTestData) setupLogDirectoryForTest(testName string) error {
path := filepath.Join(testOptions.logsExportDir, testName)
// remove directory if it already exists. This ensures that we start with an empty
// directory
Expand All @@ -39,7 +39,7 @@ func (data *TestData) setupLogDirectoryForTest(testName string) error {
return nil
}

func setupTest(tb testing.TB) (*TestData, error) {
func setupTest(tb testing.TB) (*MCTestData, error) {
if err := testData.setupLogDirectoryForTest(tb.Name()); err != nil {
tb.Errorf("Error creating logs directory '%s': %v", testData.logsDirForTestCase, err)
return nil, err
Expand All @@ -51,21 +51,21 @@ func setupTest(tb testing.TB) (*TestData, error) {
}
}()
tb.Logf("Creating '%s' K8s Namespace", multiClusterTestNamespace)
if err := testData.createTestNamespace(); err != nil {
if err := testData.createTestNamespaces(); err != nil {
return nil, err
}

success = true
return testData, nil
}

func teardownTest(tb testing.TB, data *TestData) {
func teardownTest(tb testing.TB, data *MCTestData) {
if empty, _ := IsDirEmpty(data.logsDirForTestCase); empty {
_ = os.Remove(data.logsDirForTestCase)
}
}

func createPodWrapper(tb testing.TB, data *TestData, cluster string, namespace string, name string, image string, ctr string, command []string,
func createPodWrapper(tb testing.TB, data *MCTestData, cluster string, namespace string, name string, image string, ctr string, command []string,
args []string, env []corev1.EnvVar, ports []corev1.ContainerPort, hostNetwork bool, mutateFunc func(pod *corev1.Pod)) error {
tb.Logf("Creating Pod '%s'", name)
if err := data.createPod(cluster, name, namespace, ctr, image, command, args, env, ports, hostNetwork, mutateFunc); err != nil {
Expand All @@ -79,14 +79,14 @@ func createPodWrapper(tb testing.TB, data *TestData, cluster string, namespace s
return err
}

func deletePodWrapper(tb testing.TB, data *TestData, clusterName string, namespace string, name string) {
func deletePodWrapper(tb testing.TB, data *MCTestData, clusterName string, namespace string, name string) {
tb.Logf("Deleting Pod '%s'", name)
if err := data.deletePod(clusterName, namespace, name); err != nil {
tb.Logf("Error when deleting Pod: %v", err)
}
}

func deleteServiceWrapper(tb testing.TB, data *TestData, clusterName string, namespace string, name string) {
func deleteServiceWrapper(tb testing.TB, data *MCTestData, clusterName string, namespace string, name string) {
tb.Logf("Deleting Service '%s'", name)
if err := data.deleteService(clusterName, namespace, name); err != nil {
tb.Logf("Error when deleting Service: %v", err)
Expand Down
Loading

0 comments on commit 33af3b3

Please sign in to comment.