1# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/ 2# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. 3# All Rights Reserved 4# 5# Permission is hereby granted, free of charge, to any person obtaining a 6# copy of this software and associated documentation files (the 7# "Software"), to deal in the Software without restriction, including 8# without limitation the rights to use, copy, modify, merge, publish, dis- 9# tribute, sublicense, and/or sell copies of the Software, and to permit 10# persons to whom the Software is furnished to do so, subject to the fol- 11# lowing conditions: 12# 13# The above copyright notice and this permission notice shall be included 14# in all copies or substantial portions of the Software. 15# 16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 18# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22# IN THE SOFTWARE. 23 24from boto.ec2.instancestatus import Status, Details 25 26 27class Event(object): 28 """ 29 A status event for an instance. 30 31 :ivar type: The type of the event. 32 :ivar id: The ID of the event. 33 :ivar description: A string describing the reason for the event. 34 :ivar not_before: A datestring describing the earliest time for 35 the event. 36 :ivar not_after: A datestring describing the latest time for 37 the event. 38 """ 39 40 def __init__(self, type=None, id=None, description=None, 41 not_before=None, not_after=None): 42 self.type = type 43 self.id = id 44 self.description = description 45 self.not_before = not_before 46 self.not_after = not_after 47 48 def __repr__(self): 49 return 'Event:%s' % self.type 50 51 def startElement(self, name, attrs, connection): 52 return None 53 54 def endElement(self, name, value, connection): 55 if name == 'eventType': 56 self.type = value 57 elif name == 'eventId': 58 self.id = value 59 elif name == 'description': 60 self.description = value 61 elif name == 'notBefore': 62 self.not_before = value 63 elif name == 'notAfter': 64 self.not_after = value 65 else: 66 setattr(self, name, value) 67 68 69class EventSet(list): 70 71 def startElement(self, name, attrs, connection): 72 if name == 'item': 73 event = Event() 74 self.append(event) 75 return event 76 else: 77 return None 78 79 def endElement(self, name, value, connection): 80 setattr(self, name, value) 81 82 83class Action(object): 84 """ 85 An action for an instance. 86 87 :ivar code: The code for the type of the action. 88 :ivar id: The ID of the event. 89 :ivar type: The type of the event. 90 :ivar description: A description of the action. 91 """ 92 93 def __init__(self, code=None, id=None, description=None, type=None): 94 self.code = code 95 self.id = id 96 self.type = type 97 self.description = description 98 99 def __repr__(self): 100 return 'Action:%s' % self.code 101 102 def startElement(self, name, attrs, connection): 103 return None 104 105 def endElement(self, name, value, connection): 106 if name == 'eventType': 107 self.type = value 108 elif name == 'eventId': 109 self.id = value 110 elif name == 'description': 111 self.description = value 112 elif name == 'code': 113 self.code = value 114 else: 115 setattr(self, name, value) 116 117 118class ActionSet(list): 119 120 def startElement(self, name, attrs, connection): 121 if name == 'item': 122 action = Action() 123 self.append(action) 124 return action 125 else: 126 return None 127 128 def endElement(self, name, value, connection): 129 setattr(self, name, value) 130 131 132class VolumeStatus(object): 133 """ 134 Represents an EC2 Volume status as reported by 135 DescribeVolumeStatus request. 136 137 :ivar id: The volume identifier. 138 :ivar zone: The availability zone of the volume 139 :ivar volume_status: A Status object that reports impaired 140 functionality that arises from problems internal to the instance. 141 :ivar events: A list of events relevant to the instance. 142 :ivar actions: A list of events relevant to the instance. 143 """ 144 145 def __init__(self, id=None, zone=None): 146 self.id = id 147 self.zone = zone 148 self.volume_status = Status() 149 self.events = None 150 self.actions = None 151 152 def __repr__(self): 153 return 'VolumeStatus:%s' % self.id 154 155 def startElement(self, name, attrs, connection): 156 if name == 'eventsSet': 157 self.events = EventSet() 158 return self.events 159 elif name == 'actionsSet': 160 self.actions = ActionSet() 161 return self.actions 162 elif name == 'volumeStatus': 163 return self.volume_status 164 else: 165 return None 166 167 def endElement(self, name, value, connection): 168 if name == 'volumeId': 169 self.id = value 170 elif name == 'availabilityZone': 171 self.zone = value 172 else: 173 setattr(self, name, value) 174 175 176class VolumeStatusSet(list): 177 """ 178 A list object that contains the results of a call to 179 DescribeVolumeStatus request. Each element of the 180 list will be an VolumeStatus object. 181 182 :ivar next_token: If the response was truncated by 183 the EC2 service, the next_token attribute of the 184 object will contain the string that needs to be 185 passed in to the next request to retrieve the next 186 set of results. 187 """ 188 189 def __init__(self, connection=None): 190 list.__init__(self) 191 self.connection = connection 192 self.next_token = None 193 194 def startElement(self, name, attrs, connection): 195 if name == 'item': 196 status = VolumeStatus() 197 self.append(status) 198 return status 199 else: 200 return None 201 202 def endElement(self, name, value, connection): 203 if name == 'NextToken': 204 self.next_token = value 205 setattr(self, name, value) 206