X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fplanetlab%2Fplcapi.py;h=42d652caf8c36b6ab63864e651079b4385b0d6ba;hb=3fe2e6f7812888dc1366915545dd2243ff6fb1bb;hp=4f4bf5cd519efdbbe914094c5d6a297a04a12095;hpb=2e80f0fafa0c2ef6a5f536efd4c868c91468f962;p=nepi.git diff --git a/src/nepi/resources/planetlab/plcapi.py b/src/nepi/resources/planetlab/plcapi.py index 4f4bf5cd..42d652ca 100644 --- a/src/nepi/resources/planetlab/plcapi.py +++ b/src/nepi/resources/planetlab/plcapi.py @@ -3,9 +3,8 @@ # Copyright (C) 2013 INRIA # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,11 +22,13 @@ import socket import os import time import threading -import xmlrpclib + +from six import integer_types, string_types +from six.moves import xmlrpc_client def _retry(fn): def rv(*p, **kw): - for x in xrange(5): + for x in range(5): try: return fn(*p, **kw) except (socket.error, IOError, OSError): @@ -157,15 +158,15 @@ class PLCAPI(object): self._url = urlpattern % {'hostname':hostname} if (proxy is not None): - import urllib2 - class HTTPSProxyTransport(xmlrpclib.Transport): + from six.moves.urllib import request as urllib_request + class HTTPSProxyTransport(xmlrpc_client.Transport): def __init__(self, proxy, use_datetime=0): - opener = urllib2.build_opener(urllib2.ProxyHandler({"https" : proxy})) - xmlrpclib.Transport.__init__(self, use_datetime) + opener = urllib_request.build_opener(urllib2.ProxyHandler({"https" : proxy})) + xmlrpc_client.Transport.__init__(self, use_datetime) self.opener = opener def request(self, host, handler, request_body, verbose=0): - req = urllib2.Request('https://%s%s' % (host, handler), request_body) + req = urllib_request.Request('https://%s%s' % (host, handler), request_body) req.add_header('User-agent', self.user_agent) self.verbose = verbose return self.parse_response(self.opener.open(req)) @@ -177,13 +178,13 @@ class PLCAPI(object): self.threadlocal = threading.local() # Load blacklist from file - if self._ecobj.get_global('PlanetlabNode', 'persist_blacklist'): + if self._ecobj.get_global('planetlab::Node', 'persist_blacklist'): self._set_blacklist() @property def api(self): # Cannot reuse same proxy in all threads, py2.7 is not threadsafe - return xmlrpclib.ServerProxy( + return xmlrcp_client.ServerProxy( self._url , transport = self._proxy_transport(), allow_none = True) @@ -213,7 +214,7 @@ class PLCAPI(object): try: # test authorization network_types = _retry(self.mcapi.GetNetworkTypes)(self.auth) - except (xmlrpclib.ProtocolError, xmlrpclib.Fault),e: + except (xmlrpc_client.ProtocolError, xmlrpc_client.Fault) as e: warnings.warn(str(e)) return True @@ -284,8 +285,8 @@ class PLCAPI(object): * nodefamily : string, the nodefamily this node should be based upon * plain : boolean, use plain bootstrapfs image if set (for tests) """ - if not isinstance(node, (str, int, long)): - raise ValueError, "Node must be either a non-unicode string or an int" + if not isinstance(node, integer_types + string_types): + raise ValueError("Node must be either a non-unicode string or an int") return _retry(self.mcapi.GetNodeFlavour)(self.auth, node) def get_nodes(self, node_id_or_name = None, fields = None, **kw): @@ -344,7 +345,7 @@ class PLCAPI(object): filters = filters, peer=None, **kw) ) else: - peer_filter = map(name_to_id, peer) + peer_filter = [name_to_id(x) for x in peer] elif peer is None or peer == self._local_peer: peer_filter = None @@ -433,7 +434,7 @@ class PLCAPI(object): return _retry(self.mcapi.DeleteSliceFromNodes)(self.auth, slice_id_or_name, node_id_or_hostname) def start_multicall(self): - self.threadlocal.mc = xmlrpclib.MultiCall(self.mcapi) + self.threadlocal.mc = xmlrpc_client.MultiCall(self.mcapi) def finish_multicall(self): mc = self.threadlocal.mc @@ -493,19 +494,24 @@ class PLCAPI(object): def release(self): self.count -= 1 - if self._ecobj.get_global('PlanetlabNode', 'persist_blacklist') and self.count == 0: - if self._blacklist: - to_blacklist = list() - hostnames = self.get_nodes(list(self._blacklist), ['hostname']) - for hostname in hostnames: - to_blacklist.append(hostname['hostname']) - - nepi_home = os.path.join(os.path.expanduser("~"), ".nepi") - plblacklist_file = os.path.join(nepi_home, "plblacklist.txt") - - with open(plblacklist_file, 'w') as f: - for host in to_blacklist: - f.write("%s\n" % host) + if self.count == 0: + blacklist = self._blacklist + self._blacklist = set() + self._reserved = set() + if self._ecobj.get_global('PlanetlabNode', 'persist_blacklist'): + if blacklist: + to_blacklist = list() + hostnames = self.get_nodes(list(blacklist), ['hostname']) + for hostname in hostnames: + to_blacklist.append(hostname['hostname']) + + nepi_home = os.path.join(os.path.expanduser("~"), ".nepi") + plblacklist_file = os.path.join(nepi_home, "plblacklist.txt") + + with open(plblacklist_file, 'w') as f: + for host in to_blacklist: + f.write("%s\n" % host) + class PLCAPIFactory(object): """