Skip to content

Commit

Permalink
fix lsp gc after upgrade (#2513)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangzujian committed Mar 21, 2023
1 parent 0b8964c commit 9eda485
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 20 deletions.
30 changes: 30 additions & 0 deletions mocks/pkg/ovs/interface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pkg/controller/gc.go
Expand Up @@ -357,7 +357,7 @@ func (c *Controller) markAndCleanLSP() error {

klog.Infof("gc logical switch port %s", lsp.Name)
if err := c.ovnClient.DeleteLogicalSwitchPort(lsp.Name); err != nil {
klog.Errorf("failed to delete lsp %s, %v", lsp, err)
klog.Errorf("failed to delete lsp %s: %v", lsp.Name, err)
return err
}

Expand Down
70 changes: 53 additions & 17 deletions pkg/controller/init.go
Expand Up @@ -299,13 +299,33 @@ func (c *Controller) InitIPAM() error {
}
}

result, err := c.ovnLegacyClient.CustomFindEntity("logical_switch_port", []string{"name"}, `external-ids:vendor{<}""`)
lsList, err := c.ovnClient.ListLogicalSwitch(false, nil)
if err != nil {
klog.Errorf("failed to find logical switch port without external-ids:vendor: %v", err)
klog.Errorf("failed to list LS: %v", err)
return err
}
lspWithoutVendor := make(map[string]struct{}, len(result))
for _, lsp := range result {
lspWithoutVendor[lsp["name"][0]] = struct{}{}
lsPortsMap := make(map[string]map[string]struct{}, len(lsList))
for _, ls := range lsList {
lsPortsMap[ls.Name] = make(map[string]struct{}, len(ls.Ports))
for _, port := range ls.Ports {
lsPortsMap[ls.Name][port] = struct{}{}
}
}

lspList, err := c.ovnClient.ListLogicalSwitchPortsWithLegacyExternalIDs()
if err != nil {
klog.Errorf("failed to list LSP: %v", err)
return err
}
lspWithoutVendor := make(map[string]struct{}, len(lspList))
lspWithoutLS := make(map[string]string, len(lspList))
for _, lsp := range lspList {
if len(lsp.ExternalIDs) == 0 || lsp.ExternalIDs["vendor"] == "" {
lspWithoutVendor[lsp.Name] = struct{}{}
}
if len(lsp.ExternalIDs) == 0 || lsp.ExternalIDs[logicalSwitchKey] == "" {
lspWithoutLS[lsp.Name] = lsp.UUID
}
}

pods, err := c.podsLister.List(labels.Everything())
Expand Down Expand Up @@ -376,11 +396,23 @@ func (c *Controller) InitIPAM() error {
}
}

externalIDs := make(map[string]string, 3)
if _, ok := lspWithoutVendor[portName]; ok {
if err = c.initAppendLspExternalIds(portName, pod); err != nil {
klog.Errorf("failed to append external-ids for logical switch port %s: %v", portName, err)
externalIDs["vendor"] = util.CniTypeName
externalIDs["pod"] = fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)
}
if uuid := lspWithoutLS[portName]; uuid != "" {
for ls, ports := range lsPortsMap {
if _, ok := ports[uuid]; ok {
externalIDs[logicalSwitchKey] = ls
break
}
}
}

if err = c.initAppendLspExternalIds(portName, externalIDs); err != nil {
klog.Errorf("failed to append external-ids for logical switch port %s: %v", portName, err)
}
}
}
}
Expand Down Expand Up @@ -441,11 +473,22 @@ func (c *Controller) InitIPAM() error {
node.Annotations[util.IpAddressAnnotation] = util.GetStringIP(v4IP, v6IP)
}

externalIDs := make(map[string]string, 2)
if _, ok := lspWithoutVendor[portName]; ok {
if err = c.initAppendLspExternalIds(portName, nil); err != nil {
klog.Errorf("failed to append external-ids for logical switch port %s: %v", portName, err)
externalIDs["vendor"] = util.CniTypeName
}
if uuid := lspWithoutLS[portName]; uuid != "" {
for ls, ports := range lsPortsMap {
if _, ok := ports[uuid]; ok {
externalIDs[logicalSwitchKey] = ls
break
}
}
}

if err = c.initAppendLspExternalIds(portName, externalIDs); err != nil {
klog.Errorf("failed to append external-ids for logical switch port %s: %v", portName, err)
}
}
}

