Skip to content

Commit 65ede3b

Browse files
Eslam-NawaraOmarabdul3ziz
authored andcommitted
save network resource on creation
1 parent d45f57d commit 65ede3b

4 files changed

Lines changed: 112 additions & 53 deletions

File tree

pkg/netlight/network.go

Lines changed: 102 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/threefoldtech/zosbase/pkg"
2121
localPkg "github.com/threefoldtech/zosbase/pkg"
2222
"github.com/threefoldtech/zosbase/pkg/cache"
23+
"github.com/threefoldtech/zosbase/pkg/gridtypes"
2324
"github.com/threefoldtech/zosbase/pkg/gridtypes/zos"
2425
"github.com/threefoldtech/zosbase/pkg/netbase/wireguard"
2526
"github.com/threefoldtech/zosbase/pkg/netlight/bridge"
@@ -41,6 +42,7 @@ const (
4142
ipamLeaseDir = "ndmz-lease"
4243
DefaultBridge = "zos"
4344
networkDir = "networks"
45+
linkDir = "link"
4446
)
4547

4648
var NDMZGwIP = &net.IPNet{
@@ -54,6 +56,7 @@ type networker struct {
5456
ipamLease string
5557
networkDir string
5658
portSet *set.UIntSet
59+
linkDir string
5760
}
5861

5962
var _ localPkg.NetworkerLight = (*networker)(nil)
@@ -66,11 +69,17 @@ func NewNetworker() (localPkg.NetworkerLight, error) {
6669

6770
ipamLease := filepath.Join(vd, ipamLeaseDir)
6871
runtimeDir := filepath.Join(vd, networkDir)
72+
linkDir := filepath.Join(runtimeDir, linkDir)
73+
74+
if err := os.MkdirAll(linkDir, 0755); err != nil {
75+
return nil, errors.Wrapf(err, "failed to create directory: '%s'", linkDir)
76+
}
6977

7078
n := networker{
7179
ipamLease: ipamLease,
7280
networkDir: runtimeDir,
7381
portSet: set.NewInt(),
82+
linkDir: linkDir,
7483
}
7584

7685
if err := n.syncWGPorts(); err != nil {
@@ -79,7 +88,11 @@ func NewNetworker() (localPkg.NetworkerLight, error) {
7988
return &n, nil
8089
}
8190

82-
func (n *networker) Create(name string, net zos.NetworkLight, seed []byte) error {
91+
func (n *networker) Create(name string, wl gridtypes.WorkloadID, net zos.NetworkLight) error {
92+
if err := n.storeNetwork(name, wl, net); err != nil {
93+
return errors.Wrap(err, "failed to store network object")
94+
}
95+
8396
b, err := bridge.Get(NDMZBridge)
8497
if err != nil {
8598
return err
@@ -89,28 +102,6 @@ func (n *networker) Create(name string, net zos.NetworkLight, seed []byte) error
89102
return err
90103
}
91104

92-
storedNR, err := n.networkOf(zos.NetID(name))
93-
if err != nil && !os.IsNotExist(err) {
94-
return errors.Wrap(err, "failed to load previous network setup")
95-
}
96-
97-
if err == nil {
98-
if err := n.releasePort(storedNR.WGListenPort); err != nil {
99-
return err
100-
}
101-
}
102-
103-
if err := n.reservePort(net.WGListenPort); err != nil {
104-
return err
105-
}
106-
107-
// _, err = resource.Create(name, b, ip, NDMZGwIP, &privateNet, seed)
108-
netr, err := resource.Create(name, b, ip, NDMZGwIP, &net.Subnet.IPNet, seed, net)
109-
// netr, err := resource.Create(name, b, ip, NDMZGwIP, &net.Subnet.IPNet, net.Mycelium.Key, net.NetworkIPRange.IPNet, net)
110-
if err != nil {
111-
return err
112-
}
113-
114105
cleanup := func() {
115106
log.Error().Msg("clean up network resource")
116107
if err := resource.Delete(name); err != nil {
@@ -127,39 +118,35 @@ func (n *networker) Create(name string, net zos.NetworkLight, seed []byte) error
127118
}
128119
}()
129120

130-
wgName, err := netr.WGName()
121+
// _, err = resource.Create(name, b, ip, NDMZGwIP, &privateNet, seed)
122+
// netr, err := resource.Create(name, b, ip, NDMZGwIP, &net.Subnet.IPNet, net.Mycelium.Key, net.NetworkIPRange.IPNet, net)
123+
netr, err := resource.Create(name, b, ip, NDMZGwIP, &net.Subnet.IPNet, net.Mycelium.Key, net)
131124
if err != nil {
132-
return errors.Wrap(err, "failed to get wg interface name for network resource")
125+
return err
133126
}
134127

135-
exists, err := netr.HasWireguard()
136-
if err != nil {
137-
return errors.Wrap(err, "failed to check if network resource has wireguard setup")
138-
}
128+
return n.setupWireguard(name, net, netr)
129+
}
139130

140-
if !exists {
141-
var wg *wireguard.Wireguard
142-
wg, err = wireguard.New(wgName)
143-
if err != nil {
144-
return errors.Wrapf(err, "failed to create wg interface for network resource '%s'", name)
145-
}
146-
if err = netr.SetWireguard(wg); err != nil {
147-
return errors.Wrap(err, "failed to setup wireguard interface for network resource")
148-
}
131+
func (n *networker) Delete(wl gridtypes.WorkloadWithID) error {
132+
if err := ipam.DeAllocateIPv4(wl.ID.String(), n.ipamLease); err != nil {
133+
return err
149134
}
150135

151-
if err = netr.ConfigureWG(net.WGPrivateKey); err != nil {
152-
return errors.Wrap(err, "failed to configure network resource")
136+
netID, err := zos.NetworkIDFromWorkloadID(wl.ID)
137+
if err != nil {
138+
return err
153139
}
154-
return err
155-
}
156-
157-
func (n *networker) Delete(name string) error {
158-
if err := ipam.DeAllocateIPv4(name, n.ipamLease); err != nil {
140+
netNR, err := n.networkOf(netID)
141+
if err != nil {
159142
return err
160143
}
161144

162-
return resource.Delete(name)
145+
if err := n.releasePort(netNR.WGListenPort); err != nil {
146+
log.Error().Err(err).Msg("release wireguard port failed")
147+
}
148+
149+
return resource.Delete(string(wl.ID))
163150
}
164151

165152
func (n *networker) AttachPrivate(name, id string, vmIp net.IP) (device localPkg.TapDevice, err error) {
@@ -602,3 +589,72 @@ func (n *networker) releasePort(port uint16) error {
602589
n.portSet.Remove(uint(port))
603590
return nil
604591
}
592+
593+
func (n networker) setupWireguard(name string, net zos.NetworkLight, netr *resource.Resource) error {
594+
storedNR, err := n.networkOf(zos.NetID(name))
595+
if err != nil && !os.IsNotExist(err) {
596+
return errors.Wrap(err, "failed to load previous network setup")
597+
}
598+
599+
if err == nil {
600+
if err := n.releasePort(storedNR.WGListenPort); err != nil {
601+
return err
602+
}
603+
}
604+
605+
if err := n.reservePort(net.WGListenPort); err != nil {
606+
return err
607+
}
608+
609+
wgName, err := netr.WGName()
610+
if err != nil {
611+
return errors.Wrap(err, "failed to get wg interface name for network resource")
612+
}
613+
614+
exists, err := netr.HasWireguard()
615+
if err != nil {
616+
return errors.Wrap(err, "failed to check if network resource has wireguard setup")
617+
}
618+
619+
if !exists {
620+
var wg *wireguard.Wireguard
621+
wg, err = wireguard.New(wgName)
622+
if err != nil {
623+
return errors.Wrapf(err, "failed to create wg interface for network resource '%s'", name)
624+
}
625+
if err = netr.SetWireguard(wg); err != nil {
626+
return errors.Wrap(err, "failed to setup wireguard interface for network resource")
627+
}
628+
}
629+
630+
if err = netr.ConfigureWG(net.WGPrivateKey); err != nil {
631+
return errors.Wrap(err, "failed to configure network resource")
632+
}
633+
634+
return nil
635+
}
636+
637+
func (n *networker) storeNetwork(name string, wl gridtypes.WorkloadID, network zos.NetworkLight) error {
638+
// map the network ID to the network namespace
639+
path := filepath.Join(n.networkDir, name)
640+
file, err := os.Create(path)
641+
if err != nil {
642+
return err
643+
}
644+
defer file.Close()
645+
646+
writer, err := versioned.NewWriter(file, NetworkSchemaLatestVersion)
647+
if err != nil {
648+
return err
649+
}
650+
651+
enc := json.NewEncoder(writer)
652+
if err := enc.Encode(&network); err != nil {
653+
return err
654+
}
655+
link := filepath.Join(n.linkDir, wl.String())
656+
if err := os.Symlink(filepath.Join("../", name), link); err != nil && !os.IsExist(err) {
657+
return errors.Wrap(err, "failed to create network symlink")
658+
}
659+
return nil
660+
}

pkg/network_light.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"net"
66

7+
"github.com/threefoldtech/zosbase/pkg/gridtypes"
78
"github.com/threefoldtech/zosbase/pkg/gridtypes/zos"
89
)
910

@@ -12,8 +13,10 @@ import (
1213

1314
// NetworkerLight is the interface for the network light module
1415
type NetworkerLight interface {
15-
Create(name string, net zos.NetworkLight, seed []byte) error
16-
Delete(name string) error
16+
// Create(name string, net zos.NetworkLight, seed []byte) error
17+
Create(name string, wl gridtypes.WorkloadID, net zos.NetworkLight) error
18+
// Delete(name string) error
19+
Delete(wl gridtypes.WorkloadWithID) error
1720
AttachPrivate(name, id string, vmIp net.IP) (device TapDevice, err error)
1821
AttachMycelium(name, id string, seed []byte) (device TapDevice, err error)
1922
Detach(id string) error

pkg/primitives/network-light/network.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (p *Manager) networkProvisionImpl(ctx context.Context, wl *gridtypes.Worklo
3939
mgr := stubs.NewNetworkerLightStub(p.zbus)
4040
log.Debug().Str("network", fmt.Sprintf("%+v", network)).Msg("provision network")
4141

42-
err := mgr.Create(ctx, string(zos.NetworkID(twin, wl.Name)), network, network.Mycelium.Key)
42+
err := mgr.Create(ctx, string(zos.NetworkID(twin, wl.Name)), wl.ID, network)
4343
if err != nil {
4444
return errors.Wrapf(err, "failed to create network resource for network %s", wl.ID)
4545
}
@@ -56,10 +56,9 @@ func (p *Manager) Update(ctx context.Context, wl *gridtypes.WorkloadWithID) (int
5656
}
5757

5858
func (p *Manager) Deprovision(ctx context.Context, wl *gridtypes.WorkloadWithID) error {
59-
twin, _ := provision.GetDeploymentID(ctx)
6059
mgr := stubs.NewNetworkerLightStub(p.zbus)
6160

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

pkg/stubs/network_light_stub.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
zbus "github.com/threefoldtech/zbus"
1010
pkg "github.com/threefoldtech/zosbase/pkg"
11+
gridtypes "github.com/threefoldtech/zosbase/pkg/gridtypes"
1112
zos "github.com/threefoldtech/zosbase/pkg/gridtypes/zos"
1213
"net"
1314
)
@@ -80,7 +81,7 @@ func (s *NetworkerLightStub) AttachZDB(ctx context.Context, arg0 string) (ret0 s
8081
return
8182
}
8283

83-
func (s *NetworkerLightStub) Create(ctx context.Context, arg0 string, arg1 zos.NetworkLight, arg2 []uint8) (ret0 error) {
84+
func (s *NetworkerLightStub) Create(ctx context.Context, arg0 string, arg1 gridtypes.WorkloadID, arg2 zos.NetworkLight) (ret0 error) {
8485
args := []interface{}{arg0, arg1, arg2}
8586
result, err := s.client.RequestContext(ctx, s.module, s.object, "Create", args...)
8687
if err != nil {
@@ -95,7 +96,7 @@ func (s *NetworkerLightStub) Create(ctx context.Context, arg0 string, arg1 zos.N
9596
return
9697
}
9798

98-
func (s *NetworkerLightStub) Delete(ctx context.Context, arg0 string) (ret0 error) {
99+
func (s *NetworkerLightStub) Delete(ctx context.Context, arg0 gridtypes.WorkloadWithID) (ret0 error) {
99100
args := []interface{}{arg0}
100101
result, err := s.client.RequestContext(ctx, s.module, s.object, "Delete", args...)
101102
if err != nil {

0 commit comments

Comments
 (0)