added slice_status()
[sfa.git] / sfa / managers / aggregate_manager_pl.py
index 6021cea..4b5679f 100644 (file)
@@ -28,22 +28,12 @@ def get_version():
     version['geni_api'] = 1
     return version
 
-def delete_slice(api, xrn):
-    hrn, type = urn_to_hrn(xrn)
-    slicename = hrn_to_pl_slicename(hrn)
-    slices = api.plshell.GetSlices(api.plauth, {'name': slicename})
-    if not slices:
-        return 1
-    slice = slices[0]
-
-    # determine if this is a peer slice
-    peer = peers.get_peer(api, hrn)
-    if peer:
-        api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer)
-    api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids'])
-    if peer:
-        api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id'])
-    return 1
+def slice_status(api, slice_xrn, creds):
+    result = {}
+    result['geni_urn'] = slice_xrn
+    result['geni_status'] = 'unknown'
+    result['geni_resources'] = {}
+    return result
 
 def __get_hostnames(nodes):
     hostnames = []
@@ -51,12 +41,15 @@ def __get_hostnames(nodes):
         hostnames.append(node.hostname)
     return hostnames
     
-def create_slice(api, xrn, xml, reg_objects=None):
+def create_slice(api, slice_xrn, creds, rspec, users):
     """
+    Create the sliver[s] (slice) at this aggregate.    
     Verify HRN and initialize the slice record in PLC if necessary.
     """
 
-    hrn, type = urn_to_hrn(xrn)
+    reg_objects = __get_registry_objects(slice_xrn, creds, users)
+
+    hrn, type = urn_to_hrn(slice_xrn)
     peer = None
     slices = Slices(api)
     peer = slices.get_peer(hrn)
@@ -74,7 +67,7 @@ def create_slice(api, xrn, xml, reg_objects=None):
     slice = network.get_slice(api, hrn)
     current = __get_hostnames(slice.get_nodes())
     
-    network.addRSpec(xml, api.config.SFA_AGGREGATE_RSPEC_SCHEMA)
+    network.addRSpec(rspec, api.config.SFA_AGGREGATE_RSPEC_SCHEMA)
     request = __get_hostnames(network.nodesWithSlivers())
     
     # remove nodes not in rspec
@@ -83,8 +76,6 @@ def create_slice(api, xrn, xml, reg_objects=None):
     # add nodes from rspec
     added_nodes = list(set(request).difference(current))
     
-
-
     if peer:
         api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice.id, peer)
 
@@ -102,6 +93,55 @@ def create_slice(api, xrn, xml, reg_objects=None):
     return True
 
 
+def __get_registry_objects(slice_xrn, creds, users):
+    """
+    
+    """
+    hrn, type = urn_to_hrn(slice_xrn)
+
+    hrn_auth = get_authority(hrn)
+
+    # Build up objects that an SFA registry would return if SFA
+    # could contact the slice's registry directly
+    reg_objects = None
+
+    if users:
+        reg_objects = {}
+
+        site = {}
+        site['site_id'] = 0
+        site['name'] = 'geni.%s' % hrn_auth
+        site['enabled'] = True
+        site['max_slices'] = 100
+
+        # Note:
+        # Is it okay if this login base is the same as one already at this myplc site?
+        # Do we need uniqueness?  Should use hrn_auth instead of just the leaf perhaps?
+        site['login_base'] = get_leaf(hrn_auth)
+        site['abbreviated_name'] = hrn
+        site['max_slivers'] = 1000
+        reg_objects['site'] = site
+
+        slice = {}
+        slice['expires'] = int(mktime(Credential(string=creds[0]).get_lifetime().timetuple()))
+        slice['hrn'] = hrn
+        slice['name'] = site['login_base'] + "_" +  get_leaf(hrn)
+        slice['url'] = hrn
+        slice['description'] = hrn
+        slice['pointer'] = 0
+        reg_objects['slice_record'] = slice
+
+        reg_objects['users'] = {}
+        for user in users:
+            user['key_ids'] = []
+            hrn, _ = urn_to_hrn(user['urn'])
+            user['email'] = hrn + "@geni.net"
+            user['first_name'] = hrn
+            user['last_name'] = hrn
+            reg_objects['users'][user['email']] = user
+
+        return reg_objects        
+
 def get_ticket(api, xrn, rspec, origin_hrn=None, reg_objects=None):
 
     slice_hrn, type = urn_to_hrn(xrn)
@@ -171,7 +211,7 @@ def start_slice(api, xrn):
 
     return 1
  
-def stop_slice(api, xrn):
+def stop_slice(api, xrn, creds):
     hrn, type = urn_to_hrn(xrn)
     slicename = hrn_to_pl_slicename(hrn)
     slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id'])
@@ -187,6 +227,23 @@ def reset_slice(api, xrn):
     # XX not implemented at this interface
     return 1
 
+def delete_slice(api, xrn, creds):
+    hrn, type = urn_to_hrn(xrn)
+    slicename = hrn_to_pl_slicename(hrn)
+    slices = api.plshell.GetSlices(api.plauth, {'name': slicename})
+    if not slices:
+        return 1
+    slice = slices[0]
+
+    # determine if this is a peer slice
+    peer = peers.get_peer(api, hrn)
+    if peer:
+        api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer)
+    api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids'])
+    if peer:
+        api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id'])
+    return 1
+
 def get_slices(api):
     # look in cache first
     if api.cache:
@@ -235,18 +292,6 @@ def get_rspec(api, creds, options):
     return rspec
 
 
-"""
-Returns the request context required by sfatables. At some point, this
-mechanism should be changed to refer to "contexts", which is the
-information that sfatables is requesting. But for now, we just return
-the basic information needed in a dict.
-"""
-def fetch_context(slice_xrn, user_xrn, contexts):
-    slice_hrn, type = urn_to_hrn(slice_xrn)
-    user_hrn, type = urn_to_hrn(user_xrn)
-    base_context = {'sfa':{'user':{'hrn':user_hrn}, 'slice':{'hrn':slice_hrn}}}
-    return base_context
-
 def main():
     api = SfaAPI()
     """