Expand Down Expand Up @@ -781,18 +824,11 @@ func (c *Controller) initNodeRoutes() error {
return nil
}

func (c *Controller) initAppendLspExternalIds(portName string, pod *v1.Pod) error {
externalIDs := make(map[string]string, 2)
externalIDs["vendor"] = util.CniTypeName
if pod != nil {
externalIDs["pod"] = fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)
}

func (c *Controller) initAppendLspExternalIds(portName string, externalIDs map[string]string) error {
if err := c.ovnClient.SetLogicalSwitchPortExternalIds(portName, externalIDs); err != nil {
klog.Errorf("set lsp external_ids for logical switch port %s: %v", portName, err)
return err
}

return nil
}

Expand Down
1 change: 1 addition & 0 deletions pkg/ovs/interface.go
Expand Up @@ -62,6 +62,7 @@ type LogicalSwitchPort interface {
DeleteLogicalSwitchPort(lspName string) error
ListLogicalSwitchPorts(needVendorFilter bool, externalIDs map[string]string, filter func(lsp *ovnnb.LogicalSwitchPort) bool) ([]ovnnb.LogicalSwitchPort, error)
ListNormalLogicalSwitchPorts(needVendorFilter bool, externalIDs map[string]string) ([]ovnnb.LogicalSwitchPort, error)
ListLogicalSwitchPortsWithLegacyExternalIDs() ([]ovnnb.LogicalSwitchPort, error)
GetLogicalSwitchPort(lspName string, ignoreNotFound bool) (*ovnnb.LogicalSwitchPort, error)
LogicalSwitchPortExists(name string) (bool, error)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/ovs/ovn-nb-logical_switch.go
Expand Up @@ -208,7 +208,7 @@ func (c *ovnClient) LogicalSwitchExists(lsName string) (bool, error) {
}

// ListLogicalSwitch list logical switch
func (c *ovnClient) ListLogicalSwitch(needVendorFilter bool, filter func(lr *ovnnb.LogicalSwitch) bool) ([]ovnnb.LogicalSwitch, error) {
func (c *ovnClient) ListLogicalSwitch(needVendorFilter bool, filter func(ls *ovnnb.LogicalSwitch) bool) ([]ovnnb.LogicalSwitch, error) {
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
defer cancel()

Expand Down
16 changes: 15 additions & 1 deletion pkg/ovs/ovn-nb-logical_switch_port.go
Expand Up @@ -496,6 +496,21 @@ func (c *ovnClient) ListNormalLogicalSwitchPorts(needVendorFilter bool, external
return lsps, nil
}

// ListLogicalSwitchPortsWithLegacyExternalIDs list logical switch ports with legacy external-ids
func (c *ovnClient) ListLogicalSwitchPortsWithLegacyExternalIDs() ([]ovnnb.LogicalSwitchPort, error) {
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
defer cancel()

lspList := make([]ovnnb.LogicalSwitchPort, 0)
if err := c.WhereCache(func(lsp *ovnnb.LogicalSwitchPort) bool {
return len(lsp.ExternalIDs) == 0 || lsp.ExternalIDs[logicalSwitchKey] == "" || lsp.ExternalIDs["vendor"] == ""
}).List(ctx, &lspList); err != nil {
return nil, fmt.Errorf("failed to list logical switch ports with legacy external-ids: %v", err)
}

return lspList, nil
}

// ListLogicalSwitchPorts list logical switch ports
func (c *ovnClient) ListLogicalSwitchPorts(needVendorFilter bool, externalIDs map[string]string, filter func(lsp *ovnnb.LogicalSwitchPort) bool) ([]ovnnb.LogicalSwitchPort, error) {
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
Expand Down Expand Up @@ -605,7 +620,6 @@ func logicalSwitchPortFilter(needVendorFilter bool, externalIDs map[string]strin
if needVendorFilter && (len(lsp.ExternalIDs) == 0 || lsp.ExternalIDs["vendor"] != util.CniTypeName) {
return false
}

if len(lsp.ExternalIDs) < len(externalIDs) {
return false
}
Expand Down

0 comments on commit 9eda485

Please sign in to comment.