protected Object executeInternal() throws Exception {
versionLabel = lookupVersionLabel(applicationName, versionLabel);
getLog().info(format("Using version %s", versionLabel));
Collection<EnvironmentDescription> envs = new WaitForEnvironmentCommand(this).lookupInternal(new WaitForEnvironmentContextBuilder().withApplicationName(applicationName).withEnvironmentRef(environmentNamePrefix + "*").build());
if (envs.size() > 2) {
final Collection<String> environmentList = Collections2.transform(envs, new Function<EnvironmentDescription, String>() {
@Override
public String apply(EnvironmentDescription input) {
return format("%s[%s]", input.getEnvironmentId(), input.getEnvironmentName());
}
});
String message = "Ooops. There are multiple environments matching the lookup spec: " + environmentList;
getLog().warn(message);
getLog().warn("Will pick one at random anyway as long as it uses WebServer tier name");
}
String otherEnvId = null;
for (EnvironmentDescription e : envs) {
if (! e.getEnvironmentId().equals(curEnv.getEnvironmentId()) && "WebServer".equals(e.getTier().getName())) {
otherEnvId = e.getEnvironmentId();
break;
}
}
getLog().info(format("(Green) Environment with environmentId['%s'] will be prepared once its ready to update", curEnv.getEnvironmentId()));
new WaitForEnvironmentCommand(this).execute(new WaitForEnvironmentContextBuilder().withStatusToWaitFor("Ready").withApplicationName(applicationName).withEnvironmentRef(curEnv.getEnvironmentId()).build());
getLog().info(format("(Blue) Environment with environmentId['%s'] will be prepared once its ready to update", otherEnvId));
new WaitForEnvironmentCommand(this).execute(new WaitForEnvironmentContextBuilder().withStatusToWaitFor("Ready").withApplicationName(applicationName).withEnvironmentRef(otherEnvId).build());
getLog().info(format("(Blue) Updating environmentId to version %s", versionLabel));
new UpdateEnvironmentCommand(this).execute(new UpdateEnvironmentContextBuilder().withEnvironmentId(otherEnvId).withVersionLabel(versionLabel).build());
getLog().info(format("(Blue) Waiting for environmentId['%s'] to get ready and green prior to switching", otherEnvId));
new WaitForEnvironmentCommand(this).execute(new WaitForEnvironmentContextBuilder().withStatusToWaitFor("Ready").withApplicationName(applicationName).withHealth("Green").withEnvironmentRef(otherEnvId).build());
getLog().info(format("Ok. Switching"));
getService().swapEnvironmentCNAMEs(new SwapEnvironmentCNAMEsRequest().withDestinationEnvironmentId(curEnv.getEnvironmentId()).withSourceEnvironmentId(otherEnvId));