From 470e12c390a2b6e224c4f42a9eb4253d3b2a5dd4 Mon Sep 17 00:00:00 2001 From: zhanhugo Date: Mon, 30 Jan 2023 14:23:49 -0500 Subject: [PATCH 1/2] implemented in utils functions to check all existing instances and running instances --- fogros2/utils/check_running_instances.py | 27 +++++++++++++++++++ .../launch/talker.auto_aws.launch.py | 8 +++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 fogros2/utils/check_running_instances.py diff --git a/fogros2/utils/check_running_instances.py b/fogros2/utils/check_running_instances.py new file mode 100644 index 0000000..4a6cea5 --- /dev/null +++ b/fogros2/utils/check_running_instances.py @@ -0,0 +1,27 @@ +import jmespath +import boto3 +import configparser +import os + + +def get_all_instances(): + config = configparser.ConfigParser() + config.read(os.path.join(os.path.expanduser('~'), '.aws/credentials')) + ec2_client = boto3.client('ec2') + regions = [region['RegionName'] + for region in ec2_client.describe_regions()['Regions']] + + result = [] + for profile in config.sections(): + for region in regions: + current_session = boto3.Session(profile_name = profile, region_name = region) + client = current_session.client('ec2') + response = client.describe_instances() + output = jmespath.search("Reservations[].Instances[].[NetworkInterfaces[0].OwnerId, InstanceId, InstanceType, \ + State.Name, Placement.AvailabilityZone, PrivateIpAddress, PublicIpAddress, KeyName, [Tags[?Key=='Name'].Value] [0][0]]", response) + if output: result.append(output) + + return result + +def get_running_instances(): + return [[instance for instance in region if "running" in instance] for region in get_all_instances()] diff --git a/fogros2_examples/launch/talker.auto_aws.launch.py b/fogros2_examples/launch/talker.auto_aws.launch.py index aab47a5..498afc7 100644 --- a/fogros2_examples/launch/talker.auto_aws.launch.py +++ b/fogros2_examples/launch/talker.auto_aws.launch.py @@ -33,7 +33,7 @@ from launch_ros.actions import Node import fogros2 -from utils import region_ami_selection, ec2_instance_type_selection +from utils import region_ami_selection, ec2_instance_type_selection, check_running_instances def generic_ubuntu_ami(): @@ -57,6 +57,12 @@ def generate_launch_description(): ec2_instance_type = ec2_instance_type_selection.find_cheapest_ec2_instance_type(region) print(region, ami, ec2_instance_type) + + all_instances = check_running_instances.get_all_instances() + running_instances = check_running_instances.get_running_instances() + print("All instances: ", all_instances) + print("Running instances: ", running_instances) + machine1 = fogros2.AWSCloudInstance( region=region, ec2_instance_type=ec2_instance_type, ami_image=ami ) From e070e44011d58b5e43540041fa1219166fc9ecee Mon Sep 17 00:00:00 2001 From: zhanhugo Date: Mon, 30 Jan 2023 14:34:17 -0500 Subject: [PATCH 2/2] filter out non FogROS instances --- fogros2/utils/check_running_instances.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fogros2/utils/check_running_instances.py b/fogros2/utils/check_running_instances.py index 4a6cea5..c3742bf 100644 --- a/fogros2/utils/check_running_instances.py +++ b/fogros2/utils/check_running_instances.py @@ -19,8 +19,9 @@ def get_all_instances(): response = client.describe_instances() output = jmespath.search("Reservations[].Instances[].[NetworkInterfaces[0].OwnerId, InstanceId, InstanceType, \ State.Name, Placement.AvailabilityZone, PrivateIpAddress, PublicIpAddress, KeyName, [Tags[?Key=='Name'].Value] [0][0]]", response) - if output: result.append(output) - + if output and any("FogROS" in instance[7] for instance in output): + result.append(output) + return result def get_running_instances():