forked from toolshed/abra
		
	feat: support hetzner cloud server removal
Part of coop-cloud/organising#212.
This commit is contained in:
		| @ -126,3 +126,31 @@ func ValidateSubCmdFlags(c *cli.Context) bool { | |||||||
| 	} | 	} | ||||||
| 	return true | 	return true | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ValidateServer ensures the server name arg is valid. | ||||||
|  | func ValidateServer(c *cli.Context) (string, error) { | ||||||
|  | 	serverName := c.Args().First() | ||||||
|  |  | ||||||
|  | 	serverNames, err := config.ReadServerNames() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return serverName, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if serverName == "" && !NoInput { | ||||||
|  | 		prompt := &survey.Select{ | ||||||
|  | 			Message: "Specify a server name", | ||||||
|  | 			Options: serverNames, | ||||||
|  | 		} | ||||||
|  | 		if err := survey.AskOne(prompt, &serverName); err != nil { | ||||||
|  | 			return serverName, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if serverName == "" { | ||||||
|  | 		ShowSubcommandHelpAndError(c, errors.New("no server provided")) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	logrus.Debugf("validated '%s' as server argument", serverName) | ||||||
|  |  | ||||||
|  | 	return serverName, nil | ||||||
|  | } | ||||||
|  | |||||||
| @ -466,7 +466,7 @@ You may omit flags to avoid performing this provisioning logic. | |||||||
|  |  | ||||||
| 		if _, err := cl.Info(c.Context); err != nil { | 		if _, err := cl.Info(c.Context); err != nil { | ||||||
| 			cleanUp(domainName) | 			cleanUp(domainName) | ||||||
| 			logrus.Fatalf("couldn't make a remote docker connection to %s?", domainName) | 			logrus.Fatalf("couldn't make a remote docker connection to %s? use --provision/-p to attempt to install", domainName) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if traefik { | 		if traefik { | ||||||
|  | |||||||
| @ -1,12 +1,16 @@ | |||||||
| package server | package server | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"coopcloud.tech/abra/cli/formatter" | ||||||
| 	"coopcloud.tech/abra/cli/internal" | 	"coopcloud.tech/abra/cli/internal" | ||||||
| 	"coopcloud.tech/abra/pkg/client" | 	"coopcloud.tech/abra/pkg/client" | ||||||
| 	"coopcloud.tech/abra/pkg/config" | 	"coopcloud.tech/abra/pkg/config" | ||||||
|  | 	"github.com/AlecAivazis/survey/v2" | ||||||
|  | 	"github.com/hetznercloud/hcloud-go/hcloud" | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| ) | ) | ||||||
| @ -16,21 +20,92 @@ var rmServerFlag = &cli.BoolFlag{ | |||||||
| 	Name:        "server", | 	Name:        "server", | ||||||
| 	Aliases:     []string{"s"}, | 	Aliases:     []string{"s"}, | ||||||
| 	Value:       false, | 	Value:       false, | ||||||
| 	Usage:       "Remove the actual server also", | 	Usage:       "remove the actual server also", | ||||||
| 	Destination: &rmServer, | 	Destination: &rmServer, | ||||||
| } | } | ||||||
|  |  | ||||||
| func rmHetznerCloudVPS(c *cli.Context) error { | func rmHetznerCloudVPS(c *cli.Context) error { | ||||||
| 	logrus.Warn("NOT IMPLEMENTED - COMING SOON") | 	if internal.HetznerCloudName == "" && !internal.NoInput { | ||||||
|  | 		prompt := &survey.Input{ | ||||||
|  | 			Message: "specify hetzner cloud VPS name", | ||||||
|  | 		} | ||||||
|  | 		if err := survey.AskOne(prompt, &internal.HetznerCloudName); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if internal.HetznerCloudAPIToken == "" && !internal.NoInput { | ||||||
|  | 		token, ok := os.LookupEnv("HCLOUD_TOKEN") | ||||||
|  | 		if !ok { | ||||||
|  | 			prompt := &survey.Input{ | ||||||
|  | 				Message: "specify hetzner cloud API token", | ||||||
|  | 			} | ||||||
|  | 			if err := survey.AskOne(prompt, &internal.HetznerCloudAPIToken); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			internal.HetznerCloudAPIToken = token | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	client := hcloud.NewClient(hcloud.WithToken(internal.HetznerCloudAPIToken)) | ||||||
|  |  | ||||||
|  | 	server, _, err := client.Server.Get(c.Context, internal.HetznerCloudName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if server == nil { | ||||||
|  | 		logrus.Fatalf("library provider reports that %s doesn't exist?", internal.HetznerCloudName) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Println(fmt.Sprintf(` | ||||||
|  | You have requested that Abra delete the following server (%s). Please be | ||||||
|  | absolutely sure that this is indeed the server that you would like to have | ||||||
|  | removed. There will be no going back once you confirm, the server will be | ||||||
|  | destroyed. | ||||||
|  | `, server.Name)) | ||||||
|  |  | ||||||
|  | 	tableColumns := []string{"name", "type", "image", "location"} | ||||||
|  | 	table := formatter.CreateTable(tableColumns) | ||||||
|  | 	table.Append([]string{ | ||||||
|  | 		server.Name, | ||||||
|  | 		server.ServerType.Name, | ||||||
|  | 		server.Image.Name, | ||||||
|  | 		server.Datacenter.Name, | ||||||
|  | 	}) | ||||||
|  | 	table.Render() | ||||||
|  |  | ||||||
|  | 	response := false | ||||||
|  | 	prompt := &survey.Confirm{ | ||||||
|  | 		Message: "continue with hetzner cloud VPS removal?", | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := survey.AskOne(prompt, &response); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if !response { | ||||||
|  | 		logrus.Fatal("exiting as requested") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_, err = client.Server.Delete(c.Context, server) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	logrus.Infof("%s has been deleted from your hetzner cloud account", internal.HetznerCloudName) | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| var serverRemoveCommand = &cli.Command{ | var serverRemoveCommand = &cli.Command{ | ||||||
| 	Name:      "remove", | 	Name:      "remove", | ||||||
| 	Aliases:   []string{"rm"}, | 	Aliases:   []string{"rm"}, | ||||||
|  | 	ArgsUsage: "<server>", | ||||||
| 	Usage:     "Remove a managed server", | 	Usage:     "Remove a managed server", | ||||||
| 	Description: ` | 	Description: ` | ||||||
| This command removes a server from being managed by Abra. | This command removes a server from Abra management. | ||||||
|  |  | ||||||
| Depending on whether you used a 3rd party provider to create this server ("abra | Depending on whether you used a 3rd party provider to create this server ("abra | ||||||
| server new"), you can also destroy the virtual server as well. Pass | server new"), you can also destroy the virtual server as well. Pass | ||||||
| @ -42,10 +117,13 @@ like tears in rain. | |||||||
| `, | `, | ||||||
| 	Flags: []cli.Flag{ | 	Flags: []cli.Flag{ | ||||||
| 		rmServerFlag, | 		rmServerFlag, | ||||||
| 		internal.DNSProviderFlag, |  | ||||||
|  | 		// Hetzner | ||||||
|  | 		internal.HetznerCloudNameFlag, | ||||||
|  | 		internal.HetznerCloudAPITokenFlag, | ||||||
| 	}, | 	}, | ||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		domainName, err := internal.ValidateDomain(c) | 		serverName, err := internal.ValidateServer(c) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
| @ -66,15 +144,15 @@ like tears in rain. | |||||||
|  |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err := client.DeleteContext(domainName); err != nil { | 		if err := client.DeleteContext(serverName); err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err := os.RemoveAll(filepath.Join(config.ABRA_SERVER_FOLDER, domainName)); err != nil { | 		if err := os.RemoveAll(filepath.Join(config.ABRA_SERVER_FOLDER, serverName)); err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		logrus.Infof("server at '%s' has been lost in time, like tears in rain", domainName) | 		logrus.Infof("server at '%s' has been lost in time, like tears in rain", serverName) | ||||||
|  |  | ||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user