From 846c0f88c24e682f7122df0adae15a83bc5952f0 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Tue, 4 May 2021 14:25:19 -0400 Subject: [PATCH 1/6] Abstract out deployment Provides ability to plugin different deployment backends for use in testing. Current deployment backends supported are "docker" and "kubernetes" Signed-off-by: Adam Stokes <51892+adam-stokes@users.noreply.github.com> --- e2e/_suites/fleet/fleet.go | 27 +++-- e2e/_suites/fleet/ingest_manager_test.go | 81 +++++---------- internal/common/defaults.go | 3 + internal/deploy/base.go | 39 ++++++++ internal/deploy/docker.go | 104 ++++++++++++++++++++ internal/deploy/kubernetes.go | 119 +++++++++++++++++++++++ internal/docker/docker.go | 15 ++- internal/kibana/policies.go | 5 +- internal/kibana/server.go | 6 +- 9 files changed, 322 insertions(+), 77 deletions(-) create mode 100644 internal/deploy/base.go create mode 100644 internal/deploy/docker.go create mode 100644 internal/deploy/kubernetes.go diff --git a/e2e/_suites/fleet/fleet.go b/e2e/_suites/fleet/fleet.go index 014f87f5d5..72a1e4cb95 100644 --- a/e2e/_suites/fleet/fleet.go +++ b/e2e/_suites/fleet/fleet.go @@ -7,14 +7,16 @@ package main import ( "context" "fmt" - "github.com/google/uuid" "strings" "time" + "github.com/google/uuid" + "github.com/cenkalti/backoff/v4" "github.com/cucumber/godog" "github.com/elastic/e2e-testing/internal/common" "github.com/elastic/e2e-testing/internal/compose" + "github.com/elastic/e2e-testing/internal/deploy" "github.com/elastic/e2e-testing/internal/docker" "github.com/elastic/e2e-testing/internal/elasticsearch" "github.com/elastic/e2e-testing/internal/installer" @@ -45,6 +47,7 @@ type FleetTestSuite struct { PolicyUpdatedAt string // the moment the policy was updated Version string // current elastic-agent version kibanaClient *kibana.Client + deployer deploy.Deployment // fleet server FleetServerHostname string // hostname of the fleet server. If empty, it means the agent is the first one, bootstrapping fleet server // date controls for queries @@ -54,13 +57,11 @@ type FleetTestSuite struct { // afterScenario destroys the state created by a scenario func (fts *FleetTestSuite) afterScenario() { - - serviceName := common.ElasticAgentServiceName - serviceManager := compose.NewServiceManager() + agentInstaller := fts.getInstaller() + serviceName := fts.getServiceName(agentInstaller) if !fts.StandAlone { agentInstaller := fts.getInstaller() - serviceName = fts.getServiceName(agentInstaller) if log.IsLevelEnabled(log.DebugLevel) { err := agentInstaller.PrintLogsFn(fts.Hostname) @@ -92,7 +93,7 @@ func (fts *FleetTestSuite) afterScenario() { developerMode := shell.GetEnvBool("DEVELOPER_MODE") if !developerMode { - _ = serviceManager.RemoveServicesFromCompose(context.Background(), common.FleetProfileName, []string{serviceName}, common.ProfileEnv) + _ = fts.deployer.Remove([]string{common.FleetProfileName, serviceName}, common.ProfileEnv) } else { log.WithField("service", serviceName).Info("Because we are running in development mode, the service won't be stopped") } @@ -105,7 +106,7 @@ func (fts *FleetTestSuite) afterScenario() { }).Warn("The enrollment token could not be deleted") } - fts.kibanaClient.DeleteAllPolicies(fts.FleetServerPolicy) + fts.kibanaClient.DeleteAllPolicies() // clean up fields fts.CurrentTokenID = "" @@ -350,8 +351,7 @@ func (fts *FleetTestSuite) anAgentIsDeployedToFleetWithInstallerAndFleetServer(i fts.CurrentToken = enrollmentKey.APIKey fts.CurrentTokenID = enrollmentKey.ID - var fleetConfig *kibana.FleetConfig - fleetConfig, err = deployAgentToFleet(agentInstaller, containerName, fts.CurrentToken, fts.FleetServerHostname) + _, err = deployAgentToFleet(agentInstaller, fts.deployer, containerName, fts.CurrentToken, fts.FleetServerHostname) if err != nil { return err @@ -1005,7 +1005,7 @@ func (fts *FleetTestSuite) anAttemptToEnrollANewAgentFails() error { containerName := fts.getContainerName(agentInstaller, 2) // name of the new container - fleetConfig, err := deployAgentToFleet(agentInstaller, containerName, fts.CurrentToken, fts.FleetServerHostname) + fleetConfig, err := deployAgentToFleet(agentInstaller, fts.deployer, containerName, fts.CurrentToken, fts.FleetServerHostname) // the installation process for TAR includes the enrollment if agentInstaller.InstallerType != "tar" { if err != nil { @@ -1143,7 +1143,7 @@ func (fts *FleetTestSuite) checkDataStream() error { return err } -func deployAgentToFleet(agentInstaller installer.ElasticAgentInstaller, containerName string, token string, fleetServerHost string) (*kibana.FleetConfig, error) { +func deployAgentToFleet(agentInstaller installer.ElasticAgentInstaller, deployer deploy.Deployment, containerName string, token string, fleetServerHost string) (*kibana.FleetConfig, error) { profile := agentInstaller.Profile // name of the runtime dependencies compose file service := agentInstaller.Service // name of the service serviceTag := agentInstaller.Tag // docker tag of the service @@ -1158,9 +1158,8 @@ func deployAgentToFleet(agentInstaller installer.ElasticAgentInstaller, containe common.ProfileEnv[envVarsPrefix+"AgentBinarySrcPath"] = agentInstaller.BinaryPath common.ProfileEnv[envVarsPrefix+"AgentBinaryTargetPath"] = "/" + agentInstaller.Name - serviceManager := compose.NewServiceManager() - - err := serviceManager.AddServicesToCompose(context.Background(), profile, []string{service}, common.ProfileEnv) + services := []string{profile, service} + err := deployer.Add(services, common.ProfileEnv) if err != nil { log.WithFields(log.Fields{ "service": service, diff --git a/e2e/_suites/fleet/ingest_manager_test.go b/e2e/_suites/fleet/ingest_manager_test.go index e87149a15f..726787ddf0 100644 --- a/e2e/_suites/fleet/ingest_manager_test.go +++ b/e2e/_suites/fleet/ingest_manager_test.go @@ -7,16 +7,14 @@ package main import ( "context" "os" - "strings" "time" "github.com/cucumber/godog" "github.com/cucumber/messages-go/v10" "github.com/elastic/e2e-testing/cli/config" "github.com/elastic/e2e-testing/internal/common" - "github.com/elastic/e2e-testing/internal/compose" + "github.com/elastic/e2e-testing/internal/deploy" "github.com/elastic/e2e-testing/internal/docker" - "github.com/elastic/e2e-testing/internal/elasticsearch" "github.com/elastic/e2e-testing/internal/installer" "github.com/elastic/e2e-testing/internal/kibana" "github.com/elastic/e2e-testing/internal/shell" @@ -34,6 +32,8 @@ func setUpSuite() { log.Error(err) os.Exit(1) } + + common.Provider = shell.GetEnv("PROVIDER", common.Provider) developerMode := shell.GetEnvBool("DEVELOPER_MODE") if developerMode { log.Info("Running in Developer mode 💻: runtime dependencies between different test runs will be reused to speed up dev cycle") @@ -87,6 +87,7 @@ func setUpSuite() { imts = IngestManagerTestSuite{ Fleet: &FleetTestSuite{ kibanaClient: kibanaClient, + deployer: deploy.New(common.Provider), Installers: map[string]installer.ElasticAgentInstaller{}, // do not pre-initialise the map }, } @@ -109,80 +110,48 @@ func InitializeIngestManagerTestScenario(ctx *godog.ScenarioContext) { } func InitializeIngestManagerTestSuite(ctx *godog.TestSuiteContext) { - serviceManager := compose.NewServiceManager() + developerMode := shell.GetEnvBool("DEVELOPER_MODE") ctx.BeforeSuite(func() { setUpSuite() - log.Trace("Installing Fleet runtime dependencies") - - common.ProfileEnv = map[string]string{ - "kibanaVersion": common.KibanaVersion, - "stackVersion": common.StackVersion, - } + log.Trace("Bootstrapping Fleet Server") if !shell.GetEnvBool("SKIP_PULL") { log.Info("Pulling Docker images...") docker.PullImages(common.StackVersion, common.AgentVersion, common.KibanaVersion) } - common.ProfileEnv["kibanaDockerNamespace"] = "kibana" - if strings.HasPrefix(common.KibanaVersion, "pr") || utils.IsCommit(common.KibanaVersion) { - // because it comes from a PR - common.ProfileEnv["kibanaDockerNamespace"] = "observability-ci" - } - - profile := common.FleetProfileName - err := serviceManager.RunCompose(context.Background(), true, []string{profile}, common.ProfileEnv) - if err != nil { - log.WithFields(log.Fields{ - "profile": profile, - "error": err.Error(), - }).Fatal("Could not run the runtime dependencies for the profile.") - } - - minutesToBeHealthy := time.Duration(common.TimeoutFactor) * time.Minute - healthy, err := elasticsearch.WaitForElasticsearch(context.Background(), minutesToBeHealthy) - if !healthy { - log.WithFields(log.Fields{ - "error": err, - "minutes": minutesToBeHealthy, - }).Fatal("The Elasticsearch cluster could not get the healthy status") - } + deployer := deploy.New(common.Provider) + deployer.Bootstrap(func() error { + kibanaClient, err := kibana.NewClient() + if err != nil { + log.WithField("error", err).Fatal("Unable to create kibana client") + } + err = kibanaClient.WaitForFleet() + if err != nil { + log.WithField("error", err).Fatal("Fleet could not be initialized") + } + return nil + }) - kibanaClient, err := kibana.NewClient() + serviceManifest, err := deployer.Inspect("fleet-server") if err != nil { - log.WithFields(log.Fields{ - "error": err, - }).Fatal("Unable to create kibana client") - } - - healthyKibana, err := kibanaClient.WaitForReady(minutesToBeHealthy) - if !healthyKibana { - log.WithFields(log.Fields{ - "error": err, - "minutes": minutesToBeHealthy, - }).Fatal("The Kibana instance could not get the healthy status") + log.WithField("manifest", serviceManifest).Fatal("Unable to grab service manifest") } + imts.Fleet.FleetServerHostname = serviceManifest.Hostname - imts.Fleet.setup() + log.WithField("manifest", serviceManifest).Trace("Discovered Fleet Server hostname") + imts.Fleet.Version = common.AgentVersionBase imts.Fleet.RuntimeDependenciesStartDate = time.Now().UTC() }) ctx.AfterSuite(func() { - developerMode := shell.GetEnvBool("DEVELOPER_MODE") if !developerMode { log.Debug("Destroying Fleet runtime dependencies") - profile := common.FleetProfileName - - err := serviceManager.StopCompose(context.Background(), true, []string{profile}) - if err != nil { - log.WithFields(log.Fields{ - "error": err, - "profile": profile, - }).Warn("Could not destroy the runtime dependencies for the profile.") - } + deployer := deploy.New(common.Provider) + deployer.Destroy() } installers := imts.Fleet.Installers diff --git a/internal/common/defaults.go b/internal/common/defaults.go index 664f0f99e4..bf43f6d20a 100644 --- a/internal/common/defaults.go +++ b/internal/common/defaults.go @@ -44,3 +44,6 @@ var KibanaVersion = AgentVersionBase // ProfileEnv is the environment to be applied to any execution // affecting the runtime dependencies (or profile) var ProfileEnv map[string]string + +// Provider is the deployment provider used, currently docker is supported +var Provider = "docker" diff --git a/internal/deploy/base.go b/internal/deploy/base.go new file mode 100644 index 0000000000..53da675c2f --- /dev/null +++ b/internal/deploy/base.go @@ -0,0 +1,39 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package deploy + +import ( + "strings" +) + +// Deployment interface for operations dealing with deployments of the bits +// required for testing +type Deployment interface { + Add(services []string, env map[string]string) error // adds a service to deployment + Bootstrap(waitCB func() error) error // will bootstrap or reuse existing cluster if kubernetes is selected + Destroy() error // Teardown deployment + ExecIn(service string, cmd []string) (string, error) // Execute arbitrary commands in service + Inspect(service string) (*ServiceManifest, error) // inspects service + Remove(services []string, env map[string]string) error // Removes services from deployment +} + +// ServiceManifest information about a service in a deployment +type ServiceManifest struct { + ID string + Name string + Connection string // a string representing how to connect to service + Hostname string +} + +// New creates a new deployment +func New(provider string) Deployment { + if strings.EqualFold(provider, "docker") { + return newDockerDeploy() + } + if strings.EqualFold(provider, "kubernetes") { + return newK8sDeploy() + } + return nil +} diff --git a/internal/deploy/docker.go b/internal/deploy/docker.go new file mode 100644 index 0000000000..1eb7ba45e3 --- /dev/null +++ b/internal/deploy/docker.go @@ -0,0 +1,104 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package deploy + +import ( + "context" + "strings" + + "github.com/elastic/e2e-testing/internal/common" + "github.com/elastic/e2e-testing/internal/compose" + "github.com/elastic/e2e-testing/internal/docker" + "github.com/elastic/e2e-testing/internal/utils" + log "github.com/sirupsen/logrus" +) + +// DockerDeploymentManifest deploy manifest for docker +type dockerDeploymentManifest struct { + Context context.Context +} + +func newDockerDeploy() Deployment { + return &dockerDeploymentManifest{Context: context.Background()} +} + +// Add adds services deployment +func (c *dockerDeploymentManifest) Add(services []string, env map[string]string) error { + serviceManager := compose.NewServiceManager() + + return serviceManager.AddServicesToCompose(c.Context, services[0], services[1:], env) +} + +// Bootstrap sets up environment with docker compose +func (c *dockerDeploymentManifest) Bootstrap(waitCB func() error) error { + serviceManager := compose.NewServiceManager() + common.ProfileEnv = map[string]string{ + "kibanaVersion": common.KibanaVersion, + "stackVersion": common.StackVersion, + } + + common.ProfileEnv["kibanaDockerNamespace"] = "kibana" + if strings.HasPrefix(common.KibanaVersion, "pr") || utils.IsCommit(common.KibanaVersion) { + // because it comes from a PR + common.ProfileEnv["kibanaDockerNamespace"] = "observability-ci" + } + + profile := common.FleetProfileName + err := serviceManager.RunCompose(c.Context, true, []string{profile}, common.ProfileEnv) + if err != nil { + log.WithFields(log.Fields{ + "profile": profile, + "error": err.Error(), + }).Fatal("Could not run the runtime dependencies for the profile.") + } + err = waitCB() + if err != nil { + return err + } + return nil +} + +// Destroy teardown docker environment +func (c *dockerDeploymentManifest) Destroy() error { + serviceManager := compose.NewServiceManager() + err := serviceManager.StopCompose(c.Context, true, []string{common.FleetProfileName}) + if err != nil { + log.WithFields(log.Fields{ + "error": err, + "profile": common.FleetProfileName, + }).Fatal("Could not destroy the runtime dependencies for the profile.") + } + return nil +} + +// ExecIn execute command in service +func (c *dockerDeploymentManifest) ExecIn(service string, cmd []string) (string, error) { + output, err := docker.ExecCommandIntoContainer(c.Context, service, "root", cmd) + if err != nil { + return "", err + } + return output, nil +} + +// Inspect inspects a service +func (c *dockerDeploymentManifest) Inspect(service string) (*ServiceManifest, error) { + inspect, err := docker.InspectContainer(service) + if err != nil { + return &ServiceManifest{}, err + } + return &ServiceManifest{ + ID: inspect.ID, + Name: strings.TrimPrefix(inspect.Name, "/"), + Connection: service, + Hostname: inspect.NetworkSettings.Networks["fleet_default"].Aliases[0], + }, nil +} + +// Remove remove services from deployment +func (c *dockerDeploymentManifest) Remove(services []string, env map[string]string) error { + serviceManager := compose.NewServiceManager() + + return serviceManager.RemoveServicesFromCompose(c.Context, services[0], services[1:], env) +} diff --git a/internal/deploy/kubernetes.go b/internal/deploy/kubernetes.go new file mode 100644 index 0000000000..3b46ab5ab2 --- /dev/null +++ b/internal/deploy/kubernetes.go @@ -0,0 +1,119 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package deploy + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "github.com/elastic/e2e-testing/internal/kubernetes" + "github.com/pkg/errors" +) + +var cluster kubernetes.Cluster +var kubectl kubernetes.Control + +// KubernetesDeploymentManifest deploy manifest for kubernetes +type kubernetesDeploymentManifest struct { + Context context.Context +} + +func newK8sDeploy() Deployment { + return &kubernetesDeploymentManifest{Context: context.Background()} +} + +// Add adds services deployment +func (c *kubernetesDeploymentManifest) Add(services []string, env map[string]string) error { + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + + for _, service := range services { + _, err := kubectl.Run(c.Context, "apply", "-k", fmt.Sprintf("../../../cli/config/kubernetes/overlays/%s", service)) + if err != nil { + return err + } + } + return nil +} + +// Bootstrap sets up environment with kind +func (c *kubernetesDeploymentManifest) Bootstrap(waitCB func() error) error { + err := cluster.Initialize(c.Context, "../../../cli/config/kubernetes/kind.yaml") + if err != nil { + return err + } + + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + _, err = kubectl.Run(c.Context, "apply", "-k", "../../../cli/config/kubernetes/base") + if err != nil { + return err + } + err = waitCB() + if err != nil { + return err + } + return nil +} + +// Destroy teardown kubernetes environment +func (c *kubernetesDeploymentManifest) Destroy() error { + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + cluster.Cleanup(c.Context) + return nil +} + +// ExecIn execute command in service +func (c *kubernetesDeploymentManifest) ExecIn(service string, cmd []string) (string, error) { + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + args := []string{"exec", "deployment/" + service, "--"} + for _, arg := range cmd { + args = append(cmd, arg) + } + output, err := kubectl.Run(c.Context, args...) + if err != nil { + return "", err + } + return output, nil +} + +type kubernetesServiceManifest struct { + Metadata struct { + Name string `json:"name"` + ID string `json:"uid"` + } `json:"metadata"` +} + +// Inspect inspects a service +func (c *kubernetesDeploymentManifest) Inspect(service string) (*ServiceManifest, error) { + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + out, err := kubectl.Run(c.Context, "get", "deployment/"+service, "-o", "json") + if err != nil { + return &ServiceManifest{}, err + } + var inspect kubernetesServiceManifest + if err = json.Unmarshal([]byte(out), &inspect); err != nil { + return &ServiceManifest{}, errors.Wrap(err, "Could not convert metadata to JSON") + } + return &ServiceManifest{ + ID: inspect.Metadata.ID, + Name: strings.TrimPrefix(inspect.Metadata.Name, "/"), + Connection: service, + Hostname: service, + }, nil +} + +// Remove remove services from deployment +func (c *kubernetesDeploymentManifest) Remove(services []string, env map[string]string) error { + kubectl = cluster.Kubectl().WithNamespace(c.Context, "default") + + for _, service := range services { + _, err := kubectl.Run(c.Context, "delete", "-k", fmt.Sprintf("../../../cli/config/kubernetes/overlays/%s", service)) + if err != nil { + return err + } + } + return nil +} diff --git a/internal/docker/docker.go b/internal/docker/docker.go index 05df4b0c16..83648c6e92 100644 --- a/internal/docker/docker.go +++ b/internal/docker/docker.go @@ -199,8 +199,7 @@ func InspectContainer(name string) (*types.ContainerJSON, error) { ctx := context.Background() labelFilters := filters.NewArgs() - labelFilters.Add("label", "service.owner=co.elastic.observability") - labelFilters.Add("label", "service.container.name="+name) + labelFilters.Add("label", "com.docker.compose.service="+name) containers, err := dockerClient.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: labelFilters}) if err != nil { @@ -218,6 +217,18 @@ func InspectContainer(name string) (*types.ContainerJSON, error) { return &inspect, nil } +// ListContainers returns a list of running containers +func ListContainers() ([]types.Container, error) { + dockerClient := getDockerClient() + ctx := context.Background() + + containers, err := dockerClient.ContainerList(ctx, types.ContainerListOptions{}) + if err != nil { + return []types.Container{}, err + } + return containers, nil +} + // RemoveContainer removes a container identified by its container name func RemoveContainer(containerName string) error { dockerClient := getDockerClient() diff --git a/internal/kibana/policies.go b/internal/kibana/policies.go index 5667a499ae..88fd205b19 100644 --- a/internal/kibana/policies.go +++ b/internal/kibana/policies.go @@ -77,7 +77,7 @@ func (c *Client) ListPolicies() ([]Policy, error) { } // DeleteAllPolicies deletes all policies -func (c *Client) DeleteAllPolicies(except Policy) { +func (c *Client) DeleteAllPolicies() { // Cleanup all package policies packagePolicies, err := c.ListPackagePolicies() if err != nil { @@ -87,7 +87,8 @@ func (c *Client) DeleteAllPolicies(except Policy) { } for _, pkgPolicy := range packagePolicies { // Do not remove the fleet server package integration otherwise fleet server fails to bootstrap - if !strings.Contains(pkgPolicy.Name, "fleet_server") && pkgPolicy.PolicyID == except.ID { + if !strings.Contains(pkgPolicy.Name, "fleet_server") && !strings.Contains(pkgPolicy.Name, "system") { + log.WithField("pkgPolicy", pkgPolicy.Name).Trace("Removing package policy") err = c.DeleteIntegrationFromPolicy(pkgPolicy) if err != nil { log.WithFields(log.Fields{ diff --git a/internal/kibana/server.go b/internal/kibana/server.go index 6b096ff6d1..4dc5932871 100644 --- a/internal/kibana/server.go +++ b/internal/kibana/server.go @@ -270,10 +270,10 @@ func (c *Client) WaitForFleet() error { "body": jsonResponse, "error": err, "statusCode": statusCode, - }).Error("Kibana has not been initialized") - return errors.New("Kibana has not been initialized") + }).Warn("Fleet is not ready") + return errors.New("Fleet is not ready") } - log.Info("Kibana setup initialized") + log.Info("Fleet setup complete") return nil } maxTimeout := time.Duration(common.TimeoutFactor) * time.Minute * 2 From 5ff1a250da0dbc75e8c86b06b1000c30aad394d7 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Tue, 4 May 2021 15:21:53 -0400 Subject: [PATCH 2/6] remove unused import Signed-off-by: Adam Stokes <51892+adam-stokes@users.noreply.github.com> --- e2e/_suites/fleet/ingest_manager_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/e2e/_suites/fleet/ingest_manager_test.go b/e2e/_suites/fleet/ingest_manager_test.go index 726787ddf0..c80013a59f 100644 --- a/e2e/_suites/fleet/ingest_manager_test.go +++ b/e2e/_suites/fleet/ingest_manager_test.go @@ -5,7 +5,6 @@ package main import ( - "context" "os" "time" From 4824b3c4dfd58e3b02ba22a7edfccdcdee5174c6 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Tue, 4 May 2021 16:06:34 -0400 Subject: [PATCH 3/6] remove unsetting of fleet server hostname as it's not needed Signed-off-by: Adam Stokes <51892+adam-stokes@users.noreply.github.com> --- e2e/_suites/fleet/ingest_manager_test.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/e2e/_suites/fleet/ingest_manager_test.go b/e2e/_suites/fleet/ingest_manager_test.go index c80013a59f..c9d89d5e18 100644 --- a/e2e/_suites/fleet/ingest_manager_test.go +++ b/e2e/_suites/fleet/ingest_manager_test.go @@ -134,14 +134,6 @@ func InitializeIngestManagerTestSuite(ctx *godog.TestSuiteContext) { return nil }) - serviceManifest, err := deployer.Inspect("fleet-server") - if err != nil { - log.WithField("manifest", serviceManifest).Fatal("Unable to grab service manifest") - } - imts.Fleet.FleetServerHostname = serviceManifest.Hostname - - log.WithField("manifest", serviceManifest).Trace("Discovered Fleet Server hostname") - imts.Fleet.Version = common.AgentVersionBase imts.Fleet.RuntimeDependenciesStartDate = time.Now().UTC() }) From 2b1fd5d099e5d09a26dcd27b2a8cfcf5f58372d4 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Tue, 4 May 2021 20:01:27 -0400 Subject: [PATCH 4/6] add deployer support to stand-alone Signed-off-by: Adam Stokes <51892+adam-stokes@users.noreply.github.com> --- e2e/_suites/fleet/fleet.go | 3 +-- e2e/_suites/fleet/stand-alone.go | 18 +++++++----------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/e2e/_suites/fleet/fleet.go b/e2e/_suites/fleet/fleet.go index 6c35b65eb3..606d14aff7 100644 --- a/e2e/_suites/fleet/fleet.go +++ b/e2e/_suites/fleet/fleet.go @@ -55,8 +55,7 @@ type FleetTestSuite struct { // afterScenario destroys the state created by a scenario func (fts *FleetTestSuite) afterScenario() { - agentInstaller := fts.getInstaller() - serviceName := fts.getServiceName(agentInstaller) + serviceName := common.ElasticAgentServiceName if !fts.StandAlone { agentInstaller := fts.getInstaller() diff --git a/e2e/_suites/fleet/stand-alone.go b/e2e/_suites/fleet/stand-alone.go index 1d0d07cdd2..87933670b1 100644 --- a/e2e/_suites/fleet/stand-alone.go +++ b/e2e/_suites/fleet/stand-alone.go @@ -7,17 +7,17 @@ package main import ( "context" "fmt" + "path" + "strings" + "time" + "github.com/cenkalti/backoff/v4" "github.com/elastic/e2e-testing/cli/config" "github.com/elastic/e2e-testing/internal/common" - "github.com/elastic/e2e-testing/internal/compose" "github.com/elastic/e2e-testing/internal/docker" "github.com/elastic/e2e-testing/internal/installer" "github.com/elastic/e2e-testing/internal/shell" "github.com/elastic/e2e-testing/internal/utils" - "path" - "strings" - "time" "github.com/elastic/e2e-testing/internal/elasticsearch" log "github.com/sirupsen/logrus" @@ -62,9 +62,7 @@ func (fts *FleetTestSuite) thereIsNewDataInTheIndexFromAgent() error { } func (fts *FleetTestSuite) theDockerContainerIsStopped(serviceName string) error { - serviceManager := compose.NewServiceManager() - - err := serviceManager.RemoveServicesFromCompose(context.Background(), common.FleetProfileName, []string{serviceName}, common.ProfileEnv) + err := fts.deployer.Remove([]string{common.FleetProfileName, serviceName}, common.ProfileEnv) if err != nil { return err } @@ -111,8 +109,6 @@ func (fts *FleetTestSuite) startStandAloneAgent(image string, composeFilename st dockerImageTag += "-amd64" } - serviceManager := compose.NewServiceManager() - common.ProfileEnv["elasticAgentDockerImageSuffix"] = "" if image != "default" { common.ProfileEnv["elasticAgentDockerImageSuffix"] = "-" + image @@ -130,8 +126,8 @@ func (fts *FleetTestSuite) startStandAloneAgent(image string, composeFilename st common.ProfileEnv[k] = v } - err := serviceManager.AddServicesToCompose(context.Background(), common.FleetProfileName, - []string{common.ElasticAgentServiceName}, common.ProfileEnv, composeFilename) + services := []string{common.FleetProfileName, common.ElasticAgentServiceName} + err := fts.deployer.Add(services, common.ProfileEnv) if err != nil { log.Error("Could not deploy the elastic-agent") return err From 2e38d6ab974c462d3482c28b14e860ec00c4cd22 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Tue, 4 May 2021 20:09:00 -0400 Subject: [PATCH 5/6] add elastic-agent to k8s deployment specs Signed-off-by: Adam Stokes <51892+adam-stokes@users.noreply.github.com> --- .../kubernetes/overlays/deployment.yaml | 25 +++++++++++++++++++ .../kubernetes/overlays/kustomization.yaml | 5 ++++ 2 files changed, 30 insertions(+) create mode 100644 cli/config/kubernetes/overlays/deployment.yaml create mode 100644 cli/config/kubernetes/overlays/kustomization.yaml diff --git a/cli/config/kubernetes/overlays/deployment.yaml b/cli/config/kubernetes/overlays/deployment.yaml new file mode 100644 index 0000000000..9ae3ed7a11 --- /dev/null +++ b/cli/config/kubernetes/overlays/deployment.yaml @@ -0,0 +1,25 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: elastic-agent + labels: + app: elastic-agent +spec: + replicas: 1 + selector: + matchLabels: + app: elastic-agent + template: + metadata: + labels: + app: elastic-agent + spec: + containers: + - name: elastic-agent + image: centos/systemd:latest + command: ["/usr/sbin/init"] + securityContext: + allowPrivilegeEscalation: true + runAsUser: 0 + capabilities: + add: ["SYS_ADMIN"] diff --git a/cli/config/kubernetes/overlays/kustomization.yaml b/cli/config/kubernetes/overlays/kustomization.yaml new file mode 100644 index 0000000000..37fdeffa9b --- /dev/null +++ b/cli/config/kubernetes/overlays/kustomization.yaml @@ -0,0 +1,5 @@ +bases: + - ../../base + +resources: +- deployment.yaml From abf3f1a8511ab7c92708e7d7fd67436fd0af8f82 Mon Sep 17 00:00:00 2001 From: Adam Stokes <51892+adam-stokes@users.noreply.github.com> Date: Wed, 5 May 2021 07:26:54 -0400 Subject: [PATCH 6/6] Update internal/docker/docker.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Manuel de la Peña --- internal/docker/docker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/docker/docker.go b/internal/docker/docker.go index 83648c6e92..9dcbb9b328 100644 --- a/internal/docker/docker.go +++ b/internal/docker/docker.go @@ -199,7 +199,7 @@ func InspectContainer(name string) (*types.ContainerJSON, error) { ctx := context.Background() labelFilters := filters.NewArgs() - labelFilters.Add("label", "com.docker.compose.service="+name) + labelFilters.Add("name", name) containers, err := dockerClient.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: labelFilters}) if err != nil {