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.