Skip to content

Commit d334792

Browse files
authored
Add profile flag to commands to allow running profiles at the same time (#1368)
1 parent ecf41ee commit d334792

File tree

23 files changed

+105
-43
lines changed

23 files changed

+105
-43
lines changed

cmd/benchmark.go

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/dustin/go-humanize"
1414

1515
"github.com/elastic/elastic-package/internal/corpusgenerator"
16+
"github.com/elastic/elastic-package/internal/install"
1617
"github.com/elastic/elastic-package/internal/kibana"
1718

1819
"github.com/spf13/cobra"
@@ -57,6 +58,8 @@ func setupBenchmarkCommand() *cobraext.Command {
5758
Long: benchLongDescription,
5859
}
5960

61+
cmd.PersistentFlags().StringP(cobraext.ProfileFlagName, "p", "", fmt.Sprintf(cobraext.ProfileFlagDescription, install.ProfileNameEnvVar))
62+
6063
pipelineCmd := getPipelineCommand()
6164
cmd.AddCommand(pipelineCmd)
6265

@@ -248,6 +251,11 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
248251
return fmt.Errorf("locating package root failed: %w", err)
249252
}
250253

254+
profile, err := cobraext.GetProfileFlag(cmd)
255+
if err != nil {
256+
return nil
257+
}
258+
251259
signal.Enable()
252260

253261
esClient, err := elasticsearch.NewClient()
@@ -272,6 +280,7 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
272280
system.WithPackageRootPath(packageRootPath),
273281
system.WithESAPI(esClient.API),
274282
system.WithKibanaClient(kc),
283+
system.WithProfile(profile),
275284
)
276285
runner := system.NewSystemBenchmark(opts)
277286

cmd/service.go

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/spf13/cobra"
1313

1414
"github.com/elastic/elastic-package/internal/cobraext"
15+
"github.com/elastic/elastic-package/internal/install"
1516
"github.com/elastic/elastic-package/internal/packages"
1617
"github.com/elastic/elastic-package/internal/service"
1718
)
@@ -35,6 +36,7 @@ func setupServiceCommand() *cobraext.Command {
3536
Long: serviceLongDescription,
3637
}
3738
cmd.AddCommand(upCommand)
39+
cmd.PersistentFlags().StringP(cobraext.ProfileFlagName, "p", "", fmt.Sprintf(cobraext.ProfileFlagDescription, install.ProfileNameEnvVar))
3840

