first draft for node tags & new node groups:
[plcapi.git] / PLC / Methods / GetSlivers.py
index c0a4c56..5624c0c 100644 (file)
@@ -6,17 +6,18 @@ from PLC.Parameter import Parameter, Mixed
 from PLC.Filter import Filter
 from PLC.Auth import Auth
 from PLC.Nodes import Node, Nodes
-from PLC.NodeNetworks import NodeNetwork, NodeNetworks
+from PLC.Interfaces import Interface, Interfaces
 from PLC.NodeGroups import NodeGroup, NodeGroups
 from PLC.ConfFiles import ConfFile, ConfFiles
 from PLC.Slices import Slice, Slices
 from PLC.Persons import Person, Persons
 from PLC.Keys import Key, Keys
 from PLC.SliceAttributes import SliceAttribute, SliceAttributes
+from PLC.InitScripts import InitScript, InitScripts
 
 def get_slivers(api, slice_filter, node = None):
     # Get slice information
-    slices = Slices(api, slice_filter)
+    slices = Slices(api, slice_filter, ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_attribute_ids'])
 
     # Build up list of users and slice attributes
     person_ids = set()
@@ -26,7 +27,7 @@ def get_slivers(api, slice_filter, node = None):
         slice_attribute_ids.update(slice['slice_attribute_ids'])
 
     # Get user information
-    all_persons = Persons(api, person_ids, ['person_id', 'enabled', 'key_ids']).dict()
+    all_persons = Persons(api, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids']).dict()
 
     # Build up list of keys
     key_ids = set()
@@ -63,6 +64,8 @@ def get_slivers(api, slice_filter, node = None):
 
         # Per-node sliver attributes take precedence over global
         # slice attributes, so set them first.
+        # Then comes nodegroup slice attributes
+       # Followed by global slice attributes
         sliver_attributes = []
 
         if node is not None:
@@ -71,6 +74,15 @@ def get_slivers(api, slice_filter, node = None):
                 attributes.append({'name': sliver_attribute['name'],
                                    'value': sliver_attribute['value']})
 
+           # set nodegroup slice attributes
+           for slice_attribute in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_attributes):
+               # Do not set any nodegroup slice attributes for
+                # which there is at least one sliver attribute
+                # already set.
+               if slice_attribute['name'] not in slice_attributes:
+                   attributes.append({'name': slice_attribute['name'],
+                                  'value': slice_attribute['value']})
+
         for slice_attribute in filter(lambda a: a['node_id'] is None, slice_attributes):
             # Do not set any global slice attributes for
             # which there is at least one sliver attribute
@@ -98,7 +110,7 @@ class GetSlivers(Method):
     node.
 
     All of the information returned by this call can be gathered from
-    other calls, e.g. GetNodes, GetNodeNetworks, GetSlices, etc. This
+    other calls, e.g. GetNodes, GetInterfaces, GetSlices, etc. This
     function exists almost solely for the benefit of Node Manager.
     """
 
@@ -114,9 +126,10 @@ class GetSlivers(Method):
         'timestamp': Parameter(int, "Timestamp of this call, in seconds since UNIX epoch"),
         'node_id': Node.fields['node_id'],
         'hostname': Node.fields['hostname'],
-        'networks': [NodeNetwork.fields],
+        'networks': [Interface.fields],
         'groups': [NodeGroup.fields['name']],
         'conf_files': [ConfFile.fields],
+       'initscripts': [InitScript.fields],
         'slivers': [{
             'name': Slice.fields['name'],
             'slice_id': Slice.fields['slice_id'],
@@ -151,8 +164,8 @@ class GetSlivers(Method):
             if node['peer_id'] is not None:
                 raise PLCInvalidArgument, "Not a local node"
 
-        # Get nodenetwork information
-        networks = NodeNetworks(self.api, node['nodenetwork_ids'])
+        # Get interface information
+        networks = Interfaces(self.api, node['interface_ids'])
 
         # Get node group information
         nodegroups = NodeGroups(self.api, node['nodegroup_ids']).dict('name')
@@ -176,19 +189,29 @@ class GetSlivers(Method):
         for nodegroup in nodegroups.values():
             for conf_file_id in nodegroup['conf_file_ids']:
                 if conf_file_id in all_conf_files:
-                    conf_files[conf_file['dest']] = all_conf_files[conf_file_id]
+                    conf_file = all_conf_files[conf_file_id]
+                    conf_files[conf_file['dest']] = conf_file
         
         # Node configuration files take precedence over node group
         # configuration files.
         for conf_file_id in node['conf_file_ids']:
             if conf_file_id in all_conf_files:
-                conf_files[conf_file['dest']] = all_conf_files[conf_file_id]
-            
+                conf_file = all_conf_files[conf_file_id]
+                conf_files[conf_file['dest']] = conf_file            
+
+       # Get all (enabled) initscripts
+       initscripts = InitScripts(self.api, {'enabled': True})  
+
         # Get system slices
         system_slice_attributes = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id')
         system_slice_ids = system_slice_attributes.keys()
+       
+       # Get nm-controller slices
+       controller_and_delegated_slices = Slices(self.api, {'instantiation': ['nm-controller', 'delegated']}, ['slice_id']).dict('slice_id')
+       controller_and_delegated_slice_ids = controller_and_delegated_slices.keys()
+       slice_ids = system_slice_ids + controller_and_delegated_slice_ids + node['slice_ids']
 
-        slivers = get_slivers(self.api, system_slice_ids + node['slice_ids'], node)
+       slivers = get_slivers(self.api, slice_ids, node)
 
        node.update_last_contact()
 
@@ -199,5 +222,6 @@ class GetSlivers(Method):
             'networks': networks,
             'groups': groups,
             'conf_files': conf_files.values(),
+           'initscripts': initscripts,
             'slivers': slivers
             }