From f100a6cd73c5f274a555e6999c3538d69622f7a0 Mon Sep 17 00:00:00 2001 From: Simon Castagna Date: Wed, 17 Jan 2024 10:14:23 +0100 Subject: [PATCH] Add archive environment command kosli-dev/server#324 --- cmd/kosli/archive.go | 1 + cmd/kosli/archiveEnvironment.go | 63 +++++++++++++++++++++++++++ cmd/kosli/archiveEnvironment_test.go | 65 ++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 cmd/kosli/archiveEnvironment.go create mode 100644 cmd/kosli/archiveEnvironment_test.go diff --git a/cmd/kosli/archive.go b/cmd/kosli/archive.go index f0a425b05..e0f3a229d 100644 --- a/cmd/kosli/archive.go +++ b/cmd/kosli/archive.go @@ -18,6 +18,7 @@ func newArchiveCmd(out io.Writer) *cobra.Command { // Add subcommands cmd.AddCommand( newArchiveFlowCmd(out), + newArchiveEnvironmentCmd(out), ) return cmd } diff --git a/cmd/kosli/archiveEnvironment.go b/cmd/kosli/archiveEnvironment.go new file mode 100644 index 000000000..7d8775385 --- /dev/null +++ b/cmd/kosli/archiveEnvironment.go @@ -0,0 +1,63 @@ +package main + +import ( + "fmt" + "io" + "net/http" + + "github.com/kosli-dev/cli/internal/requests" + "github.com/spf13/cobra" +) + +const archiveEnvironmentShortDesc = `Archive a Kosli environment.` + +const archiveEnvironmentLongDesc = archiveEnvironmentShortDesc + ` +The environment will no longer be visible in list of environments, data is still stored in database. +` + +const archiveEnvironmentExample = ` +# archive a Kosli environment: +kosli archive environment yourEnvironmentName \ + --api-token yourAPIToken \ + --org yourOrgName +` + +type ArchiveEnvironmentPayload struct { +} + +func newArchiveEnvironmentCmd(out io.Writer) *cobra.Command { + payload := new(ArchiveEnvironmentPayload) + cmd := &cobra.Command{ + Use: "environment ENVIRONMENT-NAME", + Short: archiveEnvironmentShortDesc, + Long: archiveEnvironmentLongDesc, + Example: archiveEnvironmentExample, + Args: cobra.ExactArgs(1), + PreRunE: func(cmd *cobra.Command, args []string) error { + err := RequireGlobalFlags(global, []string{"Org", "ApiToken"}) + if err != nil { + return ErrorBeforePrintingUsage(cmd, err.Error()) + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + url := fmt.Sprintf("%s/api/v2/environments/%s/%s/archive", global.Host, global.Org, args[0]) + + reqParams := &requests.RequestParams{ + Method: http.MethodPut, + URL: url, + Payload: payload, + DryRun: global.DryRun, + Password: global.ApiToken, + } + _, err := kosliClient.Do(reqParams) + if err == nil && !global.DryRun { + logger.Info("environment %s was archived", args[0]) + } + return err + }, + } + addDryRunFlag(cmd) + return cmd +} diff --git a/cmd/kosli/archiveEnvironment_test.go b/cmd/kosli/archiveEnvironment_test.go new file mode 100644 index 000000000..eb0e6fa38 --- /dev/null +++ b/cmd/kosli/archiveEnvironment_test.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/suite" +) + +// Define the suite, and absorb the built-in basic suite +// functionality from testify - including a T() method which +// returns the current testing context +type ArchiveEnvironmentCommandTestSuite struct { + suite.Suite + defaultKosliArguments string + environmentName string +} + +func (suite *ArchiveEnvironmentCommandTestSuite) SetupTest() { + suite.environmentName = "archive-environment" + + global = &GlobalOpts{ + ApiToken: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", + Org: "docs-cmd-test-user", + Host: "http://localhost:8001", + } + suite.defaultKosliArguments = fmt.Sprintf(" --host %s --org %s --api-token %s", global.Host, global.Org, global.ApiToken) + CreateEnv(global.Org, suite.environmentName, "server", suite.T()) +} + +func (suite *ArchiveEnvironmentCommandTestSuite) TestArchiveEnvironmentCmd() { + tests := []cmdTestCase{ + { + name: "can archive environment", + cmd: fmt.Sprintf(`archive environment %s %s`, suite.environmentName, suite.defaultKosliArguments), + golden: "environment archive-environment was archived\n", + }, + { + wantError: true, + name: "archiving non-existing environment fails", + cmd: fmt.Sprintf(`archive environment non-existing %s`, suite.defaultKosliArguments), + golden: "Error: Environment named 'non-existing' does not exist for organization 'docs-cmd-test-user'. \n", + }, + { + wantError: true, + name: "archive environment fails when 2 args are provided", + cmd: fmt.Sprintf(`archive environment %s arg2 %s`, suite.environmentName, suite.defaultKosliArguments), + golden: "Error: accepts 1 arg(s), received 2\n", + }, + { + wantError: true, + name: "archive environment fails when no args are provided", + cmd: fmt.Sprintf(`archive environment %s`, suite.defaultKosliArguments), + golden: "Error: accepts 1 arg(s), received 0\n", + }, + } + + runTestCmd(suite.T(), tests) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestArchiveEnvironmentCommandTestSuite(t *testing.T) { + suite.Run(t, new(ArchiveEnvironmentCommandTestSuite)) +}