Skip to content

Commit

Permalink
Backport UDN tests into 4.18
Browse files Browse the repository at this point in the history
Signed-off-by: Surya Seetharaman <[email protected]>
  • Loading branch information
tssurya committed Jan 24, 2025
1 parent 0fd2e36 commit 8edd18e
Show file tree
Hide file tree
Showing 6 changed files with 1,628 additions and 244 deletions.
106 changes: 68 additions & 38 deletions test/extended/networking/egressip_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,68 @@ func findDefaultInterfaceForOpenShiftSDN(oc *exutil.CLI, nodeName string) (strin
return defaultRoutes[0].Dev, nil
}

type ovnKubePodInfo struct {
podName string
containerName string
}

// findBridgePhysicalInterface returns the name of the physical interface that belogs to <bridgeName> on node <nodeName>.
func findBridgePhysicalInterface(oc *exutil.CLI, nodeName, bridgeName string) (string, error) {
ovnkubePodInfo, err := ovnkubePod(oc, nodeName)
if err != nil {
return "", err
}

out, err := adminExecInPod(
oc,
"openshift-ovn-kubernetes",
ovnkubePodInfo.podName,
ovnkubePodInfo.containerName,
fmt.Sprintf("ovs-vsctl list-ports %s", bridgeName),
)
if err != nil {
return "", fmt.Errorf("failed to get list of ports on bridge %s:, error: %v",
bridgeName, err)
}
for _, port := range strings.Split(out, "\n") {
out, err = adminExecInPod(
oc,
"openshift-ovn-kubernetes",
ovnkubePodInfo.podName,
ovnkubePodInfo.containerName,
fmt.Sprintf("ovs-vsctl get Port %s Interfaces", port),
)
if err != nil {
return "", fmt.Errorf("failed to get port %s on bridge %s: error: %v",
bridgeName, port, err)

}
// remove brackets on list of interfaces
ifaces := strings.TrimPrefix(strings.TrimSuffix(out, "]"), "[")
for _, iface := range strings.Split(ifaces, ",") {
out, err = adminExecInPod(
oc,
"openshift-ovn-kubernetes",
ovnkubePodInfo.podName,
ovnkubePodInfo.containerName,
fmt.Sprintf("ovs-vsctl get Interface %s Type", strings.TrimSpace(iface)),
)
if err != nil {
return "", fmt.Errorf("failed to get Interface %q Type on bridge %q:, error: %v",
iface, bridgeName, err)

}
// If system Type we know this is the OVS port is the NIC
if out == "system" {
return port, nil
}
}
}
return "", fmt.Errorf("Could not find a physical interface connected to bridge %s on node %s (pod %s)",
bridgeName, nodeName, ovnkubePodInfo.podName)
}

func ovnkubePod(oc *exutil.CLI, nodeName string) (ovnKubePodInfo, error) {
var podName string
var out string
var err error
Expand All @@ -268,7 +328,7 @@ func findBridgePhysicalInterface(oc *exutil.CLI, nodeName, bridgeName string) (s
"--field-selector", fmt.Sprintf("spec.nodeName=%s", nodeName),
"-l", "app=ovnkube-node")
if err != nil {
return "", err
return ovnKubePodInfo{}, err
}
outReader := bufio.NewScanner(strings.NewReader(out))
re := regexp.MustCompile("^pod/(.*)")
Expand All @@ -281,13 +341,13 @@ func findBridgePhysicalInterface(oc *exutil.CLI, nodeName, bridgeName string) (s
break
}
if podName == "" {
return "", fmt.Errorf("Could not find a valid ovnkube-node pod on node '%s'", nodeName)
return ovnKubePodInfo{}, fmt.Errorf("Could not find a valid ovnkube-node pod on node '%s'", nodeName)
}

ovnkubePod, err := oc.AdminKubeClient().CoreV1().Pods("openshift-ovn-kubernetes").Get(context.Background(),
podName, metav1.GetOptions{})
if err != nil {
return "", fmt.Errorf("couldn't get %s pod in openshift-ovn-kubernetes namespace: %v", podName, err)
return ovnKubePodInfo{}, fmt.Errorf("couldn't get %s pod in openshift-ovn-kubernetes namespace: %v", podName, err)
}

ovnkubeContainerName := ""
Expand All @@ -299,42 +359,12 @@ func findBridgePhysicalInterface(oc *exutil.CLI, nodeName, bridgeName string) (s
}
}
if ovnkubeContainerName == "" {
return "", fmt.Errorf("didn't find ovnkube-node or ovnkube-controller container in %s pod", podName)
}

out, err = adminExecInPod(oc, "openshift-ovn-kubernetes", podName, ovnkubeContainerName, fmt.Sprintf("ovs-vsctl list-ports %s", bridgeName))
if err != nil {
return "", fmt.Errorf("failed to get list of ports on bridge %s:, error: %v",
bridgeName, err)
}
for _, port := range strings.Split(out, "\n") {
out, err = adminExecInPod(
oc, "openshift-ovn-kubernetes", podName, ovnkubeContainerName,
fmt.Sprintf("ovs-vsctl get Port %s Interfaces", port))
if err != nil {
return "", fmt.Errorf("failed to get port %s on bridge %s: error: %v",
bridgeName, port, err)

}
// remove brackets on list of interfaces
ifaces := strings.TrimPrefix(strings.TrimSuffix(out, "]"), "[")
for _, iface := range strings.Split(ifaces, ",") {
out, err = adminExecInPod(
oc, "openshift-ovn-kubernetes", podName, ovnkubeContainerName,
fmt.Sprintf("ovs-vsctl get Interface %s Type", strings.TrimSpace(iface)))
if err != nil {
return "", fmt.Errorf("failed to get Interface %q Type on bridge %q:, error: %v",
iface, bridgeName, err)

}
// If system Type we know this is the OVS port is the NIC
if out == "system" {
return port, nil
}
}
return ovnKubePodInfo{}, fmt.Errorf("didn't find ovnkube-node or ovnkube-controller container in %s pod", podName)
}
return "", fmt.Errorf("Could not find a physical interface connected to bridge %s on node %s (pod %s)",
bridgeName, nodeName, podName)
return ovnKubePodInfo{
podName: podName,
containerName: ovnkubeContainerName,
}, nil
}

// adminExecInPod runs a command as admin in the provides pod inside the provided namespace.
Expand Down
Loading

0 comments on commit 8edd18e

Please sign in to comment.