-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathimport_ec2.py
123 lines (101 loc) · 4.24 KB
/
import_ec2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env/python
import boto3
import translators.ec2_translator
import translators.placement_translator
import itglue
import itglue_adapter
from multiprocessing import Process
import argparse
class EC2ImportError(Exception):
pass
def import_ec2_instances(organization, import_locations=True, instance_id=None):
ec2_type = itglue.ConfigurationType.first_or_create(name='EC2')
active_status, inactive_status = itglue_adapter.get_or_create_config_statuses()
# create a list to keep all processes
processes = []
instance_attributes = {
'organization': organization,
'conf_type': ec2_type
}
if instance_id:
instance = get_instances(instance_id)
instance_kwargs = configure_instance(instance, import_locations, organization.id, active_status, inactive_status, instance_attributes)
update_configuration_and_interfaces(instance, **instance_kwargs)
else:
instances = get_instances()
for instance in instances:
instance_kwargs = configure_instance(instance, import_locations, organization.id, active_status, inactive_status, instance_attributes)
process = Process(target=update_configuration_and_interfaces, args=(instance,), kwargs=instance_kwargs)
processes.append(process)
itglue_adapter.batch_start_processes(processes)
def get_instances(instance_id=None):
ec2 = boto3.resource('ec2')
if instance_id:
instance = ec2.Instance(instance_id)
return instance
return ec2.instances.all()
def configure_instance(instance, import_locations, organization_id, active_status, inactive_status, instance_attributes):
instance_attributes['translated_instance'] = translate_instances(instance, active_status, inactive_status)
if import_locations:
location_attributes = translators.placement_translator.PlacementTranslator(instance.placement).translated
location_attributes['organization_id'] = organization_id
location = itglue.Location.first_or_create(parent=instance_attributes['organization'], **location_attributes)
instance_attributes['location'] = location
return instance_attributes
def update_configuration_and_interfaces(instance, organization, translated_instance, conf_type, location=None):
configuration = itglue_adapter.update_or_create_configuration(
resource=translated_instance,
location=location,
organization=organization,
conf_type=conf_type
)
for interface in instance.network_interfaces:
primary = instance.private_ip_address == interface.private_ip_address
itglue_adapter.update_or_create_config_interface(interface, configuration, primary=primary)
def translate_instances(instance, active_status, inactive_status):
translated_instance = translators.ec2_translator.EC2Translator(
instance,
active_status_id=active_status.id,
inactive_status_id=inactive_status.id
)
return translated_instance.translated
# Command-line functions
def main():
args = get_args()
import_locations = args.import_locations
id = args.instance_id
if args.add_all and id:
id = None
organization = itglue_adapter.get_organization(args.organization)
import_ec2_instances(organization, import_locations=import_locations, instance_id=id)
return True
def get_args():
parser = argparse.ArgumentParser(
description='Import EC2 instances as Configurations into an IT Glue Organization')
parser.add_argument(
'organization',
metavar='ORG_ID_OR_NAME',
type=str,
help='The ID or NAME of the parent organization'
)
parser.add_argument(
'-il', '--import-locations',
action='store_true',
help='Import EC2 placements as IT Glue Locations'
)
parser.add_argument(
'-id', '--instance-id',
type=str,
help='ID of the instance to be created'
)
parser.add_argument(
'--add-all',
action='store_true',
help='add all the ec2 instances, will override instance_id'
)
args = parser.parse_args()
if not args.add_all and not args.instance_id:
parser.error('Must provide an instance ID or turn on --add-all flag')
return args
if __name__ == "__main__":
main()