Skip to content

Commit

Permalink
Merge pull request #144 from Szubie/remote-deploy
Browse files Browse the repository at this point in the history
Remote deployment
  • Loading branch information
idroz committed Sep 3, 2022
2 parents d89e3dd + 763638c commit a437103
Show file tree
Hide file tree
Showing 10 changed files with 269 additions and 87 deletions.
1 change: 1 addition & 0 deletions commands/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ func init() {
BravetoolsCmd.AddCommand(baseBuild)
BravetoolsCmd.AddCommand(braveVersion)
BravetoolsCmd.AddCommand(braveCompose)
BravetoolsCmd.AddCommand(remoteCmd)

userHome, _ := os.UserHomeDir()
exists, err := shared.CheckPath(path.Join(userHome, shared.PlatformConfig))
Expand Down
1 change: 1 addition & 0 deletions commands/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func includeDeployFlags(cmd *cobra.Command) {
cmd.Flags().StringVarP(&deployArgs.IP, "ip", "i", "", "IPv4 address (e.g., 10.0.0.20) [OPTIONAL]")
cmd.Flags().StringVarP(&deployArgs.Resources.CPU, "cpu", "c", "", "Number of allocated CPUs (e.g., 2) [OPTIONAL]")
cmd.Flags().StringVarP(&deployArgs.Resources.RAM, "ram", "r", "", "Number of allocated CPUs (e.g., 2GB) [OPTIONAL]")
cmd.Flags().StringVarP(&deployArgs.Profile, "profile", "", "", "LXD profile to deploy to. Defaults to bravetools local profile [OPTIONAL]")
cmd.Flags().StringSliceVarP(&deployArgs.Ports, "port", "p", []string{}, "Publish Unit port to host [OPTIONAL]")
cmd.Flags().StringVarP(&deployArgs.Name, "name", "n", "", "Assign name to deployed Unit")
}
Expand Down
2 changes: 1 addition & 1 deletion commands/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ func serverInit(cmd *cobra.Command, args []string) {
}

log.Println("Registering a Remote")
host.Remote = platform.NewBravehostRemote(host.Settings.BackendSettings)
host.Remote = platform.NewBravehostRemote(host.Settings.BackendSettings, host.Settings.Profile)
err = platform.SaveRemote(host.Remote)
if err != nil {
if err := deleteBraveHome(userHome); err != nil {
Expand Down
147 changes: 147 additions & 0 deletions commands/remote.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package commands

import (
"encoding/json"
"fmt"
"log"

"github.com/bravetools/bravetools/platform"
"github.com/bravetools/bravetools/shared"
"github.com/spf13/cobra"
)

var remoteCmd = &cobra.Command{
Use: "remote",
Short: "Manage remotes",
Long: ``,
}

var remoteAddCmd = &cobra.Command{
Use: "add [NAME] [URL]",
Short: "Add a remote",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) != 2 {
cmd.Usage()
return fmt.Errorf("`brave remote add` expects two positional args, [NAME] and [URL], got %d", len(args))
}
return nil
},
Long: `Create a remote called [NAME] available at [URL].
Example: brave remote add test https://localhost:8443`,
Run: remoteAdd,
}

var remoteRemoveCmd = &cobra.Command{
Use: "remove",
Short: "Remove a remote",
Long: ``,
Args: cobra.MinimumNArgs(1),
Run: remoteRemove,
}

var remoteGetCmd = &cobra.Command{
Use: "get",
Short: "Get a remote",
Long: "",
Args: cobra.ExactArgs(1),
Run: remoteGet,
}

var remoteListCmd = &cobra.Command{
Use: "list",
Short: "List all remotes",
Long: "",
Args: cobra.NoArgs,
Run: remoteList,
}

var remoteArgs = &platform.Remote{}
var remotePassword = ""

func init() {
remoteCmd.AddCommand(remoteAddCmd)
remoteCmd.AddCommand(remoteRemoveCmd)
remoteCmd.AddCommand(remoteGetCmd)
remoteCmd.AddCommand(remoteListCmd)
includeRemoteAddFlags(remoteAddCmd)
}

func includeRemoteAddFlags(cmd *cobra.Command) {
cmd.Flags().StringVar(&remoteArgs.Protocol, "protocol", "lxd", "LXD server protocol to connect with (e.g. 'lxd', 'simplestreams')")
cmd.Flags().BoolVar(&remoteArgs.Public, "public", false, "Publicly available server with no authentication")
cmd.Flags().StringVar(&remoteArgs.Profile, "profile", "", "Name of LXD profile to use with this remote by default (e.g. 'bravetools')")
cmd.Flags().StringVar(&remotePassword, "password", "", "Trusted password to use when communicating with remote")
}

func remoteAdd(cmd *cobra.Command, args []string) {

remoteArgs.Name = args[0]
remoteArgs.URL = args[1]

err := platform.SaveRemote(*remoteArgs)
if err != nil {
log.Fatal(err)
}

// Need to generate certs for non-public remotes
if !remoteArgs.Public && !(remoteArgs.Protocol == "unix") {

if remotePassword == "" {
log.Println("adding a non-public remote without providing a trusted password with the --password flag only works with remotes that already trust bravetools")
}

err = platform.AddRemote(*remoteArgs, remotePassword)
if err != nil {
platform.RemoveRemote(remoteArgs.Name)
log.Fatal(err)
}
} else {
// Validate public/unix connection
if remoteArgs.Protocol == "unix" {
_, err = platform.GetLXDInstanceServer(*remoteArgs)
} else {
_, err = platform.GetLXDImageSever(*remoteArgs)
}

if err != nil {
platform.RemoveRemote(remoteArgs.Name)
log.Fatal(err)
}
}
}

func remoteRemove(cmd *cobra.Command, args []string) {
for _, arg := range args {
if arg == shared.BravetoolsRemote {
log.Printf("remote %q cannot be removed, skipping", arg)
continue
}

err := platform.RemoveRemote(arg)
if err != nil {
log.Fatal(err)
}
}
}

func remoteGet(cmd *cobra.Command, args []string) {
remote, err := platform.LoadRemoteSettings(args[0])
if err != nil {
log.Fatal(err)
}
remoteJson, err := json.MarshalIndent(remote, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(remoteJson))
}

func remoteList(cmd *cobra.Command, args []string) {
remoteNames, err := platform.ListRemotes()
if err != nil {
log.Fatal(err)
}
for _, name := range remoteNames {
fmt.Println(name)
}
}
16 changes: 8 additions & 8 deletions platform/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,19 @@ func createSharedVolume(lxdServer lxd.InstanceServer,
return nil
}

func importLXD(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile) (fingerprint string, err error) {
func importLXD(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile, profileName string) (fingerprint string, err error) {
if err = ctx.Err(); err != nil {
return "", err
}
fingerprint, err = Launch(ctx, lxdServer, bravefile.PlatformService.Name, bravefile.Base.Image)
fingerprint, err = Launch(ctx, lxdServer, bravefile.PlatformService.Name, bravefile.Base.Image, profileName)
if err != nil {
return fingerprint, errors.New("failed to launch base unit: " + err.Error())
}

return fingerprint, nil
}

func importGitHub(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile, bh *BraveHost) (fingerprint string, err error) {
func importGitHub(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile, bh *BraveHost, profileName string) (fingerprint string, err error) {
if err = ctx.Err(); err != nil {
return "", err
}
Expand Down Expand Up @@ -171,11 +171,11 @@ func importGitHub(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *
remoteBravefile.Base.Image = remoteServiceName
remoteBravefile.PlatformService.Name = bravefile.PlatformService.Name

fingerprint, err = importLocal(ctx, lxdServer, remoteBravefile)
fingerprint, err = importLocal(ctx, lxdServer, remoteBravefile, profileName)
return fingerprint, err
}

func importLocal(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile) (fingerprint string, err error) {
func importLocal(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *shared.Bravefile, profileName string) (fingerprint string, err error) {
if err = ctx.Err(); err != nil {
return "", err
}
Expand All @@ -196,7 +196,7 @@ func importLocal(ctx context.Context, lxdServer lxd.InstanceServer, bravefile *s
return fingerprint, err
}

err = LaunchFromImage(lxdServer, bravefile.Base.Image, bravefile.PlatformService.Name)
err = LaunchFromImage(lxdServer, bravefile.Base.Image, bravefile.PlatformService.Name, profileName)
if err != nil {
return fingerprint, errors.New("failed to launch unit: " + err.Error())
}
Expand Down Expand Up @@ -456,13 +456,13 @@ func addIPRules(lxdServer lxd.InstanceServer, ct string, hostPort string, ctPort
return nil
}

func checkUnits(lxdServer lxd.InstanceServer, unitName string) error {
func checkUnits(lxdServer lxd.InstanceServer, unitName string, profileName string) error {
if unitName == "" {
return errors.New("unit name cannot be empty")
}

// Unit Checks
unitList, err := GetUnits(lxdServer)
unitList, err := GetUnits(lxdServer, profileName)
if err != nil {
return err
}
Expand Down
3 changes: 1 addition & 2 deletions platform/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,7 @@ func ConfigureHost(settings HostSettings, remote Remote) error {
if err != nil {
return err
}

units, err := GetUnits(lxdServer)
units, err := GetUnits(lxdServer, settings.Profile)
if err != nil {
return errors.New("failed to list units: " + err.Error())
}
Expand Down
Loading

0 comments on commit a437103

Please sign in to comment.