Merge branch 'master' into sqlalchemy
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 24 Jan 2012 12:23:50 +0000 (13:23 +0100)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 24 Jan 2012 12:23:50 +0000 (13:23 +0100)
Conflicts:
sfa/managers/registry_manager_openstack.py

1  2 
sfa/client/sfi.py
sfa/managers/registry_manager_openstack.py
sfa/server/sfa-clean-peer-records.py
sfa/server/sfa-start.py

Simple merge
@@@ -17,28 -17,12 +17,14 @@@ from sfa.trust.gid import GI
  from sfa.trust.credential import Credential
  from sfa.trust.certificate import Certificate, Keypair, convert_public_key
  from sfa.trust.gid import create_uuid
 -from sfa.storage.record import SfaRecord
 -from sfa.storage.table import SfaTable
 -from sfa.managers import registry_manager
  
 -class RegistryManager(registry_manager.RegistryManager):
 +from sfa.storage.persistentobjs import make_record,RegRecord
 +from sfa.storage.alchemy import dbsession
 +
 +from sfa.managers.registry_manager import RegistryManager
 +
 +class RegistryManager(RegistryManager):
  
-     def __init__ (self, config): pass
-     # The GENI GetVersion call
-     def GetVersion(self, api, options):
-         peers = dict ( [ (hrn,interface.get_url()) for (hrn,interface) in api.registries.iteritems() 
-                        if hrn != api.hrn])
-         xrn=Xrn(api.hrn)
-         return version_core({'interface':'registry',
-                              'sfa': 2,
-                              'geni_api': 2,
-                              'hrn':xrn.get_hrn(),
-                              'urn':xrn.get_urn(),
-                              'peers':peers})
-     
      def GetCredential(self, api, xrn, type, is_self=False):
          # convert xrn to hrn     
          if type:
      # field_key is the name of one field in the record, typically 'researcher' for a 'slice' record
      # hrns is the list of hrns that should be linked to the subject from now on
      # target_type would be e.g. 'user' in the 'slice' x 'researcher' example
 -    def update_relation (self, sfa_record, field_key, hrns, target_type):
 +    def update_relation (self, record_obj, field_key, hrns, target_type):
          # locate the linked objects in our db
 -        subject_type=sfa_record['type']
 -        subject_id=sfa_record['pointer']
 -        table = SfaTable()
 -        link_sfa_records = table.find ({'type':target_type, 'hrn': hrns})
 -        link_ids = [ rec.get('pointer') for rec in link_sfa_records ]
 +        subject_type=record_obj.type
 +        subject_id=record_obj.pointer
 +        # get the 'pointer' field of all matching records
 +        link_id_tuples = dbsession.query(RegRecord.pointer).filter_by(type=target_type).filter(RegRecord.hrn.in_(hrns)).all()
 +        # sqlalchemy returns named tuples for columns
 +        link_ids = [ tuple.pointer for tuple in link_id_tuples ]
          self.driver.update_relation (subject_type, target_type, subject_id, link_ids)
 -        
  
