Skip to content

Commit fd7d15f

Browse files
authored
Integrate mycelium in zos (#2342)
* set up mycelium in a namespace * add mycelium to networkd * run mycelium in networkd * add mycelium to networkder * add subnet function * rename dummy device * download flists in namespace * fix flist tests * add mycelium adr * fix flist failure * add mycelium support for zdbs * fix mycelium ip returns as publicIp * log failure in ensuring mycelium for zdb * rename mycelium constants * remove zdb ensure mycelium * run ensure container setup even if container is running
1 parent 8cc357d commit fd7d15f

File tree

18 files changed

+1216
-154
lines changed

18 files changed

+1216
-154
lines changed

bins/packages/vector/files/vector.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ sources:
1414
- b-*
1515
- br-*
1616
- dumdum
17+
- mydumdum
1718
- dummy*
1819
- tozos*
1920
filesystem:

cmds/modules/networkd/main.go

Lines changed: 91 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

166145
func 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
187165
func 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+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# 1. Mycelium
2+
3+
Date: 2024-05-29
4+
5+
## Status
6+
7+
Accepted
8+
9+
## Context
10+
11+
Support mycelium network for zdbs and zos host to get flists over mycelium
12+
13+
## Decision
14+
15+
Integrate mycelium in zos and allow zos host to have mycelium IPs, mount flists over mycelium, and support mycelium on zdbs
16+
17+
## Consequences
18+
19+
Using mycelium IP is optional. Old clients should work normally without breakage.

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ require (
115115
github.com/moby/sys/mountinfo v0.6.2 // indirect
116116
github.com/ncruces/go-strftime v0.1.9 // indirect
117117
github.com/nsf/termbox-go v1.1.1 // indirect
118+
github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect
118119
github.com/onsi/ginkgo v1.16.4 // indirect
119120
github.com/onsi/gomega v1.16.0 // indirect
120121
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,8 @@ github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpo
433433
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
434434
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
435435
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
436+
github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q=
437+
github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s=
436438
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
437439
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
438440
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=

0 commit comments

Comments
 (0)