forked from toolshed/abra
.gitea
cli
app
catalogue
formatter
internal
recipe
record
server
add.go
list.go
new.go
remove.go
server.go
autocomplete.go
cli.go
upgrade.go
cmd
pkg
scripts
tests
.drone.yml
.envrc.sample
.gitignore
.goreleaser.yml
Makefile
README.md
go.mod
go.sum
160 lines
3.9 KiB
Go
160 lines
3.9 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"coopcloud.tech/abra/cli/formatter"
|
|
"coopcloud.tech/abra/cli/internal"
|
|
"coopcloud.tech/abra/pkg/client"
|
|
"coopcloud.tech/abra/pkg/config"
|
|
"github.com/AlecAivazis/survey/v2"
|
|
"github.com/hetznercloud/hcloud-go/hcloud"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
var rmServer bool
|
|
var rmServerFlag = &cli.BoolFlag{
|
|
Name: "server",
|
|
Aliases: []string{"s"},
|
|
Value: false,
|
|
Usage: "remove the actual server also",
|
|
Destination: &rmServer,
|
|
}
|
|
|
|
func rmHetznerCloudVPS(c *cli.Context) error {
|
|
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
|
|
}
|
|
|
|
var serverRemoveCommand = &cli.Command{
|
|
Name: "remove",
|
|
Aliases: []string{"rm"},
|
|
ArgsUsage: "<server>",
|
|
Usage: "Remove a managed server",
|
|
Description: `
|
|
This command removes a server from Abra management.
|
|
|
|
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/-s" to tell Abra to try to delete this VPS.
|
|
|
|
Otherwise, Abra will remove the internal bookkeeping (~/.abra/servers/...) and
|
|
underlying client connection context. This server will then be lost in time,
|
|
like tears in rain.
|
|
`,
|
|
Flags: []cli.Flag{
|
|
rmServerFlag,
|
|
|
|
// Hetzner
|
|
internal.HetznerCloudNameFlag,
|
|
internal.HetznerCloudAPITokenFlag,
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
serverName, err := internal.ValidateServer(c)
|
|
if err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
if rmServer {
|
|
if err := internal.EnsureServerProvider(); err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
switch internal.ServerProvider {
|
|
case "capsul":
|
|
logrus.Warn("capsul provider does not support automatic removal yet, sorry!")
|
|
case "hetzner-cloud":
|
|
if err := rmHetznerCloudVPS(c); err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if err := client.DeleteContext(serverName); err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
if err := os.RemoveAll(filepath.Join(config.ABRA_SERVER_FOLDER, serverName)); err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
|
|
logrus.Infof("server at '%s' has been lost in time, like tears in rain", serverName)
|
|
|
|
return nil
|
|
},
|
|
}
|