3941
return cobraext.NewCommand(cmd, cobraext.ContextPackage)
4042
}
@@ -58,8 +60,14 @@ func upCommandAction(cmd *cobra.Command, args []string) error {
5860

5961
variantFlag, _ := cmd.Flags().GetString(cobraext.VariantFlagName)
6062

63+
profile, err := cobraext.GetProfileFlag(cmd)
64+
if err != nil {
65+
return nil
66+
}
67+
6168
_, serviceName := filepath.Split(packageRoot)
6269
err = service.BootUp(service.Options{
70+
Profile: profile,
6371
ServiceName: serviceName,
6472
PackageRootPath: packageRoot,
6573
DataStreamRootPath: dataStreamPath,

cmd/testrunner.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,14 @@ func testTypeCommandActionFactory(runner testrunner.TestRunner) cobraext.Command
226226
var results []testrunner.TestResult
227227
for _, folder := range testFolders {
228228
r, err := testrunner.Run(testType, testrunner.TestOptions{
229+
Profile: profile,
229230
TestFolder: folder,
230231
PackageRootPath: packageRootPath,
231232
GenerateTestResult: generateTestResult,
232233
API: esClient.API,
233234
DeferCleanup: deferCleanup,
234235
ServiceVariant: variantFlag,
235236
WithCoverage: testCoverage,
236-
Profile: profile,
237237
})
238238

239239
results = append(results, r...)

internal/benchrunner/runners/system/options.go

+8
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import (
99

1010
"github.com/elastic/elastic-package/internal/elasticsearch"
1111
"github.com/elastic/elastic-package/internal/kibana"
12+
"github.com/elastic/elastic-package/internal/profile"
1213
)
1314

1415
// Options contains benchmark runner options.
1516
type Options struct {
17+
Profile *profile.Profile
1618
ESAPI *elasticsearch.API
1719
KibanaClient *kibana.Client
1820
DeferCleanup time.Duration
@@ -72,3 +74,9 @@ func WithDataReindexing(b bool) OptionFunc {
7274
opts.ReindexData = b
7375
}
7476
}
77+
78+
func WithProfile(p *profile.Profile) OptionFunc {
79+
return func(opts *Options) {
80+
opts.Profile = p
81+
}
82+
}

internal/benchrunner/runners/system/runner.go

+1
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ func (r *runner) run() (report reporters.Reportable, err error) {
230230
// Setup service.
231231
logger.Debug("setting up service...")
232232
serviceDeployer, err := servicedeployer.Factory(servicedeployer.FactoryOptions{
233+
Profile: r.options.Profile,
233234
RootPath: r.options.PackageRootPath,
234235
})
235236

internal/benchrunner/runners/system/servicedeployer/compose.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ import (
1515
"github.com/elastic/elastic-package/internal/docker"
1616
"github.com/elastic/elastic-package/internal/files"
1717
"github.com/elastic/elastic-package/internal/logger"
18+
"github.com/elastic/elastic-package/internal/profile"
1819
"github.com/elastic/elastic-package/internal/stack"
1920
)
2021

2122
// DockerComposeServiceDeployer knows how to deploy a service defined via
2223
// a Docker Compose file.
2324
type DockerComposeServiceDeployer struct {
25+
profile *profile.Profile
2426
ymlPaths []string
2527
}
2628

@@ -32,8 +34,9 @@ type dockerComposeDeployedService struct {
3234
}
3335

3436
// NewDockerComposeServiceDeployer returns a new instance of a DockerComposeServiceDeployer.
35-
func NewDockerComposeServiceDeployer(ymlPaths []string) (*DockerComposeServiceDeployer, error) {
37+
func NewDockerComposeServiceDeployer(profile *profile.Profile, ymlPaths []string) (*DockerComposeServiceDeployer, error) {
3638
return &DockerComposeServiceDeployer{
39+
profile: profile,
3740
ymlPaths: ymlPaths,
3841
}, nil
3942
}
@@ -53,7 +56,7 @@ func (d *DockerComposeServiceDeployer) SetUp(inCtxt ServiceContext) (DeployedSer
5356
}
5457

5558
// Verify the Elastic stack network
56-
err = stack.EnsureStackNetworkUp()
59+
err = stack.EnsureStackNetworkUp(d.profile)
5760
if err != nil {
5861
return nil, fmt.Errorf("elastic stack network is not ready: %w", err)
5962
}
@@ -85,7 +88,7 @@ func (d *DockerComposeServiceDeployer) SetUp(inCtxt ServiceContext) (DeployedSer
8588
outCtxt.Hostname = p.ContainerName(serviceName)
8689

8790
// Connect service network with stack network (for the purpose of metrics collection)
88-
err = docker.ConnectToNetwork(p.ContainerName(serviceName), stack.Network())
91+
err = docker.ConnectToNetwork(p.ContainerName(serviceName), stack.Network(d.profile))
8992
if err != nil {
9093
return nil, fmt.Errorf("can't attach service container to the stack network: %w", err)
9194
}

internal/benchrunner/runners/system/servicedeployer/factory.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ import (
99
"fmt"
1010
"os"
1111
"path/filepath"
12+
13+
"github.com/elastic/elastic-package/internal/profile"
1214
)
1315

1416
const devDeployDir = "_dev/benchmark/system/deploy"
1517

1618
// FactoryOptions defines options used to create an instance of a service deployer.
1719
type FactoryOptions struct {
20+
Profile *profile.Profile
21+
1822
RootPath string
1923
}
2024

@@ -37,7 +41,7 @@ func Factory(options FactoryOptions) (ServiceDeployer, error) {
3741
case "docker":
3842
dockerComposeYMLPath := filepath.Join(serviceDeployerPath, "docker-compose.yml")
3943
if _, err := os.Stat(dockerComposeYMLPath); err == nil {
40-
return NewDockerComposeServiceDeployer([]string{dockerComposeYMLPath})
44+
return NewDockerComposeServiceDeployer(options.Profile, []string{dockerComposeYMLPath})
4145
}
4246
}
4347
return nil, fmt.Errorf("unsupported service deployer (name: %s)", serviceDeployerName)

internal/kind/kind.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/elastic/elastic-package/internal/docker"
1111
"github.com/elastic/elastic-package/internal/kubectl"
1212
"github.com/elastic/elastic-package/internal/logger"
13+
"github.com/elastic/elastic-package/internal/profile"
1314
"github.com/elastic/elastic-package/internal/stack"
1415
)
1516

@@ -33,13 +34,13 @@ func VerifyContext() error {
3334
}
3435

3536
// ConnectToElasticStackNetwork function ensures that the control plane node is connected to the Elastic stack network.
36-
func ConnectToElasticStackNetwork() error {
37+
func ConnectToElasticStackNetwork(profile *profile.Profile) error {
3738
containerID, err := controlPlaneContainerID()
3839
if err != nil {
3940
return fmt.Errorf("can't find kind-control plane node: %w", err)
4041
}
4142

42-
stackNetwork := stack.Network()
43+
stackNetwork := stack.Network(profile)
4344
logger.Debugf("check network connectivity between service container %s (ID: %s) and the stack network %s", ControlPlaneContainerName, containerID, stackNetwork)
4445

4546
networkDescriptions, err := docker.InspectNetwork(stackNetwork)

internal/service/boot.go

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"syscall"
1212

1313
"github.com/elastic/elastic-package/internal/logger"
14+
"github.com/elastic/elastic-package/internal/profile"
1415

1516
"github.com/elastic/elastic-package/internal/configuration/locations"
1617
"github.com/elastic/elastic-package/internal/testrunner/runners/system"
@@ -19,6 +20,8 @@ import (
1920

2021
// Options define the details of the service which should be booted up.
2122
type Options struct {
23+
Profile *profile.Profile
24+
2225
ServiceName string
2326
PackageRootPath string
2427
DataStreamRootPath string
@@ -30,6 +33,7 @@ type Options struct {
3033
func BootUp(options Options) error {
3134
logger.Debugf("Create new instance of the service deployer")
3235
serviceDeployer, err := servicedeployer.Factory(servicedeployer.FactoryOptions{
36+
Profile: options.Profile,
3337
PackageRootPath: options.DataStreamRootPath,
3438
DataStreamRootPath: options.DataStreamRootPath,
3539
Variant: options.Variant,

internal/stack/boot.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,20 @@ import (
1313
"github.com/elastic/elastic-package/internal/builder"
1414
"github.com/elastic/elastic-package/internal/configuration/locations"
1515
"github.com/elastic/elastic-package/internal/files"
16+
"github.com/elastic/elastic-package/internal/profile"
1617
)
1718

18-
// DockerComposeProjectName is the name of the Docker Compose project used to boot up
19+
// baseComposeProjectName is the base name of the Docker Compose project used to boot up
1920
// Elastic Stack containers.
20-
const DockerComposeProjectName = "elastic-package-stack"
21+
const baseComposeProjectName = "elastic-package-stack"
22+
23+
// DockerComposeProjectName returns the docker compose project name for a given profile.
24+
func DockerComposeProjectName(profile *profile.Profile) string {
25+
if profile.ProfileName == "default" {
26+
return baseComposeProjectName
27+
}
28+
return baseComposeProjectName + "-" + profile.ProfileName
29+
}
2130

2231
// BootUp function boots up the Elastic stack.
2332
func BootUp(options Options) error {
@@ -81,7 +90,7 @@ func BootUp(options Options) error {
8190
// to fail too.
8291
// As a workaround, try to give another chance to docker-compose if only
8392
// elastic-agent failed.
84-
if onlyElasticAgentFailed() {
93+
if onlyElasticAgentFailed(options) {
8594
fmt.Println("Elastic Agent failed to start, trying again.")
8695
err = dockerComposeUp(options)
8796
}
@@ -98,8 +107,8 @@ func BootUp(options Options) error {
98107
return nil
99108
}
100109

101-
func onlyElasticAgentFailed() bool {
102-
status, err := Status()
110+
func onlyElasticAgentFailed(options Options) bool {
111+
status, err := Status(options)
103112
if err != nil {
104113
fmt.Printf("Failed to check status of the stack after failure: %v\n", err)
105114
return false

internal/stack/compose.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (eb *envBuilder) build() []string {
5252
}
5353

5454
func dockerComposeBuild(options Options) error {
55-
c, err := compose.NewProject(DockerComposeProjectName, options.Profile.Path(profileStackPath, SnapshotFile))
55+
c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(profileStackPath, SnapshotFile))
5656
if err != nil {
5757
return fmt.Errorf("could not create docker compose project: %w", err)
5858
}
@@ -78,7 +78,7 @@ func dockerComposeBuild(options Options) error {
7878
}
7979

8080
func dockerComposePull(options Options) error {
81-
c, err := compose.NewProject(DockerComposeProjectName, options.Profile.Path(profileStackPath, SnapshotFile))
81+
c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(profileStackPath, SnapshotFile))
8282
if err != nil {
8383
return fmt.Errorf("could not create docker compose project: %w", err)
8484
}
@@ -104,7 +104,7 @@ func dockerComposePull(options Options) error {
104104
}
105105

106106
func dockerComposeUp(options Options) error {
107-
c, err := compose.NewProject(DockerComposeProjectName, options.Profile.Path(profileStackPath, SnapshotFile))
107+
c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(profileStackPath, SnapshotFile))
108108
if err != nil {
109109
return fmt.Errorf("could not create docker compose project: %w", err)
110110
}
@@ -136,7 +136,7 @@ func dockerComposeUp(options Options) error {
136136
}
137137

138138
func dockerComposeDown(options Options) error {
139-
c, err := compose.NewProject(DockerComposeProjectName, options.Profile.Path(profileStackPath, SnapshotFile))
139+
c, err := compose.NewProject(DockerComposeProjectName(options.Profile), options.Profile.Path(profileStackPath, SnapshotFile))
140140
if err != nil {
141141
return fmt.Errorf("could not create docker compose project: %w", err)
142142
}
@@ -182,10 +182,10 @@ func withIsReadyServices(services []string) []string {
182182
return allServices
183183
}
184184

185-
func dockerComposeStatus() ([]ServiceStatus, error) {
185+
func dockerComposeStatus(options Options) ([]ServiceStatus, error) {
186186
var services []ServiceStatus
187187
// query directly to docker to avoid load environment variables (e.g. STACK_VERSION_VARIANT) and profiles
188-
containerIDs, err := docker.ContainerIDsWithLabel(projectLabelDockerCompose, DockerComposeProjectName)
188+
containerIDs, err := docker.ContainerIDsWithLabel(projectLabelDockerCompose, DockerComposeProjectName(options.Profile))
189189
if err != nil {
190190
return nil, err
191191
}

internal/stack/dump.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func dumpStackLogs(options DumpOptions) error {
6060
writeLogFiles(logsPath, serviceName, content)
6161
}
6262

63-
err = copyDockerInternalLogs(serviceName, logsPath)
63+
err = copyDockerInternalLogs(serviceName, logsPath, options.Profile)
6464
if err != nil {
6565
logger.Errorf("can't copy internal logs (service: %s): %v", serviceName, err)
6666
}

internal/stack/logs.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func dockerComposeLogs(serviceName string, profile *profile.Profile) ([]byte, er
2222

2323
snapshotFile := profile.Path(profileStackPath, SnapshotFile)
2424

25-
p, err := compose.NewProject(DockerComposeProjectName, snapshotFile)
25+
p, err := compose.NewProject(DockerComposeProjectName(profile), snapshotFile)
2626
if err != nil {
2727
return nil, fmt.Errorf("could not create docker compose project: %w", err)
2828
}
@@ -43,14 +43,14 @@ func dockerComposeLogs(serviceName string, profile *profile.Profile) ([]byte, er
4343
return out, nil
4444
}
4545

46-
func copyDockerInternalLogs(serviceName, outputPath string) error {
46+
func copyDockerInternalLogs(serviceName, outputPath string, profile *profile.Profile) error {
4747
switch serviceName {
4848
case elasticAgentService, fleetServerService:
4949
default:
5050
return nil // we need to pull internal logs only from Elastic-Agent and Fleets Server container
5151
}
5252

53-
p, err := compose.NewProject(DockerComposeProjectName)
53+
p, err := compose.NewProject(DockerComposeProjectName(profile))
5454
if err != nil {
5555
return fmt.Errorf("could not create docker compose project: %w", err)
5656
}

internal/stack/network.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@ import (
88
"fmt"
99

1010
"github.com/elastic/elastic-package/internal/docker"
11+
"github.com/elastic/elastic-package/internal/profile"
1112
)
1213

1314
// EnsureStackNetworkUp function verifies if stack network is up and running.
14-
func EnsureStackNetworkUp() error {
15-
_, err := docker.InspectNetwork(Network())
15+
func EnsureStackNetworkUp(profile *profile.Profile) error {
16+
_, err := docker.InspectNetwork(Network(profile))
1617
if err != nil {
1718
return fmt.Errorf("network not available: %w", err)
1819
}
1920
return nil
2021
}
2122

2223
// Network function returns the stack network name.
23-
func Network() string {
24-
return fmt.Sprintf("%s_default", DockerComposeProjectName)
24+
func Network(profile *profile.Profile) string {
25+
return fmt.Sprintf("%s_default", DockerComposeProjectName(profile))
2526
}

internal/stack/providers.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,5 @@ func (*composeProvider) Dump(options DumpOptions) (string, error) {
7575
}
7676

7777
func (*composeProvider) Status(options Options) ([]ServiceStatus, error) {
78-
return Status()
78+
return Status(options)
7979
}

0 commit comments

Comments
 (0)