from sfa.util.xrn import Xrn
from sfa.util.sfalogging import logger
+from sqlalchemy import Column, Integer, String, DateTime
+from sqlalchemy import Table, Column, MetaData, join, ForeignKey
+from sfa.storage.model import RegRecord
+from sfa.storage.alchemy import dbsession,engine
+
MAXINT = 2L**31-1
class SlabSlices:
def __init__(self, driver):
self.driver = driver
- #def get_slivers(self, xrn, node=None):
+
+
+ def get_slivers(self, xrn, node=None):
+ hrn, type = urn_to_hrn(xrn)
+
+ slice_name = hrn_to_pl_slicename(hrn)
+ # XX Should we just call PLCAPI.GetSliceTicket(slice_name) instead
+ # of doing all of this?
+ #return self.api.driver.GetSliceTicket(self.auth, slice_name)
+
+
+
+ slice = self.driver.GetSlices(slice_filter = slice_name, filter_type = 'slice_hrn')
+
+
+ # Get user information
+ alchemy_person = dbsession.query(RegRecord).filter_by(record_id = slice['record_id_user']).first()
+
+ slivers = []
+ sliver_attributes = []
+
+ if slice['oar_job_id'] is not -1:
+ nodes_all = self.GetNodes({'hostname':slice['node_ids']},
+ ['node_id', 'hostname','site','boot_state'])
+ nodeall_byhostname = dict([(n['hostname'], n) for n in nodes_all])
+ nodes = slice['node_ids']
+
+ for node in nodes:
+ #for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_tags):
+ sliver_attribute['tagname'] = 'slab-tag'
+ sliver_attribute['value'] = 'slab-value'
+ sliver_attributes.append(sliver_attribute['tagname'])
+ attributes.append({'tagname': sliver_attribute['tagname'],
+ 'value': sliver_attribute['value']})
+
+ # set nodegroup slice attributes
+ for slice_tag in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_tags):
+ # Do not set any nodegroup slice attributes for
+ # which there is at least one sliver attribute
+ # already set.
+ if slice_tag not in slice_tags:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
+
+ for slice_tag in filter(lambda a: a['node_id'] is None, slice_tags):
+ # Do not set any global slice attributes for
+ # which there is at least one sliver attribute
+ # already set.
+ if slice_tag['tagname'] not in sliver_attributes:
+ attributes.append({'tagname': slice_tag['tagname'],
+ 'value': slice_tag['value']})
+
+ # XXX Sanity check; though technically this should be a system invariant
+ # checked with an assertion
+ if slice['expires'] > MAXINT: slice['expires']= MAXINT
+
+ slivers.append({
+ 'hrn': hrn,
+ 'name': slice['name'],
+ 'slice_id': slice['slice_id'],
+ 'instantiation': slice['instantiation'],
+ 'expires': slice['expires'],
+ 'keys': keys,
+ 'attributes': attributes
+ })
+
+ return slivers
+
+
+
+ #def get_slivers(self, xrn, node=None):
#hrn, type = urn_to_hrn(xrn)
#slice_name = hrn_to_pl_slicename(hrn)
#})
#return slivers
-
def get_peer(self, xrn):
hrn, type = urn_to_hrn(xrn)
- # Becaues of myplc federation, we first need to determine if this
- # slice belongs to out local plc or a myplc peer. We will assume it
- # is a local site, unless we find out otherwise
+ #Does this slice belong to a local site or a peer senslab site?
peer = None
- print>>sys.stderr, " \r\n \r\n \t slices.py get_peer slice_authority "
+
# get this slice's authority (site)
slice_authority = get_authority(hrn)
-
+
# get this site's authority (sfa root authority or sub authority)
site_authority = get_authority(slice_authority).lower()
-
+ print>>sys.stderr, " \r\n \r\n \t slices.py get_peer slice_authority %s site_authority %s " %(slice_authority, site_authority)
# check if we are already peered with this site_authority, if so
- peers = self.driver.GetPeers({'hrn':site_authority})
- print>>sys.stderr, " \r\n \r\n \t slices.py get_peer slice_authority %s site_authority %s" %(slice_authority,site_authority)
+ peers = self.driver.GetPeers({})
+ print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peers %s " %(peers)
for peer_record in peers:
- names = [name.lower() for name in peer_record.values() if isinstance(name, StringTypes)]
- if site_authority in names:
+
+ if site_authority == peer_record.hrn:
peer = peer_record
print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peer %s " %(peer)
return peer
#return site
def verify_slice(self, slice_hrn, slice_record, peer, sfa_peer, options={} ):
- #slicename = hrn_to_pl_slicename(slice_hrn)
- #parts = hrn_to_pl_slicename(slice_hrn).split("_")
+
login_base = slice_hrn.split(".")[0]
slicename = slice_hrn
- slices = self.driver.GetSlices([slicename])
- print>>sys.stderr, " \r\n \r\rn Slices.py verify_slice slicename %s slices %s slice_record %s"%(slicename ,slices, slice_record)
- if not slices:
+ sl = self.driver.GetSlices(slice_filter=slicename, filter_type = 'slice_hrn')
+ if sl:
+
+ print>>sys.stderr, " \r\n \r\rn Slices.py verify_slice slicename %s sl %s slice_record %s"%(slicename ,sl, slice_record)
+ else:
+ print>>sys.stderr, " \r\n \r\rn Slices.py verify_slice UH-Oh..."
+ if not sl:
slice = {'name': slicename,
'url': slice_record.get('url', slice_hrn),
#'description': slice_record.get('description', slice_hrn)
#'peer_authority': sfa_peer, 'pointer': slice['slice_id']}
#self.registry.register_peer_object(self.credential, peer_dict)
else:
- slice = slices[0]
+ slice = sl
slice.update(slice_record)
#del slice['last_updated']
#del slice['date_created']
users_dict = {}
for user in users:
+
+ if 'urn' in user and (not 'hrn' in user ) :
+ user['hrn'],user['type'] = urn_to_hrn(user['urn'])
+
if 'person_id' in user and 'hrn' in user:
users_by_id[user['person_id']] = user
users_dict[user['person_id']] = {'person_id':user['person_id'], 'hrn':user['hrn']}