Changeset dd3e38b


Ignore:
Timestamp:
Mar 7, 2010 8:01:52 AM (14 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-3.01, version-3.02
Children:
062b991
Parents:
d101c8c
Message:

Add slice/sliver renewal

Location:
fedd/federation
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/protogeni_access.py

    rd101c8c rdd3e38b  
    44import stat # for chmod constants
    55import re
     6import time
    67import string
    78import copy
     
    7677        self.staging_host = config.get("access", "staging_host") \
    7778                or "ops.emulab.net"
     79
     80        self.renewal_interval = config.get("access", "renewal") or (3 * 60 * 60)
     81        self.renewal_interval = int(self.renewal_interval)
    7882
    7983        self.ch_url = config.get("access", "ch_url")
     
    131135        self.start_segment = proxy_protogeni_segment.start_segment
    132136        self.stop_segment = proxy_protogeni_segment.stop_segment
     137        self.renew_segment = proxy_protogeni_segment.renew_segment
    133138
    134139        self.call_SetValue = service_caller('SetValue')
    135140        self.call_GetValue = service_caller('GetValue')
     141
     142        self.RenewSlices()
    136143
    137144        self.soap_services = {\
     
    212219
    213220            # Access line (t, p, u) -> (a, pw) line
    214             # XXX: you are here
    215221            m = access_re.match(line)
    216222            if m != None:
     
    11141120        stopper(self, user, staging, slice_cred, cf, cpw)
    11151121        return { 'allocID': req['allocID'] }
     1122
     1123    def RenewSlices(self):
     1124        self.log.info("Scanning for slices to renew")
     1125        self.state_lock.acquire()
     1126        aids = self.allocation.keys()
     1127        self.state_lock.release()
     1128
     1129        for aid in aids:
     1130            self.state_lock.acquire()
     1131            if self.allocation.has_key(aid):
     1132                name = self.allocation[aid].get('slice_name', None)
     1133                scred = self.allocation[aid].get('slice_credential', None)
     1134                cf, user, ssh_key, cpw = self.allocation[aid]['credentials']
     1135            else:
     1136                name = None
     1137                scred = None
     1138            self.state_lock.release()
     1139
     1140            # There's a ProtoGENI slice associated with the segment; renew it.
     1141            if name and scred:
     1142                renewer = self.renew_segment(log=self.log,
     1143                        debug=self.create_debug, keyfile=ssh_key,
     1144                        cm_url = self.cm_url, sa_url = self.sa_url,
     1145                        ch_url = self.ch_url)
     1146                new_scred = renewer(name, scred, self.renewal_interval, cf, cpw)
     1147                if new_scred:
     1148                    self.log.info("Slice %s renewed until %s GMT" % \
     1149                            (name, time.asctime(time.gmtime(\
     1150                                time.time()+self.renewal_interval))))
     1151                    self.state_lock.acquire()
     1152                    if self.allocation.has_key(aid):
     1153                        self.allocation[aid]['slice_credential'] = new_scred
     1154                    self.state_lock.release()
     1155                else:
     1156                    self.log.info("Failed to renew slice %s " % name)
     1157
     1158        # Let's do this all again soon.  (4 tries before the slices time out)   
     1159        t = Timer(self.renewal_interval/4, self.RenewSlices)
     1160        t.start()
  • fedd/federation/proxy_protogeni_segment.py

    rd101c8c rdd3e38b  
    9191    # name) has an entry with the allocated machine in hostname and the
    9292    # interfaces in 'interfaces'.  I love having XML parser code lying around.
    93     def manifest_to_dict(self, manifest):
    94         if self.debug:
     93    def manifest_to_dict(self, manifest, ignore_debug=False):
     94        if self.debug and not ignore_debug:
    9595            self.log.debug("Returning null manifest dict")
    9696            return { }
     
    388388                    print >>script, "sudo perl -I%s/lib %s/bin/import_key.pl /users/%s/.ssh/authorized_keys /root/.ssh/authorized_keys" % (fed_dir, fed_dir, user)
    389389                    # XXX: debug
     390                    # start routing on nodes
     391                    print >>script, "sudo perl %s/bin/protogeni_routing.pl" % \
     392                            fed_dir
    390393                    if e.get_attribute('startup'):
    391394                        print >>script, "%s \\$USER '%s'" % \
     
    541544
    542545        # With manifest in hand, we can export the portal node names.
    543         nodes = self.manifest_to_dict(manifest)
    544         print nodes
     546        nodes = self.manifest_to_dict(manifest, ignore_debug=True)
    545547        self.export_store_info(export_certfile, nodes, parent.ssh_port,
    546548                connInfo)
     
    589591        else:
    590592            parent.state_lock.acquire()
     593            parent.allocation[aid]['slice_name'] = slicename
    591594            parent.allocation[aid]['slice_credential'] = slice_cred
    592595            parent.allocation[aid]['sliver_credential'] = sliver_cred
     
    644647        return rv
    645648
     649class renew_segment(segment_base):
     650    def __init__(self, log=None, debug=False, keyfile=None,
     651            ch_url=None, sa_url=None, cm_url=None):
     652        segment_base.__init__(self, log=log, keyfile=keyfile, debug=debug,
     653                ch_url=cm_url, sa_url=sa_url, cm_url=cm_url)
     654
     655    def __call__(self, name, scred, interval, certfile, certpw):
     656        ctxt = fedd_ssl_context(my_cert=certfile, password=certpw)
     657        try:
     658            expiration = time.strftime("%Y%m%dT%H:%M:%S",
     659                    time.gmtime(time.time() + interval))
     660            cred = self.pg_call(self.sa_url, 'GetCredential', {}, ctxt)
     661
     662            param = {
     663                    'credential': scred,
     664                    'expiration': expiration
     665                    }
     666            r = self.pg_call(self.sa_url, 'RenewSlice', param, ctxt)
     667            param = {
     668                    'credential': cred,
     669                    'hrn': name,
     670                    'type': 'Slice',
     671                    }
     672            slice = self.pg_call(self.sa_url, 'Resolve', param, ctxt)
     673            uuid = slice.get('uuid', None)
     674            if uuid == None:
     675                sys.exit('No uuid for %s' % slicename)
     676
     677            print 'Calling GetCredential (uuid)'
     678            param = {
     679                    'credential': cred,
     680                    'uuid': uuid,
     681                    'type': 'Slice',
     682                    }
     683            new_scred = self.pg_call(self.sa_url, 'GetCredential', param, ctxt)
     684            f = open('./new_slice_cred', 'w')
     685            print >>f, new_scred
     686            f.close()
     687
     688        except self.ProtoGENIError, e:
     689            self.log.error("Failed to extend slice %s: %s" % (name, e))
     690            return None
     691        try:
     692            print 'Calling RenewSlice (CM)'
     693            param = {
     694                    'credential': new_scred,
     695                    }
     696            r = self.pg_call(self.cm_url, 'RenewSlice', param, ctxt)
     697        except self.ProtoGENIError, e:
     698            self.log.warn("Failed to renew sliver for %s: %s" % (name, e))
     699
     700        return new_scred
     701   
Note: See TracChangeset for help on using the changeset viewer.