Skip to content

Commit 16bf604

Browse files
author
sivakami
committed
update pod create and delete logic.
1 parent 2cc528b commit 16bf604

File tree

3 files changed

+155
-79
lines changed

3 files changed

+155
-79
lines changed

.pipelines/swiftv2-long-running/scripts/create_vnets.sh

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,22 @@ create_vnet_subets() {
7272
delegate_subnet() {
7373
local vnet="$1"
7474
local subnet="$2"
75-
local max_attempts=3
75+
local max_attempts=7
7676
local attempt=1
7777

7878
echo "==> Delegating subnet: $subnet in VNet: $vnet to Subnet Delegator"
7979
subnet_id=$(az network vnet subnet show -g "$RG" --vnet-name "$vnet" -n "$subnet" --query id -o tsv)
8080
modified_custsubnet="${subnet_id//\//%2F}"
81-
cmd_subnetdelegator_curl="'curl -X PUT \"http://localhost:8080/DelegatedSubnet/$modified_custsubnet\"'"
82-
cmd_subnetdelegator_az="az containerapp exec -n subnetdelegator-westus-u3h4j -g subnetdelegator-westus --subscription 9b8218f9-902a-4d20-a65c-e98acec5362f --command $cmd_subnetdelegator_curl"
8381

8482
while [ $attempt -le $max_attempts ]; do
8583
echo "Attempt $attempt of $max_attempts..."
86-
response=$(eval "$cmd_subnetdelegator_az")
84+
85+
# Use az containerapp exec with --command properly formatted for non-interactive execution
86+
response=$(az containerapp exec \
87+
-n subnetdelegator-westus-u3h4j \
88+
-g subnetdelegator-westus \
89+
--subscription 9b8218f9-902a-4d20-a65c-e98acec5362f \
90+
--command "curl -X PUT http://localhost:8080/DelegatedSubnet/$modified_custsubnet" 2>&1 || echo "EXEC_FAILED")
8791

8892
if [[ $response == *"success"* ]]; then
8993
echo "Subnet Delegator successfully registered the subnet"

test/integration/swiftv2/longRunningCluster/datapath.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"os/exec"
77
"text/template"
8+
9+
"github.com/Azure/azure-container-networking/test/integration/swiftv2/helpers"
810
)
911

1012
func applyTemplate(templatePath string, data interface{}, kubeconfig string) error {
@@ -75,3 +77,115 @@ type PodData struct {
7577
func CreatePod(kubeconfig string, data PodData, templatePath string) error {
7678
return applyTemplate(templatePath, data, kubeconfig)
7779
}
80+
81+
// -------------------------
82+
// High-level orchestration
83+
// -------------------------
84+
85+
// TestResources holds all the configuration needed for creating test resources
86+
type TestResources struct {
87+
Kubeconfig string
88+
PNName string
89+
PNIName string
90+
VnetGUID string
91+
SubnetGUID string
92+
SubnetARMID string
93+
SubnetToken string
94+
PodNetworkTemplate string
95+
PNITemplate string
96+
PodTemplate string
97+
PodImage string
98+
}
99+
100+
// CreateTestResources creates PodNetwork, PodNetworkInstance, namespace, and Pods
101+
func CreateTestResources(resources TestResources) error {
102+
// Step 1: Create PodNetwork
103+
err := CreatePodNetwork(resources.Kubeconfig, PodNetworkData{
104+
PNName: resources.PNName,
105+
VnetGUID: resources.VnetGUID,
106+
SubnetGUID: resources.SubnetGUID,
107+
SubnetARMID: resources.SubnetARMID,
108+
SubnetToken: resources.SubnetToken,
109+
}, resources.PodNetworkTemplate)
110+
if err != nil {
111+
return fmt.Errorf("failed to create PodNetwork: %w", err)
112+
}
113+
114+
// Step 2: Create namespace
115+
err = helpers.EnsureNamespaceExists(resources.Kubeconfig, resources.PNName)
116+
if err != nil {
117+
return fmt.Errorf("failed to create namespace: %w", err)
118+
}
119+
120+
// Step 3: Create PodNetworkInstance
121+
err = CreatePodNetworkInstance(resources.Kubeconfig, PNIData{
122+
PNIName: resources.PNIName,
123+
PNName: resources.PNName,
124+
Namespace: resources.PNName,
125+
Type: "explicit",
126+
Reservations: 2,
127+
}, resources.PNITemplate)
128+
if err != nil {
129+
return fmt.Errorf("failed to create PodNetworkInstance: %w", err)
130+
}
131+
132+
// Step 4: Get cluster nodes and create pods
133+
nodes, err := helpers.GetClusterNodes(resources.Kubeconfig)
134+
if err != nil {
135+
return fmt.Errorf("failed to get cluster nodes: %w", err)
136+
}
137+
if len(nodes) < 2 {
138+
return fmt.Errorf("need at least 2 nodes, found %d", len(nodes))
139+
}
140+
141+
// Create pods on first two nodes
142+
for i, node := range nodes[:2] {
143+
podName := fmt.Sprintf("pod-c2-%d", i)
144+
err := CreatePod(resources.Kubeconfig, PodData{
145+
PodName: podName,
146+
NodeName: node,
147+
OS: "linux",
148+
PNName: resources.PNName,
149+
PNIName: resources.PNIName,
150+
Namespace: resources.PNName,
151+
Image: resources.PodImage,
152+
}, resources.PodTemplate)
153+
if err != nil {
154+
return fmt.Errorf("failed to create pod %s: %w", podName, err)
155+
}
156+
}
157+
158+
return nil
159+
}
160+
161+
// DeleteTestResources deletes all test resources in reverse order
162+
func DeleteTestResources(kubeconfig, pnName, pniName string) error {
163+
// Delete pods (first two nodes only, matching creation)
164+
for i := 0; i < 2; i++ {
165+
podName := fmt.Sprintf("pod-c2-%d", i)
166+
err := helpers.DeletePod(kubeconfig, pnName, podName)
167+
if err != nil {
168+
return fmt.Errorf("failed to delete pod %s: %w", podName, err)
169+
}
170+
}
171+
172+
// Delete PodNetworkInstance
173+
err := helpers.DeletePodNetworkInstance(kubeconfig, pnName, pniName)
174+
if err != nil {
175+
return fmt.Errorf("failed to delete PodNetworkInstance: %w", err)
176+
}
177+
178+
// Delete PodNetwork
179+
err = helpers.DeletePodNetwork(kubeconfig, pnName)
180+
if err != nil {
181+
return fmt.Errorf("failed to delete PodNetwork: %w", err)
182+
}
183+
184+
// Delete namespace
185+
err = helpers.DeleteNamespace(kubeconfig, pnName)
186+
if err != nil {
187+
return fmt.Errorf("failed to delete namespace: %w", err)
188+
}
189+
190+
return nil
191+
}

test/integration/swiftv2/longRunningCluster/datapath_test.go

Lines changed: 33 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -39,97 +39,55 @@ var _ = ginkgo.Describe("Datapath Tests", func() {
3939

4040
// Get subnet information once (doesn't change between iterations)
4141
vnetGUID, err := helpers.GetVnetGUID(rg, vnetName)
42-
gomega.Expect(err).To(gomega.BeNil())
42+
gomega.Expect(err).To(gomega.BeNil(), "Failed to get VNet GUID")
43+
4344
subnetGUID, err := helpers.GetSubnetGUID(rg, vnetName, subnetName)
44-
gomega.Expect(err).To(gomega.BeNil())
45+
gomega.Expect(err).To(gomega.BeNil(), "Failed to get Subnet GUID")
46+
4547
subnetARMID, err := helpers.GetSubnetARMID(rg, vnetName, subnetName)
46-
gomega.Expect(err).To(gomega.BeNil())
48+
gomega.Expect(err).To(gomega.BeNil(), "Failed to get Subnet ARM ID")
49+
4750
subnetToken, err := helpers.GetSubnetToken(rg, vnetName, subnetName)
48-
gomega.Expect(err).To(gomega.BeNil())
51+
gomega.Expect(err).To(gomega.BeNil(), "Failed to get Subnet Token")
52+
53+
// Configure test resources
54+
resources := TestResources{
55+
Kubeconfig: kubeconfig2,
56+
PNName: pnName,
57+
PNIName: pniName,
58+
VnetGUID: vnetGUID,
59+
SubnetGUID: subnetGUID,
60+
SubnetARMID: subnetARMID,
61+
SubnetToken: subnetToken,
62+
PodNetworkTemplate: "../../manifests/swiftv2/long-running-cluster/podnetwork.yaml",
63+
PNITemplate: "../../manifests/swiftv2/long-running-cluster/podnetworkinstance.yaml",
64+
PodTemplate: "../../manifests/swiftv2/long-running-cluster/pod.yaml",
65+
PodImage: "weibeld/ubuntu-networking",
66+
}
4967

5068
// Run indefinitely until test is cancelled
5169
iteration := 0
5270
for {
5371
iteration++
5472
ginkgo.By(fmt.Sprintf("Starting iteration %d at %s", iteration, time.Now().Format(time.RFC3339)))
5573

56-
// Step 1: Create PodNetwork
57-
ginkgo.By(fmt.Sprintf("Creating PodNetwork %s", pnName))
58-
err := CreatePodNetwork(kubeconfig2, PodNetworkData{
59-
PNName: pnName,
60-
VnetGUID: vnetGUID,
61-
SubnetGUID: subnetGUID,
62-
SubnetARMID: subnetARMID,
63-
SubnetToken: subnetToken,
64-
}, "../../manifests/swiftv2/long-running-cluster/podnetwork.yaml")
65-
gomega.Expect(err).To(gomega.BeNil())
66-
67-
// Step 2: Create namespace and PodNetworkInstance
68-
ginkgo.By(fmt.Sprintf("Creating namespace %s", pnName))
69-
err = helpers.EnsureNamespaceExists(kubeconfig2, pnName)
70-
gomega.Expect(err).To(gomega.BeNil())
71-
72-
ginkgo.By(fmt.Sprintf("Creating PodNetworkInstance %s", pniName))
73-
err = CreatePodNetworkInstance(kubeconfig2, PNIData{
74-
PNIName: pniName,
75-
PNName: pnName,
76-
Namespace: pnName,
77-
Type: "explicit",
78-
Reservations: 2,
79-
}, "../../manifests/swiftv2/long-running-cluster/podnetworkinstance.yaml")
80-
gomega.Expect(err).To(gomega.BeNil())
81-
82-
// Step 3: Create pods on first two nodes
83-
ginkgo.By("Getting cluster nodes")
84-
nodes, err := helpers.GetClusterNodes(kubeconfig2)
85-
gomega.Expect(err).To(gomega.BeNil())
86-
gomega.Expect(len(nodes)).To(gomega.BeNumerically(">=", 2), "Need at least 2 nodes")
87-
88-
podNames := []string{}
89-
for i, node := range nodes[:2] {
90-
podName := fmt.Sprintf("pod-c2-%d", i)
91-
podNames = append(podNames, podName)
92-
93-
ginkgo.By(fmt.Sprintf("Creating pod %s on node %s", podName, node))
94-
err := CreatePod(kubeconfig2, PodData{
95-
PodName: podName,
96-
NodeName: node,
97-
OS: "linux",
98-
PNName: pnName,
99-
PNIName: pniName,
100-
Namespace: pnName,
101-
Image: "weibeld/ubuntu-networking",
102-
}, "../../manifests/swiftv2/long-running-cluster/pod.yaml")
103-
gomega.Expect(err).To(gomega.BeNil())
104-
}
105-
106-
// Step 4: Wait for 5 minutes
74+
// Create all resources
75+
ginkgo.By("Creating test resources (PodNetwork, PodNetworkInstance, and Pods)")
76+
err := CreateTestResources(resources)
77+
gomega.Expect(err).To(gomega.BeNil(), "Failed to create test resources")
78+
79+
// Wait for 5 minutes
10780
ginkgo.By("Waiting for 5 minutes before deletion")
10881
time.Sleep(5 * time.Minute)
10982

110-
// Step 5: Delete resources in reverse order
111-
ginkgo.By("Deleting pods")
112-
for _, podName := range podNames {
113-
ginkgo.By(fmt.Sprintf("Deleting pod %s", podName))
114-
err := helpers.DeletePod(kubeconfig2, pnName, podName)
115-
gomega.Expect(err).To(gomega.BeNil())
116-
}
117-
118-
ginkgo.By(fmt.Sprintf("Deleting PodNetworkInstance %s", pniName))
119-
err = helpers.DeletePodNetworkInstance(kubeconfig2, pnName, pniName)
120-
gomega.Expect(err).To(gomega.BeNil())
121-
122-
ginkgo.By(fmt.Sprintf("Deleting PodNetwork %s", pnName))
123-
err = helpers.DeletePodNetwork(kubeconfig2, pnName)
124-
gomega.Expect(err).To(gomega.BeNil())
125-
126-
ginkgo.By(fmt.Sprintf("Deleting namespace %s", pnName))
127-
err = helpers.DeleteNamespace(kubeconfig2, pnName)
128-
gomega.Expect(err).To(gomega.BeNil())
83+
// Delete all resources
84+
ginkgo.By("Deleting test resources")
85+
err = DeleteTestResources(kubeconfig2, pnName, pniName)
86+
gomega.Expect(err).To(gomega.BeNil(), "Failed to delete test resources")
12987

13088
ginkgo.By(fmt.Sprintf("Completed iteration %d at %s", iteration, time.Now().Format(time.RFC3339)))
13189

132-
// Step 6: Wait for 30 minutes before next iteration
90+
// Wait for 30 minutes before next iteration
13391
ginkgo.By("Waiting for 30 minutes before next iteration")
13492
time.Sleep(30 * time.Minute)
13593
}

0 commit comments

Comments
 (0)