diff --git a/cmd/vpc/main.go b/cmd/vpc/main.go index 6d70f79..8f98a46 100644 --- a/cmd/vpc/main.go +++ b/cmd/vpc/main.go @@ -5,21 +5,39 @@ import ( "fmt" "os" + configuration "git.g3e.fr/syonad/two/internal/config/agent" "git.g3e.fr/syonad/two/internal/vpc" + "git.g3e.fr/syonad/two/pkg/db/kv" + "github.com/dgraph-io/badger/v4" ) var ( - netns = flag.String("netns", "", "Network namespace à faire") - name = flag.String("name", "", "interface name") - action = flag.String("action", "", "Action a faire") + netns = flag.String("netns", "", "Network namespace à faire") + name = flag.String("name", "", "interface name") + action = flag.String("action", "", "Action a faire") + conf_file = flag.String("conf", "/etc/two/agent.yml", "configuration file") ) +var DB *badger.DB + func main() { flag.Parse() + conf, err := configuration.LoadConfig(*conf_file) + if err != nil { + fmt.Println(err) + return + } + + DB = kv.InitDB(kv.Config{ + Path: conf.Database.Path, + }, false) + defer DB.Close() + switch *action { case "create": - if err := vpc.CreateVPC(*name); err != nil { + kv.AddInDB(DB, "vpc/"+*name+"/state", "creating") + if err := vpc.CreateVPC(DB, *name); err != nil { fmt.Println(err) } case "delete": diff --git a/internal/vpc/create.go b/internal/vpc/create.go index 5ff5fa5..3c3ad87 100644 --- a/internal/vpc/create.go +++ b/internal/vpc/create.go @@ -3,52 +3,59 @@ package vpc import ( "git.g3e.fr/syonad/two/internal/netif" "git.g3e.fr/syonad/two/internal/netns" + "git.g3e.fr/syonad/two/pkg/db/kv" + + "github.com/dgraph-io/badger/v4" ) -func CreateVPC(name string) error { +func CreateVPC(db *badger.DB, name string) error { // missing // search data in db // change state in db // create netns - if err := netns.Create(name); err != nil { + if state, err := kv.GetFromDB(db, "vpc/"+name+"/state"); err != nil { return err - } + } else if state == "creating" { + if err := netns.Create(name); err != nil { + return err + } - // create veth public for this netns - if err := netif.CreateVethToNetns("veth"+name+"ext", "vethpublicint", "/var/run/netns/"+name, 9000); err != nil { - return err - } + // create veth public for this netns + if err := netif.CreateVethToNetns("veth"+name+"ext", "vethpublicint", "/var/run/netns/"+name, 9000); err != nil { + return err + } - // create public bridge in netns - if err := netns.Call(name, func() error { - return netif.CreateBridge("br-public", 1500) - }); err != nil { - return err - } + // create public bridge in netns + if err := netns.Call(name, func() error { + return netif.CreateBridge("br-public", 1500) + }); err != nil { + return err + } - // set veth to ext public bridge - if err := netif.BridgeSetMaster("veth"+name+"ext", "br-public"); err != nil { - return err - } + // set veth to ext public bridge + if err := netif.BridgeSetMaster("veth"+name+"ext", "br-public"); err != nil { + return err + } - // set veth to int public bridge - if err := netns.Call(name, func() error { - return netif.BridgeSetMaster("vethpublicint", "br-public") - }); err != nil { - return err - } + // set veth to int public bridge + if err := netns.Call(name, func() error { + return netif.BridgeSetMaster("vethpublicint", "br-public") + }); err != nil { + return err + } - // set set ext veth up - if err := netif.LinkSetUp("veth" + name + "ext"); err != nil { - return nil + // set set ext veth up + if err := netif.LinkSetUp("veth" + name + "ext"); err != nil { + return nil + } + // set set int veth up + if err := netns.Call(name, func() error { + return netif.LinkSetUp("vethpublicint") + }); err != nil { + return err + } + kv.AddInDB(db, "vpc/"+name+"/state", "created") } - // set set int veth up - if err := netns.Call(name, func() error { - return netif.LinkSetUp("vethpublicint") - }); err != nil { - return err - } - return nil }