Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release-4.18] OCPBUGS-48389: only provision workloads when network creation has started #29413

Open
wants to merge 6 commits into
base: release-4.18
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
ovn-k: extract ovnkubePodInfo per node to a func
This way, we can re-use this logic in other places without duplicating
code

Signed-off-by: Miguel Duarte Barroso <mdbarroso@redhat.com>
  • Loading branch information
maiqueb authored and openshift-cherrypick-robot committed Jan 9, 2025
commit 3a54873aedda9c1e209475de94189f4d9eadfbd6
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
50 changes: 4 additions & 46 deletions test/extended/networking/livemigration.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package networking

import (
"bufio"
"context"
"encoding/json"
"fmt"
"net"
"regexp"
"strings"
"time"

Expand Down Expand Up @@ -482,57 +480,17 @@ func checkEastWestTraffic(virtClient *kubevirt.Client, vmiName string, podIPsByN
}

func isNetworkProvisioned(oc *exutil.CLI, nodeName string, networkName string) (bool, error) {
var podName string
var out string
var err error

out, err = runOcWithRetry(oc.AsAdmin(), "get",
"pods",
"-o", "name",
"-n", "openshift-ovn-kubernetes",
"--field-selector", fmt.Sprintf("spec.nodeName=%s", nodeName),
"-l", "app=ovnkube-node")
ovnkubePodInfo, err := ovnkubePod(oc, nodeName)
if err != nil {
return false, err
}
outReader := bufio.NewScanner(strings.NewReader(out))
re := regexp.MustCompile("^pod/(.*)")
for outReader.Scan() {
match := re.FindSubmatch([]byte(outReader.Text()))
if len(match) != 2 {
continue
}
podName = string(match[1])
break
}
if podName == "" {
return false, 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 false, fmt.Errorf("couldn't get %s pod in openshift-ovn-kubernetes namespace: %v", podName, err)
}

ovnkubeContainerName := ""
for _, container := range ovnkubePod.Spec.Containers {
if container.Name == "ovnkube-node" {
ovnkubeContainerName = container.Name
} else if container.Name == "ovnkube-controller" {
ovnkubeContainerName = container.Name
}
}
if ovnkubeContainerName == "" {
return false, fmt.Errorf("didn't find ovnkube-node or ovnkube-controller container in %s pod", podName)
}

lsName := logicalSwitchName(networkName)
out, err = adminExecInPod(
out, err := adminExecInPod(
oc,
"openshift-ovn-kubernetes",
podName,
ovnkubeContainerName,
ovnkubePodInfo.podName,
ovnkubePodInfo.containerName,
fmt.Sprintf("ovn-nbctl list logical-switch %s", lsName),
)
if err != nil {
Expand Down