Skip to content

Commit 2a56eee

Browse files
authored
feat: CDK v1 delete (#1402)
1 parent e80e318 commit 2a56eee

File tree

3 files changed

+168
-1
lines changed

3 files changed

+168
-1
lines changed

cli/cmd/component.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import (
3232
"github.com/lacework/go-sdk/lwcomponent"
3333
)
3434

35-
const componentTypeAnnotation string = "component"
35+
const (
36+
componentTypeAnnotation string = "component"
37+
)
3638

3739
var (
3840
// componentsCmd represents the components command
@@ -467,6 +469,44 @@ func runComponentsDelete(_ *cobra.Command, args []string) (err error) {
467469
}
468470

469471
func deleteComponent(args []string) (err error) {
472+
var (
473+
componentName string = args[0]
474+
)
475+
476+
cli.StartProgress("Loading components Catalog...")
477+
478+
catalog, err := lwcomponent.NewCatalog(cli.LwApi, lwcomponent.NewStageTarGz)
479+
defer catalog.Cache()
480+
481+
cli.StopProgress()
482+
if err != nil {
483+
return errors.Wrap(err, "unable to load component Catalog")
484+
}
485+
486+
component, err := catalog.GetComponent(componentName)
487+
if err != nil {
488+
return err
489+
}
490+
491+
// @jon-stewart: TODO: component life cycle: cleanup
492+
493+
cli.StartProgress("Deleting component...")
494+
defer cli.StopProgress()
495+
496+
err = catalog.Delete(component)
497+
if err != nil {
498+
return
499+
}
500+
501+
cli.StopProgress()
502+
503+
cli.OutputChecklist(successIcon, "Component %s deleted\n", color.HiYellowString(component.Name))
504+
505+
msg := fmt.Sprintf(`\n- We will do better next time.\n\nDo you want to provide feedback?\nReach out to us at %s\n`,
506+
color.HiCyanString("[email protected]"))
507+
508+
cli.OutputHuman(msg)
509+
470510
return
471511
}
472512

lwcomponent/catalog.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,26 @@ func (c *Catalog) Install(component *CDKComponent) (err error) {
200200
return component.stage.Commit(componentDir)
201201
}
202202

203+
// Delete a CDKComponent
204+
//
205+
// Remove the Component install directory and all sub-directory. This function will not return an
206+
// error if the Component is not installed.
207+
func (c *Catalog) Delete(component *CDKComponent) (err error) {
208+
componentDir, err := componentDirectory(component.Name)
209+
if err != nil {
210+
return
211+
}
212+
213+
_, err = os.Stat(componentDir)
214+
if err != nil {
215+
return errors.Errorf("component not installed. Try running 'lacework component install %s'", component.Name)
216+
}
217+
218+
os.RemoveAll(componentDir)
219+
220+
return
221+
}
222+
203223
func NewCatalog(client *api.Client, stageConstructor StageConstructor) (*Catalog, error) {
204224
if stageConstructor == nil {
205225
return nil, errors.New("nil Catalog StageConstructor")

lwcomponent/catalog_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,113 @@ func TestCatalogInstall(t *testing.T) {
610610
})
611611
}
612612

613+
func TestCatalogDelete(t *testing.T) {
614+
var (
615+
apiComponentCount int = 4
616+
prefix string = "staging"
617+
version string = "1.0.0"
618+
)
619+
620+
fakeServer := lacework.MockServer()
621+
defer fakeServer.Close()
622+
623+
_, home := FakeHome()
624+
defer ResetHome(home)
625+
626+
fakeServer.MockAPI("Components", func(w http.ResponseWriter, r *http.Request) {
627+
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
628+
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
629+
})
630+
631+
client, _ := api.NewClient("catalog_test",
632+
api.WithToken("TOKEN"),
633+
api.WithURL(fakeServer.URL()))
634+
635+
t.Run("delete-installed", func(t *testing.T) {
636+
name := fmt.Sprintf("%s-1", prefix)
637+
638+
CreateLocalComponent(name, version, false)
639+
640+
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
641+
assert.NotNil(t, catalog)
642+
assert.Nil(t, err)
643+
644+
component, err := catalog.GetComponent(name)
645+
assert.NotNil(t, component)
646+
assert.Nil(t, err)
647+
648+
err = catalog.Delete(component)
649+
assert.Nil(t, err)
650+
651+
dir, _ := lwcomponent.CatalogCacheDir()
652+
dir = filepath.Join(dir, name)
653+
654+
_, err = os.Stat(dir)
655+
assert.NotNil(t, err)
656+
assert.True(t, os.IsNotExist(err))
657+
})
658+
659+
t.Run("delete-development", func(t *testing.T) {
660+
name := "delete-dev"
661+
662+
CreateLocalComponent(name, version, true)
663+
664+
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
665+
assert.NotNil(t, catalog)
666+
assert.Nil(t, err)
667+
668+
component, err := catalog.GetComponent(name)
669+
assert.NotNil(t, component)
670+
assert.Nil(t, err)
671+
672+
err = catalog.Delete(component)
673+
assert.Nil(t, err)
674+
675+
dir, _ := lwcomponent.CatalogCacheDir()
676+
dir = filepath.Join(dir, name)
677+
678+
_, err = os.Stat(dir)
679+
assert.NotNil(t, err)
680+
assert.True(t, os.IsNotExist(err))
681+
})
682+
683+
t.Run("delete-not-installed", func(t *testing.T) {
684+
name := fmt.Sprintf("%s-1", prefix)
685+
686+
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
687+
assert.NotNil(t, catalog)
688+
assert.Nil(t, err)
689+
690+
component, err := catalog.GetComponent(name)
691+
assert.NotNil(t, component)
692+
assert.Nil(t, err)
693+
694+
err = catalog.Delete(component)
695+
assert.NotNil(t, err)
696+
})
697+
698+
t.Run("delete-twice", func(t *testing.T) {
699+
name := fmt.Sprintf("%s-2", prefix)
700+
701+
CreateLocalComponent(name, version, false)
702+
703+
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
704+
assert.NotNil(t, catalog)
705+
assert.Nil(t, err)
706+
707+
component, err := catalog.GetComponent(name)
708+
assert.NotNil(t, component)
709+
assert.Nil(t, err)
710+
711+
err = catalog.Delete(component)
712+
assert.Nil(t, err)
713+
714+
err = catalog.Delete(component)
715+
assert.NotNil(t, err)
716+
})
717+
718+
}
719+
613720
func generateComponentsResponse(prefix string, count int) string {
614721
var (
615722
components = []api.LatestComponentVersion{}

0 commit comments

Comments
 (0)