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

fix bug: dpdk场景下添加删除ProviderNetwork失败 #4466

Merged
merged 6 commits into from
Sep 6, 2024
Merged
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
68 changes: 38 additions & 30 deletions pkg/daemon/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,42 +159,50 @@ func (c *Controller) ovsCleanProviderNetwork(provider string) error {
return nil
}

// get host nic
if output, err = ovs.Exec("list-ports", brName); err != nil {
return fmt.Errorf("failed to list ports of OVS bridge %s, %w: %q", brName, err, output)
isUserspaceDP, err := ovs.IsUserspaceDataPath()
if err != nil {
klog.Error(err)
return err
}

// remove host nic from the external bridge
if output != "" {
for _, port := range strings.Split(output, "\n") {
// patch port created by ovn-controller has an external ID ovn-localnet-port=localnet.<SUBNET>
if output, err = ovs.Exec("--data=bare", "--no-heading", "--columns=_uuid", "find", "port", "name="+port, `external-ids:ovn-localnet-port!=""`); err != nil {
return fmt.Errorf("failed to find ovs port %s, %w: %q", port, err, output)
}
if output != "" {
continue
}
klog.V(3).Infof("removing ovs port %s from bridge %s", port, brName)
if err = c.removeProviderNic(port, brName); err != nil {
errMsg := fmt.Errorf("failed to remove port %s from external bridge %s: %w", port, brName, err)
klog.Error(errMsg)
return errMsg
if !isUserspaceDP {
// get host nic
if output, err = ovs.Exec("list-ports", brName); err != nil {
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
return fmt.Errorf("failed to list ports of OVS bridge %s, %w: %q", brName, err, output)
}

// remove host nic from the external bridge
if output != "" {
for _, port := range strings.Split(output, "\n") {
// patch port created by ovn-controller has an external ID ovn-localnet-port=localnet.<SUBNET>
if output, err = ovs.Exec("--data=bare", "--no-heading", "--columns=_uuid", "find", "port", "name="+port, `external-ids:ovn-localnet-port!=""`); err != nil {
return fmt.Errorf("failed to find ovs port %s, %w: %q", port, err, output)
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
}
if output != "" {
continue
}
klog.V(3).Infof("removing ovs port %s from bridge %s", port, brName)
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
if err = c.removeProviderNic(port, brName); err != nil {
errMsg := fmt.Errorf("failed to remove port %s from external bridge %s: %w", port, brName, err)
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
klog.Error(errMsg)
return errMsg
}
klog.V(3).Infof("ovs port %s has been removed from bridge %s", port, brName)
}
klog.V(3).Infof("ovs port %s has been removed from bridge %s", port, brName)
}
}

// remove OVS bridge
klog.Infof("delete external bridge %s", brName)
if output, err = ovs.Exec(ovs.IfExists, "del-br", brName); err != nil {
return fmt.Errorf("failed to remove OVS bridge %s, %w: %q", brName, err, output)
}
klog.V(3).Infof("ovs bridge %s has been deleted", brName)
// remove OVS bridge
klog.Infof("delete external bridge %s", brName)
if output, err = ovs.Exec(ovs.IfExists, "del-br", brName); err != nil {
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
return fmt.Errorf("failed to remove OVS bridge %s, %w: %q", brName, err, output)
}
klog.V(3).Infof("ovs bridge %s has been deleted", brName)

if br := util.ExternalBridgeName(provider); br != brName {
if _, err = c.changeProvideNicName(br, brName); err != nil {
klog.Errorf("failed to change provider nic name from %s to %s: %v", br, brName, err)
return err
if br := util.ExternalBridgeName(provider); br != brName {
if _, err = c.changeProvideNicName(br, brName); err != nil {
klog.Errorf("failed to change provider nic name from %s to %s: %v", br, brName, err)
return err
}
}
}

Expand Down
23 changes: 17 additions & 6 deletions pkg/daemon/ovs_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -1341,16 +1341,27 @@ func (c *Controller) transferAddrsAndRoutes(nicName, brName string, delNonExiste
// Add host nic to external bridge
// Mac address, MTU, IP addresses & routes will be copied/transferred to the external bridge
func (c *Controller) configProviderNic(nicName, brName string, trunks []string) (int, error) {
mtu, err := c.transferAddrsAndRoutes(nicName, brName, false)
isUserspaceDP, err := ovs.IsUserspaceDataPath()
if err != nil {
return 0, fmt.Errorf("failed to transfer addresses and routes from %s to %s: %w", nicName, brName, err)
klog.Error(err)
return 0, err
}

if _, err = ovs.Exec(ovs.MayExist, "add-port", brName, nicName,
"--", "set", "port", nicName, "trunks="+strings.Join(trunks, ","), "external_ids:vendor="+util.CniTypeName); err != nil {
return 0, fmt.Errorf("failed to add %s to OVS bridge %s: %w", nicName, brName, err)
var mtu int
if !isUserspaceDP {
mtu, err = c.transferAddrsAndRoutes(nicName, brName, false)
if err != nil {
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
return 0, fmt.Errorf("failed to transfer addresses and routes from %s to %s: %w", nicName, brName, err)
}

if _, err = ovs.Exec(ovs.MayExist, "add-port", brName, nicName,
"--", "set", "port", nicName, "trunks="+strings.Join(trunks, ","), "external_ids:vendor="+util.CniTypeName); err != nil {
return 0, fmt.Errorf("failed to add %s to OVS bridge %s: %w", nicName, brName, err)
bobz965 marked this conversation as resolved.
Show resolved Hide resolved
}
klog.V(3).Infof("ovs port %s has been added to bridge %s", nicName, brName)
} else {
mtu = c.config.MTU
}
klog.V(3).Infof("ovs port %s has been added to bridge %s", nicName, brName)

return mtu, nil
}
Expand Down
Loading