-     def Register(self, api, record_dict):
-     
-         hrn, type = record_dict['hrn'], record_dict['type']
-         urn = hrn_to_urn(hrn,type)
-         # validate the type
-         if type not in ['authority', 'slice', 'node', 'user']:
-             raise UnknownSfaType(type) 
-         
-         # check if record_dict already exists
-         existing_records = dbsession.query(RegRecord).filter_by(type=type,hrn=hrn).all()
-         if existing_records:
-             raise ExistingRecord(hrn)
-            
-         assert ('type' in record_dict)
-         # returns the right type of RegRecord according to type in record
-         record = make_record(dict=record_dict)
-         record.just_created()
-         record.authority = get_authority(record.hrn)
-         auth_info = api.auth.get_auth_info(record.authority)
-         pub_key = None
-         # make sure record has a gid
-         if not record.gid:
-             uuid = create_uuid()
-             pkey = Keypair(create=True)
-             if getattr(record,'keys',None):
-                 pub_key=record.keys
-                 # use only first key in record
-                 if isinstance(record.keys, types.ListType):
-                     pub_key = record.keys[0]
-                 pkey = convert_public_key(pub_key)
-     
-             gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
-             gid = gid_object.save_to_string(save_parents=True)
-             record.gid = gid
-     
-         if type in ["authority"]:
-             # update the tree
-             if not api.auth.hierarchy.auth_exists(hrn):
-                 api.auth.hierarchy.create_auth(hrn_to_urn(hrn,'authority'))
-     
-             # get the GID from the newly created authority
-             gid = auth_info.get_gid_object()
-             record.gid=gid.save_to_string(save_parents=True)
-         # update testbed-specific data if needed
-         pointer = self.driver.register (record.__dict__, hrn, pub_key)
-         record.pointer=pointer
-         dbsession.add(record)
-         dbsession.commit()
-     
-         # update membership for researchers, pis, owners, operators
-         self.update_relations (record, record)
-         
-         return record.get_gid_object().save_to_string(save_parents=True)
-     
-     def Update(self, api, record_dict):
-         assert ('type' in record_dict)
-         new_record=RegRecord(dict=record_dict)
-         type = new_record.type
-         hrn = new_record.hrn
-         
-         # make sure the record exists
-         record = dbsession.query(RegRecord).filter_by(type=type,hrn=hrn).first()
-         if not record:
-             raise RecordNotFound("hrn=%s, type=%s"%(hrn,type))
-         record.just_updated()
-     
-         # validate the type
-         if type not in ['authority', 'slice', 'node', 'user']:
-             raise UnknownSfaType(type) 
-         # Use the pointer from the existing record, not the one that the user
-         # gave us. This prevents the user from inserting a forged pointer
-         pointer = record.pointer
-     
-         # is the a change in keys ?
-         new_key=None
-         if type=='user':
-             if getattr(new_key,'keys',None):
-                 new_key=new_record.keys
-                 if isinstance (new_key,types.ListType):
-                     new_key=new_key[0]
-         # update the PLC information that was specified with the record
-         if not self.driver.update (record.__dict__, new_record.__dict__, hrn, new_key):
-             logger.warning("driver.update failed")
-     
-         # take new_key into account
-         if new_key:
-             # update the openssl key and gid
-             pkey = convert_public_key(new_key)
-             uuid = create_uuid()
-             urn = hrn_to_urn(hrn,type)
-             gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
-             gid = gid_object.save_to_string(save_parents=True)
-             record.gid = gid
-             dsession.commit()
-         
-         # update membership for researchers, pis, owners, operators
-         self.update_relations (record, new_record)
-         
-         return 1 
-     
-     # expecting an Xrn instance
-     def Remove(self, api, xrn, origin_hrn=None):
-         hrn=xrn.get_hrn()
-         type=xrn.get_type()
-         request=dbsession.query(RegRecord).filter_by(hrn=hrn)
-         if type and type not in ['all', '*']:
-             request=request.filter_by(type=type)
-     
-         record = request.first()
-         if not record:
-             msg="Could not find hrn %s"%hrn
-             if type: msg += " type=%s"%type
-             raise RecordNotFound(msg)
-         type = record.type
-         if type not in ['slice', 'user', 'node', 'authority'] :
-             raise UnknownSfaType(type)
-         credential = api.getCredential()
-         registries = api.registries
-     
-         # Try to remove the object from the PLCDB of federated agg.
-         # This is attempted before removing the object from the local agg's PLCDB and sfa table
-         if hrn.startswith(api.hrn) and type in ['user', 'slice', 'authority']:
-             for registry in registries:
-                 if registry not in [api.hrn]:
-                     try:
-                         result=registries[registry].remove_peer_object(credential, record, origin_hrn)
-                     except:
-                         pass
-         # call testbed callback first
-         # IIUC this is done on the local testbed TOO because of the refreshpeer link
-         if not self.driver.remove(record.__dict__):
-             logger.warning("driver.remove failed")
-         # delete from sfa db
-         dbsession.delete(record)
-         dbsession.commit()
-     
-         return 1
-     # This is a PLC-specific thing, won't work with other platforms
-     def get_key_from_incoming_ip (self, api):
-         # verify that the callers's ip address exist in the db and is an interface
-         # for a node in the db
-         (ip, port) = api.remote_addr
-         interfaces = self.driver.shell.GetInterfaces({'ip': ip}, ['node_id'])
-         if not interfaces:
-             raise NonExistingRecord("no such ip %(ip)s" % locals())
-         nodes = self.driver.shell.GetNodes([interfaces[0]['node_id']], ['node_id', 'hostname'])
-         if not nodes:
-             raise NonExistingRecord("no such node using ip %(ip)s" % locals())
-         node = nodes[0]
-        
-         # look up the sfa record
-         record=dbsession.query(RegRecord).filter_by(type='node',pointer=node['node_id']).first()
-         if not record:
-             raise RecordNotFound("node with pointer %s"%node['node_id'])
-         
-         # generate a new keypair and gid
-         uuid = create_uuid()
-         pkey = Keypair(create=True)
-         urn = hrn_to_urn(record.hrn, record.type)
-         gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey)
-         gid = gid_object.save_to_string(save_parents=True)
-         record.gid = gid
-         # update the record
-         dbsession.commit()
-   
-         # attempt the scp the key
-         # and gid onto the node
-         # this will only work for planetlab based components
-         (kfd, key_filename) = tempfile.mkstemp() 
-         (gfd, gid_filename) = tempfile.mkstemp() 
-         pkey.save_to_file(key_filename)
-         gid_object.save_to_file(gid_filename, save_parents=True)
-         host = node['hostname']
-         key_dest="/etc/sfa/node.key"
-         gid_dest="/etc/sfa/node.gid" 
-         scp = "/usr/bin/scp" 
-         #identity = "/etc/planetlab/root_ssh_key.rsa"
-         identity = "/etc/sfa/root_ssh_key"
-         scp_options=" -i %(identity)s " % locals()
-         scp_options+="-o StrictHostKeyChecking=no " % locals()
-         scp_key_command="%(scp)s %(scp_options)s %(key_filename)s root@%(host)s:%(key_dest)s" %\
-                          locals()
-         scp_gid_command="%(scp)s %(scp_options)s %(gid_filename)s root@%(host)s:%(gid_dest)s" %\
-                          locals()    
-         all_commands = [scp_key_command, scp_gid_command]
-         
-         for command in all_commands:
-             (status, output) = commands.getstatusoutput(command)
-             if status:
-                 raise Exception, output
-         for filename in [key_filename, gid_filename]:
-             os.unlink(filename)
-         return 1 
Simple merge
Simple merge