import xmlrpclib
+import functools
+import socket
+
+def _retry(fn):
+ def rv(*p, **kw):
+ for x in xrange(3):
+ try:
+ return fn(*p, **kw)
+ except (socket.error, IOError, OSError):
+ pass
+ else:
+ return fn (*p, **kw)
+ return rv
class PLCAPI(object):
_expected_methods = set(
import warnings
# validate XMLRPC server checking supported API calls
- methods = set(self.api.system.listMethods())
+ methods = set(_retry(self.api.system.listMethods)())
if self._required_methods - methods:
warnings.warn("Unsupported REQUIRED methods: %s" % ( ", ".join(sorted(self._required_methods - methods)), ) )
return False
try:
# test authorization
- network_types = self.api.GetNetworkTypes(self.auth)
+ network_types = _retry(self.api.GetNetworkTypes)(self.auth)
except (xmlrpclib.ProtocolError, xmlrpclib.Fault),e:
warnings.warn(str(e))
try:
return self._network_types
except AttributeError:
- self._network_types = self.api.GetNetworkTypes(self.auth)
+ self._network_types = _retry(self.api.GetNetworkTypes)(self.auth)
return self._network_types
@property
try:
return self._peer_map
except AttributeError:
- peers = self.api.GetPeers(self.auth, {}, ['shortname','peername','peer_id'])
+ peers = _retry(self.api.GetPeers)(self.auth, {}, ['shortname','peername','peer_id'])
self._peer_map = dict(
(peer['shortname'], peer['peer_id'])
for peer in peers
"""
if not isinstance(node, (str, int, long)):
raise ValueError, "Node must be either a non-unicode string or an int"
- return self.api.GetNodeFlavour(self.auth, node)
+ return _retry(self.api.GetNodeFlavour)(self.auth, node)
def GetNodes(self, nodeIdOrName=None, fields=None, **kw):
"""
else:
fieldstuple = ()
if nodeIdOrName is not None:
- return self.api.GetNodes(self.auth, nodeIdOrName, *fieldstuple)
+ return _retry(self.api.GetNodes)(self.auth, nodeIdOrName, *fieldstuple)
else:
filters = kw.pop('filters',{})
filters['peer_id'] = peer_filter
filters.update(kw)
- return self.api.GetNodes(self.auth, filters, *fieldstuple)
+ return _retry(self.api.GetNodes)(self.auth, filters, *fieldstuple)
def GetNodeTags(self, nodeTagId=None, fields=None, **kw):
if fields is not None:
else:
fieldstuple = ()
if nodeTagId is not None:
- return self.api.GetNodeTags(self.auth, nodeTagId, *fieldstuple)
+ return _retry(self.api.GetNodeTags)(self.auth, nodeTagId, *fieldstuple)
else:
filters = kw.pop('filters',{})
filters.update(kw)
- return self.api.GetNodeTags(self.auth, filters, *fieldstuple)
+ return _retry(self.api.GetNodeTags)(self.auth, filters, *fieldstuple)
def GetSliceTags(self, sliceTagId=None, fields=None, **kw):
if fields is not None:
else:
fieldstuple = ()
if sliceTagId is not None:
- return self.api.GetSliceTags(self.auth, sliceTagId, *fieldstuple)
+ return _retry(self.api.GetSliceTags)(self.auth, sliceTagId, *fieldstuple)
else:
filters = kw.pop('filters',{})
filters.update(kw)
- return self.api.GetSliceTags(self.auth, filters, *fieldstuple)
+ return _retry(self.api.GetSliceTags)(self.auth, filters, *fieldstuple)
def GetInterfaces(self, interfaceIdOrIp=None, fields=None, **kw):
else:
fieldstuple = ()
if interfaceIdOrIp is not None:
- return self.api.GetInterfaces(self.auth, interfaceIdOrIp, *fieldstuple)
+ return _retry(self.api.GetInterfaces)(self.auth, interfaceIdOrIp, *fieldstuple)
else:
filters = kw.pop('filters',{})
filters.update(kw)
- return self.api.GetInterfaces(self.auth, filters, *fieldstuple)
+ return _retry(self.api.GetInterfaces)(self.auth, filters, *fieldstuple)
def GetSlices(self, sliceIdOrName=None, fields=None, **kw):
if fields is not None:
else:
fieldstuple = ()
if sliceIdOrName is not None:
- return self.api.GetSlices(self.auth, sliceIdOrName, *fieldstuple)
+ return _retry(self.api.GetSlices)(self.auth, sliceIdOrName, *fieldstuple)
else:
filters = kw.pop('filters',{})
filters.update(kw)
- return self.api.GetSlices(self.auth, filters, *fieldstuple)
+ return _retry(self.api.GetSlices)(self.auth, filters, *fieldstuple)
def UpdateSlice(self, sliceIdOrName, **kw):
- return self.api.UpdateSlice(self.auth, sliceIdOrName, kw)
+ return _retry(self.api.UpdateSlice)(self.auth, sliceIdOrName, kw)