/*
* Copyright 2008-2010 Xebia and 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 fr.xebia.workshop.continuousdelivery;
import com.amazonaws.services.ec2.model.Instance;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Map;
/**
* <p>
* Team infrastructure for the lab.
* </p>
*/
public class TeamInfrastructure implements Comparable{
/**
* The Jenkins server url (e.g. http://my-ec2-server:8080/) or
* <code>null</code> if the given ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the given jenkins instance is not initialized and has a
* <code>null</code> 'publicDnsName'.
*/
@Nullable
public static String getJenkinsUrl(@Nullable Instance jenkins) throws IllegalStateException {
if (jenkins == null) {
return null;
}
Preconditions.checkState(jenkins.getPublicDnsName() != null && !jenkins.getPublicDnsName().isEmpty(),
"Given jenkins is not yet initialized, it publicDnsName is null: %s", jenkins);
return "http://" + jenkins.getPublicDnsName() + ":8080/";
}
/**
* The Deployit server url (e.g. http://my-ec2-server:4516/) or
* <code>null</code> if the given ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the given jenkins instance is not initialized and has a
* <code>null</code> 'publicDnsName'.
*/
@Nullable
public static String getDeployitUrl(@Nullable Instance deployit) throws IllegalStateException {
if (deployit == null) {
return null;
}
Preconditions.checkState(deployit.getPublicDnsName() != null && !deployit.getPublicDnsName().isEmpty(),
"Given deployit is not yet initialized, it publicDnsName is null: %s", deployit);
return "http://" + deployit.getPublicDnsName() + ":4516/";
}
/**
* The Tomcat server url (e.g. http://my-ec2-server:8080/) or
* <code>null</code> if the given ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the given tomcat instance is not initialized and has a
* <code>null</code> 'publicDnsName'.
*/
@Nullable
public static String getTomcatUrl(@Nullable Instance tomcat) throws IllegalStateException {
if (tomcat == null) {
return null;
}
Preconditions.checkState(tomcat.getPublicDnsName() != null && !tomcat.getPublicDnsName().isEmpty(),
"Given tomcat is not yet initialized, it publicDnsName is null: %s", tomcat);
return "http://" + tomcat.getPublicDnsName() + ":8080/";
}
/**
* The Rundeck server url (e.g. http://my-ec2-server:4440/) or
* <code>null</code> if the given ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the given rundeck instance is not initialized and has a
* <code>null</code> 'publicDnsName'.
*/
@Nullable
public static String getRundeckUrl(Instance rundeck) {
if (rundeck == null) {
return null;
}
Preconditions.checkState(rundeck.getPublicDnsName() != null, "Given rundeck is not yet initialized, it publicDnsNAme is null: %s",
rundeck);
return "http://" + rundeck.getPublicDnsName() + ":4440/";
}
static final String ROLE_JENKINS_RUNDECK = "jenkins,rundeck";
static final String ROLE_NEXUS = "nexus";
static final String ROLE_TOMCAT = "tomcat";
private Instance devTomcat;
private String devTomcatName = "#devTomcat#";
private final WorkshopInfrastructure workshopInfrastructure;
private final String identifier;
private Instance jenkins;
private String jenkinsName = "#jenkins#";
private Instance nexus;
private Instance rundeck;
private String rundeckName = "#rundeck#";
private Instance validTomcat1;
private String validTomcat1Name = "#validTomcat1#";
private Instance validTomcat2;
private String validTomcat2Name = "#validTomcat2#";
public TeamInfrastructure(WorkshopInfrastructure workshopInfrastructure, String identifier) {
super();
this.workshopInfrastructure = workshopInfrastructure;
this.identifier = Preconditions.checkNotNull(identifier);
}
public void addInstance(Instance instance, Map<String, String> tags) {
String name = tags.get("Name");
String role = tags.get("Role");
if (ROLE_JENKINS_RUNDECK.equals(role)) {
this.jenkins = instance;
this.rundeck = instance;
this.jenkinsName = name;
this.rundeckName = name;
} else if (role.startsWith((ROLE_TOMCAT + "-"))) {
String environment = role.substring((ROLE_TOMCAT + "-").length());
if ("dev".equals(environment)) {
devTomcat = instance;
devTomcatName = name;
} else if ("valid".equals(environment)) {
if (validTomcat1 == null) {
validTomcat1 = instance;
validTomcat1Name = name;
} else if (validTomcat2 == null) {
validTomcat2 = instance;
validTomcat2Name = name;
} else {
throw new IllegalStateException("Valid tomcats already set");
}
} else {
throw new IllegalStateException("Dev tomcat already set");
}
}
}
/**
* FIXME cleanup this dirty code (CLC)
*
* @param environment like "dev" or "valid"
*/
public void addTomcat(@Nonnull String environment, @Nonnull Instance tomcatInstance, @Nonnull String tomcatServerName) {
if ("dev".equals(environment)) {
devTomcat = tomcatInstance;
devTomcatName = tomcatServerName;
} else if ("valid".equals(environment)) {
if (validTomcat1 == null) {
validTomcat1 = tomcatInstance;
validTomcat1Name = tomcatServerName;
} else if (validTomcat2 == null) {
validTomcat2 = tomcatInstance;
validTomcat2Name = tomcatServerName;
} else {
throw new IllegalStateException("Valid tomcats already set");
}
} else {
throw new IllegalStateException("Dev tomcat already set");
}
}
public String getNexusUrl() {
return workshopInfrastructure.getNexusUrlWithDomainName();
}
/**
* The Amazon EC2 instance of the Tomcat dev server
*/
public Instance getDevTomcat() {
return replaceIfNull(devTomcat);
}
private static Instance replaceIfNull(Instance instance) {
return instance != null ? instance : new NullInstance();
}
/**
* The Amazon EC2 Name of the Tomcat dev server
*/
public String getDevTomcatName() {
return devTomcatName;
}
/**
* Team identifier like a trigram or a number ("clc", "team-1", etc).
*/
public String getIdentifier() {
return identifier;
}
/**
* The Amazon EC2 instance of the Jenkins server
*/
public Instance getJenkins() {
return replaceIfNull(jenkins);
}
/**
* Amazon EC2 Name of the Jenkins server
*/
public String getJenkinsName() {
return jenkinsName;
}
/**
* <p>
* The GitHub repository home page url of the team. If the identifier is
* blank, the default xebia-petclinic project repository url is returned.
* </p>
* <p>
* e.g. "https://github.com/xebia-guest/xebia-petclinic-team-1"
* </p>
*/
@Nonnull
public String getGithubRepositoryHomePageUrl() {
return workshopInfrastructure.getGithubGuestAccountUrl() + getGithubRepositoryName();
}
@Nonnull
public String getGithubRepositoryName() {
String repositoryName = "xebia-petclinic-lite";
if (!Strings.isNullOrEmpty(identifier)) {
repositoryName += "-" + identifier;
}
return repositoryName;
}
/**
* <p>
* The GitHub repository clone url of the team. If the identifier is blank,
* the default xebia-petclinic project repository url is returned.
* </p>
* <p>
* e.g. "https://github.com/xebia-guest/xebia-petclinic-team-1"
* </p>
*/
@Nonnull
public String getGithubRepositoryCloneUrl() {
StringBuilder urlBuilder = new StringBuilder("https://");
String gitHubUsername = workshopInfrastructure.getGithubGuestAccountUsername();
if (!Strings.isNullOrEmpty(gitHubUsername)) {
urlBuilder.append(gitHubUsername).append("@");
}
return urlBuilder.append("github.com/")
.append(workshopInfrastructure.getGithubGuestAccountName())
.append("/")
.append(getGithubRepositoryName())
.append(".git")
.toString();
}
/**
* Username of the GitHub account.
*/
@Nullable
public String getGitHubAccountUsername() {
return workshopInfrastructure.getGithubGuestAccountName();
}
/**
* URL of the jenkins server like "http://my-server:8080/" or
* <code>""</code> if the underlying jenkins instance is <code>null</code>
* .
*
* @throws IllegalStateException
*/
public String getJenkinsUrl() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getJenkinsUrl(jenkins));
}
/**
* URL of the jenkins server like "http://my-server:8080/" or
* <code>""</code> if the underlying jenkins instance is <code>null</code>
* .
*
* @throws IllegalStateException
*/
public String getDeployitUrl() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getDeployitUrl(jenkins));
}
/**
* Amazon EC2 instance of the Nexus server
*/
public Instance getNexus() {
return replaceIfNull(nexus);
}
/**
* <p>
* The Maven project groupId. If the identifier is blank, the default
* project groupId "fr.xebia.demo.petclinic" is returned.
* </p>
* <p>
* e.g. "fr.xebia.demo.petclinic-" + identifier
* </p>
*/
@Nonnull
public String getProjectMavenGroupId() {
String projectMavenGroupId = "fr.xebia.demo.petclinic";
if (!Strings.isNullOrEmpty(identifier)) {
projectMavenGroupId += "-" + identifier;
}
return projectMavenGroupId;
}
public String getProjectMavenArtifactId() {
return "xebia-petclinic";
}
/**
* Amazon EC2 instance of the Nexus server
*/
public Instance getRundeck() {
return replaceIfNull(rundeck);
}
/**
* Amazon EC2 name of the Nexus server
*/
public String getRundeckName() {
return rundeckName;
}
/**
* URL of the rundeck server like "http://my-server:4440/" or
* <code>""</code> if underlying rundeck is <code>null</code>.
*
* @throws IllegalStateException the underlying jenkins instance is <code>null</code>.
*/
@Nullable
public String getRundeckUrl() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getRundeckUrl(rundeck));
}
/**
* Amazon EC2 instance of the Valid Tomcat 1 server
*/
public Instance getValidTomcat1() {
return replaceIfNull(validTomcat1);
}
/**
* Amazon EC2 name of the Valid Tomcat 1 server
*/
public String getValidTomcat1Name() {
return validTomcat1Name;
}
/**
* Amazon EC2 instance of the Valid Tomcat 2 server
*/
public Instance getValidTomcat2() {
return replaceIfNull(validTomcat2);
}
/**
* The Tomcat server url (e.g. http://my-ec2-server:8080/) or
* <code>""</code> if the underlying ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the underlying tomcat instance is not initialized and has
* a <code>null</code> 'publicDnsName'.
*/
@Nullable
public String getValidTomcat2Url() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getTomcatUrl(validTomcat2));
}
/**
* The Tomcat server url (e.g. http://my-ec2-server:8080/) or
* <code>""</code> if the underlying ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the underlying tomcat instance is not initialized and has
* a <code>null</code> 'publicDnsName'.
*/
@Nullable
public String getValidTomcat1Url() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getTomcatUrl(validTomcat1));
}
/**
* The Tomcat server url (e.g. http://my-ec2-server:8080/) or
* <code>""</code> if the underlying ec2 instance is <code>null</code>.
*
* @throws IllegalStateException if the underlying tomcat instance is not initialized and has
* a <code>null</code> 'publicDnsName'.
*/
@Nullable
public String getDevTomcatUrl() throws IllegalStateException {
return Strings.nullToEmpty(TeamInfrastructure.getTomcatUrl(devTomcat));
}
/**
* Amazon EC2 name of the Valid Tomcat 2 server
*/
public String getValidTomcat2Name() {
return validTomcat2Name;
}
public void setDevTomcat(Instance devTomcat) {
this.devTomcat = devTomcat;
}
public void setDevTomcatName(String devTomcatName) {
this.devTomcatName = devTomcatName;
}
public void setJenkins(Instance jenkins) {
this.jenkins = jenkins;
}
public void setJenkinsName(String jenkinsName) {
this.jenkinsName = jenkinsName;
}
public void setNexus(Instance nexus) {
this.nexus = nexus;
}
public void setRundeck(Instance rundeck) {
this.rundeck = rundeck;
}
public void setRundeckName(String rundeckName) {
this.rundeckName = rundeckName;
}
public void setValidTomcat1(Instance validTomcat1) {
this.validTomcat1 = validTomcat1;
}
public void setValidTomcat1Name(String validTomcat1Name) {
this.validTomcat1Name = validTomcat1Name;
}
public void setValidTomcat2(Instance validTomcat2) {
this.validTomcat2 = validTomcat2;
}
public void setValidTomcat2Name(String validTomcat2Name) {
this.validTomcat2Name = validTomcat2Name;
}
@Override
public String toString() {
return Objects.toStringHelper(this) //
.add("id", identifier) //
.add(jenkinsName, jenkins) //
.add(devTomcatName, devTomcat) //
.add(validTomcat1Name, validTomcat1) //
.add(validTomcat2Name, validTomcat2) //
.add("nexus", nexus) //
.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TeamInfrastructure that = (TeamInfrastructure) o;
if (!identifier.equals(that.identifier)) return false;
return true;
}
@Override
public int hashCode() {
return identifier.hashCode();
}
@Override
public int compareTo(Object o) {
if(o instanceof TeamInfrastructure){
return getIdentifier().compareTo(((TeamInfrastructure)o).getIdentifier());
}
return 0;
}
// quick fix for to please FreeMarker
public static class NullInstance extends Instance {
@Override
public String getPrivateDnsName() {
return "";
}
@Override
public String getPrivateIpAddress() {
return "";
}
@Override
public String getPublicDnsName() {
return "";
}
@Override
public String getPublicIpAddress() {
return "";
}
}
}