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 lsp gc after upgrade #2513

Merged
merged 1 commit into from
Mar 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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