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 {