Changeset 1dcaff4


Ignore:
Timestamp:
Mar 18, 2010 8:35:10 AM (14 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-3.01, version-3.02
Children:
114d24b
Parents:
3159f5d
Message:

Improved SSL error handling (more try blocks, BIOError exception)
Separate get_url into util
Work with remote splitter.

Location:
fedd/federation
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/emulab_access.py

    r3159f5d r1dcaff4  
    13181318
    13191319    def StartSegment(self, req, fid):
    1320         def get_url(url, cf, destdir, fn=None):
    1321             po = urlparse(url)
    1322             if not fn:
    1323                 fn = po.path.rpartition('/')[2]
    1324             ok = False
    1325             retries = 0
    1326             while not ok and retries < 5:
    1327                 try:
    1328                     conn = httplib.HTTPSConnection(po.hostname, port=po.port,
    1329                             cert_file=cf, key_file=cf)
    1330                     conn.putrequest('GET', po.path)
    1331                     conn.endheaders()
    1332                     response = conn.getresponse()
    1333 
    1334                     lf = open("%s/%s" % (destdir, fn), "w")
    1335                     buf = response.read(4096)
    1336                     while buf:
    1337                         lf.write(buf)
    1338                         buf = response.read(4096)
    1339                     lf.close()
    1340                     ok = True
    1341                 except IOError, e:
    1342                     print e
    1343                     raise service_error(service_error.internal,
    1344                             "Error writing tempfile: %s" %e)
    1345                 except httplib.HTTPException, e:
    1346                     print e
    1347                     raise service_error(service_error.internal,
    1348                             "Error retrieving data: %s" % e)
    1349                 except SSLError, e:
    1350                     print "SSL error %s" %e
    1351                     retries += 1
    1352 
    1353             if retries > 5:
    1354                 raise service_error(service_error.internal,
    1355                         "Repeated SSL failures")
    13561320
    13571321        configs = set(('hosts', 'ssh_pubkey', 'ssh_secretkey'))
     
    13961360                for s in getattr(e, 'software', []):
    13971361                    sw.add(s.location)
    1398             if len(sw) > 0:
    1399                 os.mkdir(softdir)
     1362            os.mkdir(softdir)
    14001363            for s in sw:
    14011364                self.log.debug("Retrieving %s" % s)
    1402                 get_url(s, certfile, softdir)
     1365                try:
     1366                    get_url(s, certfile, softdir)
     1367                except:
     1368                    t, v, st = sys.exc_info()
     1369                    raise service_error(service_error.internal,
     1370                            "Error retrieving %s: %s" % (s, v))
    14031371
    14041372            # Copy local federation and portal node software to the tempdir
     
    14101378            for a in attrs:
    14111379                if a['attribute'] in configs:
    1412                     get_url(a['value'], certfile, tmpdir)
     1380                    try:
     1381                        get_url(a['value'], certfile, tmpdir)
     1382                    except:
     1383                        t, v, st = sys.exc_info()
     1384                        raise service_error(service_error.internal,
     1385                                "Error retrieving %s: %s" % (s, v))
    14131386                if a['attribute'] == 'ssh_pubkey':
    14141387                    pubkey_base = a['value'].rpartition('/')[2]
     
    14471420                                    "Cannot create temp file for " +
    14481421                                    "userconfig certificates: %s e")
     1422                        except:
     1423                            t, v, st = sys.exc_info()
     1424                            raise service_error(service_error.internal,
     1425                                    "Error retrieving %s: %s" % (s, v))
    14491426                        finally:
    14501427                            if tn: os.remove(tn)
  • fedd/federation/experiment_control.py

    r3159f5d r1dcaff4  
    936936        if r.has_key('Ns2SplitResponseBody'):
    937937            r = r['Ns2SplitResponseBody']
    938             if r.has_key('output'):
    939                 return r['output'].splitlines()
     938            ed = r.get('experimentdescription', None)
     939            if ed.has_key('topdldescription'):
     940                return topdl.Topology(**ed['topdldescription'])
    940941            else:
    941942                raise service_error(service_error.protocol,
     
    21162117                self.log.debug("Calling remote splitter at %s" % \
    21172118                        self.splitter_url)
    2118                 split_data = self.remote_splitter(self.splitter_url,
     2119                top = self.remote_splitter(self.splitter_url,
    21192120                        file_content, master)
    21202121            else:
     
    21332134                split_data = tclparser.stdout
    21342135
    2135             top = topdl.topology_from_xml(file=split_data, top="experiment")
     2136                top = topdl.topology_from_xml(file=split_data, top="experiment")
    21362137
    21372138            hosts, ip_allocator = self.allocate_ips_to_topo(top)
  • fedd/federation/protogeni_access.py

    r3159f5d r1dcaff4  
    253253                    (lineno, config))
    254254        f.close()
    255 
    256 # need this ?
    257     def get_users(self, obj):
    258         """
    259         Return a list of the IDs of the users in dict
    260         """
    261         if obj.has_key('user'):
    262             return [ unpack_id(u['userID']) \
    263                     for u in obj['user'] if u.has_key('userID') ]
    264         else:
    265             return None
    266 # need this ?
    267255
    268256    def write_state(self):
     
    899887
    900888    def StartSegment(self, req, fid):
    901         def get_url(url, cf, destdir, fn=None):
    902             po = urlparse(url)
    903             if not fn:
    904                 fn = po.path.rpartition('/')[2]
    905             retries = 0
    906             ok = False
    907             while not ok and retries < 5:
    908                 try:
    909                     conn = httplib.HTTPSConnection(po.hostname, port=po.port,
    910                             cert_file=cf, key_file=cf)
    911                     conn.putrequest('GET', po.path)
    912                     conn.endheaders()
    913                     response = conn.getresponse()
    914 
    915                     lf = open("%s/%s" % (destdir, fn), "w")
    916                     buf = response.read(4096)
    917                     while buf:
    918                         lf.write(buf)
    919                         buf = response.read(4096)
    920                     lf.close()
    921                     ok = True
    922                 except IOError, e:
    923                     print e
    924                     raise service_error(service_error.internal,
    925                             "Error writing tempfile: %s" %e)
    926                 except httplib.HTTPException, e:
    927                     print e
    928                     raise service_error(service_error.internal,
    929                             "Error retrieving data: %s" % e)
    930                 except SSLError, e:
    931                     print "SSL error %s" %e
    932                     retries += 1
    933 
    934             if retries > 5:
    935                 raise service_error(service_error.internal,
    936                         "Repeated SSL failures")
    937 
    938889
    939890        configs = set(('hosts', 'ssh_pubkey', 'ssh_secretkey'))
     
    979930                for s in getattr(e, 'software', []):
    980931                    sw.add(s.location)
    981             if len(sw) > 0:
    982                 os.mkdir(softdir)
     932            os.mkdir(softdir)
    983933            for s in sw:
    984934                self.log.debug("Retrieving %s" % s)
    985                 get_url(s, certfile, softdir)
     935                try:
     936                    get_url(s, certfile, softdir)
     937                except:
     938                    t, v, st = sys.exc_info()
     939                    raise service_error(service_error.internal,
     940                            "Error retrieving %s: %s" % (s, v))
    986941
    987942            # Copy local portal node software to the tempdir
     
    1000955            for a in attrs:
    1001956                if a['attribute'] in configs:
    1002                     get_url(a['value'], certfile, tmpdir)
     957                    try:
     958                        self.log.debug("Retrieving %s" % a['value'])
     959                        get_url(a['value'], certfile, tmpdir)
     960                    except:
     961                        t, v, st = sys.exc_info()
     962                        raise service_error(service_error.internal,
     963                                "Error retrieving %s: %s" % (s, v))
    1003964                if a['attribute'] == 'ssh_pubkey':
    1004965                    pubkey_base = a['value'].rpartition('/')[2]
     
    1037998                                    "Cannot create temp file for " +
    1038999                                    "userconfig certificates: %s e")
     1000                        except:
     1001                            t, v, st = sys.exc_info()
     1002                            raise service_error(service_error.internal,
     1003                                    "Error retrieving %s: %s" % (u, v))
    10391004                        finally:
    10401005                            if tn: os.remove(tn)
     
    10431008                                "No certificate for retreiving userconfig")
    10441009                    break
    1045 
    1046 
    10471010
    10481011            self.state_lock.acquire()
  • fedd/federation/remote_service.py

    r3159f5d r1dcaff4  
    99from M2Crypto.m2xmlrpclib import SSL_Transport
    1010from M2Crypto.SSL import SSLError
     11from M2Crypto.BIO import BIOError
    1112from ZSI import ParseException, FaultException, SoapWriter
    1213
     
    364365                raise service_error(service_error.connect,
    365366                        "Cannot connect to %s: %s" % (url, e[1]))
     367            except BIOError, e:
     368                print "BIO error contacting %s: %s" % (url, e.message)
     369                retries += 1
    366370            except SSLError, e:
    367371                print "SSL error contacting %s: %s" % (url, e.message)
     
    439443                raise service_error(service_error.connect,
    440444                        "Cannot connect to %s: %s" % (url, e[1]))
     445            except BIOError, e:
     446                print "BIO error contacting %s: %s" % (url, e.message)
     447                retries += 1
    441448            except SSLError, e:
    442449                print "SSL error contacting %s: %s" % (url, e.message)
  • fedd/federation/util.py

    r3159f5d r1dcaff4  
    55import logging
    66
     7import httplib
     8
    79from M2Crypto import SSL
     10from M2Crypto.SSL import SSLError
    811from fedid import fedid
     12from service_error import service_error
     13from urlparse import urlparse
    914
    1015
     
    169174    d.close()
    170175
     176def get_url(url, cf, destdir, fn=None, max_retries=5):
     177    """
     178    Get data from a federated data store.  This presents the client cert/fedid
     179    to the http server.  We retry up to max_retries times.
     180    """
     181    po = urlparse(url)
     182    if not fn:
     183        fn = po.path.rpartition('/')[2]
     184    retries = 0
     185    ok = False
     186    failed_exception = None
     187    while not ok and retries < 5:
     188        try:
     189            conn = httplib.HTTPSConnection(po.hostname, port=po.port,
     190                    cert_file=cf, key_file=cf)
     191            conn.putrequest('GET', po.path)
     192            conn.endheaders()
     193            response = conn.getresponse()
     194
     195            lf = open("%s/%s" % (destdir, fn), "w")
     196            buf = response.read(4096)
     197            while buf:
     198                lf.write(buf)
     199                buf = response.read(4096)
     200            lf.close()
     201            ok = True
     202        except IOError, e:
     203            failed_excpetion = e
     204            retries += 1
     205        except httplib.HTTPException, e:
     206            failed_exception = e
     207            retries += 1
     208        except SSLError, e:
     209            failed_exception = e
     210            retries += 1
     211
     212    if retries > 5 and failed_exception:
     213        raise failed_excpetion
     214
Note: See TracChangeset for help on using the changeset viewer.