Skip to content

Commit

Permalink
feat: add --move flag to import cmd
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonTheLeg committed Sep 20, 2022
1 parent 7738d22 commit 6575f3d
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 7 deletions.
31 changes: 26 additions & 5 deletions cmd/import.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ type konfFile struct {
type importCmd struct {
fs afero.Fs

determineConfigs func(afero.Fs, string) ([]*konfFile, error)
writeConfig func(afero.Fs, *konfFile) error
determineConfigs func(afero.Fs, string) ([]*konfFile, error)
writeConfig func(afero.Fs, *konfFile) error
deleteOriginalConfig func(afero.Fs, string) error

move bool

cmd *cobra.Command
}
Expand All @@ -29,9 +32,10 @@ func newImportCmd() *importCmd {
fs := afero.NewOsFs()

ic := &importCmd{
fs: fs,
determineConfigs: determineConfigs,
writeConfig: writeConfig,
fs: fs,
determineConfigs: determineConfigs,
writeConfig: writeConfig,
deleteOriginalConfig: deleteOriginalConfig,
}

ic.cmd = &cobra.Command{
Expand All @@ -45,6 +49,8 @@ contain a single context. Import will take care of splitting if necessary.`,
RunE: ic.importf,
}

ic.cmd.Flags().BoolVarP(&ic.move, "move", "m", false, "whether the original kubeconfig should be deleted after successful import (default is false)")

return ic
}

Expand All @@ -69,6 +75,13 @@ func (c *importCmd) importf(cmd *cobra.Command, args []string) error {
log.Info("Imported konf from %q successfully into %q\n", fpath, conf.FilePath)
}

if c.move {
if err := c.deleteOriginalConfig(c.fs, fpath); err != nil {
return err
}
log.Info("Successfully deleted original kubeconfig at %q", fpath)
}

return nil
}

Expand Down Expand Up @@ -147,6 +160,14 @@ func writeConfig(f afero.Fs, kf *konfFile) error {
return nil
}

func deleteOriginalConfig(f afero.Fs, path string) error {
err := f.Remove(path)
if err != nil {
return err
}
return nil
}

func init() {
rootCmd.AddCommand(newImportCmd().cmd)
}
41 changes: 39 additions & 2 deletions cmd/import_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package cmd

import (
"errors"
"fmt"
"io/fs"
"testing"

"github.com/google/go-cmp/cmp"
Expand All @@ -17,47 +19,63 @@ func TestImport(t *testing.T) {
fm := testhelper.FilesystemManager{}
var determineConfigsCalled bool
var writeConfigCalledCount int
var deleteOriginalConfigCalled bool
// using just a wrapper here instead of a full mock, makes testing it slightly easier
var wrapDetermineConfig = func(f afero.Fs, fpath string) ([]*konfFile, error) {
determineConfigsCalled = true
return determineConfigs(f, fpath)
}
var mockWriteConfig = func(afero.Fs, *konfFile) error { writeConfigCalledCount++; return nil }
var mockDeleteOriginalConfig = func(afero.Fs, string) error { deleteOriginalConfigCalled = true; return nil }

type ExpCalls struct {
DetermineConfigs bool
WriteConfig int
DetermineConfigs bool
WriteConfig int
DeleteOriginalConfig bool
}
tt := map[string]struct {
Args []string
FsCreator func() afero.Fs
ExpErr error
MoveFlag bool
ExpCalls
}{
"single context": {
[]string{"./konf/store/dev-eu_dev-eu-1.yaml"},
testhelper.FSWithFiles(fm.StoreDir, fm.SingleClusterSingleContextEU),
nil,
false,
ExpCalls{DetermineConfigs: true, WriteConfig: 1},
},
"empty context": {
[]string{"./konf/store/no-context.yaml"},
testhelper.FSWithFiles(fm.StoreDir, fm.KonfWithoutContext),
fmt.Errorf("no contexts found in file \"./konf/store/no-context.yaml\""),
false,
ExpCalls{DetermineConfigs: true, WriteConfig: 0},
},
"move flag provided": {
[]string{"./konf/store/dev-eu_dev-eu-1.yaml"},
testhelper.FSWithFiles(fm.StoreDir, fm.SingleClusterSingleContextEU),
nil,
true,
ExpCalls{DetermineConfigs: true, WriteConfig: 1, DeleteOriginalConfig: true},
},
}

for name, tc := range tt {
t.Run(name, func(t *testing.T) {
determineConfigsCalled = false
writeConfigCalledCount = 0
deleteOriginalConfigCalled = false
fs := tc.FsCreator()

icmd := newImportCmd()
icmd.fs = fs
icmd.determineConfigs = wrapDetermineConfig
icmd.writeConfig = mockWriteConfig
icmd.deleteOriginalConfig = mockDeleteOriginalConfig
icmd.move = tc.MoveFlag
cmd := icmd.cmd

// TODO unfortunately I was not able to use ExecuteC here as this would run
Expand All @@ -76,6 +94,10 @@ func TestImport(t *testing.T) {
t.Errorf("Exp WriteConfigCalled to be %d, but got %d", tc.ExpCalls.WriteConfig, writeConfigCalledCount)
}

if tc.ExpCalls.DeleteOriginalConfig != deleteOriginalConfigCalled {
t.Errorf("Exp DeleteOriginalConfigCalled to be %t, but got %t", tc.ExpCalls.DeleteOriginalConfig, deleteOriginalConfigCalled)
}

})
}
}
Expand Down Expand Up @@ -274,3 +296,18 @@ users:
}

}

func TestDeleteOriginalConfig(t *testing.T) {
fpath := "/dir/original-file.yaml"

f := afero.NewMemMapFs()
afero.WriteFile(f, fpath, nil, 0664)

if err := deleteOriginalConfig(f, fpath); err != nil {
t.Fatalf("Could not delete original kubeconfig %q: '%v'", fpath, err)
}

if _, err := f.Stat(fpath); !errors.Is(err, fs.ErrNotExist) {
t.Fatalf("Expected error to be FileNotFound, but got %v", err)
}
}

0 comments on commit 6575f3d

Please sign in to comment.