You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by lu...@apache.org on 2022/02/22 03:49:11 UTC

[skywalking-infra-e2e] 01/01: support v2 separator

This is an automated email from the ASF dual-hosted git repository.

lujiajing pushed a commit to branch docker-compose-v2
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git

commit e3291f57a0a531c256f90efc33a2efd5710cdd6d
Author: Megrez Lu <lu...@gmail.com>
AuthorDate: Tue Feb 22 11:48:56 2022 +0800

    support v2 separator
---
 internal/components/setup/compose.go | 43 +++++++++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/internal/components/setup/compose.go b/internal/components/setup/compose.go
index 12b2d14..e7aa477 100644
--- a/internal/components/setup/compose.go
+++ b/internal/components/setup/compose.go
@@ -41,6 +41,19 @@ import (
 	"github.com/testcontainers/testcontainers-go"
 )
 
+const (
+	// SeparatorV1 is the separator used in docker-compose v1
+	// refer to https://github.com/docker/compose/blob/5becea4ca9f68875334c92f191a13482bcd6e5cf/compose/service.py#L1492-L1498
+	SeparatorV1 = "_"
+	// SeparatorV2 is the separator used in docker-compose v2
+	// refer to https://github.com/docker/compose/blob/981aea674d052ee1ab252f71c3ca1f9f8a7e32de/pkg/compose/convergence.go#L252-L257
+	SeparatorV2 = "-"
+)
+
+var (
+	containerNamePattern = regexp.MustCompile(".*_(?P<containerNum>[0-9]+)$")
+)
+
 // ComposeSetup sets up environment according to e2e.yaml.
 func ComposeSetup(e2eConfig *config.E2EConfig) error {
 	composeConfigPath := e2eConfig.Setup.GetFile()
@@ -122,7 +135,8 @@ func exposeComposeService(services []*ComposeService, cli *client.Client,
 
 	// find exported port and build env
 	for _, service := range services {
-		container, err := findContainer(cli, fmt.Sprintf("%s_%s", identity, getInstanceName(service.Name)))
+		serviceName, num := getInstanceName(service.Name)
+		container, err := findContainer(cli, identity, serviceName, num)
 		if err != nil {
 			return err
 		}
@@ -264,8 +278,13 @@ func getExpectPort(portConfig interface{}) (int, error) {
 	return 0, fmt.Errorf("unknown port information: %v", portConfig)
 }
 
-func findContainer(c *client.Client, instanceName string) (*types.Container, error) {
-	f := filters.NewArgs(filters.Arg("name", instanceName))
+func findContainer(c *client.Client, projectName, serviceName string, number int) (*types.Container, error) {
+	nameV1 := strings.Join([]string{projectName, serviceName, strconv.Itoa(number)}, SeparatorV1)
+	nameV2 := strings.Join([]string{projectName, serviceName, strconv.Itoa(number)}, SeparatorV2)
+	// filter either names
+	// 1) {project}_{service}_{number}
+	// 2) {project}-{service}-{number}
+	f := filters.NewArgs(filters.Arg("name", nameV1), filters.Arg("name", nameV2))
 	containerListOptions := types.ContainerListOptions{Filters: f}
 	containers, err := c.ContainerList(context.Background(), containerListOptions)
 	if err != nil {
@@ -273,20 +292,22 @@ func findContainer(c *client.Client, instanceName string) (*types.Container, err
 	}
 
 	if len(containers) == 0 {
-		return nil, fmt.Errorf("could not found container: %s", instanceName)
+		return nil, fmt.Errorf("could not found container: %s(docker-compose v1) or %s(docker-compose v2)", nameV1, nameV2)
 	}
 	return &containers[0], nil
 }
 
-func getInstanceName(serviceName string) string {
-	match, err := regexp.MatchString(".*_[0-9]+", serviceName)
-	if err != nil {
-		return serviceName
+func getInstanceName(serviceName string) (string, int) {
+	matches := containerNamePattern.FindStringSubmatch(serviceName)
+	if len(matches) == 0 {
+		return serviceName, 1
 	}
-	if !match {
-		return serviceName + "_1"
+	numberStr := matches[0]
+	number, err := strconv.Atoi(numberStr)
+	if err != nil {
+		return serviceName, 1
 	}
-	return serviceName
+	return serviceName, number
 }
 
 // hostPortCachedStrategy cached original target