Skip to content

Commit 5ef2965

Browse files
committed
update vm light to run in private network
1 parent ab4038f commit 5ef2965

5 files changed

Lines changed: 132 additions & 22 deletions

File tree

pkg/netlight/network.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,12 @@ func (n *networker) Create(name string, wl gridtypes.WorkloadID, net zos.Network
128128
return n.setupWireguard(name, net, netr)
129129
}
130130

131-
func (n *networker) Delete(wl gridtypes.WorkloadWithID) error {
132-
if err := ipam.DeAllocateIPv4(wl.ID.String(), n.ipamLease); err != nil {
131+
func (n *networker) Delete(name string) error {
132+
if err := ipam.DeAllocateIPv4(name, n.ipamLease); err != nil {
133133
return err
134134
}
135135

136-
netID, err := zos.NetworkIDFromWorkloadID(wl.ID)
137-
if err != nil {
138-
return err
139-
}
140-
netNR, err := n.networkOf(netID)
136+
netNR, err := n.networkOf(name)
141137
if err != nil {
142138
return err
143139
}
@@ -146,7 +142,12 @@ func (n *networker) Delete(wl gridtypes.WorkloadWithID) error {
146142
log.Error().Err(err).Msg("release wireguard port failed")
147143
}
148144

149-
return resource.Delete(string(wl.ID))
145+
if err := resource.Delete(name); err != nil {
146+
return err
147+
}
148+
149+
path := filepath.Join(n.networkDir, name)
150+
return os.Remove(path)
150151
}
151152

152153
func (n *networker) AttachPrivate(name, id string, vmIp net.IP) (device localPkg.TapDevice, err error) {
@@ -205,17 +206,17 @@ func (n *networker) AttachZDB(id string) (string, error) {
205206

206207
// GetSubnet of a local network resource identified by the network ID, ipv4 and ipv6
207208
// subnet respectively
208-
func (n *networker) GetSubnet(networkID pkg.NetID) (net.IPNet, error) {
209-
localNR, err := n.networkOf(networkID)
209+
func (n *networker) GetSubnet(name string) (net.IPNet, error) {
210+
localNR, err := n.networkOf(name)
210211
if err != nil {
211-
return net.IPNet{}, errors.Wrapf(err, "couldn't load network with id (%s)", networkID)
212+
return net.IPNet{}, errors.Wrapf(err, "couldn't load network with name (%s)", name)
212213
}
213214

214215
return localNR.Subnet.IPNet, nil
215216
}
216217

217-
func (n *networker) networkOf(id zos.NetID) (nr pkg.Network, err error) {
218-
path := filepath.Join(n.networkDir, string(id))
218+
func (n *networker) networkOf(name string) (nr pkg.Network, err error) {
219+
path := filepath.Join(n.networkDir, name)
219220
file, err := os.OpenFile(path, os.O_RDWR, 0660)
220221
if err != nil {
221222
return nr, err
@@ -525,6 +526,37 @@ func (n *networker) WireguardPorts() ([]uint, error) {
525526
return n.portSet.List()
526527
}
527528

529+
// GetNet of a network identified by the network ID
530+
func (n *networker) GetNet(name string) (net.IPNet, error) {
531+
localNR, err := n.networkOf(name)
532+
if err != nil {
533+
return net.IPNet{}, errors.Wrapf(err, "couldn't load network (%s)", name)
534+
}
535+
536+
return localNR.NetworkIPRange.IPNet, nil
537+
}
538+
539+
// GetDefaultGwIP returns the IPs of the default gateways inside the network
540+
// resource identified by the network ID on the local node, for IPv4
541+
func (n *networker) GetDefaultGwIP(name string) (net.IP, error) {
542+
localNR, err := n.networkOf(name)
543+
if err != nil {
544+
return nil, errors.Wrapf(err, "couldn't load network (%s)", name)
545+
}
546+
547+
// only IP4 atm
548+
ip := localNR.Subnet.IP.To4()
549+
if ip == nil {
550+
return nil, errors.New("nr subnet is not valid IPv4")
551+
}
552+
553+
// defaut gw is currently implied to be at `x.x.x.1`
554+
// also a subnet in a NR is assumed to be a /24
555+
ip[len(ip)-1] = 1
556+
557+
return ip, nil
558+
}
559+
528560
func (n *networker) syncWGPorts() error {
529561
names, err := namespace.List("n-")
530562
if err != nil {
@@ -591,7 +623,9 @@ func (n *networker) releasePort(port uint16) error {
591623
}
592624

593625
func (n networker) setupWireguard(name string, net zos.NetworkLight, netr *resource.Resource) error {
594-
storedNR, err := n.networkOf(zos.NetID(name))
626+
log.Debug().Msg("setting up wireguard")
627+
628+
storedNR, err := n.networkOf(name)
595629
if err != nil && !os.IsNotExist(err) {
596630
return errors.Wrap(err, "failed to load previous network setup")
597631
}

pkg/network_light.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ import (
1515
type NetworkerLight interface {
1616
// Create(name string, net zos.NetworkLight, seed []byte) error
1717
Create(name string, wl gridtypes.WorkloadID, net zos.NetworkLight) error
18-
// Delete(name string) error
19-
Delete(wl gridtypes.WorkloadWithID) error
18+
Delete(name string) error
2019
AttachPrivate(name, id string, vmIp net.IP) (device TapDevice, err error)
2120
AttachMycelium(name, id string, seed []byte) (device TapDevice, err error)
2221
Detach(id string) error
@@ -26,11 +25,14 @@ type NetworkerLight interface {
2625
Namespace(id string) string
2726
Ready() error
2827
ZOSAddresses(ctx context.Context) <-chan NetlinkAddresses
29-
GetSubnet(networkID NetID) (net.IPNet, error)
3028
SetPublicConfig(cfg PublicConfig) error
3129
UnSetPublicConfig() error
3230
LoadPublicConfig() (PublicConfig, error)
31+
3332
WireguardPorts() ([]uint, error)
33+
GetDefaultGwIP(name string) (net.IP, error)
34+
GetNet(name string) (net.IPNet, error)
35+
GetSubnet(name string) (net.IPNet, error)
3436
}
3537

3638
type TapDevice struct {

pkg/primitives/network-light/network.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ func (p *Manager) Update(ctx context.Context, wl *gridtypes.WorkloadWithID) (int
5757

5858
func (p *Manager) Deprovision(ctx context.Context, wl *gridtypes.WorkloadWithID) error {
5959
mgr := stubs.NewNetworkerLightStub(p.zbus)
60+
twin, _ := provision.GetDeploymentID(ctx)
6061

61-
if err := mgr.Delete(ctx, *wl); err != nil {
62+
if err := mgr.Delete(ctx, string(zos.NetworkID(twin, wl.Name))); err != nil {
6263
return fmt.Errorf("failed to delete network resource: %w", err)
6364
}
6465

pkg/primitives/vm-light/utils.go

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ func (p *Manager) newMyceliumNetworkInterface(ctx context.Context, dl gridtypes.
179179

180180
tapName := wl.ID.Unique(string(config.Network))
181181
iface, err := network.AttachMycelium(ctx, string(netID), tapName, config.Seed)
182-
183182
if err != nil {
184183
return pkg.VMIface{}, errors.Wrap(err, "could not set up tap device")
185184
}
@@ -202,20 +201,60 @@ func (p *Manager) newPrivNetworkInterface(ctx context.Context, dl gridtypes.Depl
202201
network := localStubs.NewNetworkerLightStub(p.zbus)
203202
netID := zos.NetworkID(dl.TwinID, inf.Network)
204203

204+
name := netID.String()
205+
206+
subnet, err := network.GetSubnet(ctx, name)
207+
if err != nil {
208+
return pkg.VMIface{}, errors.Wrapf(err, "could not get network resource subnet")
209+
}
210+
211+
inf.IP = inf.IP.To4()
212+
if inf.IP == nil {
213+
return pkg.VMIface{}, fmt.Errorf("invalid IPv4 supplied to wg interface")
214+
}
215+
216+
if !subnet.Contains(inf.IP) {
217+
return pkg.VMIface{}, fmt.Errorf("IP %s is not part of local nr subnet %s", inf.IP.String(), subnet.String())
218+
}
219+
220+
// always the .1/24 ip is reserved
221+
if inf.IP[3] == 1 {
222+
return pkg.VMIface{}, fmt.Errorf("ip %s is reserved", inf.IP.String())
223+
}
224+
225+
privNet, err := network.GetNet(ctx, name)
226+
if err != nil {
227+
return pkg.VMIface{}, errors.Wrapf(err, "could not get network range")
228+
}
229+
230+
addrCIDR := net.IPNet{
231+
IP: inf.IP,
232+
Mask: subnet.Mask,
233+
}
234+
235+
gw4, err := network.GetDefaultGwIP(ctx, name)
236+
if err != nil {
237+
return pkg.VMIface{}, errors.Wrap(err, "could not get network resource default gateway")
238+
}
239+
205240
tapName := wl.ID.Unique(string(inf.Network))
206241
iface, err := network.AttachPrivate(ctx, string(netID), tapName, inf.IP)
207242
if err != nil {
208243
return pkg.VMIface{}, errors.Wrap(err, "could not set up tap device for private interface")
209244
}
210245

246+
routes := append(iface.Routes, pkg.Route{Net: privNet, Gateway: gw4})
247+
log.Info().Any("routes", routes).Send()
211248
out := pkg.VMIface{
212249
Tap: iface.Name,
213250
MAC: iface.Mac.String(),
214251
IPs: []net.IPNet{
215252
*iface.IP,
253+
addrCIDR,
216254
// privIP6,
217255
},
218-
Routes: iface.Routes,
256+
Routes: routes,
257+
219258
IP4DefaultGateway: iface.Routes[0].Gateway,
220259
// IP6DefaultGateway: gw6,
221260
PublicIPv4: false,

pkg/stubs/network_light_stub.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (s *NetworkerLightStub) Create(ctx context.Context, arg0 string, arg1 gridt
9696
return
9797
}
9898

99-
func (s *NetworkerLightStub) Delete(ctx context.Context, arg0 gridtypes.WorkloadWithID) (ret0 error) {
99+
func (s *NetworkerLightStub) Delete(ctx context.Context, arg0 string) (ret0 error) {
100100
args := []interface{}{arg0}
101101
result, err := s.client.RequestContext(ctx, s.module, s.object, "Delete", args...)
102102
if err != nil {
@@ -126,7 +126,41 @@ func (s *NetworkerLightStub) Detach(ctx context.Context, arg0 string) (ret0 erro
126126
return
127127
}
128128

129-
func (s *NetworkerLightStub) GetSubnet(ctx context.Context, arg0 zos.NetID) (ret0 net.IPNet, ret1 error) {
129+
func (s *NetworkerLightStub) GetDefaultGwIP(ctx context.Context, arg0 string) (ret0 []uint8, ret1 error) {
130+
args := []interface{}{arg0}
131+
result, err := s.client.RequestContext(ctx, s.module, s.object, "GetDefaultGwIP", args...)
132+
if err != nil {
133+
panic(err)
134+
}
135+
result.PanicOnError()
136+
ret1 = result.CallError()
137+
loader := zbus.Loader{
138+
&ret0,
139+
}
140+
if err := result.Unmarshal(&loader); err != nil {
141+
panic(err)
142+
}
143+
return
144+
}
145+
146+
func (s *NetworkerLightStub) GetNet(ctx context.Context, arg0 string) (ret0 net.IPNet, ret1 error) {
147+
args := []interface{}{arg0}
148+
result, err := s.client.RequestContext(ctx, s.module, s.object, "GetNet", args...)
149+
if err != nil {
150+
panic(err)
151+
}
152+
result.PanicOnError()
153+
ret1 = result.CallError()
154+
loader := zbus.Loader{
155+
&ret0,
156+
}
157+
if err := result.Unmarshal(&loader); err != nil {
158+
panic(err)
159+
}
160+
return
161+
}
162+
163+
func (s *NetworkerLightStub) GetSubnet(ctx context.Context, arg0 string) (ret0 net.IPNet, ret1 error) {
130164
args := []interface{}{arg0}
131165
result, err := s.client.RequestContext(ctx, s.module, s.object, "GetSubnet", args...)
132166
if err != nil {

0 commit comments

Comments
 (0)