502697cfdfe782660d53ebf32e452d480dcdc647
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 |