bug4811: removed testMongoReplica because it required access to port 27017 of the MongoDB instance created

This commit is contained in:
Axel Uhl
2020-11-10 15:44:40 +01:00
parent 4e4c1a13fc
commit 72001abac4
18 changed files with 314 additions and 239 deletions
@@ -35,7 +35,9 @@ import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.landscape.InboundReplicationConfiguration;
import com.sap.sse.landscape.application.ApplicationMasterProcess;
import com.sap.sse.landscape.application.ApplicationProcessMetrics;
import com.sap.sse.landscape.application.ApplicationReplicaProcess;
import com.sap.sse.landscape.aws.AmazonMachineImage;
import com.sap.sse.landscape.aws.AwsInstance;
import com.sap.sse.landscape.aws.AwsLandscape;
@@ -82,7 +84,7 @@ public class TestProcedures {
public void testStartupEmptyMultiServer() throws Exception {
final String keyName = "MyKey-"+UUID.randomUUID();
landscape.createKeyPair(region, keyName);
final StartMultiServer.Builder<String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> builder = StartMultiServer.builder();
final StartMultiServer.Builder<?, String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> builder = StartMultiServer.builder();
final StartMultiServer<String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> startEmptyMultiServer = builder
.setLandscape(landscape)
.setKeyName(keyName)
@@ -114,7 +116,7 @@ public class TestProcedures {
public void testAddMongoReplica() throws Exception {
final String keyName = "MyKey-"+UUID.randomUUID();
landscape.createKeyPair(region, keyName);
final StartMongoDBServer.Builder<String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> builder = StartMongoDBServer.builder();
final StartMongoDBServer.Builder<?, String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> builder = StartMongoDBServer.builder();
final StartMongoDBServer<String, SailingAnalyticsMetrics, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> startMongoDBServerProcedure = builder
.setLandscape(landscape)
.setKeyName(keyName)
@@ -161,7 +163,7 @@ public class TestProcedures {
public void testImageUpgrade() throws Exception {
final String keyName = "MyKey-"+UUID.randomUUID();
landscape.createKeyPair(region, keyName);
final com.sap.sailing.landscape.procedures.UpgradeAmi.Builder<String, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> imageUpgradeProcedureBuilder = UpgradeAmi.builder();
final com.sap.sailing.landscape.procedures.UpgradeAmi.Builder<?, String, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> imageUpgradeProcedureBuilder = UpgradeAmi.builder();
final UpgradeAmi<String, SailingAnalyticsMaster<String>, SailingAnalyticsReplica<String>> imageUpgradeProcedure =
imageUpgradeProcedureBuilder
.setLandscape(landscape)
@@ -184,34 +186,12 @@ public class TestProcedures {
}
}
@Test
public void testMongoReplica() throws Exception {
final Builder<String, ApplicationProcessMetrics, ?, ?> startMongoDBServerProcedureBuilder = StartMongoDBServer.builder();
final StartMongoDBServer<String, ApplicationProcessMetrics, ?, ?> startMongoDBServerProcedure = startMongoDBServerProcedureBuilder.build();
// by default this should add a replica to the only "live" server in the test landscape
try {
startMongoDBServerProcedure.run();
final AwsInstance<String, ApplicationProcessMetrics> host = startMongoDBServerProcedure.getHost();
final String internalDNSName = landscape.getInstance(host.getInstanceId(), region).privateDnsName();
// now configure a MongoEndpoint against the replica just launched and try to connect (with a timeout)
final MongoEndpoint mongoEndpoint = landscape.getDatabaseConfigurationForDefaultReplicaSet(region);
final MongoClient mongoClient = mongoEndpoint.getClient();
final MongoDatabase database = mongoClient.getDatabase("admin");
final Document replicaSetStatus = database.runCommand(new Document("replSetGetStatus", 1));
@SuppressWarnings("unchecked")
final List<Document> members = (List<Document>) replicaSetStatus.get("members");
assertTrue(members.stream().filter(member->member.get("name").equals(internalDNSName+":27017")).findAny().isPresent());
} finally {
startMongoDBServerProcedure.getHost().terminate();
}
}
@Test
public void testConnectivity() throws Exception {
final String serverName = "test"+new Random().nextInt();
final String keyName = "MyKey-"+UUID.randomUUID();
landscape.createKeyPair(region, keyName);
final StartSailingAnalyticsMaster.Builder<String> builder = StartSailingAnalyticsMaster.builder();
final StartSailingAnalyticsMaster.Builder<?, String> builder = StartSailingAnalyticsMaster.builder();
final StartSailingAnalyticsMaster<String> startSailingAnalyticsMaster = builder
.setServerName(serverName)
.setLandscape(landscape)
@@ -44,22 +44,24 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
* </ul>
* @author Axel Uhl (D043530)
*/
public static interface Builder<T extends StartEmptyServer<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
public static interface Builder<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartEmptyServer<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartAwsHost.Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setNoShutdown(boolean noShutdown);
extends StartAwsHost.Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
BuilderT setNoShutdown(boolean noShutdown);
}
protected abstract static class BuilderImpl<T extends StartEmptyServer<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
protected abstract static class BuilderImpl<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartEmptyServer<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartAwsHost.BuilderImpl<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
extends StartAwsHost.BuilderImpl<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
private boolean noShutdown = true;
protected boolean isNoShutdown() {
@@ -67,9 +69,9 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setNoShutdown(boolean noShutdown) {
public BuilderT setNoShutdown(boolean noShutdown) {
this.noShutdown = noShutdown;
return this;
return self();
}
protected String getInstanceName() {
@@ -77,7 +79,7 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
}
}
public StartEmptyServer(BuilderImpl<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
public StartEmptyServer(BuilderImpl<?, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
super(builder);
addUserData(Collections.singleton(IMAGE_UPGRADE_USER_DATA));
if (builder.isNoShutdown()) {
@@ -48,18 +48,20 @@ implements StartFromSailingAnalyticsImage {
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<ShardingKey, MetricsT extends ApplicationProcessMetrics,
public static interface Builder<BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
extends StartEmptyServer.Builder<StartMultiServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>> {
extends StartEmptyServer.Builder<BuilderT, StartMultiServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>> {
}
protected static class BuilderImpl<ShardingKey, MetricsT extends ApplicationProcessMetrics,
protected static class BuilderImpl<BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
extends StartEmptyServer.BuilderImpl<StartMultiServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
extends StartEmptyServer.BuilderImpl<BuilderT, StartMultiServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>>
implements Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
implements Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
@Override
public StartMultiServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> build() {
return new StartMultiServer<>(this);
@@ -109,14 +111,15 @@ implements StartFromSailingAnalyticsImage {
}
}
public static <ShardingKey, MetricsT extends ApplicationProcessMetrics,
public static <BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder() {
Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder() {
return new BuilderImpl<>();
}
protected StartMultiServer(BuilderImpl<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder) {
protected StartMultiServer(BuilderImpl<?, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder) {
super(builder);
this.optionalTimeout = builder.getOptionalTimeout();
}
@@ -57,20 +57,22 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaste
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<T extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT extends SailingAnalyticsProcess<ShardingKey>>
extends StartAwsApplicationHost.Builder<T, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaster<ShardingKey>, SailingAnalyticsReplica<ShardingKey>, SailingAnalyticsHost<ShardingKey>> {
Builder<T, ShardingKey, ProcessT> setPort(int port);
public static interface Builder<BuilderT extends Builder<BuilderT, T, ShardingKey, ProcessT>,
T extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT extends SailingAnalyticsProcess<ShardingKey>>
extends StartAwsApplicationHost.Builder<BuilderT, T, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaster<ShardingKey>, SailingAnalyticsReplica<ShardingKey>, SailingAnalyticsHost<ShardingKey>> {
BuilderT setPort(int port);
Builder<T, ShardingKey, ProcessT> setTelnetPort(int telnetPort);
BuilderT setTelnetPort(int telnetPort);
Builder<T, ShardingKey, ProcessT> setExpeditionPort(int expeditionPort);
BuilderT setExpeditionPort(int expeditionPort);
Builder<T, ShardingKey, ProcessT> setDefaultServerDirectory(String serverDirectory);
BuilderT setDefaultServerDirectory(String serverDirectory);
}
protected abstract static class BuilderImpl<T extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT extends SailingAnalyticsProcess<ShardingKey>>
extends StartAwsApplicationHost.BuilderImpl<T, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaster<ShardingKey>, SailingAnalyticsReplica<ShardingKey>, SailingAnalyticsHost<ShardingKey>>
implements Builder<T, ShardingKey, ProcessT> {
protected abstract static class BuilderImpl<BuilderT extends Builder<BuilderT, T, ShardingKey, ProcessT>,
T extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT extends SailingAnalyticsProcess<ShardingKey>>
extends StartAwsApplicationHost.BuilderImpl<BuilderT, T, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaster<ShardingKey>, SailingAnalyticsReplica<ShardingKey>, SailingAnalyticsHost<ShardingKey>>
implements Builder<BuilderT, T, ShardingKey, ProcessT> {
private Integer port;
private Integer telnetPort;
private Integer expeditionPort;
@@ -101,9 +103,9 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaste
}
@Override
public Builder<T, ShardingKey, ProcessT> setPort(int port) {
public BuilderT setPort(int port) {
this.port = port;
return this;
return self();
}
public Integer getTelnetPort() {
@@ -111,9 +113,9 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaste
}
@Override
public Builder<T, ShardingKey, ProcessT> setTelnetPort(int telnetPort) {
public BuilderT setTelnetPort(int telnetPort) {
this.telnetPort = telnetPort;
return this;
return self();
}
public Integer getExpeditionPort() {
@@ -121,9 +123,9 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaste
}
@Override
public Builder<T, ShardingKey, ProcessT> setExpeditionPort(int expeditionPort) {
public BuilderT setExpeditionPort(int expeditionPort) {
this.expeditionPort = expeditionPort;
return this;
return self();
}
// TODO the host start-up should ideally be separated from the process installation/startup
@@ -132,13 +134,13 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsMaste
}
@Override
public Builder<T, ShardingKey, ProcessT> setDefaultServerDirectory(String defaultServerDirectory) {
public BuilderT setDefaultServerDirectory(String defaultServerDirectory) {
this.defaultServerDirectory = defaultServerDirectory;
return this;
return self();
}
}
protected StartSailingAnalyticsHost(BuilderImpl<? extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT> builder) {
protected StartSailingAnalyticsHost(BuilderImpl<?, ? extends StartSailingAnalyticsHost<ShardingKey, ProcessT>, ShardingKey, ProcessT> builder) {
super(builder);
// remember the port we need in order to hand out the process
this.port = builder.getPort();
@@ -24,18 +24,18 @@ public class StartSailingAnalyticsMaster<ShardingKey>
extends StartSailingAnalyticsHost<ShardingKey, SailingAnalyticsMaster<ShardingKey>> {
private static final String DEFAULT_MASTER_INSTANCE_NAME_SUFFIX = " (Master)";
public static interface Builder<ShardingKey>
extends StartSailingAnalyticsHost.Builder<StartSailingAnalyticsMaster<ShardingKey>, ShardingKey, SailingAnalyticsMaster<ShardingKey>> {
public static interface Builder<BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey>
extends StartSailingAnalyticsHost.Builder<BuilderT, StartSailingAnalyticsMaster<ShardingKey>, ShardingKey, SailingAnalyticsMaster<ShardingKey>> {
}
// TODO model an AwsLandscape subclass describing the specifics of the Sailing landscape, with a central security service that a master replicates by default
protected static class BuilderImpl<ShardingKey>
extends StartSailingAnalyticsHost.BuilderImpl<StartSailingAnalyticsMaster<ShardingKey>, ShardingKey, SailingAnalyticsMaster<ShardingKey>>
implements Builder<ShardingKey> {
protected static class BuilderImpl<BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey>
extends StartSailingAnalyticsHost.BuilderImpl<BuilderT, StartSailingAnalyticsMaster<ShardingKey>, ShardingKey, SailingAnalyticsMaster<ShardingKey>>
implements Builder<BuilderT, ShardingKey> {
@Override
public StartSailingAnalyticsMaster<ShardingKey> build() {
return new StartSailingAnalyticsMaster<ShardingKey>(this);
return new StartSailingAnalyticsMaster<>(this);
}
@Override
@@ -44,11 +44,11 @@ public class StartSailingAnalyticsMaster<ShardingKey>
}
}
public static <ShardingKey> Builder<ShardingKey> builder() {
public static <BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey> Builder<BuilderT, ShardingKey> builder() {
return new BuilderImpl<>();
}
protected StartSailingAnalyticsMaster(BuilderImpl<ShardingKey> builder) {
protected StartSailingAnalyticsMaster(BuilderImpl<?, ShardingKey> builder) {
super(builder);
addUserData(ProcessConfigurationVariable.USE_ENVIRONMENT, "live-master-server"); // TODO maybe this should be handled by this procedure adding the correct defaults, e.g., for replicating security/sharedsailing?
}
@@ -7,19 +7,19 @@ import com.sap.sse.landscape.ProcessConfigurationVariable;
public class StartSailingAnalyticsReplica<ShardingKey>
extends StartSailingAnalyticsHost<ShardingKey, SailingAnalyticsReplica<ShardingKey>> {
public static interface Builder<ShardingKey>
extends StartSailingAnalyticsHost.Builder<StartSailingAnalyticsReplica<ShardingKey>, ShardingKey, SailingAnalyticsReplica<ShardingKey>> {
public static interface Builder<BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey>
extends StartSailingAnalyticsHost.Builder<BuilderT, StartSailingAnalyticsReplica<ShardingKey>, ShardingKey, SailingAnalyticsReplica<ShardingKey>> {
}
protected static class BuilderImpl<ShardingKey>
extends StartSailingAnalyticsHost.BuilderImpl<StartSailingAnalyticsReplica<ShardingKey>, ShardingKey, SailingAnalyticsReplica<ShardingKey>>
implements Builder<ShardingKey> {
protected static class BuilderImpl<BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey>
extends StartSailingAnalyticsHost.BuilderImpl<BuilderT, StartSailingAnalyticsReplica<ShardingKey>, ShardingKey, SailingAnalyticsReplica<ShardingKey>>
implements Builder<BuilderT, ShardingKey> {
private static final String DEFAULT_REPLICA_INSTANCE_NAME_SUFFIX = " (Replica)";
private static final String DEFAULT_REPLICA_OUTPUT_REPLICATION_EXCHANGE_NAME_SUFFIX = "-replica";
@Override
public StartSailingAnalyticsReplica<ShardingKey> build() {
return new StartSailingAnalyticsReplica<ShardingKey>(this);
return new StartSailingAnalyticsReplica<>(this);
}
@Override
@@ -43,11 +43,11 @@ public class StartSailingAnalyticsReplica<ShardingKey>
}
}
public static <ShardingKey> Builder<ShardingKey> builder() {
public static <BuilderT extends Builder<BuilderT, ShardingKey>, ShardingKey> Builder<BuilderT, ShardingKey> builder() {
return new BuilderImpl<>();
}
protected StartSailingAnalyticsReplica(BuilderImpl<ShardingKey> builder) {
protected StartSailingAnalyticsReplica(BuilderImpl<?, ShardingKey> builder) {
super(builder);
addUserData(ProcessConfigurationVariable.USE_ENVIRONMENT, "live-replica-server"); // TODO maybe this should be handled by this procedure adding the correct defaults, e.g., for replicating security/sharedsailing?
}
@@ -78,17 +78,17 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, Repli
* </ul>
* @author Axel Uhl (D043530)
*/
public static interface Builder<ShardingKey,
public static interface Builder<BuilderT extends Builder<BuilderT, ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>>
extends StartEmptyServer.Builder<UpgradeAmi<ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT, SailingAnalyticsHost<ShardingKey>> {
extends StartEmptyServer.Builder<BuilderT, UpgradeAmi<ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT, SailingAnalyticsHost<ShardingKey>> {
enum VersionPart {
MAJOR, MINOR, MICRO
}
Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setUpgradedImageName(String upgradedImageName);
BuilderT setUpgradedImageName(String upgradedImageName);
Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setVersionPartToIncrement(VersionPart versionPartToIncrement);
BuilderT setVersionPartToIncrement(VersionPart versionPartToIncrement);
/**
* It is possible to assign base names for snapshots based on their device name in the AMI. For example, "/dev/sdc" may
@@ -97,14 +97,14 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, Repli
* a block device mapping to a snapshot exists, the snapshot will only be named after the AMI's name, so when multiple snapshots
* are connected to the AMI then their names will not be discernible.
*/
Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setSnapshotBaseName(String deviceName, String snapshotBaseName);
BuilderT setSnapshotBaseName(String deviceName, String snapshotBaseName);
}
protected static class BuilderImpl<ShardingKey,
protected static class BuilderImpl<BuilderT extends Builder<BuilderT, ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>>
extends StartEmptyServer.BuilderImpl<UpgradeAmi<ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT, SailingAnalyticsHost<ShardingKey>>
implements Builder<ShardingKey, MasterProcessT, ReplicaProcessT> {
extends StartEmptyServer.BuilderImpl<BuilderT, UpgradeAmi<ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT, SailingAnalyticsHost<ShardingKey>>
implements Builder<BuilderT, ShardingKey, MasterProcessT, ReplicaProcessT> {
private String upgradedImageName;
private VersionPart versionPartToIncrement;
private final Map<String, String> deviceNamesToSnapshotBaseNames;
@@ -126,9 +126,9 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, Repli
}
@Override
public Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setVersionPartToIncrement(VersionPart versionPartToIncrement) {
public BuilderT setVersionPartToIncrement(VersionPart versionPartToIncrement) {
this.versionPartToIncrement = versionPartToIncrement;
return this;
return self();
}
private String increaseVersionNumber(String imageName) {
@@ -168,15 +168,15 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, Repli
}
@Override
public Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setUpgradedImageName(String upgradedImageName) {
public BuilderT setUpgradedImageName(String upgradedImageName) {
this.upgradedImageName = upgradedImageName;
return this;
return self();
}
@Override
public Builder<ShardingKey, MasterProcessT, ReplicaProcessT> setSnapshotBaseName(String deviceName, String snapshotBaseName) {
public BuilderT setSnapshotBaseName(String deviceName, String snapshotBaseName) {
deviceNamesToSnapshotBaseNames.put(deviceName, snapshotBaseName);
return this;
return self();
}
@Override
@@ -201,14 +201,14 @@ implements Procedure<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, Repli
}
}
public static <ShardingKey,
public static <BuilderT extends Builder<BuilderT, ShardingKey, MasterProcessT, ReplicaProcessT>, ShardingKey,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, SailingAnalyticsMetrics, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, SailingAnalyticsMetrics>> Builder<ShardingKey, MasterProcessT, ReplicaProcessT> builder() {
HostT extends AwsInstance<ShardingKey, SailingAnalyticsMetrics>> Builder<BuilderT, ShardingKey, MasterProcessT, ReplicaProcessT> builder() {
return new BuilderImpl<>();
}
protected UpgradeAmi(BuilderImpl<ShardingKey, MasterProcessT, ReplicaProcessT> builder) {
protected UpgradeAmi(BuilderImpl<?, ShardingKey, MasterProcessT, ReplicaProcessT> builder) {
super(builder);
upgradedImageName = builder.getUpgradedImageName();
timeout = builder.getOptionalTimeout().orElse(null);
@@ -75,14 +75,19 @@ public class AwsInstanceImpl<ShardingKey, MetricsT extends ApplicationProcessMet
}
@Override
public InetAddress getPrivateAddress(Optional<Duration> timeoutNullMeaningForever) {
return getAddressWithTimeout(timeoutNullMeaningForever, this::getPrivateAddress);
public InetAddress getPublicAddress(Optional<Duration> timeoutEmptyMeaningForever) {
return getAddressWithTimeout(timeoutEmptyMeaningForever, this::getPublicAddress);
}
@Override
public InetAddress getPrivateAddress() {
return getIpAddress(Instance::privateIpAddress);
}
@Override
public InetAddress getPrivateAddress(Optional<Duration> timeoutEmptyMeaningForever) {
return getAddressWithTimeout(timeoutEmptyMeaningForever, this::getPrivateAddress);
}
private InetAddress getIpAddress(Function<Instance, String> addressAsStringSupplier) {
try {
@@ -115,11 +120,6 @@ public class AwsInstanceImpl<ShardingKey, MetricsT extends ApplicationProcessMet
return result;
}
@Override
public InetAddress getPublicAddress(Optional<Duration> timeoutNullMeaningForever) {
return getAddressWithTimeout(timeoutNullMeaningForever, this::getPublicAddress);
}
/**
* Establishes an unconnected session configured for the "root" user.
*
@@ -231,4 +231,9 @@ public class AwsInstanceImpl<ShardingKey, MetricsT extends ApplicationProcessMet
public void terminate() {
landscape.terminate(this);
}
@Override
public String toString() {
return getInstanceId();
}
}
@@ -47,34 +47,36 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
public static interface Builder<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartAwsHost.Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRelease(Optional<Release> release);
extends StartAwsHost.Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
BuilderT setRelease(Optional<Release> release);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setServerName(String serverName);
BuilderT setServerName(String serverName);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseName(String databaseName);
BuilderT setDatabaseName(String databaseName);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration);
BuilderT setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration);
BuilderT setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration);
BuilderT setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseConfiguration(Database databaseConfiguration);
BuilderT setDatabaseConfiguration(Database databaseConfiguration);
}
protected abstract static class BuilderImpl<T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
protected abstract static class BuilderImpl<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartAwsHost.BuilderImpl<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
extends StartAwsHost.BuilderImpl<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
private Optional<Release> release = Optional.empty();
private String serverName;
private String databaseName;
@@ -92,9 +94,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRelease(Optional<Release> release) {
public BuilderT setRelease(Optional<Release> release) {
this.release = release;
return this;
return self();
}
protected String getServerName() {
@@ -102,9 +104,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setServerName(String serverName) {
public BuilderT setServerName(String serverName) {
this.serverName = serverName;
return this;
return self();
}
protected String getDatabaseName() {
@@ -112,9 +114,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseName(String databaseName) {
public BuilderT setDatabaseName(String databaseName) {
this.databaseName = databaseName;
return this;
return self();
}
protected Database getDatabaseConfiguration() {
@@ -122,9 +124,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseConfiguration(Database databaseConfiguration) {
public BuilderT setDatabaseConfiguration(Database databaseConfiguration) {
this.databaseConfiguration = databaseConfiguration;
return this;
return self();
}
protected RabbitMQEndpoint getRabbitConfiguration() {
@@ -132,9 +134,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration) {
public BuilderT setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration) {
this.rabbitConfiguration = rabbitConfiguration;
return this;
return self();
}
protected boolean isOutboundReplicationExchangeNameSet() {
@@ -167,9 +169,9 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration) {
public BuilderT setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration) {
this.outboundReplicationConfiguration = outboundReplicationConfiguration;
return this;
return self();
}
protected Optional<InboundReplicationConfiguration> getInboundReplicationConfiguration() {
@@ -187,14 +189,14 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Hos
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration) {
public BuilderT setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration) {
this.inboundReplicationConfiguration = Optional.of(replicationConfiguration);
return this;
return self();
}
}
protected StartAwsApplicationHost(
BuilderImpl<? extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
BuilderImpl<?, ? extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
super(builder);
builder.getRelease().ifPresent(this::addUserData);
addUserData(builder.getDatabaseConfiguration());
@@ -82,58 +82,60 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
public static interface Builder<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartHost.Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRelease(Optional<Release> release);
extends StartHost.Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
BuilderT setRelease(Optional<Release> release);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setLandscape(AwsLandscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape);
BuilderT setLandscape(AwsLandscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setInstanceType(InstanceType instanceType);
BuilderT setInstanceType(InstanceType instanceType);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setAvailabilityZone(AwsAvailabilityZone availabilityZone);
BuilderT setAvailabilityZone(AwsAvailabilityZone availabilityZone);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setKeyName(String keyName);
BuilderT setKeyName(String keyName);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setSecurityGroups(Iterable<SecurityGroup> securityGroups);
BuilderT setSecurityGroups(Iterable<SecurityGroup> securityGroups);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setTags(Optional<Tags> tags);
BuilderT setTags(Optional<Tags> tags);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setUserData(String[] userData);
BuilderT setUserData(String[] userData);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRegion(AwsRegion region);
BuilderT setRegion(AwsRegion region);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setInstanceName(String name);
BuilderT setInstanceName(String name);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setServerName(String serverName);
BuilderT setServerName(String serverName);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseName(String databaseName);
BuilderT setDatabaseName(String databaseName);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration);
BuilderT setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration);
BuilderT setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration);
BuilderT setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseConfiguration(Database databaseConfiguration);
BuilderT setDatabaseConfiguration(Database databaseConfiguration);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setCommaSeparatedEmailAddressesToNotifyOfStartup(String commaSeparatedEmailAddressesToNotifyOfStartup);
BuilderT setCommaSeparatedEmailAddressesToNotifyOfStartup(String commaSeparatedEmailAddressesToNotifyOfStartup);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOptionalTimeout(Optional<Duration> optionalTimeout);
BuilderT setOptionalTimeout(Optional<Duration> optionalTimeout);
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setHostSupplier(HostSupplier<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> hostSupplier);
BuilderT setHostSupplier(HostSupplier<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> hostSupplier);
}
protected abstract static class BuilderImpl<T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
protected abstract static class BuilderImpl<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends AwsInstance<ShardingKey, MetricsT>>
extends StartHost.BuilderImpl<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
extends StartHost.BuilderImpl<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
implements Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
private Optional<Release> release = Optional.empty();
private AwsLandscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape;
private InstanceType instanceType;
@@ -163,9 +165,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRelease(Optional<Release> release) {
public BuilderT setRelease(Optional<Release> release) {
this.release = release;
return this;
return self();
}
protected AwsLandscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> getLandscape() {
@@ -173,10 +175,10 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setLandscape(
public BuilderT setLandscape(
AwsLandscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape) {
this.landscape = landscape;
return this;
return self();
}
protected InstanceType getInstanceType() {
@@ -184,10 +186,10 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setInstanceType(
public BuilderT setInstanceType(
InstanceType instanceType) {
this.instanceType = instanceType;
return this;
return self();
}
protected AwsAvailabilityZone getAvailabilityZone() {
@@ -195,10 +197,10 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setAvailabilityZone(
public BuilderT setAvailabilityZone(
AwsAvailabilityZone availabilityZone) {
this.availabilityZone = availabilityZone;
return this;
return self();
}
protected String getKeyName() {
@@ -206,9 +208,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setKeyName(String keyName) {
public BuilderT setKeyName(String keyName) {
this.keyName = keyName;
return this;
return self();
}
protected Iterable<SecurityGroup> getSecurityGroups() {
@@ -220,10 +222,10 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setSecurityGroups(
public BuilderT setSecurityGroups(
Iterable<SecurityGroup> securityGroups) {
this.securityGroups = securityGroups;
return this;
return self();
}
protected Optional<Tags> getTags() {
@@ -231,9 +233,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setTags(Optional<Tags> tags) {
public BuilderT setTags(Optional<Tags> tags) {
this.tags = tags;
return this;
return self();
}
protected Iterable<String> getUserData() {
@@ -241,13 +243,13 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setUserData(
public BuilderT setUserData(
String[] userData) {
this.userData.clear();
for (final String userDataElement : userData) {
this.userData.add(userDataElement);
}
return this;
return self();
}
protected AwsRegion getRegion() {
@@ -259,9 +261,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRegion(AwsRegion region) {
public BuilderT setRegion(AwsRegion region) {
this.region = region;
return this;
return self();
}
protected String getInstanceName() {
@@ -273,9 +275,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setInstanceName(String instanceName) {
public BuilderT setInstanceName(String instanceName) {
this.instanceName = instanceName;
return this;
return self();
}
protected String getServerName() {
@@ -283,9 +285,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setServerName(String serverName) {
public BuilderT setServerName(String serverName) {
this.serverName = serverName;
return this;
return self();
}
protected String getDatabaseName() {
@@ -293,9 +295,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseName(String databaseName) {
public BuilderT setDatabaseName(String databaseName) {
this.databaseName = databaseName;
return this;
return self();
}
protected Database getDatabaseConfiguration() {
@@ -303,9 +305,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setDatabaseConfiguration(Database databaseConfiguration) {
public BuilderT setDatabaseConfiguration(Database databaseConfiguration) {
this.databaseConfiguration = databaseConfiguration;
return this;
return self();
}
protected RabbitMQEndpoint getRabbitConfiguration() {
@@ -313,9 +315,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration) {
public BuilderT setRabbitConfiguration(RabbitMQEndpoint rabbitConfiguration) {
this.rabbitConfiguration = rabbitConfiguration;
return this;
return self();
}
protected boolean isOutboundReplicationExchangeNameSet() {
@@ -348,9 +350,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration) {
public BuilderT setOutboundReplicationConfiguration(OutboundReplicationConfiguration outboundReplicationConfiguration) {
this.outboundReplicationConfiguration = outboundReplicationConfiguration;
return this;
return self();
}
protected Optional<InboundReplicationConfiguration> getInboundReplicationConfiguration() {
@@ -368,9 +370,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration) {
public BuilderT setReplicationConfiguration(InboundReplicationConfiguration replicationConfiguration) {
this.inboundReplicationConfiguration = Optional.of(replicationConfiguration);
return this;
return self();
}
protected String getCommaSeparatedEmailAddressesToNotifyOfStartup() {
@@ -378,9 +380,9 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setCommaSeparatedEmailAddressesToNotifyOfStartup(String commaSeparatedEmailAddressesToNotifyOfStartup) {
public BuilderT setCommaSeparatedEmailAddressesToNotifyOfStartup(String commaSeparatedEmailAddressesToNotifyOfStartup) {
this.commaSeparatedEmailAddressesToNotifyOfStartup = commaSeparatedEmailAddressesToNotifyOfStartup;
return this;
return self();
}
/**
@@ -392,10 +394,10 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setOptionalTimeout(
public BuilderT setOptionalTimeout(
Optional<Duration> optionalTimeout) {
this.optionalTimeout = optionalTimeout;
return this;
return self();
}
protected HostSupplier<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> getHostSupplier() {
@@ -403,13 +405,13 @@ extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setHostSupplier(HostSupplier<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> hostSupplier) {
public BuilderT setHostSupplier(HostSupplier<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> hostSupplier) {
this.hostSupplier = hostSupplier;
return this;
return self();
}
}
protected StartAwsHost(BuilderImpl<? extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
protected StartAwsHost(BuilderImpl<?, ? extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
super(builder);
this.userData = new ArrayList<>();
for (final String ud : builder.getUserData()) {
@@ -42,7 +42,9 @@ import software.amazon.awssdk.services.ec2.model.InstanceType;
*
* To start a primary, only specify the desired replica set name and leave the primary specification empty {@code null}.
* In this case no other node tagged for the desired replica set will be found, and the new instance will become the
* first primary of the new replica set.
* first primary of the new replica set.<p>
*
* TODO Why is the MetricsT parameter necessary when there is MongoMetrics?
*
* @author Axel Uhl (D043530)
*/
@@ -83,31 +85,33 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Aws
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<ShardingKey, MetricsT extends ApplicationProcessMetrics,
public static interface Builder<BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
extends StartAwsHost.Builder<StartMongoDBServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>> {
extends StartAwsHost.Builder<BuilderT, StartMongoDBServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>> {
/**
* The default {@link #setImageType(String) image type} used for launching a MongoDB server.
*/
String MONGODB_SERVER_IMAGE_TYPE = "mongodb-server";
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetName(String replicaSetName);
BuilderT setReplicaSetName(String replicaSetName);
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetPrimary(String replicaSetPrimary);
BuilderT setReplicaSetPrimary(String replicaSetPrimary);
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetPriority(int replicaSetPriority);
BuilderT setReplicaSetPriority(int replicaSetPriority);
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetVotes(int replicaSetVotes);
BuilderT setReplicaSetVotes(int replicaSetVotes);
StartMongoDBServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> build() throws URISyntaxException, JSchException, IOException, InterruptedException;
}
protected static class BuilderImpl<ShardingKey, MetricsT extends ApplicationProcessMetrics,
protected static class BuilderImpl<BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
extends StartAwsHost.BuilderImpl<StartMongoDBServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>>
implements Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
extends StartAwsHost.BuilderImpl<BuilderT, StartMongoDBServer<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, AwsInstance<ShardingKey, MetricsT>>
implements Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
private String replicaSetName = AwsLandscape.MONGO_DEFAULT_REPLICA_SET_NAME;
private String replicaSetPrimary;
private boolean replicaSetPrimaryWasSetExplicitly = false;
@@ -124,28 +128,28 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Aws
}
@Override
public Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetName(String replicaSetName) {
public BuilderT setReplicaSetName(String replicaSetName) {
this.replicaSetName = replicaSetName;
return this;
return self();
}
@Override
public Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetPrimary(String replicaSetPrimary) {
public BuilderT setReplicaSetPrimary(String replicaSetPrimary) {
this.replicaSetPrimary = replicaSetPrimary;
this.replicaSetPrimaryWasSetExplicitly = true;
return this;
return self();
}
@Override
public Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetPriority(int replicaSetPriority) {
public BuilderT setReplicaSetPriority(int replicaSetPriority) {
this.replicaSetPriority = replicaSetPriority;
return this;
return self();
}
@Override
public Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> setReplicaSetVotes(int replicaSetVotes) {
public BuilderT setReplicaSetVotes(int replicaSetVotes) {
this.replicaSetVotes = replicaSetVotes;
return this;
return self();
}
protected String getReplicaSetName() {
@@ -220,14 +224,14 @@ extends StartAwsHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, Aws
}
}
public static <ShardingKey, MetricsT extends ApplicationProcessMetrics,
public static <BuilderT extends Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
Builder<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder() {
Builder<BuilderT, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder() {
return new BuilderImpl<>();
}
protected StartMongoDBServer(BuilderImpl<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder) throws URISyntaxException, JSchException, IOException, InterruptedException {
protected StartMongoDBServer(BuilderImpl<?, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> builder) throws URISyntaxException, JSchException, IOException, InterruptedException {
super(builder);
this.replicaSetName = builder.getReplicaSetName();
if (builder.getReplicaSetName() != null) {
@@ -26,10 +26,10 @@ public interface Host {
* Obtains the public IP address of this host, waiting for one to become available for the duration of
* {@code timeout}, or forever in case {@code timeout} is {@code null}
*
* @param timeoutNullMeaningForever
* @param timeoutEmptyMeaningForever
* if {@code null}, waits forever
*/
InetAddress getPublicAddress(Optional<Duration> timeoutNullMeaningForever);
InetAddress getPublicAddress(Optional<Duration> timeoutEmptyMeaningForever);
/**
* Obtains the private IP address of this host. Note that during the boot phase and after shutdown/termination a host
@@ -43,10 +43,10 @@ public interface Host {
* Obtains the private IP address of this host, waiting for one to become available for the duration of
* {@code timeout}, or forever in case {@code timeout} is {@code null}
*
* @param timeoutNullMeaningForever
* @param timeoutEmptyMeaningForever
* if {@code null}, waits forever
*/
InetAddress getPrivateAddress(Optional<Duration> timeoutNullMeaningForever);
InetAddress getPrivateAddress(Optional<Duration> timeoutEmptyMeaningForever);
/**
* Connects to an SSH session for the username specified, using the SSH key pair used to launch the instance, and
@@ -16,7 +16,7 @@ import com.sap.sse.landscape.mongodb.Database;
public interface ApplicationProcess<ShardingKey, MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>>
extends Process<RotatingFileBasedLog, MetricsT> {
extends Process<RotatingFileBasedLog, MetricsT> {
/**
* @return the replica set to which this process belongs<p>
*
@@ -8,6 +8,7 @@ import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoDatabase;
import com.mongodb.session.ClientSession;
import com.sap.sse.common.Duration;
/**
* A MongoDB endpoint that an application can connect to. It can produce a {@link URI} the client can use to connect to,
@@ -18,8 +19,15 @@ import com.mongodb.session.ClientSession;
*
*/
public interface MongoEndpoint {
/**
* When invoked on a {@link MongoProcess} that is not currently equipped with a public IP address, a
* {@link NullPointerException} will result. Consider using {@link #getURI(Optional, Optional)} to wait for
* a public IP address to become available if the instance is still booting up.
*/
URI getURI(Optional<Database> optionalDb) throws URISyntaxException;
URI getURI(Optional<Database> optionalDb, Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException;
Iterable<MongoDatabase> getMongoDatabases() throws URISyntaxException;
MongoDatabase getMongoDatabase(String dbName) throws URISyntaxException;
@@ -34,10 +42,24 @@ public interface MongoEndpoint {
boolean isInReplicaSet() throws URISyntaxException;
/**
* When invoked on a {@link MongoProcess} that is not currently equipped with a public IP address, a
* {@link NullPointerException} will result. Consider using {@link #getMongoClientURI(Optional, Optional)} to wait for
* a public IP address to become available if the instance is still booting up.
*/
MongoClientURI getMongoClientURI(Optional<Database> optionalDb) throws URISyntaxException;
MongoClientURI getMongoClientURI(Optional<Database> optionalDb, Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException;
/**
* When invoked on a {@link MongoProcess} that is not currently equipped with a public IP address, a
* {@link NullPointerException} will result. Consider using {@link #getClient(Optional)} to wait for
* a public IP address to become available if the instance is still booting up.
*/
MongoClient getClient() throws URISyntaxException;
MongoClient getClient(Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException;
ClientSession getClientSession() throws URISyntaxException;
default String getMD5Hash(String databaseName) throws URISyntaxException {
@@ -1,9 +1,11 @@
package com.sap.sse.landscape.mongodb;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;
import com.sap.sse.common.Duration;
import com.sap.sse.landscape.Process;
import com.sap.sse.landscape.RotatingFileBasedLog;
@@ -12,9 +14,19 @@ public interface MongoProcess extends Process<RotatingFileBasedLog, MongoMetrics
@Override
default URI getURI(Optional<Database> optionalDb) throws URISyntaxException {
return getURI(optionalDb, getHost().getPublicAddress());
}
@Override
default URI getURI(Optional<Database> optionalDb, Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException {
final InetAddress publicAddress = getHost().getPublicAddress(timeoutEmptyMeaningForever);
return getURI(optionalDb, publicAddress);
}
default URI getURI(Optional<Database> optionalDb, final InetAddress publicAddress) throws URISyntaxException {
final StringBuilder sb = new StringBuilder();
sb.append("mongodb://");
sb.append(getHost().getPublicAddress().getCanonicalHostName());
sb.append(publicAddress.getCanonicalHostName());
sb.append(":");
sb.append(getPort());
sb.append("/");
@@ -1,14 +1,20 @@
package com.sap.sse.landscape.mongodb;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.logging.Logger;
import com.sap.sse.common.Duration;
import com.sap.sse.common.Named;
public interface MongoReplicaSet extends Named, MongoEndpoint {
static Logger logger = Logger.getLogger(MongoReplicaSet.class.getName());
Iterable<MongoProcess> getInstances();
/**
@@ -17,16 +23,27 @@ public interface MongoReplicaSet extends Named, MongoEndpoint {
*/
@Override
default URI getURI(Optional<Database> optionalDb) throws URISyntaxException {
return getURI(optionalDb, mongoProcess->mongoProcess.getHost().getPublicAddress());
}
default URI getURI(Optional<Database> optionalDb, Function<MongoProcess, InetAddress> publicAddressSupplier) throws URISyntaxException {
final StringBuilder result = new StringBuilder("mongodb://");
final List<String> hostSpecs = new ArrayList<>();
for (final MongoProcess mongoProcess : getInstances()) {
final StringBuilder hostSpec = new StringBuilder();
hostSpec.append(mongoProcess.getHost().getPublicAddress().getCanonicalHostName());
if (mongoProcess.getPort() != MongoProcess.DEFAULT_PORT) {
hostSpec.append(":");
hostSpec.append(mongoProcess.getPort());
final InetAddress publicAddress = publicAddressSupplier.apply(mongoProcess);
if (publicAddress != null) {
logger.info("Adding MongoDB process running on "+publicAddress+" to replica set "+this.getName());
final StringBuilder hostSpec = new StringBuilder();
hostSpec.append(publicAddress.getCanonicalHostName());
if (mongoProcess.getPort() != MongoProcess.DEFAULT_PORT) {
hostSpec.append(":");
hostSpec.append(mongoProcess.getPort());
}
hostSpecs.add(hostSpec.toString());
} else {
logger.info("Not adding MongoDB process running on instance "+mongoProcess.getHost()+" to replica set "+this.getName()+
" because its IP address cannot be determined. Probably it is not running.");
}
hostSpecs.add(hostSpec.toString());
}
result.append(String.join(",", hostSpecs));
result.append("/");
@@ -36,6 +53,11 @@ public interface MongoReplicaSet extends Named, MongoEndpoint {
result.append("&retryWrites=true&readPreference=nearest");
return new URI(result.toString());
}
@Override
default URI getURI(Optional<Database> optionalDb, Optional<Duration> timeoutEmptyMeansForever) throws URISyntaxException {
return getURI(optionalDb, mongoProcess->mongoProcess.getHost().getPublicAddress(timeoutEmptyMeansForever));
}
void addReplica(MongoProcess newReplica);
@@ -10,6 +10,7 @@ import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoDatabase;
import com.mongodb.session.ClientSession;
import com.sap.sse.common.Duration;
import com.sap.sse.common.Util;
import com.sap.sse.landscape.mongodb.Database;
import com.sap.sse.landscape.mongodb.MongoEndpoint;
@@ -42,11 +43,21 @@ public abstract class MongoEndpointImpl implements MongoEndpoint {
return new MongoClientURI(getURI(optionalDb).toString());
}
@Override
public MongoClientURI getMongoClientURI(Optional<Database> optionalDb, Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException {
return new MongoClientURI(getURI(optionalDb, timeoutEmptyMeaningForever).toString());
}
@Override
public MongoClient getClient() throws URISyntaxException {
return new MongoClient(getMongoClientURI(Optional.empty()));
}
@Override
public MongoClient getClient(Optional<Duration> timeoutEmptyMeaningForever) throws URISyntaxException {
return new MongoClient(getMongoClientURI(Optional.empty(), timeoutEmptyMeaningForever));
}
@Override
public ClientSession getClientSession() throws URISyntaxException {
return getClient().startSession(ClientSessionOptions.builder().causallyConsistent(true).build());
@@ -38,22 +38,30 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
*
* @author Axel Uhl (D043530)
*/
public static interface Builder<T extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
public static interface Builder<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends Host> {
Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setImageType(String imageType);
BuilderT setImageType(String imageType);
T build() throws UnknownHostException, URISyntaxException, JSchException, IOException, InterruptedException;
default BuilderT self() {
@SuppressWarnings("unchecked")
final BuilderT self = (BuilderT) this;
return self;
}
}
protected abstract static class BuilderImpl<T extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
protected abstract static class BuilderImpl<BuilderT extends Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>,
T extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey,
MetricsT extends ApplicationProcessMetrics,
MasterProcessT extends ApplicationMasterProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
ReplicaProcessT extends ApplicationReplicaProcess<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT>,
HostT extends Host>
implements Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
implements Builder<BuilderT, T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> {
private MachineImage machineImage;
private Landscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape;
private Region region;
@@ -67,14 +75,14 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
return region;
}
protected Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setRegion(Region region) {
protected BuilderT setRegion(Region region) {
this.region = region;
return this;
return self();
}
protected Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setMachineImage(MachineImage machineImage) {
protected BuilderT setMachineImage(MachineImage machineImage) {
this.machineImage = machineImage;
return this;
return self();
}
protected String getImageType() {
@@ -82,22 +90,22 @@ implements Procedure<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> {
}
@Override
public Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setImageType(String imageType) {
public BuilderT setImageType(String imageType) {
this.imageType = imageType;
return this;
return self();
}
protected Landscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> getLandscape() {
return landscape;
}
protected Builder<T, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> setLandscape(Landscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape) {
protected BuilderT setLandscape(Landscape<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT> landscape) {
this.landscape = landscape;
return this;
return self();
}
}
protected StartHost(BuilderImpl<? extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
protected StartHost(BuilderImpl<?, ? extends StartHost<ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT>, ShardingKey, MetricsT, MasterProcessT, ReplicaProcessT, HostT> builder) {
super(builder.getLandscape());
this.machineImage = builder.getMachineImage();
}