java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java
... ...
@@ -99,6 +99,7 @@ import com.sap.sse.landscape.aws.orchestration.CreateDynamicLoadBalancerMapping;
99 99
import com.sap.sse.landscape.aws.orchestration.CreateLoadBalancerMapping;
100 100
import com.sap.sse.landscape.aws.orchestration.StartMongoDBServer;
101 101
import com.sap.sse.landscape.common.shared.SecuredLandscapeTypes;
102
+import com.sap.sse.landscape.mongodb.Database;
102 103
import com.sap.sse.landscape.mongodb.MongoEndpoint;
103 104
import com.sap.sse.landscape.mongodb.MongoProcess;
104 105
import com.sap.sse.landscape.mongodb.MongoProcessInReplicaSet;
... ...
@@ -677,16 +678,22 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem
677 678
}
678 679
679 680
@Override
680
- public SailingApplicationReplicaSetDTO<String> createArchiveReplicaSet(String regionId, SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade,
681
+ public SailingApplicationReplicaSetDTO<String> createArchiveReplicaSet(String regionId, SailingApplicationReplicaSetDTO<String> archiveReplicaSetToUpgrade,
681 682
String instanceType, String releaseNameOrNullForLatestMaster, String optionalKeyName,
682 683
byte[] privateKeyEncryptionPassphrase, String replicationBearerToken) throws Exception {
683 684
checkLandscapeManageAwsPermission();
685
+ final AwsRegion region = new AwsRegion(regionId, getLandscape());
686
+ final AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> awsReplicaSet =
687
+ convertFromApplicationReplicaSetDTO(region, archiveReplicaSetToUpgrade, optionalKeyName, privateKeyEncryptionPassphrase);
684 688
final String replicaSetName = SharedLandscapeConstants.ARCHIVE_SERVER_APPLICATION_REPLICA_SET_NAME;
685 689
final String archiveCandidateSubDomain = SharedLandscapeConstants.ARCHIVE_CANDIDATE_SUBDOMAIN;
686
- final String domainName = AwsLandscape.getHostedZoneName(applicationReplicaSetToUpgrade.getHostname());
690
+ final String domainName = AwsLandscape.getHostedZoneName(archiveReplicaSetToUpgrade.getHostname());
687 691
final Release release = getLandscapeService().getRelease(releaseNameOrNullForLatestMaster);
692
+ final Database databaseConfiguration = awsReplicaSet.getMaster().getDatabaseConfiguration(region,
693
+ Landscape.WAIT_FOR_PROCESS_TIMEOUT, Optional.ofNullable(optionalKeyName),
694
+ privateKeyEncryptionPassphrase);
688 695
final AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> result = getLandscapeService().createArchiveReplicaSet(regionId, replicaSetName,
689
- instanceType, releaseNameOrNullForLatestMaster, optionalKeyName, privateKeyEncryptionPassphrase, replicationBearerToken, domainName,
696
+ instanceType, releaseNameOrNullForLatestMaster, databaseConfiguration, optionalKeyName, privateKeyEncryptionPassphrase, replicationBearerToken, domainName,
690 697
/* optionalMemoryInMegabytesOrNull */ null, /* optionalMemoryTotalSizeFactorOrNull */ null, /* optionalIgtimiRiotPort */ null);
691 698
return new SailingApplicationReplicaSetDTO<String>(result.getName(), convertToSailingAnalyticsProcessDTO(result
692 699
.getMaster(), Optional.ofNullable(optionalKeyName), privateKeyEncryptionPassphrase), /* replicas */ Collections.emptySet(),
java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/LandscapeService.java
... ...
@@ -26,6 +26,7 @@ import com.sap.sse.landscape.aws.AwsApplicationReplicaSet;
26 26
import com.sap.sse.landscape.aws.AwsAvailabilityZone;
27 27
import com.sap.sse.landscape.aws.AwsLandscape;
28 28
import com.sap.sse.landscape.aws.impl.AwsRegion;
29
+import com.sap.sse.landscape.mongodb.Database;
29 30
import com.sap.sse.landscape.mongodb.MongoEndpoint;
30 31
import com.sap.sse.security.SecurityService;
31 32
... ...
@@ -153,7 +154,7 @@ public interface LandscapeService {
153 154
throws Exception;
154 155
155 156
AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> createArchiveReplicaSet(
156
- String regionId, String name, String instanceType, String releaseNameOrNullForLatestMaster,
157
+ String regionId, String name, String instanceType, String releaseNameOrNullForLatestMaster, Database databaseConfiguration,
157 158
String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String securityServiceReplicationBearerToken,
158 159
String optionalDomainName, Integer optionalMemoryInMegabytesOrNull,
159 160
Integer optionalMemoryTotalSizeFactorOrNull, Integer optionalIgtimiRiotPort) throws Exception;
java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/impl/LandscapeServiceImpl.java
... ...
@@ -237,7 +237,7 @@ public class LandscapeServiceImpl implements LandscapeService {
237 237
238 238
@Override
239 239
public AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> createArchiveReplicaSet(
240
- String regionId, String replicaSetName, String instanceType, String releaseNameOrNullForLatestMaster,
240
+ String regionId, String replicaSetName, String instanceType, String releaseNameOrNullForLatestMaster, Database databaseConfiguration,
241 241
String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String securityServiceReplicationBearerToken,
242 242
String optionalDomainName, Integer optionalMemoryInMegabytesOrNull,
243 243
Integer optionalMemoryTotalSizeFactorOrNull, Integer optionalIgtimiRiotPort) throws Exception {
... ...
@@ -251,7 +251,7 @@ public class LandscapeServiceImpl implements LandscapeService {
251 251
final AwsRegion region = new AwsRegion(regionId, landscape);
252 252
final Release release = getRelease(releaseNameOrNullForLatestMaster);
253 253
final com.sap.sailing.landscape.procedures.SailingAnalyticsMasterConfiguration.Builder<?, String> masterConfigurationBuilder =
254
- createMasterConfigurationBuilder(replicaSetName, securityServiceReplicationBearerToken, optionalMemoryInMegabytesOrNull,
254
+ createArchiveConfigurationBuilder(replicaSetName, databaseConfiguration, securityServiceReplicationBearerToken, optionalMemoryInMegabytesOrNull,
255 255
null, optionalIgtimiRiotPort, region, release);
256 256
final com.sap.sailing.landscape.procedures.StartSailingAnalyticsMasterHost.Builder<?, String> masterHostBuilder = StartSailingAnalyticsMasterHost.masterHostBuilder(masterConfigurationBuilder);
257 257
masterHostBuilder
... ...
@@ -267,12 +267,12 @@ public class LandscapeServiceImpl implements LandscapeService {
267 267
final StartSailingAnalyticsMasterHost<String> masterHostStartProcedure = masterHostBuilder.build();
268 268
masterHostStartProcedure.run();
269 269
final SailingAnalyticsProcess<String> master = masterHostStartProcedure.getSailingAnalyticsProcess();
270
- final AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> result =
271
- createLoadBalancingAndAutoScalingSetup(landscape, region, replicaSetName, master, release, instanceType,
272
- /* dynamicLoadBalancerMapping */ false, optionalKeyName, privateKeyEncryptionPassphrase, optionalDomainName,
273
- Optional.of(masterHostBuilder.getMachineImage()), securityServiceReplicationBearerToken,
274
- /* minimumAutoScalingGroupSize */ Optional.empty(), /* maximumAutoScalingGroupSize */ Optional.empty(), optionalIgtimiRiotPort);
275
- return result;
270
+ logger.info("Waiting for archive new candidate "+master+" to get ready with new release "+release.getName());
271
+ master.waitUntilReady(Optional.of(Duration.ONE_DAY.times(2))); // wait a little longer since archive candidate may need to load many races
272
+ final AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> replicaSet =
273
+ landscape.getApplicationReplicaSet(region, replicaSetName, master, Collections.emptySet(),
274
+ Landscape.WAIT_FOR_PROCESS_TIMEOUT, Optional.ofNullable(optionalKeyName), privateKeyEncryptionPassphrase);
275
+ return replicaSet;
276 276
}
277 277
278 278
@Override
... ...
@@ -935,6 +935,30 @@ public class LandscapeServiceImpl implements LandscapeService {
935 935
applyMemoryConfigurationToApplicationConfigurationBuilder(masterConfigurationBuilder, optionalMemoryInMegabytesOrNull, optionalMemoryTotalSizeFactorOrNull);
936 936
return masterConfigurationBuilder;
937 937
}
938
+
939
+ private <AppConfigBuilderT extends com.sap.sailing.landscape.procedures.SailingAnalyticsMasterConfiguration.Builder<AppConfigBuilderT, String>> AppConfigBuilderT createArchiveConfigurationBuilder(
940
+ String replicaSetName, Database databaseConfiguration, String optionalMasterReplicationBearerTokenOrNull, Integer optionalMemoryInMegabytesOrNull,
941
+ Integer optionalMemoryTotalSizeFactorOrNull, Integer optionalIgtimiRiotPort, final AwsRegion region, final Release release) {
942
+ final AppConfigBuilderT masterConfigurationBuilder = SailingAnalyticsMasterConfiguration.masterBuilder();
943
+ final String bearerTokenUsedByMaster = getEffectiveBearerToken(optionalMasterReplicationBearerTokenOrNull);
944
+ final User currentUser = getSecurityService().getCurrentUser();
945
+ if (currentUser != null && currentUser.isEmailValidated() && currentUser.getEmail() != null) {
946
+ masterConfigurationBuilder.setCommaSeparatedEmailAddressesToNotifyOfStartup(currentUser.getEmail());
947
+ }
948
+ masterConfigurationBuilder
949
+ .setDatabaseConfiguration(databaseConfiguration)
950
+ .setLandscape(getLandscape())
951
+ .setServerName(replicaSetName)
952
+ .setRelease(release)
953
+ .setRegion(region)
954
+ // TODO bug5684: probably this is the place to add the REPLICATE_MASTER_SERVLET_HOST/REPLICATE_MASTER_EXCHANGE_NAME variables to point to a default security service?
955
+ .setInboundReplicationConfiguration(InboundReplicationConfiguration.builder().setCredentials(new BearerTokenReplicationCredentials(bearerTokenUsedByMaster)).build());
956
+ if (optionalIgtimiRiotPort != null) {
957
+ masterConfigurationBuilder.setIgtimiRiotPort(optionalIgtimiRiotPort);
958
+ }
959
+ applyMemoryConfigurationToApplicationConfigurationBuilder(masterConfigurationBuilder, optionalMemoryInMegabytesOrNull, optionalMemoryTotalSizeFactorOrNull);
960
+ return masterConfigurationBuilder;
961
+ }
938 962
939 963
/**
940 964
* No specific memory configuration is made here; replicas are mostly launched on a dedicated host and hence can
java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsLandscape.java
... ...
@@ -262,7 +262,7 @@ public interface AwsLandscape<ShardingKey> extends Landscape<ShardingKey> {
262 262
*/
263 263
<HostT extends AwsInstance<ShardingKey>> Iterable<HostT> getRunningHostsWithTag(Region region, String tagName, HostSupplier<ShardingKey, HostT> hostSupplier);
264 264
265
- <HostT extends AwsInstance<ShardingKey>> HostT getHostByPrivateIpAddress(Region region, String publicIpAddress,
265
+ <HostT extends AwsInstance<ShardingKey>> HostT getHostByPrivateDnsNameOrIpAddress(Region region, String privateDnsNameOrIpAddress,
266 266
HostSupplier<ShardingKey, HostT> hostSupplier);
267 267
268 268
<HostT extends AwsInstance<ShardingKey>> HostT getHostByPublicIpAddress(Region region, String publicIpAddress,
... ...
@@ -329,7 +329,7 @@ public interface AwsLandscape<ShardingKey> extends Landscape<ShardingKey> {
329 329
330 330
Instance getInstanceByPublicIpAddress(Region region, String publicIpAddress);
331 331
332
- Instance getInstanceByPrivateDnsOrIpAddress(Region region, String publicIpAddress);
332
+ Instance getInstanceByPrivateDnsNameOrIpAddress(Region region, String privateDnsNameOrIpAddress);
333 333
334 334
/**
335 335
* @param hostname