|
|
@@ -0,0 +1,127 @@
|
|
|
+package tests
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "flag"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "runtime"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ dockerConfigFile "github.com/docker/cli/cli/config/configfile"
|
|
|
+ "github.com/docker/ecs-plugin/pkg/docker"
|
|
|
+ "gotest.tools/v3/icmd"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ e2ePath = flag.String("e2e-path", ".", "Set path to the e2e directory")
|
|
|
+ dockerCliPath = os.Getenv("DOCKERCLI_BINARY")
|
|
|
+ dockerCli dockerCliCommand
|
|
|
+ testContextName = "testAwsContextToBeRemoved"
|
|
|
+)
|
|
|
+
|
|
|
+type dockerCliCommand struct {
|
|
|
+ path string
|
|
|
+ cliPluginDir string
|
|
|
+}
|
|
|
+
|
|
|
+type ConfigFileOperator func(configFile *dockerConfigFile.ConfigFile)
|
|
|
+
|
|
|
+func (d dockerCliCommand) createTestCmd(ops ...ConfigFileOperator) (icmd.Cmd, func()) {
|
|
|
+ configDir, err := ioutil.TempDir("", "config")
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ configFilePath := filepath.Join(configDir, "config.json")
|
|
|
+ config := dockerConfigFile.ConfigFile{
|
|
|
+ CLIPluginsExtraDirs: []string{
|
|
|
+ d.cliPluginDir,
|
|
|
+ },
|
|
|
+ Filename: configFilePath,
|
|
|
+ }
|
|
|
+ for _, op := range ops {
|
|
|
+ op(&config)
|
|
|
+ }
|
|
|
+ configFile, err := os.Create(configFilePath)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ defer configFile.Close()
|
|
|
+ err = json.NewEncoder(configFile).Encode(config)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ awsContext := docker.AwsContext{
|
|
|
+ Profile: "TestProfile",
|
|
|
+ Cluster: "TestCluster",
|
|
|
+ Region: "TestRegion",
|
|
|
+ }
|
|
|
+ testStore, err := docker.NewContextWithStore(testContextName, &awsContext, filepath.Join(configDir, "contexts"))
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ cleanup := func() {
|
|
|
+ fmt.Println("cleanup")
|
|
|
+ testStore.Remove(testContextName)
|
|
|
+ os.RemoveAll(configDir)
|
|
|
+ }
|
|
|
+ env := append(os.Environ(),
|
|
|
+ "DOCKER_CONFIG="+configDir,
|
|
|
+ "DOCKER_CLI_EXPERIMENTAL=enabled") // TODO: Remove this once docker ecs plugin is no more experimental
|
|
|
+ return icmd.Cmd{Env: env}, cleanup
|
|
|
+}
|
|
|
+
|
|
|
+func (d dockerCliCommand) Command(args ...string) []string {
|
|
|
+ return append([]string{d.path, "--context", testContextName}, args...)
|
|
|
+}
|
|
|
+
|
|
|
+func TestMain(m *testing.M) {
|
|
|
+ flag.Parse()
|
|
|
+ if err := os.Chdir(*e2ePath); err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ cwd, err := os.Getwd()
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ dockerEcs := os.Getenv("DOCKERECS_BINARY")
|
|
|
+ if dockerEcs == "" {
|
|
|
+ dockerEcs = filepath.Join(cwd, "../dist/docker-ecs")
|
|
|
+ }
|
|
|
+ dockerEcs, err = filepath.Abs(dockerEcs)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ if dockerCliPath == "" {
|
|
|
+ dockerCliPath = "docker"
|
|
|
+ } else {
|
|
|
+ dockerCliPath, err = filepath.Abs(dockerCliPath)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Prepare docker cli to call the docker-ecs plugin binary:
|
|
|
+ // - Create a symbolic link with the dockerEcs binary to the plugin directory
|
|
|
+ cliPluginDir, err := ioutil.TempDir("", "configContent")
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ defer os.RemoveAll(cliPluginDir)
|
|
|
+ createDockerECSSymLink(dockerEcs, cliPluginDir)
|
|
|
+
|
|
|
+ dockerCli = dockerCliCommand{path: dockerCliPath, cliPluginDir: cliPluginDir}
|
|
|
+ os.Exit(m.Run())
|
|
|
+}
|
|
|
+
|
|
|
+func createDockerECSSymLink(dockerEcs, configDir string) {
|
|
|
+ dockerEcsExecName := "docker-ecs"
|
|
|
+ if runtime.GOOS == "windows" {
|
|
|
+ dockerEcsExecName += ".exe"
|
|
|
+ }
|
|
|
+ if err := os.Symlink(dockerEcs, filepath.Join(configDir, dockerEcsExecName)); err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+}
|