From 906267f9cad215843adaa430424eebe729aef8c4 Mon Sep 17 00:00:00 2001 From: Sai Kiran <85323324+r00tu53r@users.noreply.github.com> Date: Wed, 22 Dec 2021 18:34:28 +1100 Subject: [PATCH 1/9] Set service naming per docker compoose version * Docker compose v1 (python) and v2 (Go) use different service naming conventions. Set service name based on the version. --- internal/compose/compose.go | 31 +++++++++++++++++-- internal/stack/logs.go | 6 +++- .../runners/system/servicedeployer/compose.go | 10 ++++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index fa6bdbdf0..4c77c3f80 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -22,6 +22,11 @@ import ( "github.com/elastic/elastic-package/internal/signal" ) +const ( + DockerComposeV1 = "v1" + DockerComposeV2 = "v2" +) + // Project represents a Docker Compose project. type Project struct { name string @@ -340,7 +345,29 @@ func (p *Project) runDockerComposeCmd(opts dockerComposeOptions) error { return cmd.Run() } +func (p *Project) DockerComposeVersion() (string, error) { + + const ( + v1marker = "docker-compose version 1" + ) + var b bytes.Buffer + + args := []string{"version"} + if err := p.runDockerComposeCmd(dockerComposeOptions{args: args, stdout: &b}); err != nil { + return "", errors.Wrap(err, "running Docker Compose version command failed") + } + versionStr := string(b.Bytes()) + if strings.Contains(versionStr, v1marker) { + return DockerComposeV1, nil + } + // v2marker: Docker Compose version v2.x.y + return DockerComposeV2, nil +} + // ContainerName method the container name for the service. -func (p *Project) ContainerName(serviceName string) string { - return fmt.Sprintf("%s_%s_1", p.name, serviceName) +func (p *Project) ContainerName(dcver, serviceName string) string { + if dcver == DockerComposeV1 { + return fmt.Sprintf("%s_%s_1", p.name, serviceName) + } + return fmt.Sprintf("%s-%s-1", p.name, serviceName) } diff --git a/internal/stack/logs.go b/internal/stack/logs.go index 896b201ad..e8c8577f5 100644 --- a/internal/stack/logs.go +++ b/internal/stack/logs.go @@ -43,7 +43,11 @@ func copyDockerInternalLogs(serviceName, outputPath string) error { } outputPath = filepath.Join(outputPath, serviceName+"-internal") - serviceContainer := p.ContainerName(serviceName) + dcver, err := p.DockerComposeVersion() + if err != nil { + return errors.Wrap(err, "failed to copy docker internal logs") + } + serviceContainer := p.ContainerName(dcver, serviceName) err = docker.Copy(serviceContainer, "/usr/share/elastic-agent/state/data/logs/default", outputPath) if err != nil { return errors.Wrap(err, "docker copy failed") diff --git a/internal/testrunner/runners/system/servicedeployer/compose.go b/internal/testrunner/runners/system/servicedeployer/compose.go index dacbff29c..6089797c6 100644 --- a/internal/testrunner/runners/system/servicedeployer/compose.go +++ b/internal/testrunner/runners/system/servicedeployer/compose.go @@ -93,16 +93,20 @@ func (d *DockerComposeServiceDeployer) SetUp(inCtxt ServiceContext) (DeployedSer return nil, errors.Wrap(err, "service is unhealthy") } + dcver, err := p.DockerComposeVersion() + if err != nil { + return nil, errors.Wrap(err, "unable to determine version") + } // Build service container name - outCtxt.Hostname = p.ContainerName(serviceName) + outCtxt.Hostname = p.ContainerName(dcver, serviceName) // Connect service network with stack network (for the purpose of metrics collection) - err = docker.ConnectToNetwork(p.ContainerName(serviceName), stack.Network()) + err = docker.ConnectToNetwork(p.ContainerName(dcver, serviceName), stack.Network()) if err != nil { return nil, errors.Wrapf(err, "can't attach service container to the stack network") } - logger.Debugf("adding service container %s internal ports to context", p.ContainerName(serviceName)) + logger.Debugf("adding service container %s internal ports to context", p.ContainerName(dcver, serviceName)) serviceComposeConfig, err := p.Config(compose.CommandOptions{ Env: []string{fmt.Sprintf("%s=%s", serviceLogsDirEnv, outCtxt.Logs.Folder.Local)}, }) From 3904cfbe4841b1866336a75ec0d0a65ddfbe1b36 Mon Sep 17 00:00:00 2001 From: Sai Kiran <85323324+r00tu53r@users.noreply.github.com> Date: Thu, 23 Dec 2021 20:50:48 +1100 Subject: [PATCH 2/9] refactor code, fix linter failure --- internal/compose/compose.go | 47 +++++++++++-------- internal/stack/logs.go | 6 +-- .../runners/system/servicedeployer/compose.go | 10 ++-- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 4c77c3f80..814a85422 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -14,6 +14,7 @@ import ( "strings" "time" + "github.com/Masterminds/semver" "github.com/pkg/errors" "gopkg.in/yaml.v3" @@ -22,14 +23,10 @@ import ( "github.com/elastic/elastic-package/internal/signal" ) -const ( - DockerComposeV1 = "v1" - DockerComposeV2 = "v2" -) - // Project represents a Docker Compose project. type Project struct { name string + dcMajorVersion string composeFilePaths []string } @@ -146,8 +143,9 @@ func NewProject(name string, paths ...string) (*Project, error) { } c := Project{ - name, - paths, + name: name, + dcMajorVersion: "", + composeFilePaths: paths, } return &c, nil @@ -345,28 +343,37 @@ func (p *Project) runDockerComposeCmd(opts dockerComposeOptions) error { return cmd.Run() } -func (p *Project) DockerComposeVersion() (string, error) { +func (p *Project) dockerComposeVersion() (*semver.Version, error) { - const ( - v1marker = "docker-compose version 1" - ) var b bytes.Buffer - args := []string{"version"} + args := []string{ + "version", + "--short", + } if err := p.runDockerComposeCmd(dockerComposeOptions{args: args, stdout: &b}); err != nil { - return "", errors.Wrap(err, "running Docker Compose version command failed") + return nil, errors.Wrap(err, "running Docker Compose version command failed") } - versionStr := string(b.Bytes()) - if strings.Contains(versionStr, v1marker) { - return DockerComposeV1, nil + dcVersion := b.String() + ver, err := semver.NewVersion(dcVersion) + if err != nil { + return nil, errors.Wrapf(err, "docker compose version not a valid semver %s", dcVersion) } - // v2marker: Docker Compose version v2.x.y - return DockerComposeV2, nil + return ver, nil } // ContainerName method the container name for the service. -func (p *Project) ContainerName(dcver, serviceName string) string { - if dcver == DockerComposeV1 { +func (p *Project) ContainerName(serviceName string) string { + if p.dcMajorVersion == "" { + ver, err := p.dockerComposeVersion() + if err != nil { + logger.Errorf("Unable to determine docker-compose version: %v. Defaulting to 1.x", err) + p.dcMajorVersion = "1" + } else { + p.dcMajorVersion = strconv.FormatInt(ver.Major(), 10) + } + } + if p.dcMajorVersion == "1" { return fmt.Sprintf("%s_%s_1", p.name, serviceName) } return fmt.Sprintf("%s-%s-1", p.name, serviceName) diff --git a/internal/stack/logs.go b/internal/stack/logs.go index e8c8577f5..896b201ad 100644 --- a/internal/stack/logs.go +++ b/internal/stack/logs.go @@ -43,11 +43,7 @@ func copyDockerInternalLogs(serviceName, outputPath string) error { } outputPath = filepath.Join(outputPath, serviceName+"-internal") - dcver, err := p.DockerComposeVersion() - if err != nil { - return errors.Wrap(err, "failed to copy docker internal logs") - } - serviceContainer := p.ContainerName(dcver, serviceName) + serviceContainer := p.ContainerName(serviceName) err = docker.Copy(serviceContainer, "/usr/share/elastic-agent/state/data/logs/default", outputPath) if err != nil { return errors.Wrap(err, "docker copy failed") diff --git a/internal/testrunner/runners/system/servicedeployer/compose.go b/internal/testrunner/runners/system/servicedeployer/compose.go index 6089797c6..dacbff29c 100644 --- a/internal/testrunner/runners/system/servicedeployer/compose.go +++ b/internal/testrunner/runners/system/servicedeployer/compose.go @@ -93,20 +93,16 @@ func (d *DockerComposeServiceDeployer) SetUp(inCtxt ServiceContext) (DeployedSer return nil, errors.Wrap(err, "service is unhealthy") } - dcver, err := p.DockerComposeVersion() - if err != nil { - return nil, errors.Wrap(err, "unable to determine version") - } // Build service container name - outCtxt.Hostname = p.ContainerName(dcver, serviceName) + outCtxt.Hostname = p.ContainerName(serviceName) // Connect service network with stack network (for the purpose of metrics collection) - err = docker.ConnectToNetwork(p.ContainerName(dcver, serviceName), stack.Network()) + err = docker.ConnectToNetwork(p.ContainerName(serviceName), stack.Network()) if err != nil { return nil, errors.Wrapf(err, "can't attach service container to the stack network") } - logger.Debugf("adding service container %s internal ports to context", p.ContainerName(dcver, serviceName)) + logger.Debugf("adding service container %s internal ports to context", p.ContainerName(serviceName)) serviceComposeConfig, err := p.Config(compose.CommandOptions{ Env: []string{fmt.Sprintf("%s=%s", serviceLogsDirEnv, outCtxt.Logs.Folder.Local)}, }) From dc8dd27ad6533e059cf3a2e28b4b29dd596d3878 Mon Sep 17 00:00:00 2001 From: Sai Kiran <85323324+r00tu53r@users.noreply.github.com> Date: Thu, 23 Dec 2021 22:22:11 +1100 Subject: [PATCH 3/9] refactor --- internal/compose/compose.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 814a85422..80616cb12 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -26,7 +26,7 @@ import ( // Project represents a Docker Compose project. type Project struct { name string - dcMajorVersion string + dockerComposeV1 bool composeFilePaths []string } @@ -144,10 +144,17 @@ func NewProject(name string, paths ...string) (*Project, error) { c := Project{ name: name, - dcMajorVersion: "", + dockerComposeV1: true, composeFilePaths: paths, } - + ver, err := c.dockerComposeVersion() + if err != nil { + logger.Errorf("Unable to determine docker-compose version: %v. Defaulting to 1.x", err) + return &c, nil + } + if ver.Major() > 1 { + c.dockerComposeV1 = false + } return &c, nil } @@ -355,7 +362,7 @@ func (p *Project) dockerComposeVersion() (*semver.Version, error) { return nil, errors.Wrap(err, "running Docker Compose version command failed") } dcVersion := b.String() - ver, err := semver.NewVersion(dcVersion) + ver, err := semver.NewVersion(strings.Trim(dcVersion, "\n")) if err != nil { return nil, errors.Wrapf(err, "docker compose version not a valid semver %s", dcVersion) } @@ -364,16 +371,7 @@ func (p *Project) dockerComposeVersion() (*semver.Version, error) { // ContainerName method the container name for the service. func (p *Project) ContainerName(serviceName string) string { - if p.dcMajorVersion == "" { - ver, err := p.dockerComposeVersion() - if err != nil { - logger.Errorf("Unable to determine docker-compose version: %v. Defaulting to 1.x", err) - p.dcMajorVersion = "1" - } else { - p.dcMajorVersion = strconv.FormatInt(ver.Major(), 10) - } - } - if p.dcMajorVersion == "1" { + if p.dockerComposeV1 { return fmt.Sprintf("%s_%s_1", p.name, serviceName) } return fmt.Sprintf("%s-%s-1", p.name, serviceName) From 35ba5cfa44bc2ba1245e18980626fe4002c7b56e Mon Sep 17 00:00:00 2001 From: Marcin Tojek <mtojek@users.noreply.github.com> Date: Thu, 23 Dec 2021 13:14:59 +0100 Subject: [PATCH 4/9] Update internal/compose/compose.go --- internal/compose/compose.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 80616cb12..985e2aa98 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -364,7 +364,7 @@ func (p *Project) dockerComposeVersion() (*semver.Version, error) { dcVersion := b.String() ver, err := semver.NewVersion(strings.Trim(dcVersion, "\n")) if err != nil { - return nil, errors.Wrapf(err, "docker compose version not a valid semver %s", dcVersion) + return nil, errors.Wrapf(err, "docker compose version is not a valid semver (value: %s)", dcVersion) } return ver, nil } From 8a0f3377f724de20a77bfb61831a2713ed941685 Mon Sep 17 00:00:00 2001 From: Sai Kiran <85323324+r00tu53r@users.noreply.github.com> Date: Fri, 24 Dec 2021 15:04:13 +1100 Subject: [PATCH 5/9] remove extraneous newline --- internal/compose/compose.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 985e2aa98..2293ad709 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -351,7 +351,6 @@ func (p *Project) runDockerComposeCmd(opts dockerComposeOptions) error { } func (p *Project) dockerComposeVersion() (*semver.Version, error) { - var b bytes.Buffer args := []string{ From a9710feea9bcff365b36c4deddc9913a949d7f6c Mon Sep 17 00:00:00 2001 From: mtojek <marcin.tojek@elastic.co> Date: Fri, 24 Dec 2021 11:20:06 +0100 Subject: [PATCH 6/9] Adjust Project{} --- internal/compose/compose.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 2293ad709..8035d831b 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -144,16 +144,17 @@ func NewProject(name string, paths ...string) (*Project, error) { c := Project{ name: name, - dockerComposeV1: true, composeFilePaths: paths, } ver, err := c.dockerComposeVersion() if err != nil { logger.Errorf("Unable to determine docker-compose version: %v. Defaulting to 1.x", err) + c.dockerComposeV1 = true return &c, nil } - if ver.Major() > 1 { - c.dockerComposeV1 = false + if ver.Major() == 1 { + logger.Debugf("Determined docker-compose version: %v, the tool will use Compose V1", err) + c.dockerComposeV1 = true } return &c, nil } From 201fd2c6f48907afa16b4aac87beeb84931463e0 Mon Sep 17 00:00:00 2001 From: mtojek <marcin.tojek@elastic.co> Date: Fri, 24 Dec 2021 11:25:50 +0100 Subject: [PATCH 7/9] Fix --- internal/compose/compose.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 8035d831b..6d7e48001 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -142,18 +142,18 @@ func NewProject(name string, paths ...string) (*Project, error) { } } - c := Project{ - name: name, - composeFilePaths: paths, - } + var c Project + c.name = name + c.composeFilePaths = paths + ver, err := c.dockerComposeVersion() if err != nil { - logger.Errorf("Unable to determine docker-compose version: %v. Defaulting to 1.x", err) + logger.Errorf("Unable to determine Docker Compose version: %v. Defaulting to 1.x", err) c.dockerComposeV1 = true return &c, nil } if ver.Major() == 1 { - logger.Debugf("Determined docker-compose version: %v, the tool will use Compose V1", err) + logger.Debugf("Determined Docker Compose version: %v, the tool will use Compose V1", err) c.dockerComposeV1 = true } return &c, nil From 27c58bef250fb7d89075f60c76e97710ef3956a1 Mon Sep 17 00:00:00 2001 From: mtojek <marcin.tojek@elastic.co> Date: Fri, 24 Dec 2021 11:27:24 +0100 Subject: [PATCH 8/9] nit --- internal/compose/compose.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 6d7e48001..07c2948ef 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -26,8 +26,9 @@ import ( // Project represents a Docker Compose project. type Project struct { name string - dockerComposeV1 bool composeFilePaths []string + + dockerComposeV1 bool } // Config represents a Docker Compose configuration file. From 42416ef99e205b229f09575488ed2669843a2f89 Mon Sep 17 00:00:00 2001 From: mtojek <marcin.tojek@elastic.co> Date: Fri, 24 Dec 2021 11:35:30 +0100 Subject: [PATCH 9/9] Fix: make format --- internal/compose/compose.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/compose/compose.go b/internal/compose/compose.go index 07c2948ef..caed29fa8 100644 --- a/internal/compose/compose.go +++ b/internal/compose/compose.go @@ -28,7 +28,7 @@ type Project struct { name string composeFilePaths []string - dockerComposeV1 bool + dockerComposeV1 bool } // Config represents a Docker Compose configuration file.