37c0dc9f3c7a59aeacba0c32347e02412e2359c1
java/com.sap.sailing.landscape.common/src/com/sap/sailing/landscape/common/SharedLandscapeConstants.java
| ... | ... | @@ -125,6 +125,10 @@ public interface SharedLandscapeConstants { |
| 125 | 125 | String SAILING_ANALYTICS_APPLICATION_HOST_TAG = "sailing-analytics-server"; |
| 126 | 126 | |
| 127 | 127 | String ARCHIVE_SERVER_APPLICATION_REPLICA_SET_NAME = "ARCHIVE"; |
| 128 | + |
|
| 129 | + String ARCHIVE_SERVER_NEW_CANDIDATE_INSTANCE_NAME = "SL Archive (New Candidate)"; |
|
| 130 | + |
|
| 131 | + String ARCHIVE_CANDIDATE_SUBDOMAIN = "archive-candidate"; |
|
| 128 | 132 | |
| 129 | 133 | /** |
| 130 | 134 | * Value of the {@link #SAILING_ANALYTICS_APPLICATION_HOST_TAG} tag |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementPanel.java
| ... | ... | @@ -1471,12 +1471,11 @@ public class LandscapeManagementPanel extends SimplePanel { |
| 1471 | 1471 | stringMessages, errorReporter, new DialogCallback<UpgradeArchiveServerDialog.UpgradeArchiveServerInstructions>() { |
| 1472 | 1472 | @Override |
| 1473 | 1473 | public void ok(UpgradeArchiveServerInstructions upgradeInstructions) { |
| 1474 | - landscapeManagementService.startArchiveServer(regionId, replicaSet, |
|
| 1475 | - upgradeInstructions.getReleaseNameOrNullForLatestMaster(), |
|
| 1476 | - sshKeyManagementPanel.getSelectedKeyPair()==null?null:sshKeyManagementPanel.getSelectedKeyPair().getName(), |
|
| 1477 | - sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption() != null |
|
| 1478 | - ? sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption().getBytes() : null, |
|
| 1479 | - upgradeInstructions.getReplicaReplicationBearerToken(), |
|
| 1474 | + landscapeManagementService.createArchiveReplicaSet(regionId, replicaSet, upgradeInstructions.getOptionalInstanceType(), |
|
| 1475 | + upgradeInstructions.getReleaseNameOrNullForLatestMaster(), sshKeyManagementPanel.getSelectedKeyPair()==null?null:sshKeyManagementPanel.getSelectedKeyPair().getName(), |
|
| 1476 | + sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption() != null |
|
| 1477 | + ? sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption().getBytes() : null, |
|
| 1478 | + upgradeInstructions.getReplicaReplicationBearerToken(), |
|
| 1480 | 1479 | new AsyncCallback<SailingApplicationReplicaSetDTO<String>>() { |
| 1481 | 1480 | @Override |
| 1482 | 1481 | public void onFailure(Throwable caught) { |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteService.java
| ... | ... | @@ -166,9 +166,8 @@ public interface LandscapeManagementWriteService extends RemoteService { |
| 166 | 166 | SailingApplicationReplicaSetDTO<String> replicaSet, String instanceTypeName, |
| 167 | 167 | String optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception; |
| 168 | 168 | |
| 169 | - SailingApplicationReplicaSetDTO<String> startArchiveServer( |
|
| 170 | - String regionId, |
|
| 171 | - SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, String releaseOrNullForLatestMaster, |
|
| 169 | + SailingApplicationReplicaSetDTO<String> createArchiveReplicaSet( |
|
| 170 | + String regionId, SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, String optionalSharedInstanceType, String releaseOrNullForLatestMaster, |
|
| 172 | 171 | String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String replicationBearerToken) throws Exception; |
| 173 | 172 | |
| 174 | 173 | ArrayList<LeaderboardNameDTO> getLeaderboardNames(SailingApplicationReplicaSetDTO<String> replicaSet, String bearerToken) throws Exception; |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteServiceAsync.java
| ... | ... | @@ -190,10 +190,9 @@ public interface LandscapeManagementWriteServiceAsync { |
| 190 | 190 | AwsInstanceDTO optionalPreferredInstanceToDeployUnmanagedReplicaTo, |
| 191 | 191 | AsyncCallback<SailingApplicationReplicaSetDTO<String>> callback); |
| 192 | 192 | |
| 193 | - void startArchiveServer(String regionId, |
|
| 194 | - SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, String releaseOrNullForLatestMaster, |
|
| 195 | - String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String replicationBearerToken, |
|
| 196 | - AsyncCallback<SailingApplicationReplicaSetDTO<String>> callback); |
|
| 193 | + void createArchiveReplicaSet(String regionId, SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, |
|
| 194 | + String optionalSharedInstanceType, String releaseOrNullForLatestMaster, String optionalKeyName, |
|
| 195 | + byte[] privateKeyEncryptionPassphrase, String replicationBearerToken, AsyncCallback<SailingApplicationReplicaSetDTO<String>> callback); |
|
| 197 | 196 | |
| 198 | 197 | /** |
| 199 | 198 | * For the given replica set ensures there is at least one healthy replica, then stops replicating on all replicas and |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/UpgradeArchiveServerDialog.java
| ... | ... | @@ -12,8 +12,13 @@ import com.sap.sse.gwt.client.ErrorReporter; |
| 12 | 12 | public class UpgradeArchiveServerDialog extends AbstractApplicationReplicaSetDialog<UpgradeArchiveServerDialog.UpgradeArchiveServerInstructions> { |
| 13 | 13 | |
| 14 | 14 | public static class UpgradeArchiveServerInstructions extends AbstractApplicationReplicaSetDialog.AbstractApplicationReplicaSetInstructions { |
| 15 | - public UpgradeArchiveServerInstructions(String releaseNameOrNullForLatestMaster, String masterReplicationBearerToken, String replicaReplicationBearerToken, String optionalSharedInstanceType) { |
|
| 15 | + private final String optionalInstanceType; |
|
| 16 | + public UpgradeArchiveServerInstructions(String releaseNameOrNullForLatestMaster, String masterReplicationBearerToken, String replicaReplicationBearerToken, String optionalInstanceType) { |
|
| 16 | 17 | super(releaseNameOrNullForLatestMaster, masterReplicationBearerToken, replicaReplicationBearerToken); |
| 18 | + this.optionalInstanceType = optionalInstanceType; |
|
| 19 | + } |
|
| 20 | + public String getOptionalInstanceType() { |
|
| 21 | + return optionalInstanceType; |
|
| 17 | 22 | } |
| 18 | 23 | } |
| 19 | 24 |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java
| ... | ... | @@ -677,16 +677,22 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem |
| 677 | 677 | } |
| 678 | 678 | |
| 679 | 679 | @Override |
| 680 | - public SailingApplicationReplicaSetDTO<String> startArchiveServer(String regionId, |
|
| 681 | - SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, String releaseOrNullForLatestMaster, |
|
| 682 | - String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String replicationBearerToken) throws Exception { |
|
| 680 | + public SailingApplicationReplicaSetDTO<String> createArchiveReplicaSet(String regionId, SailingApplicationReplicaSetDTO<String> applicationReplicaSetToUpgrade, |
|
| 681 | + String instanceType, String releaseNameOrNullForLatestMaster, String optionalKeyName, |
|
| 682 | + byte[] privateKeyEncryptionPassphrase, String replicationBearerToken) throws Exception { |
|
| 683 | 683 | checkLandscapeManageAwsPermission(); |
| 684 | - logger.info(applicationReplicaSetToUpgrade.getName()); |
|
| 685 | - getLandscapeService().createApplicationReplicaSet( |
|
| 686 | - regionId, optionalKeyName, true, replicationBearerToken, regionId, false, releaseOrNullForLatestMaster, |
|
| 687 | - optionalKeyName, privateKeyEncryptionPassphrase, replicationBearerToken, replicationBearerToken, replicationBearerToken, |
|
| 688 | - null, null, null, null, null); |
|
| 689 | - return null; |
|
| 684 | + final String replicaSetName = SharedLandscapeConstants.ARCHIVE_SERVER_APPLICATION_REPLICA_SET_NAME; |
|
| 685 | + final String archiveCandidateSubDomain = SharedLandscapeConstants.ARCHIVE_CANDIDATE_SUBDOMAIN; |
|
| 686 | + final String domainName = AwsLandscape.getHostedZoneName(applicationReplicaSetToUpgrade.getHostname()); |
|
| 687 | + final Release release = getLandscapeService().getRelease(releaseNameOrNullForLatestMaster); |
|
| 688 | + final AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> result = getLandscapeService().createArchiveReplicaSet(regionId, replicaSetName, |
|
| 689 | + instanceType, releaseNameOrNullForLatestMaster, optionalKeyName, privateKeyEncryptionPassphrase, replicationBearerToken, domainName, |
|
| 690 | + /* optionalMemoryInMegabytesOrNull */ null, /* optionalMemoryTotalSizeFactorOrNull */ null, /* optionalIgtimiRiotPort */ null); |
|
| 691 | + return new SailingApplicationReplicaSetDTO<String>(result.getName(), convertToSailingAnalyticsProcessDTO(result |
|
| 692 | + .getMaster(), Optional.ofNullable(optionalKeyName), privateKeyEncryptionPassphrase), /* replicas */ Collections.emptySet(), |
|
| 693 | + release.getName(), release.getReleaseNotesURL().toString(), |
|
| 694 | + getLandscapeService().getFullyQualifiedHostname(archiveCandidateSubDomain, Optional.ofNullable(domainName)), |
|
| 695 | + /* redirect rule */ null, /* autoScalingGroup */ null); |
|
| 690 | 696 | } |
| 691 | 697 | |
| 692 | 698 | /** |
java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/shared/SailingApplicationReplicaSetDTO.java
| ... | ... | @@ -18,6 +18,9 @@ public class SailingApplicationReplicaSetDTO<ShardingKey> implements Named, IsSe |
| 18 | 18 | private String version; |
| 19 | 19 | private String releaseNotesLink; |
| 20 | 20 | private String hostname; |
| 21 | + /** |
|
| 22 | + * Originates from load balancer rule and therefore it can be null of not managed by load balancer rule |
|
| 23 | + */ |
|
| 21 | 24 | private String defaultRedirectPath; |
| 22 | 25 | private String autoScalingGroupAmiId; |
| 23 | 26 | |
| ... | ... | @@ -74,6 +77,9 @@ public class SailingApplicationReplicaSetDTO<ShardingKey> implements Named, IsSe |
| 74 | 77 | return hostname; |
| 75 | 78 | } |
| 76 | 79 | |
| 80 | + /** |
|
| 81 | + * @return may be null if not managed by load balancer rule |
|
| 82 | + */ |
|
| 77 | 83 | public String getDefaultRedirectPath() { |
| 78 | 84 | return defaultRedirectPath; |
| 79 | 85 | } |
java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/LandscapeService.java
| ... | ... | @@ -151,6 +151,12 @@ public interface LandscapeService { |
| 151 | 151 | Integer optionalMemoryInMegabytesOrNull, Integer optionalMemoryTotalSizeFactorOrNull, |
| 152 | 152 | Integer optionalIgtimiRiotPort, Optional<Integer> minimumAutoScalingGroupSize, Optional<Integer> maximumAutoScalingGroupSize) |
| 153 | 153 | throws Exception; |
| 154 | + |
|
| 155 | + AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> createArchiveReplicaSet( |
|
| 156 | + String regionId, String name, String instanceType, String releaseNameOrNullForLatestMaster, |
|
| 157 | + String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String securityServiceReplicationBearerToken, |
|
| 158 | + String optionalDomainName, Integer optionalMemoryInMegabytesOrNull, |
|
| 159 | + Integer optionalMemoryTotalSizeFactorOrNull, Integer optionalIgtimiRiotPort) throws Exception; |
|
| 154 | 160 | |
| 155 | 161 | /** |
| 156 | 162 | * Starts a first master process of a new replica set whose name is provided by the {@code replicaSetName} |
java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/impl/LandscapeServiceImpl.java
| ... | ... | @@ -236,6 +236,46 @@ public class LandscapeServiceImpl implements LandscapeService { |
| 236 | 236 | } |
| 237 | 237 | |
| 238 | 238 | @Override |
| 239 | + public AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> createArchiveReplicaSet( |
|
| 240 | + String regionId, String replicaSetName, String instanceType, String releaseNameOrNullForLatestMaster, |
|
| 241 | + String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String securityServiceReplicationBearerToken, |
|
| 242 | + String optionalDomainName, Integer optionalMemoryInMegabytesOrNull, |
|
| 243 | + Integer optionalMemoryTotalSizeFactorOrNull, Integer optionalIgtimiRiotPort) throws Exception { |
|
| 244 | + final AwsLandscape<String> landscape = getLandscape(); |
|
| 245 | + final String hostname = getHostname(SharedLandscapeConstants.ARCHIVE_CANDIDATE_SUBDOMAIN, optionalDomainName); |
|
| 246 | + final Iterable<ResourceRecordSet> existingDNSRulesForHostname = landscape.getResourceRecordSets(hostname); |
|
| 247 | + // Failing early in case DNS record already exists (see also bug 5826): |
|
| 248 | + if (existingDNSRulesForHostname != null && !Util.isEmpty(existingDNSRulesForHostname)) { |
|
| 249 | + throw new IllegalArgumentException("DNS record for "+hostname+" already exists"); |
|
| 250 | + } |
|
| 251 | + final AwsRegion region = new AwsRegion(regionId, landscape); |
|
| 252 | + final Release release = getRelease(releaseNameOrNullForLatestMaster); |
|
| 253 | + final com.sap.sailing.landscape.procedures.SailingAnalyticsMasterConfiguration.Builder<?, String> masterConfigurationBuilder = |
|
| 254 | + createMasterConfigurationBuilder(replicaSetName, securityServiceReplicationBearerToken, optionalMemoryInMegabytesOrNull, |
|
| 255 | + null, optionalIgtimiRiotPort, region, release); |
|
| 256 | + final com.sap.sailing.landscape.procedures.StartSailingAnalyticsMasterHost.Builder<?, String> masterHostBuilder = StartSailingAnalyticsMasterHost.masterHostBuilder(masterConfigurationBuilder); |
|
| 257 | + masterHostBuilder |
|
| 258 | + .setInstanceName(SharedLandscapeConstants.ARCHIVE_SERVER_NEW_CANDIDATE_INSTANCE_NAME) |
|
| 259 | + .setInstanceType(InstanceType.valueOf(instanceType)) |
|
| 260 | + .setOptionalTimeout(Landscape.WAIT_FOR_HOST_TIMEOUT) |
|
| 261 | + .setLandscape(landscape) |
|
| 262 | + .setRegion(region) |
|
| 263 | + .setPrivateKeyEncryptionPassphrase(privateKeyEncryptionPassphrase); |
|
| 264 | + if (optionalKeyName != null) { |
|
| 265 | + masterHostBuilder.setKeyName(optionalKeyName); |
|
| 266 | + } |
|
| 267 | + final StartSailingAnalyticsMasterHost<String> masterHostStartProcedure = masterHostBuilder.build(); |
|
| 268 | + masterHostStartProcedure.run(); |
|
| 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; |
|
| 276 | + } |
|
| 277 | + |
|
| 278 | + @Override |
|
| 239 | 279 | public AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> deployApplicationToExistingHost(String replicaSetName, |
| 240 | 280 | SailingAnalyticsHost<String> hostToDeployTo, String replicaInstanceType, boolean dynamicLoadBalancerMapping, |
| 241 | 281 | String releaseNameOrNullForLatestMaster, String optionalKeyName, byte[] privateKeyEncryptionPassphrase, |
| ... | ... | @@ -1648,6 +1688,11 @@ public class LandscapeServiceImpl implements LandscapeService { |
| 1648 | 1688 | return getLandscape().getApplicationReplicaSet(region, replicaSet.getServerName(), newMaster, replicaSet.getReplicas(), |
| 1649 | 1689 | Landscape.WAIT_FOR_PROCESS_TIMEOUT, Optional.ofNullable(optionalKeyName), privateKeyEncryptionPassphrase); |
| 1650 | 1690 | } |
| 1691 | + |
|
| 1692 | +// private void sendMailAboutNewArchiveCandidate( |
|
| 1693 | +// AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> replicaSet) throws MailException { |
|
| 1694 | +// sendMailToReplicaSetOwner(replicaSet, "StartingNewArchiveCandidateSubject", "StartingNewArchiveCandidateBody", Optional.of(ServerActions.CONFIGURE_REMOTE_INSTANCES)); |
|
| 1695 | +// } |
|
| 1651 | 1696 | |
| 1652 | 1697 | private void sendMailAboutMasterUnavailable( |
| 1653 | 1698 | AwsApplicationReplicaSet<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>> replicaSet) throws MailException { |