/*
* Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jp.classmethod.aws.gradle.elasticbeanstalk;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.Getter;
import lombok.Setter;
import org.gradle.api.internal.ConventionTask;
import org.gradle.api.tasks.TaskAction;
import com.amazonaws.services.elasticbeanstalk.AWSElasticBeanstalk;
import com.amazonaws.services.elasticbeanstalk.model.CreateEnvironmentRequest;
import com.amazonaws.services.elasticbeanstalk.model.CreateEnvironmentResult;
import com.amazonaws.services.elasticbeanstalk.model.DescribeEnvironmentsRequest;
import com.amazonaws.services.elasticbeanstalk.model.DescribeEnvironmentsResult;
import com.amazonaws.services.elasticbeanstalk.model.Tag;
import com.amazonaws.services.elasticbeanstalk.model.UpdateEnvironmentRequest;
public class AWSElasticBeanstalkCreateEnvironmentTask extends ConventionTask { // NOPMD
@Getter
@Setter
private String appName;
@Getter
@Setter
private String envName;
@Getter
@Setter
private String envDesc = "";
@Getter
@Setter
private String cnamePrefix = java.util.UUID.randomUUID().toString();
@Getter
@Setter
private String templateName;
@Getter
@Setter
private String versionLabel;
@Getter
@Setter
private Tier tier = Tier.WebServer;
@Getter
@Setter
private Map<String, String> tags = new HashMap<String, String>();
public AWSElasticBeanstalkCreateEnvironmentTask() {
setDescription("Create/Migrate ElasticBeanstalk Environment.");
setGroup("AWS");
}
@TaskAction
public void createEnvironment() { // NOPMD
// to enable conventionMappings feature
String appName = getAppName();
String envName = getEnvName();
String envDesc = getEnvDesc();
String cnamePrefix = getCnamePrefix();
String templateName = getTemplateName();
String versionLabel = getVersionLabel();
Tier tier = getTier();
Map<String, String> tags = getTags();
AwsBeanstalkPluginExtension ext = getProject().getExtensions().getByType(AwsBeanstalkPluginExtension.class);
AWSElasticBeanstalk eb = ext.getClient();
DescribeEnvironmentsResult der = eb.describeEnvironments(new DescribeEnvironmentsRequest()
.withApplicationName(appName)
.withEnvironmentNames(envName)
.withIncludeDeleted(false));
List<Tag> ebTags = tags
.entrySet()
.stream()
.map(entry -> {
Tag t = new Tag();
t.setKey(entry.getKey());
t.setValue(entry.getValue());
return t;
})
.collect(Collectors.toList());
if (der.getEnvironments() == null || der.getEnvironments().isEmpty()) {
CreateEnvironmentRequest req = new CreateEnvironmentRequest()
.withApplicationName(appName)
.withEnvironmentName(envName)
.withDescription(envDesc)
.withTemplateName(templateName)
.withVersionLabel(versionLabel);
if (tier != null) {
req.withTier(tier.toEnvironmentTier());
if (tier == Tier.WebServer) {
req.withCNAMEPrefix(cnamePrefix);
}
}
if (ebTags != null && !ebTags.isEmpty()) {
req.withTags(ebTags);
}
CreateEnvironmentResult result = eb.createEnvironment(req);
getLogger().info("environment {} @ {} ({}) created", envName, appName, result.getEnvironmentId());
} else {
String environmentId = der.getEnvironments().get(0).getEnvironmentId();
// Only these two values are required to deploy the a application
UpdateEnvironmentRequest req = new UpdateEnvironmentRequest()
.withEnvironmentId(environmentId)
.withVersionLabel(versionLabel);
// All other variables are optional and refer to the environment
if (isNotBlank(envName)) {
req.withEnvironmentName(envName);
}
if (isNotBlank(envDesc)) {
req.withDescription(envDesc);
}
if (isNotBlank(templateName)) {
req.withTemplateName(templateName);
}
eb.updateEnvironment(req);
getLogger().info("environment {} @ {} ({}) updated", envName, appName, environmentId);
}
}
// simple helper method to not include apache commons lang's StringUtils only for this
private boolean isNotBlank(String str) {
return str != null && !str.trim().isEmpty();
}
}