@@ -10,6 +10,7 @@ import (
1010 "github.com/pkg/errors"
1111 "github.com/threefoldtech/zos/pkg/environment"
1212 "github.com/threefoldtech/zos/pkg/network/dhcp"
13+ "github.com/threefoldtech/zos/pkg/network/mycelium"
1314 "github.com/threefoldtech/zos/pkg/network/public"
1415 "github.com/threefoldtech/zos/pkg/network/types"
1516 "github.com/threefoldtech/zos/pkg/zinit"
@@ -110,47 +111,25 @@ func action(cli *cli.Context) error {
110111 if err := dmz .Create (ctx ); err != nil {
111112 return errors .Wrap (err , "failed to create ndmz" )
112113 }
113- log . Debug (). Msg ( "starting yggdrasil" )
114- yggNamespace := dmz .Namespace ()
114+
115+ namespace := dmz .Namespace ()
115116 if public .HasPublicSetup () {
116- yggNamespace = public .PublicNamespace
117+ namespace = public .PublicNamespace
117118 }
118119
119- yggNs , err := yggdrasil .NewYggdrasilNamespace (yggNamespace )
120+ log .Debug ().Msg ("starting yggdrasil" )
121+ ygg , err := setupYgg (ctx , namespace , dmz .Namespace (), identity .PrivateKey (cli .Context ))
120122 if err != nil {
121- return errors . Wrap ( err , "failed to create yggdrasil namespace" )
123+ return err
122124 }
123125
124- ygg , err := yggdrasil .EnsureYggdrasil (ctx , identity .PrivateKey (cli .Context ), yggNs )
126+ log .Debug ().Msg ("starting mycelium" )
127+ mycelium , err := setupMycelium (ctx , namespace , dmz .Namespace (), identity .PrivateKey (cli .Context ))
125128 if err != nil {
126- return errors .Wrap (err , "failed to start yggdrasil" )
127- }
128-
129- if public .HasPublicSetup () {
130- // if yggdrasil is living inside public namespace
131- // we still need to setup ndmz to also have yggdrasil but we set the yggdrasil interface
132- // a different Ip that lives inside the yggdrasil range.
133- dmzYgg , err := yggdrasil .NewYggdrasilNamespace (dmz .Namespace ())
134- if err != nil {
135- return errors .Wrap (err , "failed to setup ygg for dmz namespace" )
136- }
137-
138- ip , err := ygg .SubnetFor ([]byte (fmt .Sprintf ("ygg:%s" , dmz .Namespace ())))
139- if err != nil {
140- return errors .Wrap (err , "failed to calculate ip for ygg inside dmz" )
141- }
142-
143- gw , err := ygg .Gateway ()
144- if err != nil {
145- return err
146- }
147-
148- if err := dmzYgg .SetYggIP (ip , gw .IP ); err != nil {
149- return errors .Wrap (err , "failed to set yggdrasil ip for dmz" )
150- }
129+ return err
151130 }
152131
153- networker , err := network .NewNetworker (identity , dmz , ygg )
132+ networker , err := network .NewNetworker (identity , dmz , ygg , mycelium )
154133 if err != nil {
155134 return errors .Wrap (err , "error creating network manager" )
156135 }
@@ -164,7 +143,6 @@ func action(cli *cli.Context) error {
164143}
165144
166145func startZBusServer (ctx context.Context , broker string , networker pkg.Networker ) error {
167-
168146 server , err := zbus .NewRedisServer (module , broker , 1 )
169147 if err != nil {
170148 log .Error ().Err (err ).Msgf ("fail to connect to message broker server" )
@@ -187,7 +165,7 @@ func startZBusServer(ctx context.Context, broker string, networker pkg.Networker
187165func waitYggdrasilBin () {
188166 log .Info ().Msg ("wait for yggdrasil binary to be available" )
189167 bo := backoff .NewExponentialBackOff ()
190- bo .MaxElapsedTime = 0 //forever
168+ bo .MaxElapsedTime = 0 // forever
191169 _ = backoff .RetryNotify (func () error {
192170 _ , err := exec .LookPath ("yggdrasil" )
193171 return err
@@ -212,3 +190,82 @@ func migrateOlderDHCPService() error {
212190
213191 return nil
214192}
193+
194+ func setupYgg (ctx context.Context , namespace , dmzNs string , privateKey []byte ) (ygg * yggdrasil.YggServer , err error ) {
195+ yggNs , err := yggdrasil .NewYggdrasilNamespace (namespace )
196+ if err != nil {
197+ return ygg , errors .Wrap (err , "failed to create yggdrasil namespace" )
198+ }
199+
200+ ygg , err = yggdrasil .EnsureYggdrasil (ctx , privateKey , yggNs )
201+ if err != nil {
202+ return ygg , errors .Wrap (err , "failed to start yggdrasil" )
203+ }
204+
205+ if public .HasPublicSetup () {
206+ // if yggdrasil is living inside public namespace
207+ // we still need to setup ndmz to also have yggdrasil but we set the yggdrasil interface
208+ // a different Ip that lives inside the yggdrasil range.
209+ dmzYgg , err := yggdrasil .NewYggdrasilNamespace (dmzNs )
210+ if err != nil {
211+ return ygg , errors .Wrap (err , "failed to setup ygg for dmz namespace" )
212+ }
213+
214+ ip , err := ygg .SubnetFor ([]byte (fmt .Sprintf ("ygg:%s" , dmzNs )))
215+ if err != nil {
216+ return ygg , errors .Wrap (err , "failed to calculate ip for ygg inside dmz" )
217+ }
218+
219+ gw , err := ygg .Gateway ()
220+ if err != nil {
221+ return ygg , err
222+ }
223+
224+ if err := dmzYgg .SetYggIP (ip , gw .IP ); err != nil {
225+ return ygg , errors .Wrap (err , "failed to set yggdrasil ip for dmz" )
226+ }
227+ }
228+ return
229+ }
230+
231+ func setupMycelium (ctx context.Context , namespace , dmzNs string , privateKey []byte ) (myc * mycelium.MyceliumServer , err error ) {
232+ myNs , err := mycelium .NewMyNamespace (namespace )
233+ if err != nil {
234+ return myc , errors .Wrap (err , "failed to create mycelium namespace" )
235+ }
236+
237+ myc , err = mycelium .EnsureMycelium (ctx , privateKey , myNs )
238+ if err != nil {
239+ return myc , errors .Wrap (err , "failed to start mycelium" )
240+ }
241+
242+ if public .HasPublicSetup () {
243+ // if mycelium is living inside public namespace
244+ // we still need to setup ndmz to also have mycelium but we set the mycelium interface
245+ // a different Ip that lives inside the mycelium range.
246+ dmzMy , err := mycelium .NewMyNamespace (dmzNs )
247+ if err != nil {
248+ return myc , errors .Wrap (err , "failed to setup mycelium for dmz namespace" )
249+ }
250+
251+ inspcet , err := myc .InspectMycelium ()
252+ if err != nil {
253+ return myc , err
254+ }
255+
256+ ip , err := inspcet .IPFor ([]byte (fmt .Sprintf ("my:%s" , dmzNs )))
257+ if err != nil {
258+ return myc , errors .Wrap (err , "failed to calculate ip for mycelium inside dmz" )
259+ }
260+
261+ gw , err := inspcet .Gateway ()
262+ if err != nil {
263+ return myc , err
264+ }
265+
266+ if err := dmzMy .SetMyIP (ip , gw .IP ); err != nil {
267+ return myc , errors .Wrap (err , "failed to set mycelium ip for dmz" )
268+ }
269+ }
270+ return
271+ }
0 commit comments