@@ -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
4648var 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
5962var _ 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
165152func (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+ }
0 commit comments