diff --git a/cmd/kndp/environment/environment.go b/cmd/kndp/environment/environment.go index 20d495c..1cc7924 100644 --- a/cmd/kndp/environment/environment.go +++ b/cmd/kndp/environment/environment.go @@ -5,4 +5,6 @@ type Cmd struct { Delete deleteCmd `cmd:"" help:"Delete an Environment"` Copy copyCmd `cmd:"" help:"Copy an Environment to another destination context"` List listCmd `cmd:"" help:"List of Environments"` + Stop stopCmd `cmd:"" help:"Stop an Environment"` + Start startCmd `cmd:"" help:"Start an Environment"` } diff --git a/cmd/kndp/environment/start.go b/cmd/kndp/environment/start.go new file mode 100644 index 0000000..a802f71 --- /dev/null +++ b/cmd/kndp/environment/start.go @@ -0,0 +1,16 @@ +package environment + +import ( + "context" + + "github.com/charmbracelet/log" + "github.com/kndpio/kndp/internal/environment" +) + +type startCmd struct { + Name string `arg:"" required:"" help:"Name of environment."` +} + +func (c *startCmd) Run(ctx context.Context, logger *log.Logger) error { + return environment.Start(ctx, c.Name, logger) +} diff --git a/cmd/kndp/environment/stop.go b/cmd/kndp/environment/stop.go new file mode 100644 index 0000000..f8e0696 --- /dev/null +++ b/cmd/kndp/environment/stop.go @@ -0,0 +1,16 @@ +package environment + +import ( + "context" + + "github.com/charmbracelet/log" + "github.com/kndpio/kndp/internal/environment" +) + +type stopCmd struct { + Name string `arg:"" required:"" help:"Name of environment."` +} + +func (c *stopCmd) Run(ctx context.Context, logger *log.Logger) error { + return environment.Stop(ctx, c.Name, logger) +} diff --git a/go.mod b/go.mod index 1d2b474..2d75102 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,8 @@ go 1.21.4 require ( github.com/Masterminds/semver/v3 v3.2.1 + github.com/docker/docker v24.0.7+incompatible + github.com/pkg/errors v0.9.1 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.29.1 k8s.io/apiextensions-apiserver v0.29.0 @@ -24,6 +26,7 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect github.com/atotto/clipboard v0.1.4 // indirect @@ -43,7 +46,6 @@ require ( github.com/distribution/reference v0.5.0 // indirect github.com/docker/cli v24.0.6+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect @@ -127,7 +129,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/posener/complete v1.2.3 // indirect github.com/prometheus/client_golang v1.18.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -161,6 +162,7 @@ require ( golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.16.1 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect diff --git a/internal/environment/environment.go b/internal/environment/environment.go index 5ea53f5..a4d80b6 100644 --- a/internal/environment/environment.go +++ b/internal/environment/environment.go @@ -7,6 +7,9 @@ import ( "regexp" "strings" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + docker "github.com/docker/docker/client" "github.com/kndpio/kndp/internal/engine" "github.com/kndpio/kndp/internal/kube" "github.com/kndpio/kndp/internal/namespace" @@ -150,3 +153,49 @@ func ListEnvironments(logger *log.Logger, tableData pterm.TableData) pterm.Table } return tableData } + +// Stop Environment +func Stop(ctx context.Context, name string, logger *log.Logger) error { + dockerClient, err := docker.NewClientWithOpts(docker.FromEnv) + if err != nil { + return err + } + containers, err := dockerClient.ContainerList(ctx, types.ContainerListOptions{All: true}) + if err != nil { + return err + } + for _, c := range containers { + if strings.Contains(c.Names[0], name) { + containerID := c.ID + err := dockerClient.ContainerStop(ctx, containerID, container.StopOptions{}) + if err != nil { + return err + } + } + } + logger.Info("Environment stopped successfully.") + return nil +} + +// Start Environment +func Start(ctx context.Context, name string, logger *log.Logger) error { + dockerClient, err := docker.NewClientWithOpts(docker.FromEnv) + if err != nil { + return err + } + containers, err := dockerClient.ContainerList(ctx, types.ContainerListOptions{All: true}) + if err != nil { + return err + } + for _, c := range containers { + if strings.Contains(c.Names[0], name) { + containerID := c.ID + err := dockerClient.ContainerStart(ctx, containerID, types.ContainerStartOptions{}) + if err != nil { + return err + } + } + } + logger.Info("Environment started successfully.") + return nil +}