def list_sizes(self, location=None):
        """
        Eucalyptus 2 specific implementation of list_sizes.
        """
        params = {'Action' : 'DescribeAvailabilityZones',
                  'ZoneName.1' : 'verbose'}
        element = self.connection.request(self.path, params).object
        sizes = self._to_sizes(element)
        return sizes

    def _to_sizes(self, element):
        """
        Create a NodeSize object given a libcloud XML element.
        Extra information is available in nodesize.extra dictionary.
        """
        # elem_sizes = element/availabilityZoneInfo/item.
        # elem_sizes[0]  == zone and ip
        # elem_sizes[1]  == column descriptors
        # elem_sizes[2]+ == occupancy and type information.
        elem_sizes = findall(element=element, xpath='availabilityZoneInfo/item', namespace=NAMESPACE)[2:]
        sizes = []
        attributes = {}
        for s in elem_sizes:
            pieces = re.findall(r'\w+|!/', s[1].text)
            # expected format of pieces is
            # ['0058', '0215', '2', '4096', '10']
            # ['remaining', 'total', 'cpu', 'ram', 'disk']
            id = s[0].text.split()[1]
            size_info = {'id': id,
                         'name': id,
                         'ram': int(pieces[3]),
                         'disk': int(pieces[4]),
                         'bandwidth': 0,
                         'price': 0}
            node_size = NodeSize(driver=self, **size_info)
            node_size.extra = { 'cpu' : int(pieces[2]),
                                'occupancy': {'remaining': int(pieces[0]),
                                              'total': int(pieces[1])}}
            sizes.append(node_size)
        return sizes

Generated by jmatt using scpaste at Mon Jan 28 23:13:45 2013. Thanks Phil! MST. (original)