This is an automated email from the ASF dual-hosted git repository. dimuthuupe pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/airavata-mft.git
commit 1bc3594d1c63b07fbcd4f50f9bb297e9aa2b2d5d Author: Dimuthu Wannipurage <[email protected]> AuthorDate: Thu Feb 2 13:21:45 2023 -0500 Ignoring failed Agent instances when reusing --- .../mft/controller/spawner/AgentOrchestrator.java | 8 +-- .../mft/controller/spawner/AgentSpawner.java | 2 +- .../mft/controller/spawner/EC2AgentSpawner.java | 63 +++++++++++++++------- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentOrchestrator.java b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentOrchestrator.java index cb58002..ceceab6 100644 --- a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentOrchestrator.java +++ b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentOrchestrator.java @@ -32,7 +32,7 @@ public class AgentOrchestrator { private static final Logger logger = LoggerFactory.getLogger(AgentOrchestrator.class); - private final int SPAWNER_MAX_IDLE_SECONDS = 30; + private final int SPAWNER_MAX_IDLE_SECONDS = 30; // TODO Externalize this private class TransferInfo { private final String transferId; @@ -145,7 +145,7 @@ public class AgentOrchestrator { logger.info("Removing consul key {}", transferInfo.consulKey); transferDispatcher.getMftConsulClient().getKvClient().deleteKey(transferInfo.consulKey); logger.info("Terminating the spawner"); - metadata.spawner.terminate(); + metadata.spawner.terminate(true); launchedSpawnersMap.remove(key); } finally { metadata.transferInfos.remove(agentTransferId); @@ -169,7 +169,7 @@ public class AgentOrchestrator { } catch (Exception e) { logger.info("Killing spawner with key {} as the agent is not responding and inactive for {} seconds", key, SPAWNER_MAX_IDLE_SECONDS); - metadata.spawner.terminate(); + metadata.spawner.terminate(false); launchedSpawnersMap.remove(key); return; } @@ -181,7 +181,7 @@ public class AgentOrchestrator { logger.info("Killing spawner with key {} as all files were transferred and the agent" + " is inactive for {} seconds", key, SPAWNER_MAX_IDLE_SECONDS); - metadata.spawner.terminate(); + metadata.spawner.terminate(false); launchedSpawnersMap.remove(key); } } diff --git a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentSpawner.java b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentSpawner.java index a8a733a..3dadf4d 100644 --- a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentSpawner.java +++ b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/AgentSpawner.java @@ -33,7 +33,7 @@ public abstract class AgentSpawner { public abstract void launch(); public abstract Future<String> getLaunchState(); - public abstract void terminate(); + public abstract void terminate(boolean failed); public abstract Future<Boolean> getTerminateState(); } diff --git a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/EC2AgentSpawner.java b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/EC2AgentSpawner.java index 0ac8094..30cf81e 100644 --- a/controller/src/main/java/org/apache/airavata/mft/controller/spawner/EC2AgentSpawner.java +++ b/controller/src/main/java/org/apache/airavata/mft/controller/spawner/EC2AgentSpawner.java @@ -23,6 +23,7 @@ import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; import com.amazonaws.services.ec2.model.*; +import com.amazonaws.services.lightsail.model.CreateInstanceSnapshotRequest; import org.apache.airavata.mft.agent.stub.SecretWrapper; import org.apache.airavata.mft.agent.stub.StorageWrapper; import org.slf4j.Logger; @@ -109,6 +110,20 @@ public class EC2AgentSpawner extends AgentSpawner { .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) .build(); + boolean preSavedImage = false; + DescribeImagesRequest describeImagesRequest = new DescribeImagesRequest().withFilters( + new ArrayList<>()); + describeImagesRequest.getFilters().add(new Filter().withName("name").withValues("mft-agent")); + DescribeImagesResult describeImagesResult = amazonEC2.describeImages( + describeImagesRequest); + List<Image> images = describeImagesResult.getImages(); + if (!images.isEmpty()) { + Image image = images.get(0); + imageId = image.getImageId(); + preSavedImage = true; + logger.info("Using already created image {}", imageId); + } + DescribeSecurityGroupsRequest desSecGrp = new DescribeSecurityGroupsRequest(); DescribeSecurityGroupsResult describeSecurityGroupsResult = amazonEC2.describeSecurityGroups(desSecGrp); List<SecurityGroup> securityGroups = describeSecurityGroupsResult.getSecurityGroups(); @@ -178,14 +193,15 @@ public class EC2AgentSpawner extends AgentSpawner { RunInstancesRequest runInstancesRequest = new RunInstancesRequest(); runInstancesRequest.withImageId(imageId) - .withInstanceType(InstanceType.T1Micro) + .withInstanceType(InstanceType.T1Micro) // TODO Externalize .withMinCount(1) .withMaxCount(1) .withKeyName(keyName) .withTagSpecifications( new TagSpecification().withResourceType(ResourceType.Instance) .withTags(new Tag().withKey("Type").withValue("MFT-Agent"), - new Tag().withKey("AgentId").withValue(agentId))) + new Tag().withKey("AgentId").withValue(agentId), + new Tag().withKey("Name").withValue("MFT-Agent"))) .withSecurityGroups(secGroupName); @@ -225,23 +241,25 @@ public class EC2AgentSpawner extends AgentSpawner { Path.of(mftKeyDir, keyName).toAbsolutePath().toString(), systemUser); logger.info("Created SSH Connection. Installing dependencies..."); - int exeCode = sshProvider.runCommand("sudo apt update -y"); - if (exeCode != 0) - throw new IOException("Failed to update apt for VM"); - exeCode = sshProvider.runCommand("sudo apt install -y openjdk-11-jre-headless"); - if (exeCode != 0) - throw new IOException("Failed to install jdk on new VM"); - exeCode = sshProvider.runCommand("sudo apt install -y unzip"); - if (exeCode != 0) - throw new IOException("Failed to install unzip on new VM"); - exeCode = sshProvider.runCommand("wget https://github.com/apache/airavata-mft/releases/download/v0.0.1/MFT-Agent-0.01-bin.zip"); - if (exeCode != 0) - throw new IOException("Failed to download mft distribution"); - exeCode = sshProvider.runCommand("unzip MFT-Agent-0.01-bin.zip"); - if (exeCode != 0) - throw new IOException("Failed to unzip mft distribution"); + if (! preSavedImage) { + int exeCode = sshProvider.runCommand("sudo apt update -y"); + if (exeCode != 0) + throw new IOException("Failed to update apt for VM"); + exeCode = sshProvider.runCommand("sudo apt install -y openjdk-11-jre-headless"); + if (exeCode != 0) + throw new IOException("Failed to install jdk on new VM"); + exeCode = sshProvider.runCommand("sudo apt install -y unzip"); + if (exeCode != 0) + throw new IOException("Failed to install unzip on new VM"); + exeCode = sshProvider.runCommand("wget https://github.com/apache/airavata-mft/releases/download/v0.0.1/MFT-Agent-0.01-bin.zip"); + if (exeCode != 0) + throw new IOException("Failed to download mft distribution"); + exeCode = sshProvider.runCommand("unzip MFT-Agent-0.01-bin.zip"); + if (exeCode != 0) + throw new IOException("Failed to unzip mft distribution"); + } - exeCode = sshProvider.runCommand("sed -ir \"s/^[#]*\\s*agent.id=.*/agent.id=" + agentId + "/\" /home/ubuntu/MFT-Agent-0.01/conf/application.properties"); + int exeCode = sshProvider.runCommand("sed -ir \"s/^[#]*\\s*agent.id=.*/agent.id=" + agentId + "/\" /home/ubuntu/MFT-Agent-0.01/conf/application.properties"); if (exeCode != 0) throw new IOException("Failed to update agent id in config file"); @@ -279,7 +297,7 @@ public class EC2AgentSpawner extends AgentSpawner { } @Override - public void terminate() { + public void terminate(boolean failed) { terminateFuture = executor.submit(() -> { @@ -295,6 +313,13 @@ public class EC2AgentSpawner extends AgentSpawner { .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) .build(); + /*logger.info("Creating AMI for MFT Agent"); + CreateImageRequest createImageRequest = new CreateImageRequest().withName("mft-agent") + .withDescription("AMI For MFT Agent").withInstanceId(instanceId).withNoReboot(true) + .withBlockDeviceMappings(new BlockDeviceMapping().withEbs(new EbsBlockDevice())); + CreateImageResult imageCreateResult = amazonEC2.createImage(createImageRequest); + logger.info("Created AMI {} for instance {}", imageCreateResult.getImageId(), instanceId); + */ if (portForwardLock != null) { portForwardLock.countDown(); }
