diff --git a/python-boto-2.5.2-statechg.patch b/python-boto-2.5.2-statechg.patch new file mode 100644 index 0000000..cec046e --- /dev/null +++ b/python-boto-2.5.2-statechg.patch @@ -0,0 +1,197 @@ +Index: boto/boto/ec2/instance.py +=================================================================== +--- boto.orig/boto/ec2/instance.py ++++ boto/boto/ec2/instance.py +@@ -15,7 +15,7 @@ + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- + # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + # IN THE SOFTWARE. +@@ -33,6 +33,29 @@ from boto.ec2.networkinterface import Ne + from boto.ec2.group import Group + import base64 + ++ ++class InstanceState(object): ++ """ ++ """ ++ def __init__(self, code=0, name=None): ++ self.code = code ++ self.name = name ++ ++ def __repr__(self): ++ return '%s(%d)' % (self.name, self.code) ++ ++ def startElement(self, name, attrs, connection): ++ pass ++ ++ def endElement(self, name, value, connection): ++ if name == 'code': ++ self.code = int(value) ++ elif name == 'name': ++ self.name = value ++ else: ++ setattr(self, name, value) ++ ++ + class Reservation(EC2Object): + """ + Represents a Reservation response object. +@@ -44,7 +67,6 @@ class Reservation(EC2Object): + :ivar instances: A list of Instance objects launched in this + Reservation. + """ +- + def __init__(self, connection=None): + EC2Object.__init__(self, connection) + self.id = None +@@ -76,7 +98,8 @@ class Reservation(EC2Object): + def stop_all(self): + for instance in self.instances: + instance.stop() +- ++ ++ + class Instance(TaggedEC2Object): + """ + Represents an instance. +@@ -86,8 +109,13 @@ class Instance(TaggedEC2Object): + groups associated with the instance. + :ivar public_dns_name: The public dns name of the instance. + :ivar private_dns_name: The private dns name of the instance. +- :ivar state: The string representation of the instances current state. +- :ivar state_code: An integer representation of the instances current state. ++ :ivar state: The string representation of the instance's current state. ++ :ivar state_code: An integer representation of the instance's ++ current state. ++ :ivar previous_state: The string representation of the instance's ++ previous state. ++ :ivar previous_state_code: An integer representation of the ++ instance's current state. + :ivar key_name: The name of the SSH key associated with the instance. + :ivar instance_type: The type of instance (e.g. m1.small). + :ivar launch_time: The time the instance was launched. +@@ -116,18 +144,14 @@ class Instance(TaggedEC2Object): + :ivar interfaces: List of Elastic Network Interfaces associated with + this instance. + """ +- ++ + def __init__(self, connection=None): + TaggedEC2Object.__init__(self, connection) + self.id = None + self.dns_name = None + self.public_dns_name = None + self.private_dns_name = None +- self.state = None +- self.state_code = None + self.key_name = None +- self.shutdown_state = None +- self.previous_state = None + self.instance_type = None + self.launch_time = None + self.image_id = None +@@ -158,10 +182,32 @@ class Instance(TaggedEC2Object): + self.hypervisor = None + self.virtualization_type = None + self.architecture = None ++ self._previous_state = None ++ self._state = InstanceState() + + def __repr__(self): + return 'Instance:%s' % self.id + ++ @property ++ def state(self): ++ return self._state.name ++ ++ @property ++ def state_code(self): ++ return self._state.code ++ ++ @property ++ def previous_state(self): ++ if self._previous_state: ++ return self._previous_state.name ++ return None ++ ++ @property ++ def previous_state_code(self): ++ if self._previous_state: ++ return self._previous_state.code ++ return 0 ++ + def startElement(self, name, attrs, connection): + retval = TaggedEC2Object.startElement(self, name, attrs, connection) + if retval is not None: +@@ -187,6 +233,13 @@ class Instance(TaggedEC2Object): + elif name == 'iamInstanceProfile': + self.instance_profile = SubParse('iamInstanceProfile') + return self.instance_profile ++ elif name == 'currentState': ++ return self._state ++ elif name == 'previousState': ++ self._previous_state = InstanceState() ++ return self._previous_state ++ elif name == 'instanceState': ++ return self._state + return None + + def endElement(self, name, value, connection): +@@ -203,8 +256,6 @@ class Instance(TaggedEC2Object): + self.key_name = value + elif name == 'amiLaunchIndex': + self.ami_launch_index = value +- elif name == 'shutdownState': +- self.shutdown_state = value + elif name == 'previousState': + self.previous_state = value + elif name == 'name': +@@ -310,7 +361,7 @@ class Instance(TaggedEC2Object): + + :type force: bool + :param force: Forces the instance to stop +- ++ + :rtype: list + :return: A list of the instances stopped + """ +@@ -411,6 +462,7 @@ class Instance(TaggedEC2Object): + """ + return self.connection.reset_instance_attribute(self.id, attribute) + ++ + class ConsoleOutput: + + def __init__(self, parent=None): +@@ -432,10 +484,12 @@ class ConsoleOutput: + else: + setattr(self, name, value) + ++ + class InstanceAttribute(dict): + + ValidValues = ['instanceType', 'kernel', 'ramdisk', 'userData', +- 'disableApiTermination', 'instanceInitiatedShutdownBehavior', ++ 'disableApiTermination', ++ 'instanceInitiatedShutdownBehavior', + 'rootDeviceName', 'blockDeviceMapping', 'sourceDestCheck', + 'groupSet'] + +@@ -465,6 +519,7 @@ class InstanceAttribute(dict): + elif name in self.ValidValues: + self[name] = self._current_value + ++ + class SubParse(dict): + + def __init__(self, section, parent=None): +@@ -477,4 +532,3 @@ class SubParse(dict): + def endElement(self, name, value, connection): + if name != self.section: + self[name] = value +- diff --git a/python-boto.spec b/python-boto.spec index 0d74703..f59a8e0 100644 --- a/python-boto.spec +++ b/python-boto.spec @@ -2,7 +2,7 @@ Summary: A simple lightweight interface to Amazon Web Services Name: python-boto Version: 2.5.2 -Release: 2%{?dist} +Release: 3%{?dist} License: MIT Group: Development/Languages URL: https://github.com/boto/boto @@ -14,6 +14,9 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) # https://bugzilla.redhat.com/show_bug.cgi?id=838076 # Fixed with upstream commit 6870daf Patch1: python-boto-2.5.2-emptydata.patch +# https://github.com/boto/boto/issues/881 +# Fixed with upstream commit a23c379 +Patch2: python-boto-2.5.2-statechg.patch %description Boto is a Python package that provides interfaces to Amazon Web Services. @@ -25,6 +28,7 @@ use, lightweight wrapper around the Amazon services. %prep %setup -q -n boto-%{version} %patch1 -p1 +%patch2 -p1 %build %{__python} setup.py build @@ -59,6 +63,9 @@ rm -rf $RPM_BUILD_ROOT %{python_sitelib}/* %changelog +* Tue Jan 8 2013 Garrett Holmstrom - 2.5.2-3 +- Fixed parsing of current/previous instance state data (boto #881) + * Sat Jul 21 2012 Fedora Release Engineering - 2.5.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild