Skip to content

Commit

Permalink
Allow setting environment in ddev pull on command line, fixes #4180, f…
Browse files Browse the repository at this point in the history
  • Loading branch information
rfay committed Nov 28, 2022
1 parent 64b9b88 commit 49092bd
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 46 deletions.
23 changes: 19 additions & 4 deletions cmd/ddev/cmd/pull.go
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"fmt"
"os"
"strings"

"github.com/drud/ddev/pkg/ddevapp"
"github.com/drud/ddev/pkg/dockerutil"
Expand All @@ -21,15 +22,18 @@ var PullCmd = &cobra.Command{
ddev pull platform
ddev pull pantheon -y
ddev pull platform --skip-files -y
ddev pull localfile --skip-db -y`,
ddev pull localfile --skip-db -y
ddev pull platform --environment=PLATFORM_ENVIRONMENT=main,PLATFORMSH_CLI_TOKEN=abcdef
`,

Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
dockerutil.EnsureDdevNetwork()
},
}

// appPull() does the work of pull
func appPull(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, skipImportArg bool, skipDbArg bool, skipFilesArg bool) {
func appPull(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, skipImportArg bool, skipDbArg bool, skipFilesArg bool, env string) {

// If we're not performing the import step, we won't be deleting the existing db or files.
if !skipConfirmation && !skipImportArg && os.Getenv("DDEV_NONINTERACTIVE") == "" {
Expand Down Expand Up @@ -57,6 +61,16 @@ func appPull(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, s
util.Failed("Failed to get provider: %v", err)
}

// Add or override the command-line provided environment variables
envVars := strings.Split(env, ",")
for _, v := range envVars {
split := strings.Split(v, "=")
if len(split) != 2 {
util.Failed("unable to parse environment variable setting: %v", v)
}
provider.EnvironmentVariables[split[0]] = split[1]
}

if err := app.Pull(provider, skipDbArg, skipFilesArg, skipImportArg); err != nil {
util.Failed("Pull failed: %v", err)
}
Expand Down Expand Up @@ -104,14 +118,15 @@ ddev pull %s --skip-files -y`, subCommandName, subCommandName, subCommandName),
}
}

appPull(providerName, app, flags["skip-confirmation"], flags["skip-import"], flags["skip-db"], flags["skip-files"])
environment, _ := cmd.Flags().GetString("environment")
appPull(providerName, app, flags["skip-confirmation"], flags["skip-import"], flags["skip-db"], flags["skip-files"], environment)
},
}
PullCmd.AddCommand(subCommand)
subCommand.Flags().BoolP("skip-confirmation", "y", false, "Skip confirmation step")
subCommand.Flags().Bool("skip-db", false, "Skip pulling database archive")
subCommand.Flags().Bool("skip-files", false, "Skip pulling file archive")
subCommand.Flags().Bool("skip-import", false, "Downloads file and/or database archives, but does not import them")

subCommand.Flags().String("environment", "", "Add/override environment variables during pull. Commas and equals are not allowed in the names or values.")
}
}
23 changes: 19 additions & 4 deletions cmd/ddev/cmd/push.go
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"fmt"
"os"
"strings"

"github.com/drud/ddev/pkg/ddevapp"
"github.com/drud/ddev/pkg/dockerutil"
Expand All @@ -21,15 +22,17 @@ var PushCmd = &cobra.Command{
ddev push platform
ddev push pantheon -y
ddev push platform --skip-files -y
ddev push acquia --skip-db -y`,
ddev push acquia --skip-db -y
ddev push platform --environment=PLATFORM_ENVIRONMENT=main,PLATFORMSH_CLI_TOKEN=abcdef
`,
Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
dockerutil.EnsureDdevNetwork()
},
}

// apppush() does the work of push
func apppush(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, skipImportArg bool, skipDbArg bool, skipFilesArg bool) {
func apppush(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, skipImportArg bool, skipDbArg bool, skipFilesArg bool, env string) {

// If we're not performing the import step, we won't be deleting the existing db or files.
if !skipConfirmation && !skipImportArg && os.Getenv("DDEV_NONINTERACTIVE") == "" {
Expand Down Expand Up @@ -57,6 +60,16 @@ func apppush(providerType string, app *ddevapp.DdevApp, skipConfirmation bool, s
util.Failed("Failed to get provider: %v", err)
}

// Add or override the command-line provided environment variables
envVars := strings.Split(env, ",")
for _, v := range envVars {
split := strings.Split(v, "=")
if len(split) != 2 {
util.Failed("unable to parse environment variable setting: %v", v)
}
provider.EnvironmentVariables[split[0]] = split[1]
}

if err := app.Push(provider, skipDbArg, skipFilesArg); err != nil {
util.Failed("push failed: %v", err)
}
Expand Down Expand Up @@ -103,14 +116,16 @@ ddev push %s --skip-files -y`, subCommandName, subCommandName, subCommandName),
util.Failed("Failed to get flag %s: %v", f, err)
}
}
apppush(providerName, app, flags["skip-confirmation"], flags["skip-import"], flags["skip-db"], flags["skip-files"])
environment, _ := cmd.Flags().GetString("environment")

