Skip to content

Commit afc60dc

Browse files
winiciusallanstgraber
authored andcommitted
incusd/network/ovn: Allow creation of OVN network with no uplink
Closes: #1529 Signed-off-by: Winicius Silva <[email protected]>
1 parent 7bd69c0 commit afc60dc

File tree

1 file changed

+60
-40
lines changed

1 file changed

+60
-40
lines changed

internal/server/network/driver_ovn.go

Lines changed: 60 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2162,6 +2162,10 @@ func (n *ovn) setup(update bool) error {
21622162
return fmt.Errorf("Failed parsing router's internal port IPv6 Net: %w", err)
21632163
}
21642164

2165+
if n.config["network"] != "none" && routerIntPortIPv4 == nil && routerIntPortIPv6 == nil {
2166+
return fmt.Errorf("IPv4 or IPv6 subnets must be specified on a non-isolated OVN network")
2167+
}
2168+
21652169
// Create chassis group.
21662170
err = n.ovnnb.CreateChassisGroup(context.TODO(), n.getChassisGroupName(), update)
21672171
if err != nil {
@@ -2172,18 +2176,24 @@ func (n *ovn) setup(update bool) error {
21722176
revert.Add(func() { _ = n.ovnnb.DeleteChassisGroup(context.TODO(), n.getChassisGroupName()) })
21732177
}
21742178

2175-
// Create logical router.
2176-
err = n.ovnnb.CreateLogicalRouter(context.TODO(), n.getRouterName(), update)
2177-
if err != nil {
2178-
return fmt.Errorf("Failed adding router: %w", err)
2179-
}
2179+
// Configure logical router.
2180+
if routerIntPortIPv4 != nil || routerIntPortIPv6 != nil {
2181+
// Create logical router.
2182+
err = n.ovnnb.CreateLogicalRouter(context.TODO(), n.getRouterName(), update)
2183+
if err != nil {
2184+
return fmt.Errorf("Failed adding router: %w", err)
2185+
}
21802186

2181-
if !update {
2182-
revert.Add(func() { _ = n.ovnnb.DeleteLogicalRouter(context.TODO(), n.getRouterName()) })
2187+
if !update {
2188+
revert.Add(func() { _ = n.ovnnb.DeleteLogicalRouter(context.TODO(), n.getRouterName()) })
2189+
}
2190+
} else {
2191+
err := n.ovnnb.DeleteLogicalRouter(context.TODO(), n.getRouterName())
2192+
if err != nil && err != networkOVN.ErrNotFound {
2193+
return fmt.Errorf("Failed deleting router: %w", err)
2194+
}
21832195
}
21842196

2185-
// Configure logical router.
2186-
21872197
// Generate external router port IPs (in CIDR format).
21882198
extRouterIPs := []*net.IPNet{}
21892199
if routerExtPortIPv4Net != nil {
@@ -2401,10 +2411,6 @@ func (n *ovn) setup(update bool) error {
24012411
intSubnets = append(intSubnets, *routerIntPortIPv6Net)
24022412
}
24032413

2404-
if len(intRouterIPs) <= 0 {
2405-
return fmt.Errorf("No internal IPs defined for network router")
2406-
}
2407-
24082414
// Create internal logical switch if not updating.
24092415
err = n.ovnnb.CreateLogicalSwitch(context.TODO(), n.getIntSwitchName(), update)
24102416
if err != nil {
@@ -2551,22 +2557,29 @@ func (n *ovn) setup(update bool) error {
25512557
})
25522558
}
25532559

2554-
// Apply router security policy.
2555-
err = n.logicalRouterPolicySetup(n.ovnnb)
2556-
if err != nil {
2557-
return fmt.Errorf("Failed applying router security policy: %w", err)
2558-
}
2560+
if routerIntPortIPv4 != nil || routerIntPortIPv6 != nil {
2561+
// Apply router security policy.
2562+
err = n.logicalRouterPolicySetup(n.ovnnb)
2563+
if err != nil {
2564+
return fmt.Errorf("Failed applying router security policy: %w", err)
2565+
}
25592566

2560-
// Create internal router port.
2561-
err = n.ovnnb.CreateLogicalRouterPort(context.TODO(), n.getRouterName(), n.getRouterIntPortName(), routerMAC, bridgeMTU, intRouterIPs, "", update)
2562-
if err != nil {
2563-
return fmt.Errorf("Failed adding internal router port: %w", err)
2564-
}
2567+
// Create internal router port.
2568+
err = n.ovnnb.CreateLogicalRouterPort(context.TODO(), n.getRouterName(), n.getRouterIntPortName(), routerMAC, bridgeMTU, intRouterIPs, "", update)
2569+
if err != nil {
2570+
return fmt.Errorf("Failed adding internal router port: %w", err)
2571+
}
25652572

2566-
if !update {
2567-
revert.Add(func() {
2568-
_ = n.ovnnb.DeleteLogicalRouterPort(context.TODO(), n.getRouterName(), n.getRouterIntPortName())
2569-
})
2573+
if !update {
2574+
revert.Add(func() {
2575+
_ = n.ovnnb.DeleteLogicalRouterPort(context.TODO(), n.getRouterName(), n.getRouterIntPortName())
2576+
})
2577+
}
2578+
} else {
2579+
err := n.ovnnb.DeleteLogicalRouterPort(context.TODO(), n.getRouterName(), n.getRouterIntPortName())
2580+
if err != nil && err != ovs.ErrNotFound {
2581+
return fmt.Errorf("Failed deleting logical router port: %w", err)
2582+
}
25702583
}
25712584

25722585
// Configure DHCP option sets.
@@ -2690,26 +2703,33 @@ func (n *ovn) setup(update bool) error {
26902703
}
26912704
} else {
26922705
err = n.ovnnb.UpdateLogicalRouterPort(context.TODO(), n.getRouterIntPortName(), &networkOVN.OVNIPv6RAOpts{})
2693-
if err != nil {
2706+
if err != nil && err != networkOVN.ErrNotFound {
26942707
return fmt.Errorf("Failed removing internal router port IPv6 advertisement settings: %w", err)
26952708
}
26962709
}
26972710

26982711
// Create internal switch port and link to router port.
2699-
err = n.ovnnb.CreateLogicalSwitchPort(context.TODO(), n.getIntSwitchName(), n.getIntSwitchRouterPortName(), nil, update)
2700-
if err != nil {
2701-
return fmt.Errorf("Failed adding internal switch router port: %w", err)
2702-
}
2712+
if routerIntPortIPv4Net != nil || routerIntPortIPv6Net != nil {
2713+
err = n.ovnnb.CreateLogicalSwitchPort(context.TODO(), n.getIntSwitchName(), n.getIntSwitchRouterPortName(), nil, update)
2714+
if err != nil {
2715+
return fmt.Errorf("Failed adding internal switch router port: %w", err)
2716+
}
27032717

2704-
if !update {
2705-
revert.Add(func() {
2706-
_ = n.ovnnb.DeleteLogicalSwitchPort(context.TODO(), n.getIntSwitchName(), n.getIntSwitchRouterPortName())
2707-
})
2708-
}
2718+
if !update {
2719+
revert.Add(func() {
2720+
_ = n.ovnnb.DeleteLogicalSwitchPort(context.TODO(), n.getIntSwitchName(), n.getIntSwitchRouterPortName())
2721+
})
2722+
}
27092723

2710-
err = n.ovnnb.UpdateLogicalSwitchPortLinkRouter(context.TODO(), n.getIntSwitchRouterPortName(), n.getRouterIntPortName())
2711-
if err != nil {
2712-
return fmt.Errorf("Failed linking internal router port to internal switch port: %w", err)
2724+
err = n.ovnnb.UpdateLogicalSwitchPortLinkRouter(context.TODO(), n.getIntSwitchRouterPortName(), n.getRouterIntPortName())
2725+
if err != nil {
2726+
return fmt.Errorf("Failed linking internal router port to internal switch port: %w", err)
2727+
}
2728+
} else {
2729+
err := n.ovnnb.DeleteLogicalSwitchPort(context.TODO(), n.getIntSwitchName(), n.getIntSwitchRouterPortName())
2730+
if err != nil && err != networkOVN.ErrNotFound {
2731+
return fmt.Errorf("Failed removing logical switch port: %w", err)
2732+
}
27132733
}
27142734

27152735
// Apply baseline ACL rules to internal logical switch.

0 commit comments

Comments
 (0)