diff --git a/README.md b/README.md index 5c424ba4..f4f66d12 100644 --- a/README.md +++ b/README.md @@ -300,6 +300,7 @@ TODO - filter/list box (list and delete) and template (list and validate) columns by provider + sorting - flaky issue zerolog `could not write event: write /home/ubuntu/.local/state/hck/hckctl-ubuntu.log: file already closed` * lab + - `command` cli description and example - in `create` add override e.g. `--input alias=parrot --input password=changeme --input vpn=htb-eu` - inputs should look for HCK_LAB_??? env var override if --input is not present before using default - verify optional merge/overrides diff --git a/internal/command/box/box.go b/internal/command/box/box.go index 1914db70..9b7f8d7b 100644 --- a/internal/command/box/box.go +++ b/internal/command/box/box.go @@ -2,6 +2,7 @@ package box import ( "fmt" + "github.com/MakeNowJust/heredoc" "github.com/pkg/errors" "github.com/rs/zerolog/log" diff --git a/internal/command/config/model_test.go b/internal/command/config/model_test.go index 0719704d..371ef595 100644 --- a/internal/command/config/model_test.go +++ b/internal/command/config/model_test.go @@ -1,12 +1,12 @@ package config import ( - "github.com/hckops/hckctl/pkg/util" "testing" "github.com/stretchr/testify/assert" "github.com/hckops/hckctl/pkg/common/model" + "github.com/hckops/hckctl/pkg/util" ) func TestNewConfig(t *testing.T) { diff --git a/pkg/box/docker/docker.go b/pkg/box/docker/docker.go index 85822018..06c13453 100644 --- a/pkg/box/docker/docker.go +++ b/pkg/box/docker/docker.go @@ -63,8 +63,8 @@ func (box *DockerBoxClient) createBox(opts *boxModel.CreateOptions) (*boxModel.B var hostname string var networkMode string if opts.NetworkInfo.Vpn != nil { - // set all networks configs on the sidecar to avoid options conflicts - if sidecarContainerId, err := box.docker.StartVpnSidecar(containerName, opts.NetworkInfo.Vpn, portConfig); err != nil { + // set all network configs on the sidecar to avoid option conflicts + if sidecarContainerId, err := box.docker.StartSidecarVpn(containerName, opts.NetworkInfo.Vpn, portConfig); err != nil { return nil, err } else { // fix conflicting options: hostname and the network mode @@ -130,8 +130,8 @@ func (box *DockerBoxClient) createBox(opts *boxModel.CreateOptions) (*boxModel.B HostConfig: hostConfig, NetworkingConfig: docker.BuildNetworkingConfig(networkName, networkId), // all on the same network WaitStatus: false, - CaptureInterrupt: false, // TODO ??? - OnContainerInterruptCallback: func(string) {}, // TODO ??? + CaptureInterrupt: false, + OnContainerInterruptCallback: func(string) {}, OnContainerCreateCallback: func(string) error { return nil }, OnContainerWaitCallback: func(string) error { return nil }, OnContainerStatusCallback: func(status string) { @@ -199,6 +199,7 @@ func (box *DockerBoxClient) execBox(template *boxModel.BoxV1, info *boxModel.Box } } + // restart main container restartsOpts := &docker.ContainerRestartOpts{ ContainerId: info.Id, OnRestartCallback: func(status string) { diff --git a/pkg/client/docker/builder.go b/pkg/client/docker/builder.go index 3c760f70..b547729a 100644 --- a/pkg/client/docker/builder.go +++ b/pkg/client/docker/builder.go @@ -2,12 +2,12 @@ package docker import ( "fmt" - "github.com/docker/docker/api/types/mount" "strings" "github.com/pkg/errors" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/network" "github.com/docker/go-connections/nat" diff --git a/pkg/client/docker/builder_test.go b/pkg/client/docker/builder_test.go index 3c2d1dbd..bb868156 100644 --- a/pkg/client/docker/builder_test.go +++ b/pkg/client/docker/builder_test.go @@ -1,12 +1,12 @@ package docker import ( - "github.com/docker/docker/api/types/mount" "testing" "github.com/stretchr/testify/assert" "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/network" "github.com/docker/go-connections/nat" ) diff --git a/pkg/client/docker/client.go b/pkg/client/docker/client.go index e80c899d..3f1ba13b 100644 --- a/pkg/client/docker/client.go +++ b/pkg/client/docker/client.go @@ -3,7 +3,6 @@ package docker import ( "context" "fmt" - "github.com/hckops/hckctl/pkg/util" "io" "os" "os/signal" @@ -23,6 +22,7 @@ import ( "golang.org/x/exp/maps" "github.com/hckops/hckctl/pkg/client/common" + "github.com/hckops/hckctl/pkg/util" ) func NewDockerClient() (*DockerClient, error) { diff --git a/pkg/client/docker/options.go b/pkg/client/docker/options.go index 32902767..86a1a219 100644 --- a/pkg/client/docker/options.go +++ b/pkg/client/docker/options.go @@ -5,6 +5,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" + commonModel "github.com/hckops/hckctl/pkg/common/model" ) diff --git a/pkg/common/docker/client.go b/pkg/common/docker/client.go index 3d36981a..fdd2735d 100644 --- a/pkg/common/docker/client.go +++ b/pkg/common/docker/client.go @@ -2,7 +2,6 @@ package docker import ( "fmt" - "github.com/hckops/hckctl/pkg/schema" "strings" "github.com/pkg/errors" @@ -10,6 +9,7 @@ import ( "github.com/hckops/hckctl/pkg/client/docker" commonModel "github.com/hckops/hckctl/pkg/common/model" "github.com/hckops/hckctl/pkg/event" + "github.com/hckops/hckctl/pkg/schema" ) type DockerCommonClient struct { @@ -73,7 +73,7 @@ func (common *DockerCommonClient) PullImageOffline(imageName string, onImagePull return nil } -func buildVpnSidecarName(containerName string) string { +func buildSidecarVpnName(containerName string) string { // expect valid name always tokens := strings.Split(containerName, "-") return fmt.Sprintf("%svpn-%s", commonModel.SidecarPrefixName, tokens[len(tokens)-1]) @@ -104,10 +104,10 @@ func (common *DockerCommonClient) GetSidecars(containerName string) ([]commonMod return sidecars, nil } -func (common *DockerCommonClient) StartVpnSidecar(mainContainerName string, vpnInfo *commonModel.VpnNetworkInfo, portConfig *docker.ContainerPortConfigOpts) (string, error) { +func (common *DockerCommonClient) StartSidecarVpn(mainContainerName string, vpnInfo *commonModel.VpnNetworkInfo, portConfig *docker.ContainerPortConfigOpts) (string, error) { // sidecarName - containerName := buildVpnSidecarName(mainContainerName) + containerName := buildSidecarVpnName(mainContainerName) // constants imageName := commonModel.SidecarVpnImageName @@ -115,8 +115,8 @@ func (common *DockerCommonClient) StartVpnSidecar(mainContainerName string, vpnI vpnConfigPath := "/usr/share/client.ovpn" if err := common.PullImageOffline(imageName, func() { - common.eventBus.Publish(newVpnSidecarConnectDockerEvent(vpnInfo.Name)) - common.eventBus.Publish(newVpnSidecarConnectDockerLoaderEvent(vpnInfo.Name)) + common.eventBus.Publish(newSidecarVpnConnectDockerEvent(vpnInfo.Name)) + common.eventBus.Publish(newSidecarVpnConnectDockerLoaderEvent(vpnInfo.Name)) }); err != nil { return "", err } @@ -150,7 +150,7 @@ func (common *DockerCommonClient) StartVpnSidecar(mainContainerName string, vpnI return common.Client.CopyFileToContainer(containerId, vpnInfo.LocalPath, vpnConfigPath) }, OnContainerStatusCallback: func(status string) { - common.eventBus.Publish(newVpnSidecarCreateStatusDockerEvent(status)) + common.eventBus.Publish(newSidecarVpnCreateStatusDockerEvent(status)) }, OnContainerStartCallback: func() {}, } @@ -159,7 +159,7 @@ func (common *DockerCommonClient) StartVpnSidecar(mainContainerName string, vpnI if err != nil { return "", err } - common.eventBus.Publish(newVpnSidecarCreateDockerEvent(containerName, containerId)) + common.eventBus.Publish(newSidecarVpnCreateDockerEvent(containerName, containerId)) return containerId, nil } diff --git a/pkg/common/docker/client_test.go b/pkg/common/docker/client_test.go index e7a1adfc..fa72ac5f 100644 --- a/pkg/common/docker/client_test.go +++ b/pkg/common/docker/client_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestBuildVpnSidecarName(t *testing.T) { +func TestBuildSidecarVpnName(t *testing.T) { expected := "sidecar-vpn-12345" - assert.Equal(t, expected, buildVpnSidecarName("aaa-bbb-ccc-ddd-12345")) + assert.Equal(t, expected, buildSidecarVpnName("aaa-bbb-ccc-ddd-12345")) } diff --git a/pkg/common/docker/events.go b/pkg/common/docker/events.go index c486f336..cc2021b8 100644 --- a/pkg/common/docker/events.go +++ b/pkg/common/docker/events.go @@ -2,6 +2,7 @@ package docker import ( "fmt" + "github.com/hckops/hckctl/pkg/common/model" "github.com/hckops/hckctl/pkg/event" ) @@ -47,18 +48,18 @@ func newImageRemoveIgnoreDockerEvent(imageId string, err error) *dockerCommonEve return &dockerCommonEvent{kind: event.LogWarning, value: fmt.Sprintf("image remove ignored: imageId=%s error=%v", imageId, err)} } -func newVpnSidecarCreateDockerEvent(containerName string, containerId string) *dockerCommonEvent { +func newSidecarVpnCreateDockerEvent(containerName string, containerId string) *dockerCommonEvent { return &dockerCommonEvent{kind: event.LogInfo, value: fmt.Sprintf("sidecar-vpn create: containerName=%s containerId=%s", containerName, containerId)} } -func newVpnSidecarCreateStatusDockerEvent(status string) *dockerCommonEvent { +func newSidecarVpnCreateStatusDockerEvent(status string) *dockerCommonEvent { return &dockerCommonEvent{kind: event.LogDebug, value: status} } -func newVpnSidecarConnectDockerEvent(vpnName string) *dockerCommonEvent { +func newSidecarVpnConnectDockerEvent(vpnName string) *dockerCommonEvent { return &dockerCommonEvent{kind: event.LogInfo, value: fmt.Sprintf("sidecar-vpn connect: vpnName=%s", vpnName)} } -func newVpnSidecarConnectDockerLoaderEvent(vpnName string) *dockerCommonEvent { +func newSidecarVpnConnectDockerLoaderEvent(vpnName string) *dockerCommonEvent { return &dockerCommonEvent{kind: event.LoaderUpdate, value: fmt.Sprintf("connecting to %s", vpnName)} } diff --git a/pkg/common/model/labels.go b/pkg/common/model/labels.go index 36d7b653..5f04b139 100644 --- a/pkg/common/model/labels.go +++ b/pkg/common/model/labels.go @@ -2,11 +2,12 @@ package model import ( "fmt" - "github.com/hckops/hckctl/pkg/schema" "path/filepath" "strings" "golang.org/x/exp/maps" + + "github.com/hckops/hckctl/pkg/schema" ) type Labels map[string]string diff --git a/pkg/lab/cloud/cloud.go b/pkg/lab/cloud/cloud.go index e6e66bdb..4ccf7be0 100644 --- a/pkg/lab/cloud/cloud.go +++ b/pkg/lab/cloud/cloud.go @@ -1,15 +1,15 @@ package cloud import ( - model2 "github.com/hckops/hckctl/pkg/common/model" "github.com/pkg/errors" v1 "github.com/hckops/hckctl/pkg/api/v1" "github.com/hckops/hckctl/pkg/client/ssh" - "github.com/hckops/hckctl/pkg/lab/model" + commonModel "github.com/hckops/hckctl/pkg/common/model" + labModel "github.com/hckops/hckctl/pkg/lab/model" ) -func newCloudLabClient(commonOpts *model.CommonLabOptions, cloudOpts *model2.CloudOptions) (*CloudLabClient, error) { +func newCloudLabClient(commonOpts *labModel.CommonLabOptions, cloudOpts *commonModel.CloudOptions) (*CloudLabClient, error) { commonOpts.EventBus.Publish(newInitCloudClientEvent()) clientConfig := &ssh.SshClientConfig{ @@ -29,7 +29,7 @@ func newCloudLabClient(commonOpts *model.CommonLabOptions, cloudOpts *model2.Clo }, nil } -func (lab *CloudLabClient) createLab(opts *model.CreateOptions) (*model.LabInfo, error) { +func (lab *CloudLabClient) createLab(opts *labModel.CreateOptions) (*labModel.LabInfo, error) { lab.eventBus.Publish(newApiCreateCloudLoaderEvent(lab.clientOpts.Address, opts.LabTemplate.Name)) request := v1.NewLabCreateRequest(lab.clientOpts.Version, opts.LabTemplate.Name, opts.Parameters) @@ -49,5 +49,5 @@ func (lab *CloudLabClient) createLab(opts *model.CreateOptions) (*model.LabInfo, labName := response.Body.Name lab.eventBus.Publish(newApiCreateCloudEvent(opts.LabTemplate.Name, labName)) - return &model.LabInfo{Id: labName, Name: labName}, nil + return &labModel.LabInfo{Id: labName, Name: labName}, nil } diff --git a/pkg/lab/cloud/events.go b/pkg/lab/cloud/events.go index f47aab6c..c1d604d8 100644 --- a/pkg/lab/cloud/events.go +++ b/pkg/lab/cloud/events.go @@ -2,6 +2,7 @@ package cloud import ( "fmt" + "github.com/hckops/hckctl/pkg/event" "github.com/hckops/hckctl/pkg/lab/model" ) diff --git a/pkg/task/docker/docker.go b/pkg/task/docker/docker.go index 07c72271..e77dc32a 100644 --- a/pkg/task/docker/docker.go +++ b/pkg/task/docker/docker.go @@ -37,7 +37,7 @@ func (task *DockerTaskClient) runTask(opts *taskModel.RunOptions) error { // vpn sidecar var networkMode string if opts.NetworkInfo.Vpn != nil { - if sidecarContainerId, err := task.docker.StartVpnSidecar(containerName, opts.NetworkInfo.Vpn, &docker.ContainerPortConfigOpts{}); err != nil { + if sidecarContainerId, err := task.docker.StartSidecarVpn(containerName, opts.NetworkInfo.Vpn, &docker.ContainerPortConfigOpts{}); err != nil { return err } else { networkMode = docker.ContainerNetworkMode(sidecarContainerId)