apppush(providerName, app, flags["skip-confirmation"], flags["skip-import"], flags["skip-db"], flags["skip-files"], environment)
},
}
PushCmd.AddCommand(subCommand)
subCommand.Flags().BoolP("skip-confirmation", "y", false, "Skip confirmation step")
subCommand.Flags().Bool("skip-db", false, "Skip pushing database archive")
subCommand.Flags().Bool("skip-files", false, "Skip pushing file archive")
subCommand.Flags().Bool("skip-import", false, "Downloads file and/or database archives, but does not import them")

subCommand.Flags().String("environment", "", "Add/override environment variables during pull. Commas and equals are not allowed in the names or values.")
}
}
4 changes: 4 additions & 0 deletions pkg/ddevapp/provider.go
Expand Up @@ -51,6 +51,10 @@ func (p *Provider) Init(pType string, app *DdevApp) error {
return err
}

if p.EnvironmentVariables == nil {
p.EnvironmentVariables = map[string]string{}
}

p.ProviderType = pType
app.ProviderInstance = p
return nil
Expand Down
54 changes: 16 additions & 38 deletions pkg/ddevapp/providerPlatform_test.go
Expand Up @@ -26,9 +26,9 @@ import (
* defined in the constants below.
*/

var platformTestSiteID = "lago3j23xu2w6"
var platformPullTestSiteEnvironment = "platform-pull"
var platformPushTestSiteEnvironment = "platform-push"
const platformTestSiteID = "lago3j23xu2w6"
const platformPullTestSiteEnvironment = "platform-pull"
const platformPushTestSiteEnvironment = "platform-push"

const platformPullSiteURL = "https://master-7rqtwti-lago3j23xu2w6.eu-3.platformsh.site/"
const platformSiteExpectation = "Super easy vegetarian pasta"
Expand All @@ -44,8 +44,6 @@ func TestPlatformPull(t *testing.T) {

require.True(t, isPullSiteValid(platformPullSiteURL, platformSiteExpectation), "platformPullSiteURL %s isn't working right", platformPullSiteURL)

globalWebEnvSave := globalconfig.DdevGlobalConfig.WebEnvironment

origDir, _ := os.Getwd()

siteDir := testcommon.CreateTmpDir(t.Name())
Expand All @@ -57,28 +55,16 @@ func TestPlatformPull(t *testing.T) {
assert.NoError(err)
app, err := NewApp(siteDir, true)
assert.NoError(err)
webEnvSave := app.WebEnvironment
app.Name = t.Name()
app.Type = nodeps.AppTypeDrupal9
err = app.Stop(true, false)
require.NoError(t, err)
err = app.WriteConfig()
require.NoError(t, err)

globalconfig.DdevGlobalConfig.WebEnvironment = []string{"PLATFORMSH_CLI_TOKEN=" + token}
err = globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
assert.NoError(err)

testcommon.ClearDockerEnv()

t.Cleanup(func() {
globalconfig.DdevGlobalConfig.WebEnvironment = globalWebEnvSave
err = globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
assert.NoError(err)
app.WebEnvironment = webEnvSave
err = app.WriteConfig()
assert.NoError(err)

err = app.Stop(true, false)
assert.NoError(err)

Expand All @@ -90,16 +76,17 @@ func TestPlatformPull(t *testing.T) {
err = PopulateExamplesCommandsHomeadditions(app.Name)
require.NoError(t, err)

app.WebEnvironment = []string{
"PLATFORM_PROJECT=" + platformTestSiteID,
"PLATFORM_ENVIRONMENT=" + platformPullTestSiteEnvironment,
}
app.Docroot = "web"
err = app.WriteConfig()
require.NoError(t, err)

provider, err := app.GetProvider("platform")
require.NoError(t, err)

provider.EnvironmentVariables["PLATFORM_PROJECT"] = platformTestSiteID
provider.EnvironmentVariables["PLATFORM_ENVIRONMENT"] = platformPullTestSiteEnvironment
provider.EnvironmentVariables["PLATFORMSH_CLI_TOKEN"] = token

err = app.Start()
require.NoError(t, err)
err = app.Pull(provider, false, false, false)
Expand All @@ -121,15 +108,9 @@ func TestPlatformPush(t *testing.T) {
assert := asrt.New(t)
origDir, _ := os.Getwd()

webEnvSave := globalconfig.DdevGlobalConfig.WebEnvironment

globalconfig.DdevGlobalConfig.WebEnvironment = []string{"PLATFORMSH_CLI_TOKEN=" + token}
err := globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
assert.NoError(err)

siteDir := testcommon.CreateTmpDir(t.Name())

err = os.Chdir(siteDir)
err := os.Chdir(siteDir)
require.NoError(t, err)

err = globalconfig.RemoveProjectInfo(t.Name())
Expand All @@ -142,10 +123,6 @@ func TestPlatformPush(t *testing.T) {
err = app.Stop(true, false)
assert.NoError(err)

globalconfig.DdevGlobalConfig.WebEnvironment = webEnvSave
err = globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
assert.NoError(err)

_ = os.Chdir(origDir)
err = os.RemoveAll(siteDir)
assert.NoError(err)
Expand All @@ -156,10 +133,6 @@ func TestPlatformPush(t *testing.T) {
app.Hooks = map[string][]YAMLTask{"post-push": {{"exec-host": "touch hello-post-push-" + app.Name}}, "pre-push": {{"exec-host": "touch hello-pre-push-" + app.Name}}}
_ = app.Stop(true, false)

app.WebEnvironment = []string{
"PLATFORM_PROJECT=" + platformTestSiteID,
"PLATFORM_ENVIRONMENT=" + platformPushTestSiteEnvironment,
}
app.Docroot = "web"

err = app.WriteConfig()
Expand All @@ -172,6 +145,11 @@ func TestPlatformPush(t *testing.T) {

provider, err := app.GetProvider("platform")
require.NoError(t, err)

provider.EnvironmentVariables["PLATFORM_PROJECT"] = platformTestSiteID
provider.EnvironmentVariables["PLATFORM_ENVIRONMENT"] = platformPushTestSiteEnvironment
provider.EnvironmentVariables["PLATFORMSH_CLI_TOKEN"] = token

err = app.Start()
require.NoError(t, err)

Expand All @@ -191,15 +169,15 @@ func TestPlatformPush(t *testing.T) {

// Test that the database row was added
out, _, err := app.Exec(&ExecOpts{
Cmd: fmt.Sprintf(`echo 'SELECT title FROM %s WHERE title="%s";' | platform db:sql --project="%s" --environment="%s"`, t.Name(), tval, platformTestSiteID, platformPushTestSiteEnvironment),
Cmd: fmt.Sprintf(`echo 'SELECT title FROM %s WHERE title="%s";' | PLATFORMSH_CLI_TOKEN=%s platform db:sql --project="%s" --environment="%s"`, t.Name(), tval, token, platformTestSiteID, platformPushTestSiteEnvironment),
})
require.NoError(t, err)
assert.Contains(out, tval)

// Test that the file arrived there (by rsyncing it back)
tmpRsyncDir := filepath.Join("/tmp", t.Name()+util.RandString(5))
out, _, err = app.Exec(&ExecOpts{
Cmd: fmt.Sprintf(`platform mount:download --yes --quiet --project="%s" --environment="%s" --mount=web/sites/default/files --target=%s && cat %s/%s && rm -rf %s`, platformTestSiteID, platformPushTestSiteEnvironment, tmpRsyncDir, tmpRsyncDir, fName, tmpRsyncDir),
Cmd: fmt.Sprintf(`PLATFORMSH_CLI_TOKEN=%s platform mount:download --yes --quiet --project="%s" --environment="%s" --mount=web/sites/default/files --target=%s && cat %s/%s && rm -rf %s`, token, platformTestSiteID, platformPushTestSiteEnvironment, tmpRsyncDir, tmpRsyncDir, fName, tmpRsyncDir),
})
require.NoError(t, err)
assert.Contains(out, tval)
Expand Down

0 comments on commit 49092bd

Please sign in to comment.