From bb9e31ff530ff326eb52874e134240accd4cfa46 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 23 Sep 2021 18:44:38 +0200 Subject: [PATCH] bug5311: added a second bearer token field to allow for distinguishing between master/security and application replica replication --- .../AbstractApplicationReplicaSetDialog.java | 29 +++++++++++++------ .../CreateApplicationReplicaSetDialog.java | 18 +++++++----- .../ui/client/LandscapeManagementPanel.java | 5 ++-- .../LandscapeManagementWriteService.java | 2 +- .../LandscapeManagementWriteServiceAsync.java | 3 +- .../UpgradeApplicationReplicaSetDialog.java | 10 +++---- .../ui/client/i18n/StringMessages.java | 1 + .../ui/client/i18n/StringMessages.properties | 3 +- .../client/i18n/StringMessages_de.properties | 3 +- .../LandscapeManagementWriteServiceImpl.java | 14 ++++----- 10 files changed, 54 insertions(+), 34 deletions(-) diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/AbstractApplicationReplicaSetDialog.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/AbstractApplicationReplicaSetDialog.java index e122794a606..929276e3eec 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/AbstractApplicationReplicaSetDialog.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/AbstractApplicationReplicaSetDialog.java @@ -15,25 +15,31 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog; public abstract class AbstractApplicationReplicaSetDialog extends DataEntryDialog { public static class AbstractApplicationReplicaSetInstructions { - private final String replicationBearerToken; + private final String masterReplicationBearerToken; + private final String replicaReplicationBearerToken; private final String releaseNameOrNullForLatestMaster; - public AbstractApplicationReplicaSetInstructions(String releaseNameOrNullForLatestMaster, String replicationBearerToken) { + public AbstractApplicationReplicaSetInstructions(String releaseNameOrNullForLatestMaster, String masterReplicationBearerToken, String replicaReplicationBearerToken) { super(); - this.replicationBearerToken = replicationBearerToken; + this.masterReplicationBearerToken = masterReplicationBearerToken; + this.replicaReplicationBearerToken = replicaReplicationBearerToken; this.releaseNameOrNullForLatestMaster = releaseNameOrNullForLatestMaster; } public String getReleaseNameOrNullForLatestMaster() { return releaseNameOrNullForLatestMaster; } - public String getReplicationBearerToken() { - return replicationBearerToken; + public String getMasterReplicationBearerToken() { + return masterReplicationBearerToken; + } + public String getReplicaReplicationBearerToken() { + return replicaReplicationBearerToken; } } private final StringMessages stringMessages; private final SuggestBox releaseNameBox; - private final TextBox replicationBearerTokenBox; + private final TextBox masterReplicationBearerTokenBox; + private final TextBox replicaReplicationBearerTokenBox; public AbstractApplicationReplicaSetDialog(String title, LandscapeManagementWriteServiceAsync landscapeManagementService, Iterable releaseNames, StringMessages stringMessages, ErrorReporter errorReporter, Validator validator, DialogCallback callback) { @@ -49,7 +55,8 @@ public abstract class AbstractApplicationReplicaSetDialog>() { @Override public void onFailure(Throwable caught) { @@ -678,7 +679,7 @@ public class LandscapeManagementPanel extends SimplePanel { sshKeyManagementPanel.getSelectedKeyPair()==null?null:sshKeyManagementPanel.getSelectedKeyPair().getName(), sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption() != null ? sshKeyManagementPanel.getPassphraseForPrivateKeyDecryption().getBytes() : null, - upgradeInstructions.getReplicationBearerToken(), + upgradeInstructions.getMasterReplicationBearerToken(), new AsyncCallback>() { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteService.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteService.java index e87038b6b46..1d2c5e557c9 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteService.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteService.java @@ -71,7 +71,7 @@ public interface LandscapeManagementWriteService extends RemoteService { SailingApplicationReplicaSetDTO createApplicationReplicaSet(String regionId, String name, String masterInstanceType, boolean dynamicLoadBalancerMapping, String releaseNameOrNullForLatestMaster, String optionalKeyName, - byte[] privateKeyEncryptionPassphrase, String securityReplicationBearerToken, String optionalDomainName) throws Exception; + byte[] privateKeyEncryptionPassphrase, String securityReplicationBearerToken, String replicaReplicationBearerToken, String optionalDomainName) throws Exception; void defineDefaultRedirect(String regionId, String hostname, RedirectDTO redirect, String keyName, String passphraseForPrivateKeyDecryption); diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteServiceAsync.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteServiceAsync.java index 5b2b6c6032c..97a8438ea14 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteServiceAsync.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementWriteServiceAsync.java @@ -89,7 +89,8 @@ public interface LandscapeManagementWriteServiceAsync { void createApplicationReplicaSet(String regionId, String name, String masterInstanceType, boolean dynamicLoadBalancerMapping, String releaseNameOrNullForLatestMaster, String optionalKeyName, - byte[] privateKeyEncryptionPassphrase, String securityReplicationBearerToken, String optionalDomainName, + byte[] privateKeyEncryptionPassphrase, String securityReplicationBearerToken, String replicaReplicationBearerToken, + String optionalDomainName, AsyncCallback> callback); void serializationDummy(ProcessDTO mongoProcessDTO, AwsInstanceDTO awsInstanceDTO, diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/UpgradeApplicationReplicaSetDialog.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/UpgradeApplicationReplicaSetDialog.java index a17feb831ba..6efeab4b0e4 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/UpgradeApplicationReplicaSetDialog.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/UpgradeApplicationReplicaSetDialog.java @@ -9,8 +9,8 @@ import com.sap.sse.gwt.client.ErrorReporter; public class UpgradeApplicationReplicaSetDialog extends AbstractApplicationReplicaSetDialog { public static class UpgradeApplicationReplicaSetInstructions extends AbstractApplicationReplicaSetDialog.AbstractApplicationReplicaSetInstructions { - public UpgradeApplicationReplicaSetInstructions(String releaseNameOrNullForLatestMaster, String replicationBearerToken) { - super(releaseNameOrNullForLatestMaster, replicationBearerToken); + public UpgradeApplicationReplicaSetInstructions(String releaseNameOrNullForLatestMaster, String masterReplicationBearerToken, String replicaReplicationBearerToken) { + super(releaseNameOrNullForLatestMaster, masterReplicationBearerToken, replicaReplicationBearerToken); } } @@ -28,8 +28,8 @@ public class UpgradeApplicationReplicaSetDialog extends AbstractApplicationRepli int row=0; result.setWidget(row, 0, new Label(stringMessages.release())); result.setWidget(row++, 1, getReleaseNameBox()); - result.setWidget(row, 0, new Label(stringMessages.bearerTokenForSecurityReplication())); - result.setWidget(row++, 1, getReplicationBearerTokenBox()); + result.setWidget(row, 0, new Label(stringMessages.replicaReplicationBearerToken())); + result.setWidget(row++, 1, getReplicaReplicationBearerTokenBox()); return result; } @@ -40,6 +40,6 @@ public class UpgradeApplicationReplicaSetDialog extends AbstractApplicationRepli @Override protected UpgradeApplicationReplicaSetInstructions getResult() { - return new UpgradeApplicationReplicaSetInstructions(getReleaseNameBoxValue(), getReplicationBearerTokenBox().getValue()); + return new UpgradeApplicationReplicaSetInstructions(getReleaseNameBoxValue(), getMasterReplicationBearerTokenBox().getValue(), getReplicaReplicationBearerTokenBox().getValue()); } } diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.java index a78943b8f7b..9af5450fa2f 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.java @@ -107,4 +107,5 @@ com.sap.sse.gwt.adminconsole.StringMessages { String bearerTokenOrNullForArchive(); String numberOfMinutesBeforeAndBetweenCompareServers(); String numberOfCompareServersAttempts(); + String replicaReplicationBearerToken(); } diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.properties b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.properties index 87247a801a7..78b00993486 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages.properties @@ -95,4 +95,5 @@ removeArchivedReplicaSet=Remove archived replica set after successful verificati bearerTokenOrNullForApplicationReplicaSetToArchive=Bearer token for application replica set {0} (leave empty for current user) bearerTokenOrNullForArchive=Bearer token for archive (leave empty for current user) numberOfMinutesBeforeAndBetweenCompareServers=Minutes before and between verification attempts -numberOfCompareServersAttempts=Maximum number of verification attempts \ No newline at end of file +numberOfCompareServersAttempts=Maximum number of verification attempts +replicaReplicationBearerToken=Bearer token for replicas to replicate master \ No newline at end of file diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages_de.properties b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages_de.properties index 1b2784f142b..c93d5997c5e 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages_de.properties +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/i18n/StringMessages_de.properties @@ -95,4 +95,5 @@ removeArchivedReplicaSet=Anwendungs-Cluster nach dem Archivieren entfernen? bearerTokenOrNullForApplicationReplicaSetToArchive=Token für zu archivierendes Anwendungs-Cluster {0} (leer für aktuellen Benutzer) bearerTokenOrNullForArchive=Token für Archive-Server (leer für aktuellen Benutzer) numberOfMinutesBeforeAndBetweenCompareServers=Minuten vor und zwischen den Verifikations-Läufen -numberOfCompareServersAttempts=Maximale Anzahl Verifikations-Läufe \ No newline at end of file +numberOfCompareServersAttempts=Maximale Anzahl Verifikations-Läufe +replicaReplicationBearerToken=Token für Replikas, um den Master-Server zu replizieren \ No newline at end of file diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java index d1ab1f99002..fd4bad0cab4 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/server/LandscapeManagementWriteServiceImpl.java @@ -574,7 +574,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem @Override public SailingApplicationReplicaSetDTO createApplicationReplicaSet(String regionId, String name, String masterInstanceType, boolean dynamicLoadBalancerMapping, String releaseNameOrNullForLatestMaster, String optionalKeyName, - byte[] privateKeyEncryptionPassphrase, String replicationBearerToken, String optionalDomainName) + byte[] privateKeyEncryptionPassphrase, String masterReplicationBearerToken, String replicaReplicationBearerToken, String optionalDomainName) throws Exception { checkLandscapeManageAwsPermission(); final AwsLandscape landscape = getLandscape(); @@ -582,8 +582,8 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem final com.sap.sailing.landscape.procedures.StartSailingAnalyticsMasterHost.Builder masterHostBuilder = StartSailingAnalyticsMasterHost.masterHostBuilder(masterConfigurationBuilder); final AwsRegion region = new AwsRegion(regionId); establishServerGroupAndTryToMakeCurrentUserItsOwnerAndMember(name); - final String bearerTokenUsedByMaster = Util.hasLength(replicationBearerToken) ? replicationBearerToken : getSecurityService().getOrCreateAccessToken(SessionUtils.getPrincipal().toString()); - final String bearerTokenUsedByReplicas = getSecurityService().getAccessToken(SessionUtils.getPrincipal().toString()); // TODO how about using an explicit replicationBearerToken only for master and prefer the current user's token for replicas? Doesn't work, though, for testing with disconnected caller security + final String bearerTokenUsedByMaster = Util.hasLength(masterReplicationBearerToken) ? masterReplicationBearerToken : getSecurityService().getOrCreateAccessToken(SessionUtils.getPrincipal().toString()); + final String bearerTokenUsedByReplicas = Util.hasLength(replicaReplicationBearerToken) ? replicaReplicationBearerToken : getSecurityService().getOrCreateAccessToken(SessionUtils.getPrincipal().toString()); final Release release = getRelease(releaseNameOrNullForLatestMaster); masterConfigurationBuilder .setLandscape(landscape) @@ -949,13 +949,13 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem @Override public SailingApplicationReplicaSetDTO upgradeApplicationReplicaSet(String regionId, SailingApplicationReplicaSetDTO applicationReplicaSetToUpgrade, String releaseOrNullForLatestMaster, - String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String replicationBearerToken) throws Exception { + String optionalKeyName, byte[] privateKeyEncryptionPassphrase, String replicaReplicationBearerToken) throws Exception { checkLandscapeManageAwsPermission(); final Release release = getRelease(releaseOrNullForLatestMaster); final AwsRegion region = new AwsRegion(regionId); final AwsApplicationReplicaSet> replicaSet = convertFromApplicationReplicaSetDTO(region, applicationReplicaSetToUpgrade); - final String bearerToken = Util.hasLength(replicationBearerToken) ? replicationBearerToken : + final String effectiveReplicaReplicationBearerToken = Util.hasLength(replicaReplicationBearerToken) ? replicaReplicationBearerToken : getSecurityService().getOrCreateAccessToken(SessionUtils.getPrincipal().toString()); final SailingAnalyticsProcess additionalReplicaStarted; final int oldAutoScalingGroupMinSize; @@ -970,7 +970,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem logger.info("No replica found for replica set " + replicaSet.getName() + "; spinning one up and waiting for it to become healthy"); additionalReplicaStarted = launchReplicaAndWaitUntilHealthy(replicaSet, Optional.ofNullable(optionalKeyName), - privateKeyEncryptionPassphrase, bearerToken); + privateKeyEncryptionPassphrase, effectiveReplicaReplicationBearerToken); replicas.add(additionalReplicaStarted); } else { additionalReplicaStarted = null; @@ -978,7 +978,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem logger.info("Stopping replication for replica set "+replicaSet.getName()); for (final SailingAnalyticsProcess replica : replicas) { logger.info("...asking replica "+replica+" to stop replication"); - replica.stopReplicatingFromMaster(bearerToken, WAIT_FOR_PROCESS_TIMEOUT); + replica.stopReplicatingFromMaster(effectiveReplicaReplicationBearerToken, WAIT_FOR_PROCESS_TIMEOUT); } logger.info("Done stopping replication. Removing master "+replicaSet.getMaster()+" from target groups "+ replicaSet.getPublicTargetGroup()+" and "+replicaSet.getMasterTargetGroup());