## Friday, 10 May 2013

### juju switch

The switch command has recently landed in trunk, and will be included in the next juju-core release.

juju switch is another way to specify the current working environment. Current precedence for environment lookup still holds, but this now sits between the JUJU_ENV environment variable and the default value in environments.yaml.

If you have multiple environments defined, there are several different ways to tell juju which environment you mean when executing commands.

Prior to switch, there were three ways to specify the environment.

The first and default way to specify the environment is to use the default value in the environments.yaml file.  This was always the fallback position if one of the other ways was not specified.

Another way was to be explicit for some commands, and use the -e or --environment command line argument.

`\$ juju bootstrap -e hpcloud`

There is also an environment variable that can be set which will override the default specified in the environments.yaml file.

`\$ export JUJU_ENV=hpcloud\$ juju bootstrap          # now bootstraps hpcloud\$ juju deploy wordpress   # deploys to hpcloud`

The switch option effectively overrides what the default is for the environments.yaml file without actually changing the environments.yaml file. This means that -e and the JUJU_ENV options still override the environment defined by switch.

`\$ juju help switchusage: juju switch [options] [environment name]purpose: show or change the default juju environment name  options:-l, --list  (= false)    list the environment names  Show or change the default juju environment name.  If no command line parameters are passed, switch will output the currentenvironment as defined by the file \$JUJU_HOME/current-environment.  If a command line parameter is passed in, that value will is stored in thecurrent environment file if it represents a valid environment name asspecified in the environments.yaml file.  aliases: env`

It works something like this:

`\$ juju envCurrent environment: "amazon-ap"\$ juju switchCurrent environment: "amazon-ap"\$ juju switch -lCurrent environment: "amazon-ap"Environments:        amazon        amazon-ap        hpcloud        openstack\$ juju switch amazonChanged default environment from "amazon-ap" to "amazon"\$ juju switch amazonCurrent environment: "amazon"\$ juju switchCurrent environment: "amazon"`

If you have JUJU_ENV set, then you get told that the current environment is defined by this.  Also if you try to use switch to change the current environment when the environment is defined by JUJU_ENV, you will get an error.

`\$ export JUJU_ENV="amazon-ap"\$ juju switchCurrent environment: "amazon-ap" (from JUJU_ENV)\$ juju switch amazonerror: Cannot switch when JUJU_ENV is overriding the environment (set to "amazon-ap")`

Unknown said...

Nice. Reminds me of bazaar colo branches, I wonder where you got the inspiration :)

bigjools said...

Gah, Google ID leaves me as "unknown", let's try this.

Gavin Panella said...

This seems fairly complex. Are some of these 4 ways of specifying the environment going to be deprecated or removed?

For example, JUJU_ENV could be removed, and the default could be the first environment defined in environments.yaml. That would leave just `juju switch` and `juju -e \$env`.