[ https://issues.apache.org/jira/browse/LIBCLOUD-705?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14546486#comment-14546486 ]
Samuel Marks commented on LIBCLOUD-705: --------------------------------------- Sounds good to me. In the meantime I've hacked together a solution to turn the Node into a dictionary (for JSON): ``` from types import (DictType, ListType, TupleType, BooleanType, FloatType, StringType, UnicodeType, IntType, NoneType, LongType, MethodType, ClassType) # Types which can be easily serialised normal_types = (DictType, ListType, TupleType, BooleanType, FloatType, StringType, UnicodeType, IntType, NoneType, LongType) def is_instance_method(obj): """Checks if an object is a bound method on an instance. From: http://stackoverflow.com/a/1260881 """ if not isinstance(obj, MethodType): return False # Not a method if obj.im_self is None: return False # Method is not bound if issubclass(obj.im_class, type) or obj.im_class is ClassType: return False # Method is a classmethod return True node_to_dict = lambda node: { attr: {'driver': (lambda s: s[s.find("'") + 1:s.rfind("'")])(str(type(getattr(node, attr)))), 'extra': _extra_to_dict(getattr(node, attr))}.get(attr, getattr(node, attr)) for attr in dir(node) if not attr.startswith('_') and not is_instance_method(getattr(node, attr)) } def _extra_to_dict(extra): extra = { attr: getattr(extra, attr) for attr in dir(extra) if not attr.startswith('_') and not is_instance_method(getattr(extra, attr)) and type(getattr(extra, attr)) in normal_types } for key in ('secret', 'key'): extra.pop(key, None) if 'network_interfaces' in extra: extra['network_interfaces'] = [{'name': interface.name, 'id': interface.id} for interface in extra['network_interfaces']] return extra ``` > Pickling of Nodes isn't supported - TypeError: a class that defines __slots__ > without defining __getstate__ cannot be pickled > ----------------------------------------------------------------------------------------------------------------------------- > > Key: LIBCLOUD-705 > URL: https://issues.apache.org/jira/browse/LIBCLOUD-705 > Project: Libcloud > Issue Type: Wish > Components: Compute > Reporter: Samuel Marks > Labels: features > > TypeError: a class that defines __slots__ without defining __getstate__ > cannot be pickled. > Class is libcloud.compute.base.Node. > Use case: pushing nodes created in libcloud into a queue for processing with > other tools -- This message was sent by Atlassian JIRA (v6.3.4#6332)