@@ -10,6 +10,7 @@ import (
10
10
"github.com/pkg/errors"
11
11
"github.com/threefoldtech/zos/pkg/environment"
12
12
"github.com/threefoldtech/zos/pkg/network/dhcp"
13
+ "github.com/threefoldtech/zos/pkg/network/mycelium"
13
14
"github.com/threefoldtech/zos/pkg/network/public"
14
15
"github.com/threefoldtech/zos/pkg/network/types"
15
16
"github.com/threefoldtech/zos/pkg/zinit"
@@ -110,47 +111,25 @@ func action(cli *cli.Context) error {
110
111
if err := dmz .Create (ctx ); err != nil {
111
112
return errors .Wrap (err , "failed to create ndmz" )
112
113
}
113
- log . Debug (). Msg ( "starting yggdrasil" )
114
- yggNamespace := dmz .Namespace ()
114
+
115
+ namespace := dmz .Namespace ()
115
116
if public .HasPublicSetup () {
116
- yggNamespace = public .PublicNamespace
117
+ namespace = public .PublicNamespace
117
118
}
118
119
119
- yggNs , err := yggdrasil .NewYggdrasilNamespace (yggNamespace )
120
+ log .Debug ().Msg ("starting yggdrasil" )
121
+ ygg , err := setupYgg (ctx , namespace , dmz .Namespace (), identity .PrivateKey (cli .Context ))
120
122
if err != nil {
121
- return errors . Wrap ( err , "failed to create yggdrasil namespace" )
123
+ return err
122
124
}
123
125
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 ))
125
128
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
151
130
}
152
131
153
- networker , err := network .NewNetworker (identity , dmz , ygg )
132
+ networker , err := network .NewNetworker (identity , dmz , ygg , mycelium )
154
133
if err != nil {
155
134
return errors .Wrap (err , "error creating network manager" )
156
135
}
@@ -164,7 +143,6 @@ func action(cli *cli.Context) error {
164
143
}
165
144
166
145
func startZBusServer (ctx context.Context , broker string , networker pkg.Networker ) error {
167
-
168
146
server , err := zbus .NewRedisServer (module , broker , 1 )
169
147
if err != nil {
170
148
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
187
165
func waitYggdrasilBin () {
188
166
log .Info ().Msg ("wait for yggdrasil binary to be available" )
189
167
bo := backoff .NewExponentialBackOff ()
190
- bo .MaxElapsedTime = 0 //forever
168
+ bo .MaxElapsedTime = 0 // forever
191
169
_ = backoff .RetryNotify (func () error {
192
170
_ , err := exec .LookPath ("yggdrasil" )
193
171
return err
@@ -212,3 +190,82 @@ func migrateOlderDHCPService() error {
212
190
213
191
return nil
214
192
}
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