Skip to content
This repository has been archived by the owner on Sep 17, 2024. It is now read-only.

cli: enable loading default profiles turnkey (backport #943) #1075

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,284 changes: 1,214 additions & 70 deletions cli/NOTICE.txt

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cli/cmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
var deployToProfile string

func init() {
config.InitConfig()
config.Init()

for k := range config.AvailableServices() {
// deploy command
Expand Down
2 changes: 1 addition & 1 deletion cli/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var versionToRun string
var environmentItems map[string]string

func init() {
config.InitConfig()
config.Init()

rootCmd.AddCommand(runCmd)

Expand Down
2 changes: 1 addition & 1 deletion cli/cmd/stop.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
var versionToStop string

func init() {
config.InitConfig()
config.Init()

rootCmd.AddCommand(stopCmd)

Expand Down
2 changes: 1 addition & 1 deletion cli/cmd/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ var excludedBlocks = []string{"build"}
var remote = "elastic:master"

func init() {
config.InitConfig()
config.Init()

syncIntegrationsCmd.Flags().BoolVarP(&deleteRepository, "delete", "d", false, "Will delete the existing Beats repository before cloning it again (default false)")
syncIntegrationsCmd.Flags().StringVarP(&remote, "remote", "r", "elastic:master", "Sets the remote for Beats, using 'user:branch' as format (i.e. elastic:master)")
Expand Down
2 changes: 1 addition & 1 deletion cli/config/compose/profiles/fleet/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ services:
ports:
- "5601:5601"
volumes:
- ${kibanaConfigPath}:/usr/share/kibana/config/kibana.yml
- ./configurations/kibana.config.yml:/usr/share/kibana/config/kibana.yml
package-registry:
image: docker.elastic.co/package-registry/distribution:staging
healthcheck:
Expand Down
102 changes: 54 additions & 48 deletions cli/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package config

import (
"fmt"
"io/ioutil"
"os"
"path"
"path/filepath"
Expand Down Expand Up @@ -71,7 +72,7 @@ func FileExists(configFile string) (bool, error) {
}

// GetComposeFile returns the path of the compose file, looking up the
// tool's workdir or in the static resources already packaged in the binary
// tool's workdir
func GetComposeFile(isProfile bool, composeName string) (string, error) {
composeFileName := "docker-compose.yml"
serviceType := "services"
Expand All @@ -94,9 +95,8 @@ func GetComposeFile(isProfile bool, composeName string) (string, error) {
"composeFilePath": composeFilePath,
"error": err,
"type": serviceType,
}).Trace("Compose file not found at workdir. Extracting from binary resources")
}).Trace("Compose file not found. Please make sure the file exists at the location")

composeBytes, err := opComposeBox.Find(path.Join(serviceType, composeName, composeFileName))
if err != nil {
log.WithFields(log.Fields{
"composeFileName": composeFileName,
Expand All @@ -108,23 +108,6 @@ func GetComposeFile(isProfile bool, composeName string) (string, error) {
return "", err
}

// create parent directory for the compose file
err = io.MkdirAll(filepath.Dir(composeFilePath))
if err != nil {
return composeFilePath, err
}

err = io.WriteFile(composeBytes, composeFilePath)
if err != nil {
return composeFilePath, err
}

log.WithFields(log.Fields{
"composeFilePath": composeFilePath,
"isProfile": isProfile,
"type": serviceType,
}).Trace("Compose file generated at workdir.")

return composeFilePath, nil
}

Expand All @@ -135,6 +118,10 @@ func GetServiceConfig(service string) (Service, bool) {

// Init creates this tool workspace under user's home, in a hidden directory named ".op"
func Init() {
if Op != nil {
return
}

configureLogger()

binaries := []string{
Expand Down Expand Up @@ -296,53 +283,72 @@ func newConfig(workspace string) {
}
Op = &opConfig

box := packComposeFiles(Op)
box := packFiles(Op)
if box == nil {
log.WithFields(log.Fields{
"workspace": workspace,
}).Error("Could not get packaged compose files")
return
}

// initialize included profiles/services
extractProfileServiceConfig(Op, box)

// add file system services and profiles
readFilesFromFileSystem("services")
readFilesFromFileSystem("profiles")

opComposeBox = box
}

func packComposeFiles(op *OpConfig) *packr.Box {
box := packr.New("Compose Files", "./compose")

err := box.Walk(func(boxedPath string, f packr.File) error {
// there must be three tokens: i.e. 'services/aerospike/docker-compose.yml'
tokens := strings.Split(boxedPath, string(os.PathSeparator))
composeType := tokens[0]
composeName := tokens[1]

log.WithFields(log.Fields{
"service": composeName,
"path": boxedPath,
}).Trace("Boxed file")

if composeType == "profiles" {
op.Profiles[composeName] = Profile{
Name: composeName,
Path: boxedPath,
}
} else if composeType == "services" {
op.Services[composeName] = Service{
Name: composeName,
Path: boxedPath,
// Extract packaged profiles and services for use with cli runner
// all default configs/profiles/services will be overwritten. In order to customize
// the default deployments, create a new directory and copy the existing files over.
func extractProfileServiceConfig(op *OpConfig, box *packr.Box) error {
var walkFn = func(s string, file packr.File) error {
p := filepath.Join(op.Workspace, "compose", s)
dir := filepath.Dir(p)
if _, err := os.Stat(dir); os.IsNotExist(err) {
err := os.MkdirAll(dir, 0755)
if err != nil {
return err
}
}

return nil
})
if err != nil {
return nil
log.WithFields(log.Fields{
"file": p,
"dir": dir,
}).Trace("Extracting boxed file")

return ioutil.WriteFile(p, []byte(file.String()), 0644)
}

if err := box.Walk(walkFn); err != nil {
return err
}
return nil
}

// Packs all files required for starting profiles/services
// if a configurations directory exists within the parent directory for each compose file
// it will be included in the package binary but skipped in determining the correct paths
// for each compose file
//
// Directory format for profiles/services are as follows:
// compose/
// profiles/
// fleet/
// configurations/
// docker-compose.yml
// services/
// apache/
// configurations/
// docker-compose.yml
//
// configurations/ directory is optional and only needed if docker-compose.yml needs to reference
// any filelike object within its parent directory
func packFiles(op *OpConfig) *packr.Box {
box := packr.New("Compose Files", "./compose")
return box
}

Expand Down
37 changes: 37 additions & 0 deletions cli/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module github.com/elastic/e2e-testing/cli

go 1.14

require (
github.com/Flaque/filet v0.0.0-20190209224823-fc4d33cfcf93
github.com/Microsoft/go-winio v0.4.12 // indirect
github.com/cenkalti/backoff/v4 v4.0.2
github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v0.7.3-0.20190506211059-b20a14b54661
github.com/docker/go-units v0.4.0 // indirect
github.com/gobuffalo/packr/v2 v2.7.1
github.com/gogo/protobuf v1.3.1 // indirect
github.com/gorilla/mux v1.7.3 // indirect
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/mitchellh/go-homedir v1.1.0
github.com/morikuni/aec v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.5.0 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/sirupsen/logrus v1.4.2
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cobra v0.0.5
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.6.1
github.com/testcontainers/testcontainers-go v0.7.0
go.elastic.co/apm v1.11.0
golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 // indirect
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6 // indirect
google.golang.org/grpc v1.24.0 // indirect
gopkg.in/src-d/go-git.v4 v4.13.1
gopkg.in/yaml.v2 v2.3.0
gotest.tools v2.2.0+incompatible // indirect
)
Loading