package de.codecentric.jenkins.dashboard;
import hudson.Extension;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import hudson.security.ACL;
import hudson.util.ComboBoxModel;
import hudson.util.ListBoxModel;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Nonnull;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.cloudbees.plugins.credentials.CredentialsProvider;
import com.cloudbees.plugins.credentials.domains.DomainRequirement;
import de.codecentric.jenkins.dashboard.api.environments.ServerEnvironment;
import de.codecentric.jenkins.dashboard.ec2.AwsKeyCredentials;
import de.codecentric.jenkins.dashboard.impl.environments.EnvironmentType;
import de.codecentric.jenkins.dashboard.impl.environments.ec2.AwsRegion;
import de.codecentric.jenkins.dashboard.impl.environments.ec2.EC2Connector;
/**
* Describes the environment configuration.
*/
public class Environment extends AbstractDescribableImpl<Environment> {
private final static Logger LOGGER = Logger.getLogger(Environment.class.getName());
private String name;
private String urlPrefix;
private String urlPostfix;
private EnvironmentType environmentType;
private String awsInstance;
private String region;
private String credentials;
private String buildJob;
@DataBoundConstructor
public Environment(@Nonnull final String name, final String urlPrefix, final String urlPostfix, @Nonnull final String credentials, @Nonnull final String region,
@Nonnull final String environmentType, final String awsInstance, final String buildJob) {
LOGGER.info("New environment created: " + credentials + ", " + region);
setName(name);
setCredentials(credentials);
setRegion(region);
setEnvironmentType(environmentType);
setAwsInstance(awsInstance);
setBuildJob(buildJob);
setUrlPostfix(urlPostfix);
setUrlPrefix(urlPrefix);
}
@Extension
public static class EnvironmentDescriptor extends Descriptor<Environment> {
public String getDisplayName() {
return Messages.Environment_DisplayName();
}
public ListBoxModel doFillEnvironmentTypeItems() {
ListBoxModel model = new ListBoxModel();
for (EnvironmentType value : EnvironmentType.values()) {
model.add(value.getDescription(), value.name());
}
return model;
}
public ListBoxModel doFillCredentialsItems() {
final ListBoxModel model = new ListBoxModel();
DomainRequirement domain = new DomainRequirement();
for (AwsKeyCredentials credentials : CredentialsProvider.lookupCredentials(AwsKeyCredentials.class, Jenkins.getInstance(), ACL.SYSTEM, domain)) {
model.add(credentials.getId());
}
return model;
}
public ListBoxModel doFillAwsInstanceItems(@QueryParameter String region, @QueryParameter String credentials) {
final ListBoxModel model = new ListBoxModel();
LOGGER.info("Looking for instances in " + region);
if (StringUtils.isBlank(region)) {
LOGGER.info("Region is empty");
return model;
}
for (ServerEnvironment env : getEC2Instances(region, credentials)) {
model.add(env.getEnvironmentTag());
}
return model;
}
private List<ServerEnvironment> getEC2Instances(String region, String credentialsId) {
final EC2Connector ec2 = EC2Connector.getEC2Connector(credentialsId);
if (ec2 == null) {
return Collections.<ServerEnvironment> emptyList();
}
return ec2.getEnvironments(Region.getRegion(Regions.fromName(region)));
}
public ListBoxModel doFillRegionItems() {
final ListBoxModel model = new ListBoxModel();
for (AwsRegion value : AwsRegion.values()) {
model.add(value.getName(), value.getIdentifier());
}
return model;
}
public ComboBoxModel doFillBuildJobItems() {
ComboBoxModel model = new ComboBoxModel();
for (String jobName : Jenkins.getInstance().getJobNames()) {
model.add(jobName);
}
return model;
}
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getEnvironmentType() {
return environmentType.name();
}
public void setEnvironmentType(final String environmentType) {
this.environmentType = EnvironmentType.valueOf(environmentType);
}
public String getAwsInstance() {
return awsInstance;
}
public void setAwsInstance(final String awsInstance) {
this.awsInstance = awsInstance;
}
public String getRegion() {
return region;
}
public void setRegion(final String region) {
this.region = region;
}
public String getCredentials() {
return credentials;
}
public void setCredentials(final String credentials) {
this.credentials = credentials;
}
public String getBuildJob() {
return buildJob;
}
public void setBuildJob(final String buildJob) {
this.buildJob = buildJob;
}
public String getUrlPrefix() {
return urlPrefix;
}
public void setUrlPrefix(String urlPrefix) {
this.urlPrefix = urlPrefix;
}
public String getUrlPostfix() {
return urlPostfix;
}
public void setUrlPostfix(String urlPostfix) {
this.urlPostfix = urlPostfix;
}
}