diff --git a/java/com.sap.sailing.landscape.test/src/com/sap/sailing/landscape/test/TestProcedures.java b/java/com.sap.sailing.landscape.test/src/com/sap/sailing/landscape/test/TestProcedures.java index ce54e058f4c..71aeb578ce3 100755 --- a/java/com.sap.sailing.landscape.test/src/com/sap/sailing/landscape/test/TestProcedures.java +++ b/java/com.sap.sailing.landscape.test/src/com/sap/sailing/landscape/test/TestProcedures.java @@ -42,7 +42,6 @@ import com.sap.sse.landscape.InboundReplicationConfiguration; import com.sap.sse.landscape.application.ApplicationReplicaSet; import com.sap.sse.landscape.aws.AmazonMachineImage; import com.sap.sse.landscape.aws.ApplicationProcessHost; -import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.aws.Tags; import com.sap.sse.landscape.aws.impl.AwsRegion; @@ -72,7 +71,7 @@ import software.amazon.awssdk.services.route53.model.RRType; public class TestProcedures { private static final Logger logger = Logger.getLogger(TestProcedures.class.getName()); private static final Optional optionalTimeout = Optional.of(Duration.ONE_MINUTE.times(10)); - private AwsLandscape> landscape; + private AwsLandscape landscape; private AwsRegion region; private final static String MAIL_SMTP_PASSWORD = "mail.smtp.password"; private final static String SECURITY_SERVICE_REPLICATION_BEARER_TOKEN = "security.service.replication.bearer.token"; @@ -211,8 +210,8 @@ public class TestProcedures { public void testAddMongoReplica() throws Exception { final String keyName = "MyKey-"+UUID.randomUUID(); landscape.createKeyPair(region, keyName, privateKeyEncryptionPassphrase); - final StartMongoDBServer.Builder> builder = StartMongoDBServer.builder(); - final StartMongoDBServer> startMongoDBServerProcedure = builder + final StartMongoDBServer.Builder builder = StartMongoDBServer.builder(); + final StartMongoDBServer startMongoDBServerProcedure = builder .setLandscape(landscape) .setKeyName(keyName) .setPrivateKeyEncryptionPassphrase(privateKeyEncryptionPassphrase) @@ -268,7 +267,7 @@ public class TestProcedures { .build(); try { imageUpgradeProcedure.run(); - final AmazonMachineImage upgradedAmi = imageUpgradeProcedure.getUpgradedAmi(); + final AmazonMachineImage upgradedAmi = imageUpgradeProcedure.getUpgradedAmi(); assertTrue(upgradedAmi.getCreatedAt().until(TimePoint.now()).compareTo(Duration.ONE_MINUTE.times(10)) < 0); assertEquals(3, Util.size(upgradedAmi.getBlockDeviceMappings())); } catch (Exception e) { @@ -336,15 +335,14 @@ public class TestProcedures { final String domain = "wiesen-weg.de"; final String hostname = serverName+"."+domain; CreateDynamicLoadBalancerMapping.Builder, AwsInstance> createAlbProcedureBuilder = CreateDynamicLoadBalancerMapping.builder(); + SailingAnalyticsProcess> createAlbProcedureBuilder = CreateDynamicLoadBalancerMapping.builder(); createAlbProcedureBuilder .setProcess(process) .setHostname(hostname) .setTargetGroupNamePrefix("S-ded-") // TODO when we combine procedures for launching dedicated hosts (StartSailingAnlayticsHost and specializations) then "S-ded-" should be the default; for DeployProcessOnMultiServer, "S-shared-" should be the default .setLandscape(landscape); optionalTimeout.ifPresent(createAlbProcedureBuilder::setTimeout); - final CreateDynamicLoadBalancerMapping, AwsInstance> createAlbProcedure = - createAlbProcedureBuilder.build(); + final CreateDynamicLoadBalancerMapping> createAlbProcedure = createAlbProcedureBuilder.build(); try { createAlbProcedure.run(); // A few validations: diff --git a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementPanel.java b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementPanel.java index 9482d480b73..9b68757979d 100755 --- a/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementPanel.java +++ b/java/com.sap.sailing.landscape.ui/src/com/sap/sailing/landscape/ui/client/LandscapeManagementPanel.java @@ -174,7 +174,9 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess }, stringMessages.hostname()); final ActionsColumn mongoEndpointsActionColumn = new ActionsColumn( new MongoEndpointsImagesBarCell(stringMessages), /* permission checker */ (mongoEndpoint, action)->true); - mongoEndpointsActionColumn.addAction(MongoEndpointsImagesBarCell.ACTION_SCALE, mongoEndpointToScale->scaleMongoEndpoint(stringMessages, mongoEndpointToScale)); + mongoEndpointsActionColumn.addAction(MongoEndpointsImagesBarCell.ACTION_SCALE, + mongoEndpointToScale -> scaleMongoEndpoint(stringMessages, + regionsTable.getSelectionModel().getSelectedObject(), mongoEndpointToScale)); mongoEndpointsTable.addColumn(mongoEndpointsActionColumn); final CaptionPanel mongoEndpointsCaptionPanel = new CaptionPanel(stringMessages.mongoEndpoints()); final VerticalPanel mongoEndpointsVerticalPanel = new VerticalPanel(); @@ -288,12 +290,13 @@ public class LandscapeManagementPanel extends VerticalPanel implements AwsAccess } } - private void scaleMongoEndpoint(StringMessages stringMessages, MongoEndpointDTO mongoEndpointToScale) { + private void scaleMongoEndpoint(StringMessages stringMessages, String selectedRegion, MongoEndpointDTO mongoEndpointToScale) { new MongoScalingDialog(mongoEndpointToScale, stringMessages, errorReporter, landscapeManagementService, new DialogCallback() { @Override public void ok(MongoScalingInstructionsDTO mongoScalingInstructions) { mongoEndpointsBusy.setBusy(true); - landscapeManagementService.scaleMongo(mongoScalingInstructions, new AsyncCallback() { + landscapeManagementService.scaleMongo(awsAccessKeyTextBox.getValue(), awsSecretPasswordTextBox.getValue(), selectedRegion, + mongoScalingInstructions, new AsyncCallback() { @Override public void onFailure(Throwable caught) { mongoEndpointsBusy.setBusy(false); 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 3514ffd1206..618f7805917 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 @@ -36,5 +36,5 @@ public interface LandscapeManagementWriteService extends RemoteService { AmazonMachineImageDTO upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) throws Exception; - void scaleMongo(MongoScalingInstructionsDTO mongoScalingInstructions); + void scaleMongo(String awsAccessKey, String awsSecret, String region, MongoScalingInstructionsDTO mongoScalingInstructions) throws Exception; } 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 c108cbd197e..0f8e1dc9ea9 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 @@ -55,5 +55,6 @@ public interface LandscapeManagementWriteServiceAsync { void upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId, AsyncCallback callback); - void scaleMongo(MongoScalingInstructionsDTO mongoScalingInstructions, AsyncCallback asyncCallback); + void scaleMongo(String awsAccessKey, String awsSecret, String region, + MongoScalingInstructionsDTO mongoScalingInstructions, AsyncCallback asyncCallback); } 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 c0585ccb49d..4c3d5ae77e1 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 @@ -10,7 +10,6 @@ import org.apache.shiro.subject.Subject; import org.osgi.framework.BundleContext; import com.jcraft.jsch.JSchException; -import com.sap.sailing.landscape.SailingAnalyticsMetrics; import com.sap.sailing.landscape.SailingAnalyticsProcess; import com.sap.sailing.landscape.procedures.UpgradeAmi; import com.sap.sailing.landscape.ui.client.LandscapeManagementWriteService; @@ -29,6 +28,7 @@ import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AmazonMachineImage; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.aws.impl.AwsRegion; +import com.sap.sse.landscape.aws.orchestration.StartMongoDBServer; import com.sap.sse.landscape.common.shared.SecuredLandscapeTypes; import com.sap.sse.landscape.mongodb.MongoEndpoint; import com.sap.sse.landscape.mongodb.MongoProcess; @@ -148,7 +148,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem @Override public ArrayList getSshKeys(String awsAccessKey, String awsSecret, String regionId) { final ArrayList result = new ArrayList<>(); - final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); + final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); final AwsRegion region = new AwsRegion(regionId); for (final KeyPairInfo keyPairInfo : landscape.getAllKeyPairInfos(region)) { final SSHKeyPair key = landscape.getSSHKeyPair(region, keyPairInfo.keyName()); @@ -169,7 +169,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem @Override public byte[] getEncryptedSshPrivateKey(String regionId, String keyName) throws JSchException { - final AwsLandscape landscape = AwsLandscape.obtain(); + final AwsLandscape landscape = AwsLandscape.obtain(); final SSHKeyPair keyPair = landscape.getSSHKeyPair(new AwsRegion(regionId), keyName); getSecurityService().checkCurrentUserReadPermission(keyPair); return keyPair.getEncryptedPrivateKey(); @@ -177,7 +177,7 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem @Override public byte[] getSshPublicKey(String regionId, String keyName) throws JSchException { - final AwsLandscape landscape = AwsLandscape.obtain(); + final AwsLandscape landscape = AwsLandscape.obtain(); final SSHKeyPair keyPair = landscape.getSSHKeyPair(new AwsRegion(regionId), keyName); getSecurityService().checkCurrentUserReadPermission(keyPair); return keyPair.getPublicKey(); @@ -189,9 +189,9 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem new TypeRelativeObjectIdentifier("AWS"))); final ArrayList result = new ArrayList<>(); final AwsRegion awsRegion = new AwsRegion(region); - final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); + final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); for (final String imageType : landscape.getMachineImageTypes(awsRegion)) { - for (final AmazonMachineImage machineImage : landscape.getAllImagesWithType(awsRegion, imageType)) { + for (final AmazonMachineImage machineImage : landscape.getAllImagesWithType(awsRegion, imageType)) { final AmazonMachineImageDTO dto = new AmazonMachineImageDTO(machineImage.getId(), machineImage.getRegion().getId(), machineImage.getName(), imageType, machineImage.getState().name(), machineImage.getCreatedAt()); @@ -205,8 +205,8 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem public void removeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) { SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE, new TypeRelativeObjectIdentifier("AWS"))); - final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); - final AmazonMachineImage ami = landscape.getImage(new AwsRegion(region), machineImageId); + final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); + final AmazonMachineImage ami = landscape.getImage(new AwsRegion(region), machineImageId); ami.delete(); } @@ -214,9 +214,9 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem public AmazonMachineImageDTO upgradeAmazonMachineImage(String awsAccessKey, String awsSecret, String region, String machineImageId) throws Exception { SecurityUtils.getSubject().checkPermission(SecuredLandscapeTypes.LANDSCAPE.getStringPermissionForTypeRelativeIdentifier(SecuredLandscapeTypes.LandscapeActions.MANAGE, new TypeRelativeObjectIdentifier("AWS"))); - final AwsLandscape> landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); + final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); final AwsRegion awsRegion = new AwsRegion(region); - final AmazonMachineImage ami = landscape.getImage(awsRegion, machineImageId); + final AmazonMachineImage ami = landscape.getImage(awsRegion, machineImageId); final UpgradeAmi.Builder> upgradeAmiBuilder = UpgradeAmi.builder(); upgradeAmiBuilder .setLandscape(landscape) @@ -225,13 +225,29 @@ public class LandscapeManagementWriteServiceImpl extends ResultCachingProxiedRem .setOptionalTimeout(IMAGE_UPGRADE_TIMEOUT); final UpgradeAmi upgradeAmi = upgradeAmiBuilder.build(); upgradeAmi.run(); - final AmazonMachineImage resultingAmi = upgradeAmi.getUpgradedAmi(); + final AmazonMachineImage resultingAmi = upgradeAmi.getUpgradedAmi(); return new AmazonMachineImageDTO(resultingAmi.getId(), resultingAmi.getRegion().getId(), resultingAmi.getName(), /* TODO type */ null, resultingAmi.getState().name(), resultingAmi.getCreatedAt()); } @Override - public void scaleMongo(MongoScalingInstructionsDTO mongoScalingInstructions) { - // TODO Implement LandscapeManagementWriteServiceImpl.scaleMongo(...) - + public void scaleMongo(String awsAccessKey, String awsSecret, String regionId, MongoScalingInstructionsDTO mongoScalingInstructions) throws Exception { + if (mongoScalingInstructions.getReplicaSetName() == null) { + throw new IllegalArgumentException("Can only scale MongoDB Replica Sets, not standalone instances"); + } + final AwsLandscape landscape = AwsLandscape.obtain(awsAccessKey, awsSecret); + final AwsRegion region = new AwsRegion(regionId); + for (int i=0; i startMongoProcessBuilder = StartMongoDBServer.builder(); + final StartMongoDBServer startMongoDBServer = startMongoProcessBuilder + .setLandscape(landscape) + .setInstanceType(InstanceType.valueOf(mongoScalingInstructions.getLaunchParameters().getInstanceType())) + .setRegion(region) + .setReplicaSetName(mongoScalingInstructions.getReplicaSetName()) + .setReplicaSetPrimary(mongoScalingInstructions.getLaunchParameters().getReplicaSetPrimary()) + .setReplicaSetPriority(mongoScalingInstructions.getLaunchParameters().getReplicaSetPriority()) + .setReplicaSetVotes(mongoScalingInstructions.getLaunchParameters().getReplicaSetVotes()) + .build(); + startMongoDBServer.run(); + } } } diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/DeployProcessOnMultiServer.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/DeployProcessOnMultiServer.java index ea821103f36..f10c9fc78c6 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/DeployProcessOnMultiServer.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/DeployProcessOnMultiServer.java @@ -33,11 +33,11 @@ import com.sap.sse.landscape.ssh.SshCommandChannel; * * @author Axel Uhl (D043530) */ -public class DeployProcessOnMultiServer, +public class DeployProcessOnMultiServer, ApplicationConfigurationT extends SailingAnalyticsApplicationConfiguration, ApplicationConfigurationBuilderT extends SailingAnalyticsApplicationConfiguration.Builder> -extends AbstractProcedureImpl> -implements Procedure> { +extends AbstractProcedureImpl +implements Procedure { private static final Logger logger = Logger.getLogger(DeployProcessOnMultiServer.class.getName()); private final ApplicationProcessHost> hostToDeployTo; private final ApplicationConfigurationT applicationConfiguration; @@ -87,19 +87,19 @@ implements Procedure, ShardingKey, HostT extends AwsInstance, + public static interface Builder, ShardingKey, HostT extends AwsInstance, ApplicationConfigurationT extends SailingAnalyticsApplicationConfiguration, ApplicationConfigurationBuilderT extends SailingAnalyticsApplicationConfiguration.Builder> - extends com.sap.sse.landscape.orchestration.Procedure.Builder, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess> { + extends com.sap.sse.landscape.orchestration.Procedure.Builder, ShardingKey> { BuilderT setHostToDeployTo(ApplicationProcessHost> hostToDeployTo); BuilderT setKeyName(String keyName); BuilderT setPrivateKeyEncryptionPassphrase(byte[] privateKeyEncryptionPassphrase); } - public static class BuilderImpl, ShardingKey, HostT extends AwsInstance, + public static class BuilderImpl, ShardingKey, HostT extends AwsInstance, ApplicationConfigurationT extends SailingAnalyticsApplicationConfiguration, ApplicationConfigurationBuilderT extends SailingAnalyticsApplicationConfiguration.Builder> - extends com.sap.sse.landscape.orchestration.AbstractProcedureImpl.BuilderImpl, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess> + extends com.sap.sse.landscape.orchestration.AbstractProcedureImpl.BuilderImpl, ShardingKey> implements Builder { private final SailingAnalyticsApplicationConfiguration.BuilderImpl applicationConfigurationBuilder; private ApplicationProcessHost> hostToDeployTo; @@ -178,8 +178,8 @@ implements Procedure> getLandscape() { - return (AwsLandscape>) super.getLandscape(); + protected AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } @Override @@ -225,7 +225,7 @@ implements Procedure, ShardingKey, HostT extends AwsInstance, + public static , ShardingKey, HostT extends AwsInstance, ApplicationConfigurationT extends SailingAnalyticsApplicationConfiguration, ApplicationConfigurationBuilderT extends SailingAnalyticsApplicationConfiguration.Builder> Builder builder(ApplicationConfigurationBuilderT applicationConfigurationBuilder) { diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsApplicationConfiguration.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsApplicationConfiguration.java index ed58c93fbaa..a233ef27dac 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsApplicationConfiguration.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsApplicationConfiguration.java @@ -133,7 +133,7 @@ extends AwsApplicationConfiguration> getLandscape() { + protected AwsLandscape getLandscape() { return super.getLandscape(); } diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsReplicaConfiguration.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsReplicaConfiguration.java index df1674e56a5..c0303f9075b 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsReplicaConfiguration.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/SailingAnalyticsReplicaConfiguration.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; -import com.sap.sailing.landscape.SailingAnalyticsMetrics; import com.sap.sse.landscape.DefaultProcessConfigurationVariables; import com.sap.sse.landscape.InboundReplicationConfiguration; import com.sap.sse.landscape.OutboundReplicationConfiguration; @@ -82,7 +81,7 @@ extends SailingAnalyticsApplicationConfiguration { } public static , - ShardingKey extends AwsInstance> BuilderT replicaBuilder() { + ShardingKey extends AwsInstance> BuilderT replicaBuilder() { @SuppressWarnings("unchecked") final BuilderT result = (BuilderT) new BuilderImpl(); return result; diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartMultiServer.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartMultiServer.java index 8fdf808ac1a..1f6c2654045 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartMultiServer.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartMultiServer.java @@ -37,9 +37,7 @@ import software.amazon.awssdk.services.ec2.model.InstanceType; * @param > */ public class StartMultiServer -extends StartEmptyServer, ShardingKey, SailingAnalyticsMetrics, - SailingAnalyticsProcess, ApplicationProcessHost>> +extends StartEmptyServer, ShardingKey, ApplicationProcessHost>> implements StartFromSailingAnalyticsImage { private static final Logger logger = Logger.getLogger(StartMultiServer.class.getName()); private Optional optionalTimeout; @@ -56,13 +54,12 @@ implements StartFromSailingAnalyticsImage { * @author Axel Uhl (D043530) */ public static interface Builder, ShardingKey> - extends StartEmptyServer.Builder, ShardingKey, - SailingAnalyticsMetrics, SailingAnalyticsProcess, ApplicationProcessHost>> { + extends StartEmptyServer.Builder, ShardingKey, ApplicationProcessHost>> { } protected static class BuilderImpl, ShardingKey> extends StartEmptyServer.BuilderImpl, - ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess, ApplicationProcessHost>> + ShardingKey, ApplicationProcessHost>> implements Builder { @Override public StartMultiServer build() { @@ -91,8 +88,8 @@ implements StartFromSailingAnalyticsImage { } @Override - protected HostSupplier, ApplicationProcessHost>> getHostSupplier() { - final HostSupplier, ApplicationProcessHost>> result; + protected HostSupplier>> getHostSupplier() { + final HostSupplier>> result; if (super.getHostSupplier() == null) { result = (instanceId, az, landscape)-> new ApplicationProcessHostImpl>(instanceId, az, landscape, (host, serverDirectory)->{ diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartSailingAnalyticsHost.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartSailingAnalyticsHost.java index a861b4fab0f..8f73743ac3b 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartSailingAnalyticsHost.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/StartSailingAnalyticsHost.java @@ -33,7 +33,7 @@ import com.sap.sse.landscape.orchestration.Procedure; */ public class StartSailingAnalyticsHost extends StartAwsApplicationHost, ApplicationProcessHost>> -implements Procedure>, +implements Procedure, StartFromSailingAnalyticsImage { public static final Logger logger = Logger.getLogger(StartSailingAnalyticsHost.class.getName()); private final static String INSTANCE_NAME_DEFAULT_PREFIX = "SL "; @@ -86,8 +86,8 @@ implements Procedure, ApplicationProcessHost>> getHostSupplier() { - return (String instanceId, AwsAvailabilityZone az, AwsLandscape> landscape)-> + protected HostSupplier>> getHostSupplier() { + return (String instanceId, AwsAvailabilityZone az, AwsLandscape landscape)-> new ApplicationProcessHostImpl<>(instanceId, az, landscape, (host, serverDirectory)->{ try { diff --git a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/UpgradeAmi.java b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/UpgradeAmi.java index 19122ea7556..cd602c90c1c 100755 --- a/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/UpgradeAmi.java +++ b/java/com.sap.sailing.landscape/src/com/sap/sailing/landscape/procedures/UpgradeAmi.java @@ -58,8 +58,8 @@ import software.amazon.awssdk.services.ec2.model.InstanceType; * @param */ public class UpgradeAmi -extends StartEmptyServer, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess, ApplicationProcessHost>> -implements Procedure>, StartFromSailingAnalyticsImage { +extends StartEmptyServer, ShardingKey, ApplicationProcessHost>> +implements Procedure, StartFromSailingAnalyticsImage { private static final Logger logger = Logger.getLogger(UpgradeAmi.class.getName()); private static final Pattern imageNamePattern = Pattern.compile("^(.*) ([0-9]+)\\.([0-9]+)(\\.([0-9]+))?$"); @@ -70,7 +70,7 @@ implements Procedure deviceNamesToSnapshotBaseNames; - private AmazonMachineImage upgradedAmi; + private AmazonMachineImage upgradedAmi; /** * Additional default rules in addition to what the {@link StartAwsHost.Builder parent builder} defines: @@ -106,7 +106,7 @@ implements Procedure>, ShardingKey, ProcessT extends ApplicationProcess> - extends StartEmptyServer.Builder, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess, ApplicationProcessHost>> { + extends StartEmptyServer.Builder, ShardingKey, ApplicationProcessHost>> { enum VersionPart { MAJOR, MINOR, MICRO } @@ -126,7 +126,7 @@ implements Procedure>, ShardingKey> - extends StartEmptyServer.BuilderImpl, ShardingKey, SailingAnalyticsMetrics, SailingAnalyticsProcess, ApplicationProcessHost>> + extends StartEmptyServer.BuilderImpl, ShardingKey, ApplicationProcessHost>> implements Builder> { private String upgradedImageName; private VersionPart versionPartToIncrement; @@ -248,8 +248,8 @@ implements Procedure, ApplicationProcessHost>> getHostSupplier() { - return (String instanceId, AwsAvailabilityZone az, AwsLandscape> landscape)-> + public HostSupplier>> getHostSupplier() { + return (String instanceId, AwsAvailabilityZone az, AwsLandscape landscape)-> new ApplicationProcessHostImpl<>(instanceId, az, landscape, (host, serverDirectory)->{ try { @@ -293,7 +293,7 @@ implements Procedure>, ShardingKey, - HostT extends AwsInstance> Builder> builder() { + HostT extends AwsInstance> Builder> builder() { return new BuilderImpl<>(); } @@ -368,7 +368,7 @@ implements Procedure getUpgradedAmi() { + public AmazonMachineImage getUpgradedAmi() { return upgradedAmi; } } diff --git a/java/com.sap.sse.landscape.aws.test/src/com/sap/sse/landscape/aws/ConnectivityTest.java b/java/com.sap.sse.landscape.aws.test/src/com/sap/sse/landscape/aws/ConnectivityTest.java index d997e4854db..781c2106dff 100755 --- a/java/com.sap.sse.landscape.aws.test/src/com/sap/sse/landscape/aws/ConnectivityTest.java +++ b/java/com.sap.sse.landscape.aws.test/src/com/sap/sse/landscape/aws/ConnectivityTest.java @@ -71,7 +71,7 @@ import software.amazon.awssdk.services.route53.model.RRType; public class ConnectivityTest> { private static final Logger logger = Logger.getLogger(ConnectivityTest.class.getName()); private static final Optional optionalTimeout = Optional.of(Duration.ONE_MINUTE.times(5)); - private AwsLandscape landscape; + private AwsLandscape landscape; private AwsRegion region; private byte[] keyPass; private String AXELS_KEY_PASS; @@ -153,7 +153,7 @@ public class ConnectivityTest proxy = landscape.getCentralReverseProxy(region); final String hostname = "kw2021.sapsailing.com"; - final AwsInstance proxyHost = proxy.getHosts().iterator().next(); + final AwsInstance proxyHost = proxy.getHosts().iterator().next(); final ProcessT process = createApplicationProcess(proxyHost); proxy.setEventRedirect(hostname, process, UUID.randomUUID(), /* optional SSH key name */ Optional.empty(), AXELS_KEY_PASS.getBytes()); final ByteArrayOutputStream configFileContents = new ByteArrayOutputStream(); @@ -169,7 +169,7 @@ public class ConnectivityTest host) { + protected ProcessT createApplicationProcess(final AwsInstance host) { @SuppressWarnings("unchecked") final ProcessT process = (ProcessT) new SailingAnalyticsProcessImpl(8888, host, ApplicationProcessHost.DEFAULT_SERVER_PATH); return process; @@ -183,7 +183,7 @@ public class ConnectivityTest host = landscape.launchHost( + final AwsInstance host = landscape.launchHost( getLatestSailingImage(), InstanceType.T3_SMALL, landscape.getAvailabilityZoneByName(region, "eu-west-2b"), keyName, Collections.singleton(()->"sg-0b2afd48960251280"), Optional.of(Tags.with("Name", "MyHost").and("Hello", "World")), @@ -213,15 +213,15 @@ public class ConnectivityTest castLandscape = (AwsLandscape) landscape; - final CreateDNSBasedLoadBalancerMapping.Builder> builder = CreateDNSBasedLoadBalancerMapping.builder(); + final AwsLandscape castLandscape = (AwsLandscape) landscape; + final CreateDNSBasedLoadBalancerMapping.Builder builder = CreateDNSBasedLoadBalancerMapping.builder(); builder .setProcess(process) .setHostname(hostname) .setTargetGroupNamePrefix(TARGET_GROUP_NAME_PREFIX) .setLandscape(castLandscape); optionalTimeout.ifPresent(builder::setTimeout); - final CreateDNSBasedLoadBalancerMapping> createDNSBasedLoadBalancerMappingProcedure = + final CreateDNSBasedLoadBalancerMapping createDNSBasedLoadBalancerMappingProcedure = builder.build(); final String wiesenWegId = landscape.getDNSHostedZoneId(hostedZoneName); try { @@ -241,7 +241,7 @@ public class ConnectivityTest getLatestSailingImage() { + private AmazonMachineImage getLatestSailingImage() { return landscape.getLatestImageWithTag(region, "image-type", StartFromSailingAnalyticsImage.IMAGE_TYPE_TAG_VALUE_SAILING); } @@ -348,7 +348,7 @@ public class ConnectivityTest host = landscape.launchHost(getLatestSailingImage(), + final AwsInstance host = landscape.launchHost(getLatestSailingImage(), InstanceType.T3_SMALL, landscape.getAvailabilityZoneByName(region, "eu-west-2b"), keyName, Collections.singleton(()->"sg-0b2afd48960251280"), /* tags */ Optional.empty()); try { assertNotNull(host); @@ -387,7 +387,7 @@ public class ConnectivityTest image = landscape.getImage(region, "ami-0c0907685eae2dbab"); + final AmazonMachineImage image = landscape.getImage(region, "ami-0c0907685eae2dbab"); assertEquals(TimePoint.of(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz").parse( /* November 9, 2020 at 9:37:16 PM UTC+1 */ "2020-11-09T21:37:16+0100")), image.getCreatedAt()); @@ -416,7 +416,7 @@ public class ConnectivityTest alb = landscape.createLoadBalancer(albName, region); + final ApplicationLoadBalancer alb = landscape.createLoadBalancer(albName, region); try { assertNotNull(alb); assertEquals(albName, alb.getName()); @@ -439,9 +439,9 @@ public class ConnectivityTest targetGroup = landscape.createTargetGroup(region, targetGroupName, 80, "/gwt/status", 80); + final TargetGroup targetGroup = landscape.createTargetGroup(region, targetGroupName, 80, "/gwt/status", 80); try { - final TargetGroup fetchedTargetGroup = landscape.getTargetGroup(region, targetGroupName, targetGroup.getTargetGroupArn()); + final TargetGroup fetchedTargetGroup = landscape.getTargetGroup(region, targetGroupName, targetGroup.getTargetGroupArn()); assertEquals(targetGroupName, fetchedTargetGroup.getName()); } finally { landscape.deleteTargetGroup(targetGroup); diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AmazonMachineImage.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AmazonMachineImage.java index 5d9889fe528..639015334a4 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AmazonMachineImage.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AmazonMachineImage.java @@ -1,12 +1,11 @@ package com.sap.sse.landscape.aws; import com.sap.sse.landscape.MachineImage; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import software.amazon.awssdk.services.ec2.model.BlockDeviceMapping; import software.amazon.awssdk.services.ec2.model.ImageState; -public interface AmazonMachineImage extends MachineImage { +public interface AmazonMachineImage extends MachineImage { Iterable getBlockDeviceMappings(); @Override diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationLoadBalancer.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationLoadBalancer.java index 5fec1f2e65c..e4685e6db08 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationLoadBalancer.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationLoadBalancer.java @@ -2,7 +2,6 @@ package com.sap.sse.landscape.aws; import com.sap.sse.common.Named; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import software.amazon.awssdk.services.elasticloadbalancingv2.model.Listener; import software.amazon.awssdk.services.elasticloadbalancingv2.model.Rule; @@ -29,7 +28,7 @@ import software.amazon.awssdk.services.elasticloadbalancingv2.model.Rule; * @author Axel Uhl (D043530) * */ -public interface ApplicationLoadBalancer extends Named { +public interface ApplicationLoadBalancer extends Named { /** * The DNS name of this load balancer; can be used, e.g., to set a CNAME DNS record pointing * to this load balancer. @@ -77,7 +76,7 @@ public interface ApplicationLoadBalancer addRulesAssigningUnusedPriorities(boolean forceContiguous, Rule... rules); - Iterable> getTargetGroups(); + Iterable> getTargetGroups(); /** * Deletes this application load balancer and all its {@link #getTargetGroups target groups}. diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationProcessHost.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationProcessHost.java index c7ba7f58153..3a49fb8f6c5 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationProcessHost.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ApplicationProcessHost.java @@ -11,7 +11,7 @@ import com.sap.sse.landscape.application.Scope; public interface ApplicationProcessHost> -extends AwsInstance { +extends AwsInstance { String DEFAULT_SERVERS_PATH = "/home/sailing/servers"; String DEFAULT_SERVER_DIRECTORY_NAME = "server"; @@ -36,5 +36,5 @@ extends AwsInstance { */ Iterable getApplicationProcesses(Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception; - AwsLandscape getLandscape(); + AwsLandscape getLandscape(); } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsInstance.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsInstance.java index 99b5c32715c..831066e5ca0 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsInstance.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsInstance.java @@ -2,7 +2,6 @@ package com.sap.sse.landscape.aws; import com.sap.sse.landscape.Host; import com.sap.sse.landscape.MachineImage; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.impl.AwsRegion; /** @@ -12,7 +11,7 @@ import com.sap.sse.landscape.aws.impl.AwsRegion; * @author Axel Uhl (D043530) * */ -public interface AwsInstance extends Host { +public interface AwsInstance extends Host { String getInstanceId(); void terminate(); diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsLandscape.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsLandscape.java index 766283839a2..3472fd42bc0 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsLandscape.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/AwsLandscape.java @@ -75,9 +75,7 @@ import software.amazon.awssdk.services.route53.model.RRType; * @param * @param */ -public interface AwsLandscape> -extends Landscape { +public interface AwsLandscape extends Landscape { String ACCESS_KEY_ID_SYSTEM_PROPERTY_NAME = "com.sap.sse.landscape.aws.accesskeyid"; String SECRET_ACCESS_KEY_SYSTEM_PROPERTY_NAME = "com.sap.sse.landscape.aws.secretaccesskey"; @@ -124,8 +122,8 @@ extends Landscape { */ static > - AwsLandscape obtain() { - final AwsLandscape result = new AwsLandscapeImpl<>(Activator.getInstance().getLandscapeState()); + AwsLandscape obtain() { + final AwsLandscape result = new AwsLandscapeImpl<>(Activator.getInstance().getLandscapeState()); return result; } @@ -136,16 +134,16 @@ extends Landscape { */ static > - AwsLandscape obtain(String accessKey, String secret) { - final AwsLandscape result = new AwsLandscapeImpl<>(Activator.getInstance().getLandscapeState(), accessKey, secret); + AwsLandscape obtain(String accessKey, String secret) { + final AwsLandscape result = new AwsLandscapeImpl<>(Activator.getInstance().getLandscapeState(), accessKey, secret); return result; } - default AwsInstance launchHost(MachineImage image, InstanceType instanceType, + default AwsInstance launchHost(MachineImage image, InstanceType instanceType, AwsAvailabilityZone availabilityZone, String keyName, Iterable securityGroups, Optional tags, String... userData) { - final HostSupplier> hostSupplier = - (instanceId, az, landscape)->new AwsInstanceImpl(instanceId, az, landscape); + final HostSupplier> hostSupplier = + (instanceId, az, landscape)->new AwsInstanceImpl(instanceId, az, landscape); return launchHost(hostSupplier, image, instanceType, availabilityZone, keyName, securityGroups, tags, userData); } @@ -160,8 +158,8 @@ extends Landscape { * concatenated, using the line separator to join them. The instance is able to read the user data throuh * the AWS SDK installed on the instance. */ - default > HostT launchHost( - HostSupplier hostSupplier, + default > HostT launchHost( + HostSupplier hostSupplier, MachineImage fromImage, InstanceType instanceType, AwsAvailabilityZone az, String keyName, Iterable securityGroups, Optional tags, String... userData) { return launchHosts(hostSupplier, /* numberOfHostsToLaunch */ 1, fromImage, instanceType, az, keyName, @@ -177,27 +175,27 @@ extends Landscape { * the SSH key pair name to use when launching; this will grant root access with the corresponding * private key; see also {@link #getKeyPairInfo(Region, String)} */ - > Iterable launchHosts( - HostSupplier hostSupplier, int numberOfHostsToLaunch, + > Iterable launchHosts( + HostSupplier hostSupplier, int numberOfHostsToLaunch, MachineImage fromImage, InstanceType instanceType, AwsAvailabilityZone az, String keyName, Iterable securityGroups, Optional tags, String... userData); - AmazonMachineImage getImage(Region region, String imageId); + AmazonMachineImage getImage(Region region, String imageId); - AmazonMachineImage createImage(AwsInstance instance, String imageName, Optional tags); + AmazonMachineImage createImage(AwsInstance instance, String imageName, Optional tags); void deleteImage(Region region, String imageId); - AmazonMachineImage getLatestImageWithTag(Region region, String tagName, String tagValue); + AmazonMachineImage getLatestImageWithTag(Region region, String tagName, String tagValue); - default AmazonMachineImage getLatestImageWithType(Region region, String imageType) { + default AmazonMachineImage getLatestImageWithType(Region region, String imageType) { return getLatestImageWithTag(region, IMAGE_TYPE_TAG_NAME, imageType); } - Iterable> getAllImagesWithTag(Region region, String tagName, String tagValue); + Iterable> getAllImagesWithTag(Region region, String tagName, String tagValue); - default Iterable> getAllImagesWithType(Region region, String imageType) { + default Iterable> getAllImagesWithType(Region region, String imageType) { return getAllImagesWithTag(region, IMAGE_TYPE_TAG_NAME, imageType); } @@ -216,7 +214,7 @@ extends Landscape { * * @see #getRunningHostsWithTagValue(Region, String) */ - Iterable> getHostsWithTagValue(Region region, String tagName, String tagValue); + Iterable> getHostsWithTagValue(Region region, String tagName, String tagValue); /** * Finds EC2 instances in the {@code region} that have a tag named {@code tagName}. The tag may have any value. The @@ -224,19 +222,19 @@ extends Landscape { * * @see #getRunningHostsWithTag(Region, String) */ - Iterable> getHostsWithTag(Region region, String tagName); + Iterable> getHostsWithTag(Region region, String tagName); /** * Finds EC2 instances in the {@code region} that have a tag named {@code tagName}. The tag may have any value. The * instances returned have been in state RUNNING at the time of the request. */ - Iterable> getRunningHostsWithTag(Region region, String tagName); + Iterable> getRunningHostsWithTag(Region region, String tagName); /** * Finds EC2 instances in the {@code region} that have a tag named {@code tagName} with value {@code tagValue}. The * instances returned have been in state RUNNING at the time of the request. */ - Iterable> getRunningHostsWithTagValue(Region region, String tagName, + Iterable> getRunningHostsWithTagValue(Region region, String tagName, String tagValue); KeyPairInfo getKeyPairInfo(Region region, String keyName); @@ -253,7 +251,7 @@ extends Landscape { */ SSHKeyPair importKeyPair(Region region, byte[] publicKey, byte[] encryptedPrivateKey, String keyName) throws JSchException; - void terminate(AwsInstance host); + void terminate(AwsInstance host); /** * The calling subject must have {@code READ} permission for the key requested. @@ -309,7 +307,7 @@ extends Landscape { * @param hostname * the fully-qualified host name */ - ChangeInfo setDNSRecordToApplicationLoadBalancer(String hostedZoneId, String hostname, ApplicationLoadBalancer alb); + ChangeInfo setDNSRecordToApplicationLoadBalancer(String hostedZoneId, String hostname, ApplicationLoadBalancer alb); String getDNSHostedZoneId(String hostedZoneName); @@ -340,22 +338,22 @@ extends Landscape { ChangeInfo getUpdatedChangeInfo(ChangeInfo changeInfo); - Iterable> getLoadBalancers(Region region); + Iterable> getLoadBalancers(Region region); - ApplicationLoadBalancer getLoadBalancer(String loadBalancerArn, Region region); + ApplicationLoadBalancer getLoadBalancer(String loadBalancerArn, Region region); - ApplicationLoadBalancer getLoadBalancerByName(String name, Region region); + ApplicationLoadBalancer getLoadBalancerByName(String name, Region region); /** * Creates an application load balancer with the name and in the region specified. The method returns once the request * has been responded to. The load balancer may still be in a pre-ready state. Use {@link #getApplicationLoadBalancerStatus(ApplicationLoadBalancer)} * to find out more. */ - ApplicationLoadBalancer createLoadBalancer(String name, Region region); + ApplicationLoadBalancer createLoadBalancer(String name, Region region); - Iterable getListeners(ApplicationLoadBalancer alb); + Iterable getListeners(ApplicationLoadBalancer alb); - LoadBalancerState getApplicationLoadBalancerStatus(ApplicationLoadBalancer alb); + LoadBalancerState getApplicationLoadBalancerStatus(ApplicationLoadBalancer alb); Iterable getAvailabilityZones(Region awsRegion); @@ -365,13 +363,13 @@ extends Landscape { * Deletes this load balancer and all its target groups (the target groups to which this load balancer currently * forwards any traffic). */ - void deleteLoadBalancer(ApplicationLoadBalancer alb); + void deleteLoadBalancer(ApplicationLoadBalancer alb); /** * All target groups that have the load balancer identified by the ARN as "their" load balancer which means that * this load balancer is forwarding traffic to all those target groups. */ - Iterable> getTargetGroupsByLoadBalancerArn(Region region, String loadBalancerArn); + Iterable> getTargetGroupsByLoadBalancerArn(Region region, String loadBalancerArn); /** * Looks up a target group by its name in a region. The main reason is to obtain the target group's ARN in order to @@ -380,17 +378,17 @@ extends Landscape { * @return {@code null} if no target group named according to the value of {@code targetGroupName} is found in the * {@code region} */ - TargetGroup getTargetGroup(Region region, String targetGroupName); + TargetGroup getTargetGroup(Region region, String targetGroupName); /** * Creates a target group with a default configuration that includes a health check URL. Stickiness is enabled with * the default duration of one day. The load balancing algorithm is set to {@code least_outstanding_requests}. * The protocol (HTTP or HTTPS) is inferred from the port: 443 means HTTPS; anything else means HTTP. */ - TargetGroup createTargetGroup(Region region, String targetGroupName, int port, + TargetGroup createTargetGroup(Region region, String targetGroupName, int port, String healthCheckPath, int healthCheckPort); - default TargetGroup getTargetGroup(Region region, String targetGroupName, String targetGroupArn) { + default TargetGroup getTargetGroup(Region region, String targetGroupName, String targetGroupArn) { return new AwsTargetGroupImpl<>(this, region, targetGroupName, targetGroupArn); } @@ -398,9 +396,9 @@ extends Landscape { software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetGroup getAwsTargetGroupByArn(Region region, String targetGroupArn); - Map, TargetHealth> getTargetHealthDescriptions(TargetGroup targetGroup); + Map, TargetHealth> getTargetHealthDescriptions(TargetGroup targetGroup); - void deleteTargetGroup(TargetGroup targetGroup); + void deleteTargetGroup(TargetGroup targetGroup); Iterable getLoadBalancerListenerRules(Listener loadBalancerListener, Region region); @@ -422,12 +420,12 @@ extends Landscape { SecurityGroup getSecurityGroup(String securityGroupId, Region region); void addTargetsToTargetGroup( - TargetGroup targetGroup, - Iterable> targets); + TargetGroup targetGroup, + Iterable> targets); void removeTargetsFromTargetGroup( - TargetGroup targetGroup, - Iterable> targets); + TargetGroup targetGroup, + Iterable> targets); LoadBalancer getAwsLoadBalancer(String loadBalancerArn, Region region); @@ -438,6 +436,7 @@ extends Landscape { * dedicated load balancer rule, such as "cold storage" hostnames that have been archived. May return {@code null} * in case in the given {@code region} no such reverse proxy has been configured / set up yet. */ + > ReverseProxyCluster getCentralReverseProxy(Region region); /** @@ -454,7 +453,7 @@ extends Landscape { * @param wildcardDomain e.g., "sapsailing.com" without leading and without trailing dot * */ - ApplicationLoadBalancer getNonDNSMappedLoadBalancer(Region region, String wildcardDomain); + ApplicationLoadBalancer getNonDNSMappedLoadBalancer(Region region, String wildcardDomain); /** * Creates an application load balancer (ALB) intended to serve requests for dynamically-mapped sub-domains where @@ -462,13 +461,13 @@ extends Landscape { * {@link #getNonDNSMappedLoadBalancer(Region, String)}, when called with an equal {@code wildcardDomain} and * {@code region}, will deliver the load balancer created by this call. */ - ApplicationLoadBalancer createNonDNSMappedLoadBalancer(Region region, String wildcardDomain); + ApplicationLoadBalancer createNonDNSMappedLoadBalancer(Region region, String wildcardDomain); /** * Looks up the hostname in the DNS and assumes to get a load balancer CNAME record for it that exists in the {@code region} * specified. The load balancer is then looked up by its {@link ApplicationLoadBalancer#getDNSName() host name}. */ - ApplicationLoadBalancer getDNSMappedLoadBalancerFor(Region region, String hostname); + ApplicationLoadBalancer getDNSMappedLoadBalancerFor(Region region, String hostname); /** * The default MongoDB configuration to connect to. See also {@link #MONGO_DEFAULT_REPLICA_SET_NAME} and @@ -524,7 +523,7 @@ extends Landscape { * Looks for a tag with key as specified by {@code tagName} on the {@code host} specified. If found, the tag's value * is returned. Otherwise, the {@link Optional} returned {@link Optional#isPresent() is not present}. */ - Optional getTag(AwsInstance host, String tagName); + Optional getTag(AwsInstance host, String tagName); /** * Obtains all hosts with a tag named {@code tagName}, regardless the tag's value, and returns them as @@ -535,6 +534,7 @@ extends Landscape { * takes the host and the server directory as arguments and is expected to produce an * {@link ApplicationProcess} object of some sort. */ + > Iterable> getApplicationProcessHostsByTag(Region region, String tagName, BiFunction processFactoryFromHostAndServerDirectory); @@ -551,6 +551,7 @@ extends Landscape { * an optional timeout for communicating with the application server(s) to try to read the application * configuration; used, e.g., as timeout during establishing SSH connections */ + > Iterable> getApplicationReplicaSetsByTag(Region region, String tagName, BiFunction processFactoryFromHostAndServerDirectory, Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception; diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/HostSupplier.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/HostSupplier.java index b6bec40c525..35ffaa58495 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/HostSupplier.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/HostSupplier.java @@ -1,11 +1,6 @@ package com.sap.sse.landscape.aws; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; - @FunctionalInterface -public interface HostSupplier, -HostT extends AwsInstance> { - HostT supply(String instanceId, AwsAvailabilityZone az, AwsLandscape landscape); +public interface HostSupplier> { + HostT supply(String instanceId, AwsAvailabilityZone az, AwsLandscape landscape); } \ No newline at end of file diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ReverseProxyCluster.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ReverseProxyCluster.java index ba9a590d4f5..8e2cbb90be8 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ReverseProxyCluster.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/ReverseProxyCluster.java @@ -22,21 +22,21 @@ extends ReverseProxy { * * @return at least one host */ - Iterable> getHosts(); + Iterable> getHosts(); /** * Add one host of the instance type specified to the availability zone {@code az}. * * @return the host that was added by this request; it will also be part of the response of {@link #getHosts()} now */ - AwsInstance createHost(InstanceType instanceType, AwsAvailabilityZone az, String keyName); + AwsInstance createHost(InstanceType instanceType, AwsAvailabilityZone az, String keyName); - void addHost(AwsInstance host); + void addHost(AwsInstance host); /** * Removes a single host from this reverse proxy, terminating the host. When trying to remove the last remaining * host, an {@link IllegalStateException} will be thrown and the method will not complete the request. Consider * using {@link #terminate()} to terminate all hosts forming this reverse proxy. */ - void removeHost(AwsInstance host); + void removeHost(AwsInstance host); } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/TargetGroup.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/TargetGroup.java index c16d8a961eb..a5324247ca7 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/TargetGroup.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/TargetGroup.java @@ -5,7 +5,6 @@ import java.util.Map; import com.sap.sse.common.Named; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetHealth; @@ -15,24 +14,24 @@ import software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetHealth * @author Axel Uhl (D043530) * */ -public interface TargetGroup extends Named { +public interface TargetGroup extends Named { Region getRegion(); - Map, TargetHealth> getRegisteredTargets(); + Map, TargetHealth> getRegisteredTargets(); - default void addTarget(AwsInstance target) { + default void addTarget(AwsInstance target) { addTargets(Collections.singleton(target)); } - void addTargets(Iterable> targets); + void addTargets(Iterable> targets); - default void removeTarget(AwsInstance target) { + default void removeTarget(AwsInstance target) { removeTargets(Collections.singleton(target)); } - void removeTargets(Iterable> targets); + void removeTargets(Iterable> targets); String getTargetGroupArn(); - ApplicationLoadBalancer getLoadBalancer(); + ApplicationLoadBalancer getLoadBalancer(); } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AbstractApacheReverseProxy.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AbstractApacheReverseProxy.java index cd1e84dac0d..5bf16f51f58 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AbstractApacheReverseProxy.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AbstractApacheReverseProxy.java @@ -10,13 +10,13 @@ public abstract class AbstractApacheReverseProxy> implements ReverseProxy { protected static final String INTERNAL_SERVER_STATUS = "internal-server-status"; - private final AwsLandscape landscape; + private final AwsLandscape landscape; - public AbstractApacheReverseProxy(AwsLandscape landscape) { + public AbstractApacheReverseProxy(AwsLandscape landscape) { this.landscape = landscape; } - protected AwsLandscape getLandscape() { + protected AwsLandscape getLandscape() { return landscape; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AmazonMachineImageImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AmazonMachineImageImpl.java index 4f4abad6c11..09ee923e9d8 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AmazonMachineImageImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AmazonMachineImageImpl.java @@ -7,7 +7,6 @@ import java.util.TimeZone; import com.sap.sse.common.TimePoint; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AmazonMachineImage; import com.sap.sse.landscape.aws.AwsLandscape; @@ -15,13 +14,13 @@ import software.amazon.awssdk.services.ec2.model.BlockDeviceMapping; import software.amazon.awssdk.services.ec2.model.Image; import software.amazon.awssdk.services.ec2.model.ImageState; -public class AmazonMachineImageImpl implements AmazonMachineImage { +public class AmazonMachineImageImpl implements AmazonMachineImage { private static final long serialVersionUID = 1615200981492476022L; private final Image image; private final Region region; - private final AwsLandscape landscape; + private final AwsLandscape landscape; - public AmazonMachineImageImpl(Image image, Region region, AwsLandscape landscape) { + public AmazonMachineImageImpl(Image image, Region region, AwsLandscape landscape) { this.image = image; this.region = region; this.landscape = landscape; @@ -56,7 +55,7 @@ public class AmazonMachineImageImpl updateAllPackages() { + public AmazonMachineImage updateAllPackages() { // launch with "image-upgrade" as the only user data, then produce the new image // TODO Implement MachineImage.updateAllPackages(...) return null; diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxy.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxy.java index 63440e01ec5..c6fff6de554 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxy.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxy.java @@ -63,9 +63,9 @@ implements com.sap.sse.landscape.Process { private static final String STATUS = "Status"; private static final String CONFIG_FILE_FOR_INTERNALS = "001-internals"+CONFIG_FILE_EXTENSION; - private final AwsInstance host; + private final AwsInstance host; - public ApacheReverseProxy(AwsLandscape landscape, AwsInstance host) { + public ApacheReverseProxy(AwsLandscape landscape, AwsInstance host) { super(landscape); this.host = host; } @@ -178,7 +178,7 @@ implements com.sap.sse.landscape.Process { * {@link AwsInstance}. */ @Override - public AwsInstance getHost() { + public AwsInstance getHost() { return host; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxyCluster.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxyCluster.java index 6d2f8da9fd5..9ecf6e2dbc8 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxyCluster.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApacheReverseProxyCluster.java @@ -28,15 +28,15 @@ public class ApacheReverseProxyCluster, LogT extends Log> extends AbstractApacheReverseProxy implements ReverseProxyCluster { - private Set> hosts; + private Set> hosts; - public ApacheReverseProxyCluster(AwsLandscape landscape) { + public ApacheReverseProxyCluster(AwsLandscape landscape) { super(landscape); this.hosts = new HashSet<>(); } @Override - public Iterable> getHosts() { + public Iterable> getHosts() { return Collections.unmodifiableCollection(hosts); } @@ -45,14 +45,14 @@ implements ReverseProxyCluster host) { + public void addHost(AwsInstance host) { hosts.add(host); } @Override - public AwsInstance createHost(InstanceType instanceType, AwsAvailabilityZone az, String keyName) { - final AwsInstance host = getLandscape().launchHost( - (instanceId, availabilityZone, landscape) -> new AwsInstanceImpl(instanceId, + public AwsInstance createHost(InstanceType instanceType, AwsAvailabilityZone az, String keyName) { + final AwsInstance host = getLandscape().launchHost( + (instanceId, availabilityZone, landscape) -> new AwsInstanceImpl(instanceId, availabilityZone, landscape), getAmiId(), instanceType, az, keyName, Collections.singleton(getSecurityGroup(az.getRegion())), Optional.of(Tags.with("Name", "ReverseProxy"))); @@ -61,7 +61,7 @@ implements ReverseProxyCluster host) { + public void removeHost(AwsInstance host) { assert Util.contains(getHosts(), host); if (Util.size(getHosts()) == 1) { throw new IllegalStateException("Trying to remove the last hosts of reverse proxy "+this+". Use terminate() instead"); @@ -80,9 +80,9 @@ implements ReverseProxyCluster> hosts = new HashSet<>(); + Set> hosts = new HashSet<>(); Util.addAll(getHosts(), hosts); - for (final AwsInstance host : hosts) { + for (final AwsInstance host : hosts) { getLandscape().terminate(host); } } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationLoadBalancerImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationLoadBalancerImpl.java index a3c1ec945aa..475a22701d6 100644 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationLoadBalancerImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationLoadBalancerImpl.java @@ -9,7 +9,6 @@ import java.util.List; import com.sap.sse.common.Duration; import com.sap.sse.common.Util; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.ApplicationLoadBalancer; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.aws.TargetGroup; @@ -20,8 +19,8 @@ import software.amazon.awssdk.services.elasticloadbalancingv2.model.ProtocolEnum import software.amazon.awssdk.services.elasticloadbalancingv2.model.Rule; import software.amazon.awssdk.services.elasticloadbalancingv2.model.RulePriorityPair; -public class ApplicationLoadBalancerImpl -implements ApplicationLoadBalancer { +public class ApplicationLoadBalancerImpl +implements ApplicationLoadBalancer { private static final long serialVersionUID = -5297220031399131769L; /** @@ -33,9 +32,9 @@ implements ApplicationLoadBalancer { private final Region region; - private final AwsLandscape landscape; + private final AwsLandscape landscape; - public ApplicationLoadBalancerImpl(Region region, LoadBalancer loadBalancer, AwsLandscape landscape) { + public ApplicationLoadBalancerImpl(Region region, LoadBalancer loadBalancer, AwsLandscape landscape) { this.region = region; this.loadBalancer = loadBalancer; this.landscape = landscape; @@ -149,7 +148,7 @@ implements ApplicationLoadBalancer { } @Override - public Iterable> getTargetGroups() { + public Iterable> getTargetGroups() { return landscape.getTargetGroupsByLoadBalancerArn(getRegion(), getArn()); } @@ -164,14 +163,14 @@ implements ApplicationLoadBalancer { @Override public void delete() throws InterruptedException { // first obtain the target groups to which, based on the current ALB configuration, traffic is forwarded - final Iterable> targetGroups = getTargetGroups(); + final Iterable> targetGroups = getTargetGroups(); // now delete the rules to free up all target groups to which the ALB could have forwarded, except the default rule deleteAllRules(); deleteAllListeners(); landscape.deleteLoadBalancer(this); Thread.sleep(Duration.ONE_SECOND.times(5).asMillis()); // wait a bit until the target groups are no longer considered "in use" // now that all target groups the ALB used are freed up, delete them: - for (final TargetGroup targetGroup : targetGroups) { + for (final TargetGroup targetGroup : targetGroups) { landscape.deleteTargetGroup(landscape.getTargetGroup(getRegion(), targetGroup.getName(), targetGroup.getTargetGroupArn())); } } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationProcessHostImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationProcessHostImpl.java index b4c6ec0ff3c..7e77f8fbcbb 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationProcessHostImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/ApplicationProcessHostImpl.java @@ -22,23 +22,20 @@ import com.sap.sse.landscape.aws.ReverseProxy; public class ApplicationProcessHostImpl> -extends AwsInstanceImpl +extends AwsInstanceImpl implements ApplicationProcessHost { private static final Logger logger = Logger.getLogger(ApplicationProcessHostImpl.class.getName()); private final BiFunction processFactoryFromHostAndServerDirectory; public ApplicationProcessHostImpl(String instanceId, AwsAvailabilityZone availabilityZone, - AwsLandscape landscape, BiFunction processFactoryFromHostAndServerDirectory) { + AwsLandscape landscape, BiFunction processFactoryFromHostAndServerDirectory) { super(instanceId, availabilityZone, landscape); this.processFactoryFromHostAndServerDirectory = processFactoryFromHostAndServerDirectory; } @Override - public AwsLandscape getLandscape() { - @SuppressWarnings("unchecked") - final AwsLandscape castLandscape = - (AwsLandscape) super.getLandscape(); - return castLandscape; + public AwsLandscape getLandscape() { + return super.getLandscape(); } @Override diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsInstanceImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsInstanceImpl.java index 4ae9f479b2e..52883b85c9e 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsInstanceImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsInstanceImpl.java @@ -22,7 +22,6 @@ import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.landscape.SecurityGroup; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AwsAvailabilityZone; import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; @@ -36,14 +35,14 @@ import com.sap.sse.util.Wait; import software.amazon.awssdk.services.ec2.model.Instance; import software.amazon.awssdk.services.ec2.model.InstanceStateName; -public class AwsInstanceImpl implements AwsInstance { +public class AwsInstanceImpl implements AwsInstance { private final static Logger logger = Logger.getLogger(AwsInstanceImpl.class.getName()); private static final String ROOT_USER_NAME = "root"; private final String instanceId; private final AwsAvailabilityZone availabilityZone; - private final AwsLandscape landscape; + private final AwsLandscape landscape; - public AwsInstanceImpl(String instanceId, AwsAvailabilityZone availabilityZone, AwsLandscape landscape) { + public AwsInstanceImpl(String instanceId, AwsAvailabilityZone availabilityZone, AwsLandscape landscape) { this.instanceId = instanceId; this.availabilityZone = availabilityZone; this.landscape = landscape; @@ -51,9 +50,7 @@ public class AwsInstanceImpl otherCast = (AwsInstance) other; - return otherCast.getInstanceId().equals(getInstanceId()); + return ((AwsInstance) other).getInstanceId().equals(getInstanceId()); } @Override @@ -258,7 +255,7 @@ public class AwsInstanceImpl getLandscape() { + protected AwsLandscape getLandscape() { return landscape; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsLandscapeImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsLandscapeImpl.java index 7bf47da1666..b8750c9ae2b 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsLandscapeImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsLandscapeImpl.java @@ -136,9 +136,7 @@ import software.amazon.awssdk.services.route53.model.RRType; import software.amazon.awssdk.services.route53.model.ResourceRecord; import software.amazon.awssdk.services.route53.model.ResourceRecordSet; -public class AwsLandscapeImpl> -implements AwsLandscape { +public class AwsLandscapeImpl implements AwsLandscape { private static final String DEFAULT_TARGET_GROUP_PREFIX = "D"; private static final Logger logger = Logger.getLogger(AwsLandscapeImpl.class.getName()); private static final long DEFAULT_DNS_TTL_MILLIS = 60000l; @@ -241,7 +239,7 @@ implements AwsLandscape { } @Override - public ApplicationLoadBalancer createLoadBalancer(String name, com.sap.sse.landscape.Region region) { + public ApplicationLoadBalancer createLoadBalancer(String name, com.sap.sse.landscape.Region region) { Region awsRegion = getRegion(region); final ElasticLoadBalancingV2Client client = getLoadBalancingClient(awsRegion); final Iterable availabilityZones = getAvailabilityZones(region); @@ -255,16 +253,17 @@ implements AwsLandscape { LoadBalancerAttribute.builder().key("access_logs.s3.enabled").value("true").build(), LoadBalancerAttribute.builder().key("access_logs.s3.bucket").value(getS3BucketForAlbLogs(region)).build(), LoadBalancerAttribute.builder().key("idle_timeout.timeout_seconds").value("4000").build()).build()); - final ApplicationLoadBalancer result = new ApplicationLoadBalancerImpl<>(region, response.loadBalancers().iterator().next(), this); + final ApplicationLoadBalancer result = new ApplicationLoadBalancerImpl<>(region, response.loadBalancers().iterator().next(), this); createLoadBalancerListener(result, ProtocolEnum.HTTP); createLoadBalancerListener(result, ProtocolEnum.HTTPS); return result; } - private Listener createLoadBalancerListener(ApplicationLoadBalancer alb, ProtocolEnum protocol) { + private > + Listener createLoadBalancerListener(ApplicationLoadBalancer alb, ProtocolEnum protocol) { final int port = protocol==ProtocolEnum.HTTP?80:443; final ReverseProxyCluster reverseProxy = getCentralReverseProxy(alb.getRegion()); - final TargetGroup defaultTargetGroup = createTargetGroup(alb.getRegion(), DEFAULT_TARGET_GROUP_PREFIX+alb.getName()+"-"+protocol.name(), + final TargetGroup defaultTargetGroup = createTargetGroup(alb.getRegion(), DEFAULT_TARGET_GROUP_PREFIX+alb.getName()+"-"+protocol.name(), port, reverseProxy.getHealthCheckPath(), /* healthCheckPort */ port); defaultTargetGroup.addTargets(reverseProxy.getHosts()); return getLoadBalancingClient( @@ -287,24 +286,24 @@ implements AwsLandscape { } @Override - public void deleteLoadBalancer(ApplicationLoadBalancer alb) { + public void deleteLoadBalancer(ApplicationLoadBalancer alb) { getLoadBalancingClient(getRegion(alb.getRegion())).deleteLoadBalancer(DeleteLoadBalancerRequest.builder().loadBalancerArn(alb.getArn()).build()); } @Override - public Iterable> getTargetGroupsByLoadBalancerArn(com.sap.sse.landscape.Region region, String loadBalancerArn) { + public Iterable> getTargetGroupsByLoadBalancerArn(com.sap.sse.landscape.Region region, String loadBalancerArn) { return Util.map(getLoadBalancingClient(getRegion(region)).describeTargetGroups(tg->tg.loadBalancerArn(loadBalancerArn)).targetGroups(), tg->new AwsTargetGroupImpl<>(this, region, tg.targetGroupName(), tg.targetGroupArn())); } @Override - public Iterable getListeners(ApplicationLoadBalancer alb) { + public Iterable getListeners(ApplicationLoadBalancer alb) { final ElasticLoadBalancingV2Client client = getLoadBalancingClient(getRegion(alb.getRegion())); return client.describeListeners(b->b.loadBalancerArn(alb.getArn())).listeners(); } @Override - public LoadBalancerState getApplicationLoadBalancerStatus(ApplicationLoadBalancer alb) { + public LoadBalancerState getApplicationLoadBalancerStatus(ApplicationLoadBalancer alb) { final ElasticLoadBalancingV2Client client = getLoadBalancingClient(getRegion(alb.getRegion())); final DescribeLoadBalancersResponse response = client.describeLoadBalancers(b->b.loadBalancerArns(alb.getArn())); return response.loadBalancers().iterator().next().state(); @@ -364,7 +363,7 @@ implements AwsLandscape { } @Override - public Iterable> getLoadBalancers(com.sap.sse.landscape.Region region) { + public Iterable> getLoadBalancers(com.sap.sse.landscape.Region region) { final List loadBalancers = getLoadBalancingClient(getRegion(region)) .describeLoadBalancers(DescribeLoadBalancersRequest.builder().build()) .loadBalancers(); @@ -373,7 +372,7 @@ implements AwsLandscape { } @Override - public ApplicationLoadBalancer getLoadBalancerByName(String name, com.sap.sse.landscape.Region region) { + public ApplicationLoadBalancer getLoadBalancerByName(String name, com.sap.sse.landscape.Region region) { try { final DescribeLoadBalancersResponse response = getLoadBalancingClient(getRegion(region)).describeLoadBalancers(b->b.names(name)); return response.hasLoadBalancers() ? new ApplicationLoadBalancerImpl<>(region, response.loadBalancers().iterator().next(), this) : null; @@ -383,7 +382,7 @@ implements AwsLandscape { } @Override - public ApplicationLoadBalancer getLoadBalancer(String loadBalancerArn, com.sap.sse.landscape.Region region) { + public ApplicationLoadBalancer getLoadBalancer(String loadBalancerArn, com.sap.sse.landscape.Region region) { final LoadBalancer loadBalancer = getLoadBalancingClient(getRegion(region)) .describeLoadBalancers(DescribeLoadBalancersRequest.builder().loadBalancerArns(loadBalancerArn).build()) .loadBalancers().iterator().next(); @@ -409,7 +408,7 @@ implements AwsLandscape { @Override public ChangeInfo setDNSRecordToApplicationLoadBalancer(String hostedZoneId, String hostname, - ApplicationLoadBalancer alb) { + ApplicationLoadBalancer alb) { final String dnsName = alb.getDNSName(); return setDNSRecord(hostedZoneId, hostname, RRType.CNAME, dnsName); } @@ -456,14 +455,14 @@ implements AwsLandscape { } @Override - public AmazonMachineImage getImage(com.sap.sse.landscape.Region region, String imageId) { + public AmazonMachineImage getImage(com.sap.sse.landscape.Region region, String imageId) { final DescribeImagesResponse response = getEc2Client(getRegion(region)) .describeImages(DescribeImagesRequest.builder().imageIds(imageId).build()); return new AmazonMachineImageImpl<>(response.images().iterator().next(), region, this); } @Override - public AmazonMachineImage createImage(AwsInstance instance, String imageName, Optional tags) { + public AmazonMachineImage createImage(AwsInstance instance, String imageName, Optional tags) { logger.info("Creating Amazon Machine Image (AMI) named "+imageName+" for instance "+instance.getInstanceId()); final Ec2Client client = getEc2Client(getRegion(instance.getRegion())); final String imageId = client.createImage(b->b @@ -482,14 +481,14 @@ implements AwsLandscape { } @Override - public AmazonMachineImage getLatestImageWithTag(com.sap.sse.landscape.Region region, String tagName, String tagValue) { + public AmazonMachineImage getLatestImageWithTag(com.sap.sse.landscape.Region region, String tagName, String tagValue) { final DescribeImagesResponse response = getEc2Client(getRegion(region)) .describeImages(DescribeImagesRequest.builder().filters(Filter.builder().name("tag:"+tagName).values(tagValue).build()).build()); return new AmazonMachineImageImpl<>(response.images().stream().max(getMachineImageCreationDateComparator()).get(), region, this); } @Override - public Iterable> getAllImagesWithTag(com.sap.sse.landscape.Region region, + public Iterable> getAllImagesWithTag(com.sap.sse.landscape.Region region, String tagName, String tagValue) { final DescribeImagesResponse response = getEc2Client(getRegion(region)) .describeImages(DescribeImagesRequest.builder().filters(Filter.builder().name("tag:"+tagName).values(tagValue).build()).build()); @@ -519,7 +518,7 @@ implements AwsLandscape { } @Override - public Iterable> getHostsWithTagValue(com.sap.sse.landscape.Region region, + public Iterable> getHostsWithTagValue(com.sap.sse.landscape.Region region, String tagName, String tagValue) { Filter filter = getHostWithTagValueFilter(tagName, tagValue).build(); return getHostsWithFilters(region, filter); @@ -530,7 +529,7 @@ implements AwsLandscape { } @Override - public Iterable> getRunningHostsWithTagValue(com.sap.sse.landscape.Region region, + public Iterable> getRunningHostsWithTagValue(com.sap.sse.landscape.Region region, String tagName, String tagValue) { return getHostsWithFilters(region, getRunningHostFilter()); } @@ -539,8 +538,8 @@ implements AwsLandscape { return Filter.builder().name("instance-state-name").values("running").build(); } - private Iterable> getHostsWithFilters(com.sap.sse.landscape.Region region, Filter... filters) { - final List> result = new ArrayList<>(); + private Iterable> getHostsWithFilters(com.sap.sse.landscape.Region region, Filter... filters) { + final List> result = new ArrayList<>(); final DescribeInstancesResponse instanceResponse = getEc2Client(getRegion(region)).describeInstances(b->b.filters(filters)); for (final Reservation r : instanceResponse.reservations()) { for (final Instance i : r.instances()) { @@ -550,21 +549,21 @@ implements AwsLandscape { return result; } - private AwsInstance getHost(com.sap.sse.landscape.Region region, final Instance instance) { - return new AwsInstanceImpl(instance.instanceId(), getAvailabilityZoneByName(region, instance.placement().availabilityZone()), this); + private AwsInstance getHost(com.sap.sse.landscape.Region region, final Instance instance) { + return new AwsInstanceImpl(instance.instanceId(), getAvailabilityZoneByName(region, instance.placement().availabilityZone()), this); } - private AwsInstance getHost(com.sap.sse.landscape.Region region, final String instanceId) { + private AwsInstance getHost(com.sap.sse.landscape.Region region, final String instanceId) { return getHost(region, getInstance(instanceId, region)); } @Override - public Iterable> getRunningHostsWithTag(com.sap.sse.landscape.Region region, String tagName) { + public Iterable> getRunningHostsWithTag(com.sap.sse.landscape.Region region, String tagName) { return getHostsWithFilters(region, getFilterForHostWithTag(Filter.builder(), tagName), getRunningHostFilter()); } @Override - public Iterable> getHostsWithTag(com.sap.sse.landscape.Region region, String tagName) { + public Iterable> getHostsWithTag(com.sap.sse.landscape.Region region, String tagName) { return getHostsWithFilters(region, getFilterForHostWithTag(Filter.builder(), tagName)); } @@ -652,13 +651,14 @@ implements AwsLandscape { } @Override - public Map, ApplicationReplicaSet> getScopes() { + public > + Map, ApplicationReplicaSet> getScopes() { // TODO Implement Landscape.getScopes(...) return null; } @Override - public > Iterable launchHosts(HostSupplier hostSupplier, + public > Iterable launchHosts(HostSupplier hostSupplier, int numberOfHostsToLaunch, MachineImage fromImage, InstanceType instanceType, AwsAvailabilityZone az, String keyName, Iterable securityGroups, Optional tags, String... userData) { if (!fromImage.getRegion().equals(az.getRegion())) { @@ -695,7 +695,7 @@ implements AwsLandscape { } @Override - public void terminate(AwsInstance host) { + public void terminate(AwsInstance host) { logger.info("Terminating instance "+host); getEc2Client(getRegion(host.getAvailabilityZone().getRegion())).terminateInstances( TerminateInstancesRequest.builder().instanceIds(host.getInstanceId()).build()); @@ -712,7 +712,7 @@ implements AwsLandscape { } @Override - public TargetGroup getTargetGroup(com.sap.sse.landscape.Region region, String targetGroupName) { + public TargetGroup getTargetGroup(com.sap.sse.landscape.Region region, String targetGroupName) { final ElasticLoadBalancingV2Client loadBalancingClient = getLoadBalancingClient(getRegion(region)); final DescribeTargetGroupsResponse targetGroupResponse = loadBalancingClient.describeTargetGroups(b->b.names(targetGroupName)); return targetGroupResponse.hasTargetGroups() @@ -722,7 +722,7 @@ implements AwsLandscape { } @Override - public TargetGroup createTargetGroup(com.sap.sse.landscape.Region region, String targetGroupName, int port, String healthCheckPath, int healthCheckPort) { + public TargetGroup createTargetGroup(com.sap.sse.landscape.Region region, String targetGroupName, int port, String healthCheckPath, int healthCheckPort) { final ElasticLoadBalancingV2Client loadBalancingClient = getLoadBalancingClient(getRegion(region)); final software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetGroup targetGroup = loadBalancingClient.createTargetGroup(CreateTargetGroupRequest.builder() @@ -772,14 +772,14 @@ implements AwsLandscape { } @Override - public void deleteTargetGroup(TargetGroup targetGroup) { + public void deleteTargetGroup(TargetGroup targetGroup) { getLoadBalancingClient(getRegion(targetGroup.getRegion())).deleteTargetGroup(DeleteTargetGroupRequest.builder().targetGroupArn( targetGroup.getTargetGroupArn()).build()); } @Override - public Map, TargetHealth> getTargetHealthDescriptions(TargetGroup targetGroup) { - final Map, TargetHealth> result = new HashMap<>(); + public Map, TargetHealth> getTargetHealthDescriptions(TargetGroup targetGroup) { + final Map, TargetHealth> result = new HashMap<>(); final Region region = getRegion(targetGroup.getRegion()); getLoadBalancingClient(region) .describeTargetHealth(DescribeTargetHealthRequest.builder().targetGroupArn(targetGroup.getTargetGroupArn()).build()) @@ -790,9 +790,10 @@ implements AwsLandscape { } @Override - public ReverseProxyCluster getCentralReverseProxy(com.sap.sse.landscape.Region region) { + public > + ReverseProxyCluster getCentralReverseProxy(com.sap.sse.landscape.Region region) { ApacheReverseProxyCluster reverseProxyCluster = new ApacheReverseProxyCluster<>(this); - for (final AwsInstance reverseProxyHost : getRunningHostsWithTag(region, CENTRAL_REVERSE_PROXY_TAG_NAME)) { + for (final AwsInstance reverseProxyHost : getRunningHostsWithTag(region, CENTRAL_REVERSE_PROXY_TAG_NAME)) { reverseProxyCluster.addHost(reverseProxyHost); } return reverseProxyCluster; @@ -805,24 +806,24 @@ implements AwsLandscape { @Override public void addTargetsToTargetGroup( - TargetGroup targetGroup, - Iterable> targets) { + TargetGroup targetGroup, + Iterable> targets) { getLoadBalancingClient(getRegion(targetGroup.getRegion())).registerTargets(getRegisterTargetsRequestBuilderConsumer(targetGroup, targets)); } - private TargetDescription[] getTargetDescriptions(Iterable> targets) { + private TargetDescription[] getTargetDescriptions(Iterable> targets) { return Util.toArray(Util.map(targets, t->TargetDescription.builder().id(t.getInstanceId()).build()), new TargetDescription[0]); } @Override public void removeTargetsFromTargetGroup( - TargetGroup targetGroup, - Iterable> targets) { + TargetGroup targetGroup, + Iterable> targets) { getLoadBalancingClient(getRegion(targetGroup.getRegion())).deregisterTargets(getDeregisterTargetRequestBuilderConsumers(targetGroup, targets)); } private Consumer getRegisterTargetsRequestBuilderConsumer( - TargetGroup targetGroup, Iterable> targets) { + TargetGroup targetGroup, Iterable> targets) { final TargetDescription[] targetDescriptions = getTargetDescriptions(targets); return b->b .targetGroupArn(targetGroup.getTargetGroupArn()) @@ -830,7 +831,7 @@ implements AwsLandscape { } private Consumer getDeregisterTargetRequestBuilderConsumers( - TargetGroup targetGroup, Iterable> targets) { + TargetGroup targetGroup, Iterable> targets) { final TargetDescription[] targetDescriptions = getTargetDescriptions(targets); return b->b .targetGroupArn(targetGroup.getTargetGroupArn()) @@ -877,13 +878,13 @@ implements AwsLandscape { } @Override - public ApplicationLoadBalancer getNonDNSMappedLoadBalancer( + public ApplicationLoadBalancer getNonDNSMappedLoadBalancer( com.sap.sse.landscape.Region region, String wildcardDomain) { return getLoadBalancerByName(getNonDNSMappedLoadBalancerName(wildcardDomain), region); } @Override - public ApplicationLoadBalancer createNonDNSMappedLoadBalancer( + public ApplicationLoadBalancer createNonDNSMappedLoadBalancer( com.sap.sse.landscape.Region region, String wildcardDomain) { return createLoadBalancer(getNonDNSMappedLoadBalancerName(wildcardDomain), region); } @@ -893,11 +894,11 @@ implements AwsLandscape { } @Override - public ApplicationLoadBalancer getDNSMappedLoadBalancerFor( + public ApplicationLoadBalancer getDNSMappedLoadBalancerFor( com.sap.sse.landscape.Region region, String hostname) { final DescribeLoadBalancersResponse response = getLoadBalancingClient(getRegion(region)).describeLoadBalancers(); for (final LoadBalancer lb : response.loadBalancers()) { - final ApplicationLoadBalancer alb = new ApplicationLoadBalancerImpl<>(region, lb, this); + final ApplicationLoadBalancer alb = new ApplicationLoadBalancerImpl<>(region, lb, this); for (final Rule rule : alb.getRules()) { if (rule.conditions().stream().filter(r->r.hostHeaderConfig().values().contains(hostname)).findAny().isPresent()) { return alb; @@ -923,7 +924,7 @@ implements AwsLandscape { } @Override - public Optional getTag(AwsInstance host, String tagName) { + public Optional getTag(AwsInstance host, String tagName) { final DescribeTagsResponse tagResponse = getEc2Client(getRegion(host.getRegion())).describeTags(b->b.filters( Filter.builder() .name("resource-id").values(host.getInstanceId()).build(), @@ -941,7 +942,7 @@ implements AwsLandscape { @Override public MongoReplicaSet getDatabaseConfigurationForReplicaSet(com.sap.sse.landscape.Region region, String mongoReplicaSetName) { final MongoReplicaSet result = new MongoReplicaSetImpl(mongoReplicaSetName); - for (final AwsInstance host : getMongoDBHosts(region)) { + for (final AwsInstance host : getMongoDBHosts(region)) { for (final Pair replicaSetNameAndPort : getMongoEndpointSpecificationsAsReplicaSetNameAndPort(host)) { if (replicaSetNameAndPort.getA().equals(mongoReplicaSetName)) { result.addReplica(new MongoProcessInReplicaSetImpl(result, replicaSetNameAndPort.getB(), host)); @@ -951,7 +952,7 @@ implements AwsLandscape { return result; } - private Iterable> getMongoDBHosts(com.sap.sse.landscape.Region region) { + private Iterable> getMongoDBHosts(com.sap.sse.landscape.Region region) { return getRunningHostsWithTag(region, MONGO_REPLICA_SETS_TAG_NAME); } @@ -960,7 +961,7 @@ implements AwsLandscape { * assumed to be a host that has the {@link #MONGO_REPLICA_SETS_TAG_NAME} tag set * @return the replica set name / port number pairs extracted from the tag value */ - private Iterable> getMongoEndpointSpecificationsAsReplicaSetNameAndPort(final AwsInstance host) { + private Iterable> getMongoEndpointSpecificationsAsReplicaSetNameAndPort(final AwsInstance host) { final List> result = new ArrayList<>(); getTag(host, MONGO_REPLICA_SETS_TAG_NAME).ifPresent(tagValue->{ for (final String replicaNameWithOptionalPortColonSeparated : tagValue.split(",")) { @@ -975,7 +976,7 @@ implements AwsLandscape { public Iterable getMongoEndpoints(com.sap.sse.landscape.Region region) { final Set result = new HashSet<>(); final Set replicaSetsCreated = new HashSet<>(); - for (final AwsInstance mongoDBHost : getMongoDBHosts(region)) { + for (final AwsInstance mongoDBHost : getMongoDBHosts(region)) { for (final Pair replicaSetNameAndPort : getMongoEndpointSpecificationsAsReplicaSetNameAndPort(mongoDBHost)) { if (replicaSetNameAndPort.getA() != null && !replicaSetNameAndPort.getA().isEmpty()) { // non-empty replica set name if (!replicaSetsCreated.contains(replicaSetNameAndPort.getA())) { @@ -994,9 +995,9 @@ implements AwsLandscape { @Override public RabbitMQEndpoint getDefaultRabbitConfiguration(AwsRegion region) { final RabbitMQEndpoint result; - final Iterable> rabbitMQHostsInRegion = getRunningHostsWithTag(region, RABBITMQ_TAG_NAME); + final Iterable> rabbitMQHostsInRegion = getRunningHostsWithTag(region, RABBITMQ_TAG_NAME); if (rabbitMQHostsInRegion.iterator().hasNext()) { - final AwsInstance anyRabbitMQHost = rabbitMQHostsInRegion.iterator().next(); + final AwsInstance anyRabbitMQHost = rabbitMQHostsInRegion.iterator().next(); result = new RabbitMQEndpoint() { @Override public int getPort() { @@ -1033,10 +1034,11 @@ implements AwsLandscape { } @Override - public Iterable> getApplicationProcessHostsByTag(com.sap.sse.landscape.Region region, String tagName, + public > + Iterable> getApplicationProcessHostsByTag(com.sap.sse.landscape.Region region, String tagName, BiFunction processFactoryFromHostAndServerDirectory) { final List> result = new ArrayList<>(); - for (final AwsInstance host : getRunningHostsWithTag(region, tagName)) { + for (final AwsInstance host : getRunningHostsWithTag(region, tagName)) { final ApplicationProcessHost applicationProcessHost = new ApplicationProcessHostImpl( host.getInstanceId(), host.getAvailabilityZone(), this, processFactoryFromHostAndServerDirectory); @@ -1046,7 +1048,8 @@ implements AwsLandscape { } @Override - public Iterable> getApplicationReplicaSetsByTag(com.sap.sse.landscape.Region region, String tagName, + public > + Iterable> getApplicationReplicaSetsByTag(com.sap.sse.landscape.Region region, String tagName, BiFunction processFactoryFromHostAndServerDirectory, Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception { final Iterable> hosts = getApplicationProcessHostsByTag(region, tagName, processFactoryFromHostAndServerDirectory); final Map mastersByServerName = new HashMap<>(); diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsRegion.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsRegion.java index a079e9e9bde..e7c9cde050c 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsRegion.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsRegion.java @@ -6,7 +6,7 @@ import com.sap.sse.landscape.SecurityGroup; import com.sap.sse.landscape.aws.AwsLandscape; public class AwsRegion implements Region { - private AwsLandscape landscape; // FIXME this is broken; it shall be final and has to be initialized by the constructors if getAvailabilityZones and getSecurityGroups is expected to do anything useful + private AwsLandscape landscape; // FIXME this is broken; it shall be final and has to be initialized by the constructors if getAvailabilityZones and getSecurityGroups is expected to do anything useful private final String id; public AwsRegion(String id) { diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsTargetGroupImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsTargetGroupImpl.java index 4c274b5789c..49f02f15c8c 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsTargetGroupImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/impl/AwsTargetGroupImpl.java @@ -4,8 +4,6 @@ import java.util.Map; import com.sap.sse.common.impl.NamedImpl; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.ApplicationLoadBalancer; import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; @@ -13,15 +11,14 @@ import com.sap.sse.landscape.aws.TargetGroup; import software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetHealth; -public class AwsTargetGroupImpl> -extends NamedImpl implements TargetGroup { +public class AwsTargetGroupImpl +extends NamedImpl implements TargetGroup { private static final long serialVersionUID = -5442598262397393201L; private final String arn; - private final AwsLandscape landscape; + private final AwsLandscape landscape; private final Region region; - public AwsTargetGroupImpl(AwsLandscape landscape, Region region, String targetGroupName, String arn) { + public AwsTargetGroupImpl(AwsLandscape landscape, Region region, String targetGroupName, String arn) { super(targetGroupName); this.arn = arn; this.landscape = landscape; @@ -37,14 +34,14 @@ extends NamedImpl implements TargetGroup { } @Override - public Map, TargetHealth> getRegisteredTargets() { + public Map, TargetHealth> getRegisteredTargets() { return landscape.getTargetHealthDescriptions(this); } @Override - public ApplicationLoadBalancer getLoadBalancer() { + public ApplicationLoadBalancer getLoadBalancer() { final software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetGroup targetGroup = getAwsTargetGroup(); - final ApplicationLoadBalancer result; + final ApplicationLoadBalancer result; if (targetGroup.hasLoadBalancerArns() && !targetGroup.loadBalancerArns().isEmpty()) { result = new ApplicationLoadBalancerImpl<>(getRegion(), landscape.getAwsLoadBalancer( targetGroup.loadBalancerArns().iterator().next(), getRegion()), landscape); @@ -55,12 +52,12 @@ extends NamedImpl implements TargetGroup { } @Override - public void addTargets(Iterable> targets) { + public void addTargets(Iterable> targets) { landscape.addTargetsToTargetGroup(this, targets); } @Override - public void removeTargets(Iterable> targets) { + public void removeTargets(Iterable> targets) { landscape.removeTargetsFromTargetGroup(this, targets); } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AbstractAwsProcedureImpl.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AbstractAwsProcedureImpl.java index d18099505c7..e254780f407 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AbstractAwsProcedureImpl.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AbstractAwsProcedureImpl.java @@ -1,39 +1,31 @@ package com.sap.sse.landscape.aws.orchestration; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.orchestration.AbstractProcedureImpl; import com.sap.sse.landscape.orchestration.Procedure; -public abstract class AbstractAwsProcedureImpl> -extends AbstractProcedureImpl { +public abstract class AbstractAwsProcedureImpl +extends AbstractProcedureImpl { public static interface Builder, - T extends Procedure, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends Procedure.Builder { + T extends Procedure, ShardingKey> + extends Procedure.Builder { } - protected abstract static class BuilderImpl, - T extends Procedure, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends AbstractProcedureImpl.BuilderImpl - implements Builder { - protected AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + protected abstract static class BuilderImpl, + T extends Procedure, ShardingKey> + extends AbstractProcedureImpl.BuilderImpl + implements Builder { + protected AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } } - public AbstractAwsProcedureImpl(BuilderImpl builder) { + public AbstractAwsProcedureImpl(BuilderImpl builder) { super(builder); } @Override - public AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + public AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AwsApplicationConfiguration.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AwsApplicationConfiguration.java index cd1be9a33b4..ade512a4def 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AwsApplicationConfiguration.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/AwsApplicationConfiguration.java @@ -71,7 +71,7 @@ implements UserDataProvider { extends com.sap.sse.common.Builder { BuilderT setRegion(AwsRegion region); - BuilderT setLandscape(AwsLandscape landscape); + BuilderT setLandscape(AwsLandscape landscape); BuilderT setRelease(Release release); @@ -115,7 +115,7 @@ implements UserDataProvider { private static final String DEFAULT_SMTP_HOSTNAME_PATTERN = "email-smtp.%s.amazonaws.com"; private static final String DEFAULT_SMTP_USER = "AKIAIHCQEFAZDLIK7SUQ"; private static final Integer DEFAULT_SMTP_PORT = 25; - private AwsLandscape landscape; + private AwsLandscape landscape; private AwsRegion region; private Optional release = Optional.empty(); private String serverName; @@ -142,12 +142,12 @@ implements UserDataProvider { } @Override - public BuilderT setLandscape(AwsLandscape landscape) { + public BuilderT setLandscape(AwsLandscape landscape) { this.landscape = landscape; return self(); } - protected AwsLandscape getLandscape() { + protected AwsLandscape getLandscape() { return landscape; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDNSBasedLoadBalancerMapping.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDNSBasedLoadBalancerMapping.java index 4baa1dd1f4b..3d5df4a3857 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDNSBasedLoadBalancerMapping.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDNSBasedLoadBalancerMapping.java @@ -15,7 +15,6 @@ import com.sap.sse.landscape.Region; import com.sap.sse.landscape.application.ApplicationProcess; import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.ApplicationLoadBalancer; -import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.orchestration.Procedure; @@ -30,31 +29,29 @@ import com.sap.sse.landscape.orchestration.Procedure; * @author Axel Uhl (D043530) */ public class CreateDNSBasedLoadBalancerMapping, -HostT extends AwsInstance> -extends CreateLoadBalancerMapping -implements Procedure { +ProcessT extends ApplicationProcess> +extends CreateLoadBalancerMapping +implements Procedure { private static final String DNS_MAPPED_ALB_NAME_PREFIX = "DNSMapped-"; private static final Pattern ALB_NAME_PATTERN = Pattern.compile(DNS_MAPPED_ALB_NAME_PREFIX+"(.*)$"); - public static interface Builder, - T extends CreateDNSBasedLoadBalancerMapping, + public static interface Builder, + T extends CreateDNSBasedLoadBalancerMapping, ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends CreateLoadBalancerMapping.Builder { + ProcessT extends ApplicationProcess> + extends CreateLoadBalancerMapping.Builder { } - protected static class BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT>, + protected static class BuilderImpl, ShardingKey, MetricsT, ProcessT>, ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends CreateLoadBalancerMapping.BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> - implements Builder, ShardingKey, MetricsT, ProcessT, HostT> { + ProcessT extends ApplicationProcess> + extends CreateLoadBalancerMapping.BuilderImpl, ShardingKey, MetricsT, ProcessT> + implements Builder, ShardingKey, MetricsT, ProcessT> { private static final Logger logger = Logger.getLogger(BuilderImpl.class.getName()); @Override - public ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { - final ApplicationLoadBalancer result; + public ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { + final ApplicationLoadBalancer result; if (super.getLoadBalancerUsed() != null) { result = super.getLoadBalancerUsed(); } else { @@ -68,11 +65,11 @@ implements Procedure { * at least the length of {@link #createRules()} additional rules available. * @throws InterruptedException */ - private ApplicationLoadBalancer getOrCreateDNSMappedLoadBalancer( - AwsLandscape landscape, Region region) throws InterruptedException { - ApplicationLoadBalancer result = null; + private ApplicationLoadBalancer getOrCreateDNSMappedLoadBalancer( + AwsLandscape landscape, Region region) throws InterruptedException { + ApplicationLoadBalancer result = null; final Set loadBalancerNames = new HashSet<>(); - for (final ApplicationLoadBalancer loadBalancer : landscape.getLoadBalancers(region)) { + for (final ApplicationLoadBalancer loadBalancer : landscape.getLoadBalancers(region)) { if (ALB_NAME_PATTERN.matcher(loadBalancer.getName()).matches()) { loadBalancerNames.add(loadBalancer.getName()); if (Util.size(loadBalancer.getRules()) <= MAX_RULES_PER_ALB - NUMBER_OF_RULES_PER_REPLICA_SET) { @@ -106,19 +103,19 @@ implements Procedure { } @Override - public CreateDNSBasedLoadBalancerMapping build() throws Exception { - return new CreateDNSBasedLoadBalancerMapping(this); + public CreateDNSBasedLoadBalancerMapping build() throws Exception { + return new CreateDNSBasedLoadBalancerMapping(this); } } public static , HostT extends AwsInstance, - BuilderT extends Builder, ShardingKey, MetricsT, ProcessT, HostT>> - Builder, ShardingKey, MetricsT, ProcessT, HostT> builder() { + ProcessT extends ApplicationProcess, + BuilderT extends Builder, ShardingKey, MetricsT, ProcessT>> + Builder, ShardingKey, MetricsT, ProcessT> builder() { return new BuilderImpl<>(); } - protected CreateDNSBasedLoadBalancerMapping(BuilderImpl builder) throws Exception { + protected CreateDNSBasedLoadBalancerMapping(BuilderImpl builder) throws Exception { super(builder); } @@ -130,7 +127,7 @@ implements Procedure { private void createRoute53Mapping() { final String hostname = this.getHostName(); - final ApplicationLoadBalancer alb = getLoadBalancerUsed(); + final ApplicationLoadBalancer alb = getLoadBalancerUsed(); getLandscape().setDNSRecordToApplicationLoadBalancer(getLandscape().getDNSHostedZoneId( getHostedZoneName(hostname)), hostname, alb); } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDynamicLoadBalancerMapping.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDynamicLoadBalancerMapping.java index b6bf49750aa..a3f3a7183a1 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDynamicLoadBalancerMapping.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateDynamicLoadBalancerMapping.java @@ -14,24 +14,24 @@ import com.sap.sse.landscape.orchestration.Procedure; * @author Axel Uhl (D043530) */ public class CreateDynamicLoadBalancerMapping, HostT extends AwsInstance> -extends CreateLoadBalancerMapping -implements Procedure { - public static interface Builder, - T extends CreateDynamicLoadBalancerMapping, +ProcessT extends ApplicationProcess> +extends CreateLoadBalancerMapping +implements Procedure { + public static interface Builder, + T extends CreateDynamicLoadBalancerMapping, ShardingKey, MetricsT extends ApplicationProcessMetrics, - MasterProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends CreateLoadBalancerMapping.Builder { + MasterProcessT extends ApplicationProcess> + extends CreateLoadBalancerMapping.Builder { } - protected static class BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT>, + protected static class BuilderImpl, ShardingKey, MetricsT, ProcessT>, ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends CreateLoadBalancerMapping.BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> - implements Builder, ShardingKey, MetricsT, ProcessT, HostT> { + ProcessT extends ApplicationProcess> + extends CreateLoadBalancerMapping.BuilderImpl, ShardingKey, MetricsT, ProcessT> + implements Builder, ShardingKey, MetricsT, ProcessT> { @Override - public ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { - final ApplicationLoadBalancer result; + public ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { + final ApplicationLoadBalancer result; if (super.getLoadBalancerUsed() != null) { result = super.getLoadBalancerUsed(); } else { @@ -40,11 +40,11 @@ implements Procedure { return result; } - private ApplicationLoadBalancer getOrCreateNonDNSMappedLoadBalancer( - Region region, String hostname, AwsLandscape landscape) throws InterruptedException { + private ApplicationLoadBalancer getOrCreateNonDNSMappedLoadBalancer( + Region region, String hostname, AwsLandscape landscape) throws InterruptedException { final String domainName = getHostedZoneName(hostname); - final ApplicationLoadBalancer existingLoadBalancer = landscape.getNonDNSMappedLoadBalancer(region, domainName); - final ApplicationLoadBalancer result; + final ApplicationLoadBalancer existingLoadBalancer = landscape.getNonDNSMappedLoadBalancer(region, domainName); + final ApplicationLoadBalancer result; if (existingLoadBalancer != null) { result = existingLoadBalancer; } else { @@ -56,28 +56,28 @@ implements Procedure { } private void createWildcardRoute53Mapping( - AwsLandscape landscape, - ApplicationLoadBalancer loadBalancer, String domainName) { + AwsLandscape landscape, + ApplicationLoadBalancer loadBalancer, String domainName) { final String hostname = "*." + domainName; landscape.setDNSRecordToApplicationLoadBalancer(landscape.getDNSHostedZoneId(domainName), hostname, loadBalancer); } @Override - public CreateDynamicLoadBalancerMapping build() throws Exception { - return new CreateDynamicLoadBalancerMapping(this); + public CreateDynamicLoadBalancerMapping build() throws Exception { + return new CreateDynamicLoadBalancerMapping(this); } } public static , - HostT extends AwsInstance, - BuilderT extends Builder, ShardingKey, MetricsT, ProcessT, HostT>, + HostT extends AwsInstance, + BuilderT extends Builder, ShardingKey, MetricsT, ProcessT>, ShardingKey> - Builder, ShardingKey, MetricsT, ProcessT, HostT> builder() { - return new BuilderImpl(); + Builder, ShardingKey, MetricsT, ProcessT> builder() { + return new BuilderImpl(); } - protected CreateDynamicLoadBalancerMapping(BuilderImpl builder) throws Exception { + protected CreateDynamicLoadBalancerMapping(BuilderImpl builder) throws Exception { super(builder); } } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateLoadBalancerMapping.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateLoadBalancerMapping.java index 7f7a942869e..0431cc5defd 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateLoadBalancerMapping.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/CreateLoadBalancerMapping.java @@ -71,15 +71,15 @@ import software.amazon.awssdk.services.elasticloadbalancingv2.model.TargetGroupT * @author Axel Uhl (D043530) */ public abstract class CreateLoadBalancerMapping, HostT extends AwsInstance> -extends ProcedureWithTargetGroup { +ProcessT extends ApplicationProcess> +extends ProcedureWithTargetGroup { protected static int NUMBER_OF_RULES_PER_REPLICA_SET = 4; protected static final int MAX_RULES_PER_ALB = 100; protected static final int MAX_ALBS_PER_REGION = 20; private final ProcessT process; private final String hostname; - private TargetGroup masterTargetGroupCreated; - private TargetGroup publicTargetGroupCreated; + private TargetGroup masterTargetGroupCreated; + private TargetGroup publicTargetGroupCreated; private Iterable rulesAdded; /** @@ -95,12 +95,11 @@ extends ProcedureWithTargetGroup { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends CreateLoadBalancerMapping, + public static interface Builder, + T extends CreateLoadBalancerMapping, ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends ProcedureWithTargetGroup.Builder { + ProcessT extends ApplicationProcess> + extends ProcedureWithTargetGroup.Builder { BuilderT setProcess(ProcessT process); BuilderT setHostname(String hostname); BuilderT setTimeout(Duration timeout); @@ -108,12 +107,12 @@ extends ProcedureWithTargetGroup { BuilderT setPrivateKeyEncryptionPassphrase(byte[] privateKeyEncryptionPassphrase); } - protected abstract static class BuilderImpl, - T extends CreateLoadBalancerMapping, + protected abstract static class BuilderImpl, + T extends CreateLoadBalancerMapping, ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends ProcedureWithTargetGroup.BuilderImpl - implements Builder { + ProcessT extends ApplicationProcess> + extends ProcedureWithTargetGroup.BuilderImpl + implements Builder { private static final Logger logger = Logger.getLogger(BuilderImpl.class.getName()); private String hostname; private ProcessT process; @@ -178,7 +177,7 @@ extends ProcedureWithTargetGroup { return result; } - protected void waitUntilLoadBalancerProvisioned(AwsLandscape landscape, ApplicationLoadBalancer loadBalancer) throws InterruptedException { + protected void waitUntilLoadBalancerProvisioned(AwsLandscape landscape, ApplicationLoadBalancer loadBalancer) throws InterruptedException { final TimePoint startingToPollForReady = TimePoint.now(); while (landscape.getApplicationLoadBalancerStatus(loadBalancer).code() == LoadBalancerStateEnum.PROVISIONING && (!getOptionalTimeout().isPresent() || startingToPollForReady.until(TimePoint.now()).compareTo(getOptionalTimeout().get()) <= 0)) { @@ -188,15 +187,15 @@ extends ProcedureWithTargetGroup { } } - protected CreateLoadBalancerMapping(BuilderImpl builder) throws Exception { + protected CreateLoadBalancerMapping(BuilderImpl builder) throws Exception { super(builder); this.process = builder.getProcess(); this.hostname = builder.getHostname(); } @Override - public AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + public AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } @Override @@ -238,17 +237,17 @@ extends ProcedureWithTargetGroup { return hostname; } - private AwsInstance getHost() { + private AwsInstance getHost() { @SuppressWarnings("unchecked") - final AwsInstance result = (AwsInstance) getProcess().getHost(); + final AwsInstance result = (AwsInstance) getProcess().getHost(); return result; } - public TargetGroup getMasterTargetGroupCreated() { + public TargetGroup getMasterTargetGroupCreated() { return masterTargetGroupCreated; } - public TargetGroup getPublicTargetGroupCreated() { + public TargetGroup getPublicTargetGroupCreated() { return publicTargetGroupCreated; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/ProcedureWithTargetGroup.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/ProcedureWithTargetGroup.java index 5ce1cc40679..f58758652c6 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/ProcedureWithTargetGroup.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/ProcedureWithTargetGroup.java @@ -8,7 +8,6 @@ import com.sap.sse.landscape.Region; import com.sap.sse.landscape.application.ApplicationProcess; import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.ApplicationLoadBalancer; -import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.aws.TargetGroup; @@ -21,11 +20,10 @@ import software.amazon.awssdk.services.elasticloadbalancingv2.model.Rule; * * @author Axel Uhl (D043530) */ -public abstract class ProcedureWithTargetGroup, HostT extends AwsInstance> -extends AbstractAwsProcedureImpl { +public abstract class ProcedureWithTargetGroup +extends AbstractAwsProcedureImpl { private static final String MASTER_TARGET_GROUP_SUFFIX = "-m"; - private final ApplicationLoadBalancer loadBalancerUsed; + private final ApplicationLoadBalancer loadBalancerUsed; private final String targetGroupNamePrefix; private final String serverName; private Iterable rulesAdded; @@ -36,29 +34,25 @@ extends AbstractAwsProcedureImpl { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends ProcedureWithTargetGroup, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends AbstractAwsProcedureImpl.Builder { - BuilderT setLoadBalancerUsed(ApplicationLoadBalancer loadBalancerUsed); + public static interface Builder, + T extends ProcedureWithTargetGroup, ShardingKey> + extends AbstractAwsProcedureImpl.Builder { + BuilderT setLoadBalancerUsed(ApplicationLoadBalancer loadBalancerUsed); BuilderT setTargetGroupNamePrefix(String targetGroupNamePrefix); BuilderT setServerName(String serverName); } - protected abstract static class BuilderImpl, - T extends ProcedureWithTargetGroup, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, HostT extends AwsInstance> - extends AbstractAwsProcedureImpl.BuilderImpl - implements Builder { - private ApplicationLoadBalancer loadBalancerUsed; + protected abstract static class BuilderImpl, + T extends ProcedureWithTargetGroup, ShardingKey> + extends AbstractAwsProcedureImpl.BuilderImpl + implements Builder { + private ApplicationLoadBalancer loadBalancerUsed; private String targetGroupNamePrefix; private String serverName; @Override public BuilderT setLoadBalancerUsed( - ApplicationLoadBalancer loadBalancerUsed) { + ApplicationLoadBalancer loadBalancerUsed) { this.loadBalancerUsed = loadBalancerUsed; return self(); } @@ -76,7 +70,7 @@ extends AbstractAwsProcedureImpl { return self(); } - protected ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { + protected ApplicationLoadBalancer getLoadBalancerUsed() throws InterruptedException { return loadBalancerUsed; } @@ -88,34 +82,35 @@ extends AbstractAwsProcedureImpl { return serverName; } - protected AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + protected AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } } - protected ProcedureWithTargetGroup(BuilderImpl builder) throws Exception { + protected ProcedureWithTargetGroup(BuilderImpl builder) throws Exception { super(builder); this.loadBalancerUsed = builder.getLoadBalancerUsed(); this.targetGroupNamePrefix = builder.getTargetGroupNamePrefix(); this.serverName = builder.getServerName(); } - protected TargetGroup createTargetGroup(Region region, String targetGroupName, ProcessT process) { + protected , MetricsT extends ApplicationProcessMetrics> + TargetGroup createTargetGroup(Region region, String targetGroupName, ProcessT process) { return getLandscape().createTargetGroup(getLoadBalancerUsed().getRegion(), targetGroupName, process.getPort(), process.getHealthCheckPath(), /* use traffic port as health check port, too */ process.getPort()); // TODO this doesn't health-check the reverse proxy running on the instance for default set-ups with only one process running on the instance; but how do we know? } @Override - public AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + public AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } protected String getMasterTargetGroupName() { return getPublicTargetGroupName()+MASTER_TARGET_GROUP_SUFFIX; } - protected TargetGroup getMasterTargetGroup() throws JSchException, IOException, InterruptedException, SftpException { + protected TargetGroup getMasterTargetGroup() throws JSchException, IOException, InterruptedException, SftpException { return getLandscape().getTargetGroup(loadBalancerUsed.getRegion(), getMasterTargetGroupName()); } @@ -123,11 +118,11 @@ extends AbstractAwsProcedureImpl { return targetGroupNamePrefix+serverName; } - protected TargetGroup getPublicTargetGroup() throws JSchException, IOException, InterruptedException, SftpException { + protected TargetGroup getPublicTargetGroup() throws JSchException, IOException, InterruptedException, SftpException { return getLandscape().getTargetGroup(loadBalancerUsed.getRegion(), getPublicTargetGroupName()); } - public ApplicationLoadBalancer getLoadBalancerUsed() { + public ApplicationLoadBalancer getLoadBalancerUsed() { return loadBalancerUsed; } diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsApplicationHost.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsApplicationHost.java index 903b3d513ba..ea8f567ee2b 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsApplicationHost.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsApplicationHost.java @@ -21,8 +21,8 @@ import com.sap.sse.landscape.aws.impl.AwsRegion; public class StartAwsApplicationHost, -HostT extends AwsInstance> -extends StartAwsHost { +HostT extends AwsInstance> +extends StartAwsHost { /** * When setting the {@link #setLandscape(Landscape) landscape} or the {@link #setRegion(AwsRegion) region}, these * settings are also copied to the {@link AwsApplicationConfiguration.Builder application configuration builder}. @@ -30,19 +30,19 @@ extends StartAwsHost { * @author Axel Uhl (D043530) */ public static interface Builder, - T extends StartAwsHost, ShardingKey, + T extends StartAwsHost, ShardingKey, MetricsT extends ApplicationProcessMetrics, ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartAwsHost.Builder { + HostT extends AwsInstance> + extends StartAwsHost.Builder { } protected abstract static class BuilderImpl, - T extends StartAwsHost, ShardingKey, + T extends StartAwsHost, ShardingKey, MetricsT extends ApplicationProcessMetrics, ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartAwsHost.BuilderImpl + HostT extends AwsInstance> + extends StartAwsHost.BuilderImpl implements Builder { private final AwsApplicationConfiguration.Builder applicationConfigurationBuilder; @@ -62,8 +62,8 @@ extends StartAwsHost { } @Override - public BuilderT setLandscape(Landscape landscape) { - getApplicationConfigurationBuilder().setLandscape((AwsLandscape) landscape); + public BuilderT setLandscape(Landscape landscape) { + getApplicationConfigurationBuilder().setLandscape((AwsLandscape) landscape); return super.setLandscape(landscape); } @@ -74,13 +74,12 @@ extends StartAwsHost { protected Optional getOptionalTimeout() { return super.getOptionalTimeout(); } - } private final AwsApplicationConfiguration applicationConfiguration; private final Optional optionalTimeout; - protected StartAwsApplicationHost(BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> builder) throws Exception { + protected StartAwsApplicationHost(BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> builder) throws Exception { super(builder); this.optionalTimeout = builder.getOptionalTimeout(); applicationConfiguration = builder.getApplicationConfigurationBuilder().build(); diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsHost.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsHost.java index a9904a74ffc..49af2e24ec4 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsHost.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartAwsHost.java @@ -36,11 +36,8 @@ import software.amazon.awssdk.services.ec2.model.InstanceType; * * @author Axel Uhl (D043530) */ -public abstract class StartAwsHost, - HostT extends AwsInstance> -extends StartHost { +public abstract class StartAwsHost> +extends StartHost { protected static final String NAME_TAG_NAME = "Name"; private final List userData; @@ -49,7 +46,7 @@ extends StartHost { private final String keyName; private final Iterable securityGroups; private final Optional tags; - private final HostSupplier hostSupplier; + private final HostSupplier hostSupplier; private final byte[] privateKeyEncryptionPassphrase; private HostT host; @@ -74,12 +71,10 @@ extends StartHost { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends StartAwsHost, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartHost.Builder { + public static interface Builder, + T extends StartAwsHost, ShardingKey, + HostT extends AwsInstance> + extends StartHost.Builder { BuilderT setInstanceType(InstanceType instanceType); BuilderT setAvailabilityZone(AwsAvailabilityZone availabilityZone); @@ -108,16 +103,14 @@ extends StartHost { BuilderT setInstanceName(String name); - BuilderT setHostSupplier(HostSupplier hostSupplier); + BuilderT setHostSupplier(HostSupplier hostSupplier); } - protected abstract static class BuilderImpl, - T extends StartAwsHost, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartHost.BuilderImpl - implements Builder { + protected abstract static class BuilderImpl, + T extends StartAwsHost, ShardingKey, + HostT extends AwsInstance> + extends StartHost.BuilderImpl + implements Builder { private InstanceType instanceType; private AwsAvailabilityZone availabilityZone; private String keyName; @@ -126,11 +119,11 @@ extends StartHost { private List userData = new ArrayList<>(); private AwsRegion region; private String instanceName; - private HostSupplier hostSupplier; + private HostSupplier hostSupplier; private byte[] privateKeyEncryptionPassphrase; - protected AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + protected AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } protected InstanceType getInstanceType() { @@ -138,8 +131,7 @@ extends StartHost { } @Override - public BuilderT setInstanceType( - InstanceType instanceType) { + public BuilderT setInstanceType(InstanceType instanceType) { this.instanceType = instanceType; return self(); } @@ -232,12 +224,12 @@ extends StartHost { return self(); } - protected HostSupplier getHostSupplier() { + protected HostSupplier getHostSupplier() { return hostSupplier; } @Override - public BuilderT setHostSupplier(HostSupplier hostSupplier) { + public BuilderT setHostSupplier(HostSupplier hostSupplier) { this.hostSupplier = hostSupplier; return self(); } @@ -253,7 +245,7 @@ extends StartHost { } } - protected StartAwsHost(BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> builder) { + protected StartAwsHost(BuilderImpl, ShardingKey, HostT> builder) { super(builder); this.userData = new ArrayList<>(); for (final String ud : builder.getUserData()) { @@ -271,14 +263,14 @@ extends StartHost { protected static > - AmazonMachineImage getLatestImageOfType(String imageType, AwsLandscape landscape, Region region) { + AmazonMachineImage getLatestImageOfType(String imageType, AwsLandscape landscape, Region region) { return landscape.getLatestImageWithType(region, imageType); } protected static > - AwsAvailabilityZone getRandomAvailabilityZone(AwsRegion region, AwsLandscape landscape) { + AwsAvailabilityZone getRandomAvailabilityZone(AwsRegion region, AwsLandscape landscape) { final Iterable azs = landscape.getAvailabilityZones(region); return (AwsAvailabilityZone) Util.get(azs, new Random().nextInt(Util.size(azs))); } @@ -286,13 +278,13 @@ extends StartHost { protected static > - Set getDefaultSecurityGroupForApplicationHosts(Landscape landscape, Region region) { + Set getDefaultSecurityGroupForApplicationHosts(Landscape landscape, Region region) { return Collections.singleton(landscape.getDefaultSecurityGroupForApplicationHosts(region)); } @Override - public AwsLandscape getLandscape() { - return (AwsLandscape) super.getLandscape(); + public AwsLandscape getLandscape() { + return (AwsLandscape) super.getLandscape(); } @Override diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartEmptyServer.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartEmptyServer.java index 72d328e22b9..9ab7013c99b 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartEmptyServer.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartEmptyServer.java @@ -2,8 +2,6 @@ package com.sap.sse.landscape.aws.orchestration; import java.util.Collections; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.orchestration.Procedure; @@ -19,12 +17,10 @@ import com.sap.sse.landscape.orchestration.Procedure; * @param * @param */ -public abstract class StartEmptyServer, -ShardingKey, MetricsT extends ApplicationProcessMetrics, -ProcessT extends ApplicationProcess, -HostT extends AwsInstance> -extends StartAwsHost -implements Procedure { +public abstract class StartEmptyServer, +ShardingKey, HostT extends AwsInstance> +extends StartAwsHost +implements Procedure { private static final String IMAGE_UPGRADE_USER_DATA = "image-upgrade"; private static final String NO_SHUTDOWN_USER_DATA = "no-shutdown"; @@ -41,22 +37,18 @@ implements Procedure { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends StartEmptyServer, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartAwsHost.Builder { + public static interface Builder, + T extends StartEmptyServer, + ShardingKey, HostT extends AwsInstance> + extends StartAwsHost.Builder { BuilderT setNoShutdown(boolean noShutdown); } - protected abstract static class BuilderImpl, - T extends StartEmptyServer, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, - HostT extends AwsInstance> - extends StartAwsHost.BuilderImpl - implements Builder { + protected abstract static class BuilderImpl, + T extends StartEmptyServer, + ShardingKey, HostT extends AwsInstance> + extends StartAwsHost.BuilderImpl + implements Builder { private boolean noShutdown = true; protected boolean isNoShutdown() { @@ -74,7 +66,7 @@ implements Procedure { } } - public StartEmptyServer(BuilderImpl builder) { + public StartEmptyServer(BuilderImpl builder) { super(builder); addUserData(Collections.singleton(IMAGE_UPGRADE_USER_DATA)); if (builder.isNoShutdown()) { diff --git a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartMongoDBServer.java b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartMongoDBServer.java index c0cc50d877b..a4b7248ad29 100755 --- a/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartMongoDBServer.java +++ b/java/com.sap.sse.landscape.aws/src/com/sap/sse/landscape/aws/orchestration/StartMongoDBServer.java @@ -11,8 +11,6 @@ import com.sap.sse.common.Duration; import com.sap.sse.common.Util; import com.sap.sse.landscape.Host; import com.sap.sse.landscape.ProcessConfigurationVariable; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.aws.AwsInstance; import com.sap.sse.landscape.aws.AwsLandscape; import com.sap.sse.landscape.aws.HostSupplier; @@ -49,18 +47,15 @@ import software.amazon.awssdk.services.ec2.model.InstanceType; * In this case no other node tagged for the desired replica set will be found, and the new instance will become the * first primary of the new replica set.

* - * TODO Why is the MetricsT parameter necessary when there is MongoMetrics? - * * @author Axel Uhl (D043530) */ -public class StartMongoDBServer> -extends StartAwsHost> { +public class StartMongoDBServer +extends StartAwsHost> { private static enum MongoDBReplicaSetUserData implements ProcessConfigurationVariable { REPLICA_SET_NAME, REPLICA_SET_PRIMARY, REPLICA_SET_PRIORITY, REPLICA_SET_VOTES; } - private MongoProcess mongoProcess; + private ProcessT mongoProcess; private final String replicaSetName; @@ -95,10 +90,9 @@ extends StartAwsHost, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends StartAwsHost.Builder, ShardingKey, MetricsT, ProcessT, AwsInstance> { + public static interface Builder, + ShardingKey, ProcessT extends MongoProcess> + extends StartAwsHost.Builder, ShardingKey, AwsInstance> { /** * The default {@link #setImageType(String) image type} used for launching a MongoDB server. */ @@ -113,11 +107,10 @@ extends StartAwsHost, - ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends StartAwsHost.BuilderImpl, ShardingKey, MetricsT, ProcessT, AwsInstance> - implements Builder { + protected static class BuilderImpl, + ShardingKey, ProcessT extends MongoProcess> + extends StartAwsHost.BuilderImpl, ShardingKey, AwsInstance> + implements Builder { private String replicaSetName = AwsLandscape.MONGO_DEFAULT_REPLICA_SET_NAME; private String replicaSetPrimary; private boolean replicaSetPrimaryWasSetExplicitly = false; @@ -129,7 +122,7 @@ extends StartAwsHost> getHostSupplier() { + public HostSupplier> getHostSupplier() { return AwsInstanceImpl::new; } @@ -221,7 +214,7 @@ extends StartAwsHost build() throws URISyntaxException, JSchException, IOException, InterruptedException { + public StartMongoDBServer build() throws URISyntaxException, JSchException, IOException, InterruptedException { setTags(getLandscape().getTagForMongoProcess(getTags().orElse(Tags.empty()), getReplicaSetName(), MongoDBConstants.DEFAULT_PORT)); if (!isSecurityGroupsSet()) { setSecurityGroups(Collections.singleton(getLandscape().getDefaultSecurityGroupForMongoDBHosts(getRegion()))); @@ -238,13 +231,12 @@ extends StartAwsHost,ShardingKey, MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - Builder builder() { + public static , ShardingKey, ProcessT extends MongoProcess> + Builder builder() { return new BuilderImpl<>(); } - protected StartMongoDBServer(BuilderImpl builder) throws URISyntaxException, JSchException, IOException, InterruptedException { + protected StartMongoDBServer(BuilderImpl builder) throws URISyntaxException, JSchException, IOException, InterruptedException { super(builder); this.replicaSetName = builder.getReplicaSetName(); if (builder.getReplicaSetName() != null) { @@ -261,7 +253,7 @@ extends StartAwsHostgetLandscape().getInstance(getHost().getInstanceId(), getHost().getRegion()).state().name() == InstanceStateName.RUNNING, @@ -279,7 +273,9 @@ extends StartAwsHostreplica.getHost().equals(getHost())).map(replica->replica.getHost()).findAny().get(); - mongoProcess = new MongoProcessInReplicaSetImpl(replicaSet, MongoDBConstants.DEFAULT_PORT, instance); + @SuppressWarnings("unchecked") + final ProcessT mongoProcessCast = (ProcessT) new MongoProcessInReplicaSetImpl(replicaSet, MongoDBConstants.DEFAULT_PORT, instance); + mongoProcess = mongoProcessCast; } } } diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/Landscape.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/Landscape.java index 268c0dd5f33..98132ddbec0 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/Landscape.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/Landscape.java @@ -8,8 +8,7 @@ import com.sap.sse.landscape.application.ApplicationReplicaSet; import com.sap.sse.landscape.application.Scope; import com.sap.sse.landscape.rabbitmq.RabbitMQEndpoint; -public interface Landscape> { +public interface Landscape { /** * The {@link Landscape#getLatestImageWithTag(Region, String, String)} method is * used to obtain default images for specific host starting procedures that subclass this class. The @@ -21,7 +20,8 @@ ProcessT extends ApplicationProcess> { /** * Tells which scope currently lives where */ - Map, ApplicationReplicaSet> getScopes(); + > + Map, ApplicationReplicaSet> getScopes(); /** * @return the security group that shall be assigned by default to any application server host, whether master or diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/application/ApplicationProcess.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/application/ApplicationProcess.java index 5cedcc7aade..435712b06a0 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/application/ApplicationProcess.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/application/ApplicationProcess.java @@ -29,7 +29,6 @@ extends Process { * @param releaseRepository * mandatory parameter required to enable resolving the release and enabling the download of its * artifacts, including its release notes - * @param optionalKeyName TODO * @return the release that this process is currently running */ Release getRelease(ReleaseRepository releaseRepository, Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception; @@ -63,7 +62,6 @@ extends Process { * as the base name of the {@link #getServerDirectory() server's directory}. Often, it is also used as the name of * the {@link Database}, at least when this is a master node, and the name of the RabbitMQ fan-out exchange used * for replication. - * @param optionalKeyName TODO */ String getServerName(Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception; @@ -82,7 +80,6 @@ extends Process { /** * Obtains the last definition of the process configuration variable specified, or {@code null} if that variable cannot be found * in the evaluated {@code env.sh} file. - * @param optionalKeyName TODO * @throws Exception */ String getEnvShValueFor(ProcessConfigurationVariable variable, Optional optionalTimeout, Optional optionalKeyName, byte[] privateKeyEncryptionPassphrase) diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/AbstractProcedureImpl.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/AbstractProcedureImpl.java index ab261745af3..3eb2821054b 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/AbstractProcedureImpl.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/AbstractProcedureImpl.java @@ -4,27 +4,21 @@ import java.util.Optional; import com.sap.sse.common.Duration; import com.sap.sse.landscape.Landscape; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; -public abstract class AbstractProcedureImpl> -implements Procedure { - protected abstract static class BuilderImpl, - T extends Procedure, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - implements Builder { - private Landscape landscape; +public abstract class AbstractProcedureImpl +implements Procedure { + protected abstract static class BuilderImpl, + T extends Procedure, ShardingKey> + implements Builder { + private Landscape landscape; private Optional optionalTimeout; - protected Landscape getLandscape() { + protected Landscape getLandscape() { return landscape; } @Override - public BuilderT setLandscape(Landscape landscape) { + public BuilderT setLandscape(Landscape landscape) { this.landscape = landscape; return self(); } @@ -45,14 +39,14 @@ implements Procedure { } } - private final Landscape landscape; + private final Landscape landscape; - protected AbstractProcedureImpl(BuilderImpl builder) { + protected AbstractProcedureImpl(BuilderImpl builder) { this.landscape = builder.getLandscape(); } @Override - public Landscape getLandscape() { + public Landscape getLandscape() { return landscape; } } diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/Procedure.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/Procedure.java index 9c9c539ade2..12db4b96baa 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/Procedure.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/Procedure.java @@ -5,8 +5,6 @@ import java.util.Optional; import com.sap.sse.common.Duration; import com.sap.sse.concurrent.RunnableWithException; import com.sap.sse.landscape.Landscape; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; /** * Encodes a potentially compound sequence of actions that transform the landscape from one state to another, trying to @@ -39,9 +37,7 @@ import com.sap.sse.landscape.application.ApplicationProcessMetrics; * @author Axel Uhl (D043530) * */ -public interface Procedure> +public interface Procedure extends RunnableWithException { /** * The following defaults apply: @@ -52,15 +48,12 @@ extends RunnableWithException { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends Procedure, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> + public static interface Builder, T extends Procedure, ShardingKey> extends com.sap.sse.common.Builder { - BuilderT setLandscape(Landscape landscape); + BuilderT setLandscape(Landscape landscape); BuilderT setOptionalTimeout(Optional optionalTimeout); } - Landscape getLandscape(); + Landscape getLandscape(); } diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/StartHost.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/StartHost.java index fe4beb00acb..017a707db64 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/StartHost.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/StartHost.java @@ -3,15 +3,10 @@ package com.sap.sse.landscape.orchestration; import com.sap.sse.landscape.Host; import com.sap.sse.landscape.MachineImage; import com.sap.sse.landscape.Region; -import com.sap.sse.landscape.application.ApplicationProcess; -import com.sap.sse.landscape.application.ApplicationProcessMetrics; -public abstract class StartHost, - HostT extends Host> -extends AbstractProcedureImpl -implements Procedure { +public abstract class StartHost +extends AbstractProcedureImpl +implements Procedure { private final MachineImage machineImage; /** @@ -25,23 +20,19 @@ implements Procedure { * * @author Axel Uhl (D043530) */ - public static interface Builder, - T extends StartHost, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, + public static interface Builder, + T extends StartHost, ShardingKey, HostT extends Host> - extends Procedure.Builder { + extends Procedure.Builder { BuilderT setImageType(String imageType); BuilderT setMachineImage(MachineImage machineImage); } - protected abstract static class BuilderImpl, - T extends StartHost, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess, + protected abstract static class BuilderImpl, + T extends StartHost, ShardingKey, HostT extends Host> - extends AbstractProcedureImpl.BuilderImpl - implements Builder { + extends AbstractProcedureImpl.BuilderImpl + implements Builder { private MachineImage machineImage; private String imageType; @@ -68,7 +59,7 @@ implements Procedure { } } - protected StartHost(BuilderImpl, ShardingKey, MetricsT, ProcessT, HostT> builder) { + protected StartHost(BuilderImpl, ShardingKey, HostT> builder) { super(builder); this.machineImage = builder.getMachineImage(); } diff --git a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/impl/ProcedureSequence.java b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/impl/ProcedureSequence.java index 1f144633139..2c8958752f5 100755 --- a/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/impl/ProcedureSequence.java +++ b/java/com.sap.sse.landscape/src/com/sap/sse/landscape/orchestration/impl/ProcedureSequence.java @@ -10,69 +10,62 @@ import com.sap.sse.landscape.application.ApplicationProcessMetrics; import com.sap.sse.landscape.orchestration.AbstractProcedureImpl; import com.sap.sse.landscape.orchestration.Procedure; -public class ProcedureSequence> -extends AbstractProcedureImpl -implements Procedure, Iterable> { - public static interface Builder, - T extends ProcedureSequence, ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends Procedure.Builder { +public class ProcedureSequence +extends AbstractProcedureImpl +implements Procedure, Iterable> { + public static interface Builder, + T extends ProcedureSequence, ShardingKey> + extends Procedure.Builder { /** * An alias for {@link #then(com.sap.sse.landscape.orchestration.Procedure.Builder)} which makes writing * a procedure sequence a bit more human-readable. */ - default BuilderT first(Procedure.Builder firstStepBuilder) { + default BuilderT first(Procedure.Builder firstStepBuilder) { return then(firstStepBuilder); } /** * When building the procedure sequence, the next step is built with {@code stepBuilder}. */ - BuilderT then(Procedure.Builder stepBuilder); + BuilderT then(Procedure.Builder stepBuilder); } - protected static class BuilderImpl, ShardingKey, MetricsT, ProcessT>, - ShardingKey, - MetricsT extends ApplicationProcessMetrics, - ProcessT extends ApplicationProcess> - extends AbstractProcedureImpl.BuilderImpl, ShardingKey, MetricsT, ProcessT> - implements Builder, ShardingKey, MetricsT, ProcessT> { - final List> stepBuilders = new ArrayList<>(); + protected static class BuilderImpl, ShardingKey>, ShardingKey> + extends AbstractProcedureImpl.BuilderImpl, ShardingKey> + implements Builder, ShardingKey> { + final List> stepBuilders = new ArrayList<>(); @Override - public ProcedureSequence build() throws Exception { + public ProcedureSequence build() throws Exception { return new ProcedureSequence<>(this); } @Override public BuilderT then( - com.sap.sse.landscape.orchestration.Procedure.Builder stepBuilder) { + com.sap.sse.landscape.orchestration.Procedure.Builder stepBuilder) { stepBuilders.add(stepBuilder); return self(); } - protected Iterable> getStepBuilders() { + protected Iterable> getStepBuilders() { return stepBuilders; } } - private final Iterable> steps; + private final Iterable> steps; public static , - BuilderT extends Builder, ShardingKey, MetricsT, ProcessT>> - Builder, ShardingKey, MetricsT, ProcessT> builder() { - return new BuilderImpl(); + BuilderT extends Builder, ShardingKey>> + Builder, ShardingKey> builder() { + return new BuilderImpl(); } - protected ProcedureSequence(BuilderImpl builder) throws Exception { + protected ProcedureSequence(BuilderImpl builder) throws Exception { super(builder); - final List> mySteps = new ArrayList<>(); - for (final com.sap.sse.landscape.orchestration.Procedure.Builder stepBuilder : builder.getStepBuilders()) { + final List> mySteps = new ArrayList<>(); + for (final com.sap.sse.landscape.orchestration.Procedure.Builder stepBuilder : builder.getStepBuilders()) { mySteps.add(stepBuilder.build()); } this.steps = Collections.unmodifiableList(mySteps); @@ -80,13 +73,13 @@ implements Procedure, Iterable s : this) { + for (final Procedure s : this) { s.run(); } } @Override - public Iterator> iterator() { + public Iterator> iterator() { return steps.iterator(); } }