OLD | NEW |
1 # Copyright (c) 2009 Reza Lotun http://reza.lotun.name/ | 1 # Copyright (c) 2009 Reza Lotun http://reza.lotun.name/ |
2 # | 2 # |
3 # Permission is hereby granted, free of charge, to any person obtaining a | 3 # Permission is hereby granted, free of charge, to any person obtaining a |
4 # copy of this software and associated documentation files (the | 4 # copy of this software and associated documentation files (the |
5 # "Software"), to deal in the Software without restriction, including | 5 # "Software"), to deal in the Software without restriction, including |
6 # without limitation the rights to use, copy, modify, merge, publish, dis- | 6 # without limitation the rights to use, copy, modify, merge, publish, dis- |
7 # tribute, sublicense, and/or sell copies of the Software, and to permit | 7 # tribute, sublicense, and/or sell copies of the Software, and to permit |
8 # persons to whom the Software is furnished to do so, subject to the fol- | 8 # persons to whom the Software is furnished to do so, subject to the fol- |
9 # lowing conditions: | 9 # lowing conditions: |
10 # | 10 # |
11 # The above copyright notice and this permission notice shall be included | 11 # The above copyright notice and this permission notice shall be included |
12 # in all copies or substantial portions of the Software. | 12 # in all copies or substantial portions of the Software. |
13 # | 13 # |
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | 15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | 16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | 17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
20 # IN THE SOFTWARE. | 20 # IN THE SOFTWARE. |
21 | 21 |
22 | 22 |
23 from boto.ec2.autoscale.request import Request | 23 from datetime import datetime |
| 24 import base64 |
| 25 from boto.resultset import ResultSet |
24 from boto.ec2.elb.listelement import ListElement | 26 from boto.ec2.elb.listelement import ListElement |
25 | 27 |
| 28 # this should use the corresponding object from boto.ec2 |
| 29 class Ebs(object): |
| 30 def __init__(self, connection=None, snapshot_id=None, volume_size=None): |
| 31 self.connection = connection |
| 32 self.snapshot_id = snapshot_id |
| 33 self.volume_size = volume_size |
| 34 |
| 35 def __repr__(self): |
| 36 return 'Ebs(%s, %s)' % (self.snapshot_id, self.volume_size) |
| 37 |
| 38 def startElement(self, name, attrs, connection): |
| 39 pass |
| 40 |
| 41 def endElement(self, name, value, connection): |
| 42 if name == 'SnapshotId': |
| 43 self.snapshot_id = value |
| 44 elif name == 'VolumeSize': |
| 45 self.volume_size = value |
| 46 |
| 47 |
| 48 class InstanceMonitoring(object): |
| 49 def __init__(self, connection=None, enabled='false'): |
| 50 self.connection = connection |
| 51 self.enabled = enabled |
| 52 |
| 53 def __repr__(self): |
| 54 return 'InstanceMonitoring(%s)' % self.enabled |
| 55 |
| 56 def startElement(self, name, attrs, connection): |
| 57 pass |
| 58 |
| 59 def endElement(self, name, value, connection): |
| 60 if name == 'Enabled': |
| 61 self.enabled = value |
| 62 |
| 63 |
| 64 # this should use the BlockDeviceMapping from boto.ec2.blockdevicemapping |
| 65 class BlockDeviceMapping(object): |
| 66 def __init__(self, connection=None, device_name=None, virtual_name=None): |
| 67 self.connection = connection |
| 68 self.device_name = None |
| 69 self.virtual_name = None |
| 70 self.ebs = None |
| 71 |
| 72 def __repr__(self): |
| 73 return 'BlockDeviceMapping(%s, %s)' % (self.device_name, self.virtual_na
me) |
| 74 |
| 75 def startElement(self, name, attrs, connection): |
| 76 if name == 'Ebs': |
| 77 self.ebs = Ebs(self) |
| 78 return self.ebs |
| 79 |
| 80 def endElement(self, name, value, connection): |
| 81 if name == 'DeviceName': |
| 82 self.device_name = value |
| 83 elif name == 'VirtualName': |
| 84 self.virtual_name = value |
| 85 |
26 | 86 |
27 class LaunchConfiguration(object): | 87 class LaunchConfiguration(object): |
28 def __init__(self, connection=None, name=None, image_id=None, | 88 def __init__(self, connection=None, name=None, image_id=None, |
29 key_name=None, security_groups=None, user_data=None, | 89 key_name=None, security_groups=None, user_data=None, |
30 instance_type='m1.small', kernel_id=None, | 90 instance_type='m1.small', kernel_id=None, |
31 ramdisk_id=None, block_device_mappings=None): | 91 ramdisk_id=None, block_device_mappings=None, |
| 92 instance_monitoring=False): |
32 """ | 93 """ |
33 A launch configuration. | 94 A launch configuration. |
34 | 95 |
35 :type name: str | 96 :type name: str |
36 :param name: Name of the launch configuration to create. | 97 :param name: Name of the launch configuration to create. |
37 | 98 |
38 :type image_id: str | 99 :type image_id: str |
39 :param image_id: Unique ID of the Amazon Machine Image (AMI) which was | 100 :param image_id: Unique ID of the Amazon Machine Image (AMI) which was |
40 assigned during registration. | 101 assigned during registration. |
41 | 102 |
42 :type key_name: str | 103 :type key_name: str |
43 :param key_name: The name of the EC2 key pair. | 104 :param key_name: The name of the EC2 key pair. |
44 | 105 |
45 :type security_groups: list | 106 :type security_groups: list |
46 :param security_groups: Names of the security groups with which to | 107 :param security_groups: Names of the security groups with which to |
47 associate the EC2 instances. | 108 associate the EC2 instances. |
48 | 109 |
| 110 :type user_data: str |
| 111 :param user_data: The user data available to launched EC2 instances. |
| 112 |
| 113 :type instance_type: str |
| 114 :param instance_type: The instance type |
| 115 |
| 116 :type kern_id: str |
| 117 :param kern_id: Kernel id for instance |
| 118 |
| 119 :type ramdisk_id: str |
| 120 :param ramdisk_id: RAM disk id for instance |
| 121 |
| 122 :type block_device_mappings: list |
| 123 :param block_device_mappings: Specifies how block devices are exposed |
| 124 for instances |
| 125 |
| 126 :type instance_monitoring: bool |
| 127 :param instance_monitoring: Whether instances in group are launched |
| 128 with detailed monitoring. |
49 """ | 129 """ |
50 self.connection = connection | 130 self.connection = connection |
51 self.name = name | 131 self.name = name |
52 self.instance_type = instance_type | 132 self.instance_type = instance_type |
53 self.block_device_mappings = block_device_mappings | 133 self.block_device_mappings = block_device_mappings |
54 self.key_name = key_name | 134 self.key_name = key_name |
55 sec_groups = security_groups or [] | 135 sec_groups = security_groups or [] |
56 self.security_groups = ListElement(sec_groups) | 136 self.security_groups = ListElement(sec_groups) |
57 self.image_id = image_id | 137 self.image_id = image_id |
58 self.ramdisk_id = ramdisk_id | 138 self.ramdisk_id = ramdisk_id |
59 self.created_time = None | 139 self.created_time = None |
60 self.kernel_id = kernel_id | 140 self.kernel_id = kernel_id |
61 self.user_data = user_data | 141 self.user_data = user_data |
62 self.created_time = None | 142 self.created_time = None |
| 143 self.instance_monitoring = instance_monitoring |
| 144 self.launch_configuration_arn = None |
63 | 145 |
64 def __repr__(self): | 146 def __repr__(self): |
65 return 'LaunchConfiguration:%s' % self.name | 147 return 'LaunchConfiguration:%s' % self.name |
66 | 148 |
67 def startElement(self, name, attrs, connection): | 149 def startElement(self, name, attrs, connection): |
68 if name == 'SecurityGroups': | 150 if name == 'SecurityGroups': |
69 return self.security_groups | 151 return self.security_groups |
70 else: | 152 elif name == 'BlockDeviceMappings': |
71 return | 153 self.block_device_mappings = ResultSet([('member', BlockDeviceMappin
g)]) |
| 154 return self.block_device_mappings |
| 155 elif name == 'InstanceMonitoring': |
| 156 self.instance_monitoring = InstanceMonitoring(self) |
| 157 return self.instance_monitoring |
72 | 158 |
73 def endElement(self, name, value, connection): | 159 def endElement(self, name, value, connection): |
74 if name == 'InstanceType': | 160 if name == 'InstanceType': |
75 self.instance_type = value | 161 self.instance_type = value |
76 elif name == 'LaunchConfigurationName': | 162 elif name == 'LaunchConfigurationName': |
77 self.name = value | 163 self.name = value |
78 elif name == 'KeyName': | 164 elif name == 'KeyName': |
79 self.key_name = value | 165 self.key_name = value |
80 elif name == 'ImageId': | 166 elif name == 'ImageId': |
81 self.image_id = value | 167 self.image_id = value |
82 elif name == 'CreatedTime': | 168 elif name == 'CreatedTime': |
83 self.created_time = value | 169 try: |
| 170 self.created_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.
%fZ') |
| 171 except ValueError: |
| 172 self.created_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ
') |
84 elif name == 'KernelId': | 173 elif name == 'KernelId': |
85 self.kernel_id = value | 174 self.kernel_id = value |
86 elif name == 'RamdiskId': | 175 elif name == 'RamdiskId': |
87 self.ramdisk_id = value | 176 self.ramdisk_id = value |
88 elif name == 'UserData': | 177 elif name == 'UserData': |
89 self.user_data = value | 178 self.user_data = base64.b64decode(value) |
| 179 elif name == 'LaunchConfigurationARN': |
| 180 self.launch_configuration_arn = value |
| 181 elif name == 'InstanceMonitoring': |
| 182 self.instance_monitoring = value |
90 else: | 183 else: |
91 setattr(self, name, value) | 184 setattr(self, name, value) |
92 | 185 |
93 def delete(self): | 186 def delete(self): |
94 """ Delete this launch configuration. """ | 187 """ Delete this launch configuration. """ |
95 params = {'LaunchConfigurationName' : self.name} | 188 return self.connection.delete_launch_configuration(self.name) |
96 return self.connection.get_object('DeleteLaunchConfiguration', params, | |
97 Request) | |
98 | 189 |
OLD | NEW |