diff --git a/internal/server/network/driver_ovn.go b/internal/server/network/driver_ovn.go index 779b6d196ed..8c56c3d54df 100644 --- a/internal/server/network/driver_ovn.go +++ b/internal/server/network/driver_ovn.go @@ -2071,7 +2071,7 @@ func (n *ovn) setup(update bool) error { } // Create logical router. - err = n.state.OVNNB.LogicalRouterAdd(n.getRouterName(), update) + err = n.state.OVNNB.CreateLogicalRouter(context.TODO(), n.getRouterName(), update) if err != nil { return fmt.Errorf("Failed adding router: %w", err) } diff --git a/internal/server/network/ovn/ovn_nb_actions.go b/internal/server/network/ovn/ovn_nb_actions.go index ca8d8c22180..3de586f3cae 100644 --- a/internal/server/network/ovn/ovn_nb_actions.go +++ b/internal/server/network/ovn/ovn_nb_actions.go @@ -182,15 +182,41 @@ type OVNRouterPeering struct { TargetRouterRoutes []net.IPNet } -// LogicalRouterAdd adds a named logical router. -func (o *NB) LogicalRouterAdd(routerName OVNRouter, mayExist bool) error { - args := []string{} - if mayExist { - args = append(args, "--may-exist") +// CreateLogicalRouter adds a named logical router. +// If mayExist is true, then an existing resource of the same name is not treated as an error. +func (o *NB) CreateLogicalRouter(ctx context.Context, routerName OVNRouter, mayExist bool) error { + logicalRouter := ovnNB.LogicalRouter{ + Name: string(routerName), } - _, err := o.nbctl(append(args, "lr-add", string(routerName))...) + // Check if already exists. + err := o.get(ctx, &logicalRouter) + if err != nil && err != ErrNotFound { + return err + } + + if logicalRouter.UUID != "" { + if mayExist { + return nil + } + + return ErrExists + } + + // Create the record. + operations, err := o.client.Create(&logicalRouter) + if err != nil { + return err + } + + // Apply the changes. + resp, err := o.client.Transact(ctx, operations...) + if err != nil { + return err + } + + _, err = ovsdb.CheckOperationResults(resp, operations) if err != nil { return err }