From 19d435c5e5cd2a4ef572a0c0d99b924b8b2b5048 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 2 Aug 2021 01:03:27 +0200 Subject: [PATCH] feat: implement server init --- TODO.md | 2 +- cli/server.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 6d67d2ad..11d61eaa 100644 --- a/TODO.md +++ b/TODO.md @@ -12,7 +12,7 @@ - [ ] `capsul` - [ ] `hetzner` - [x] `rm` - - [ ] `init` + - [x] `init` - [ ] `abra app` - [x] `ls` - [x] `new` diff --git a/cli/server.go b/cli/server.go index 0077800c..e8d7f374 100644 --- a/cli/server.go +++ b/cli/server.go @@ -1,10 +1,14 @@ package cli import ( + "context" "fmt" + "net" "coopcloud.tech/abra/client" "coopcloud.tech/abra/config" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -111,6 +115,41 @@ the default IPv4 address as the advertising address. This can be re-configured later for more advanced use cases. `, Action: func(c *cli.Context) error { + host := c.Args().First() + if host == "" { + cli.ShowSubcommandHelp(c) + return nil + } + + cl, err := client.NewClientWithContext(host) + if err != nil { + return err + } + + var ipv4 net.IP + ips, _ := net.LookupIP(host) + for _, ip := range ips { + ipv4 = ip.To4() + } + + if string(ipv4) == "" { + return fmt.Errorf("Unable to retrieve ipv4 address for %s", host) + } + + ctx := context.Background() + initReq := swarm.InitRequest{ + ListenAddr: "0.0.0.0:2377", + AdvertiseAddr: string(ipv4), + } + if _, err := cl.SwarmInit(ctx, initReq); err != nil { + return err + } + + netOpts := types.NetworkCreate{Driver: "overlay", Scope: "swarm"} + if _, err := cl.NetworkCreate(ctx, "proxy", netOpts); err != nil { + return err + } + return nil }, }