expose leases to nodes
[plcapi.git] / PLC / Methods / GetSlivers.py
index 5a129ca..25cdbca 100644 (file)
@@ -18,8 +18,12 @@ from PLC.Roles import Roles
 from PLC.Keys import Key, Keys
 from PLC.SliceTags import SliceTag, SliceTags
 from PLC.InitScripts import InitScript, InitScripts
+from PLC.Leases import Lease, Leases
+from PLC.Timestamp import Duration
 from PLC.Methods.GetSliceFamily import GetSliceFamily
 
+from PLC.Accessors.Accessors_standard import *
+
 # XXX used to check if slice expiration time is sane
 MAXINT =  2L**31-1
 
@@ -118,7 +122,7 @@ def get_slivers(api, auth, slice_filter, node = None):
 
     return slivers
 
-class v43GetSlivers(Method):
+class GetSlivers(Method):
     """
     Returns a struct containing information about the specified node
     (or calling node, if called by a node and node_id_or_hostname is
@@ -142,7 +146,7 @@ class v43GetSlivers(Method):
         'timestamp': Parameter(int, "Timestamp of this call, in seconds since UNIX epoch"),
         'node_id': Node.fields['node_id'],
         'hostname': Node.fields['hostname'],
-        'networks': [Interface.fields],
+        'interfaces': [Interface.fields],
         'groups': [NodeGroup.fields['groupname']],
         'conf_files': [ConfFile.fields],
        'initscripts': [InitScript.fields],
@@ -166,7 +170,15 @@ class v43GetSlivers(Method):
                 'tagname': SliceTag.fields['tagname'],
                 'value': SliceTag.fields['value']
             }]
-        }]
+        }],
+        'xmpp': {'server':Parameter(str,"hostname for the XMPP server"),
+                 'user':Parameter(str,"username for the XMPP server"),
+                 'password':Parameter(str,"username for the XMPP server"),
+                 },
+        'leases': [  { 'slice_id' : Lease.fields['slice_id'],
+                       't_from' : Lease.fields['t_from'],
+                       't_until' : Lease.fields['t_until'],
+                       }],
     }
 
     def call(self, auth, node_id_or_hostname = None):
@@ -188,7 +200,7 @@ class v43GetSlivers(Method):
                 raise PLCInvalidArgument, "Not a local node"
 
         # Get interface information
-        networks = Interfaces(self.api, node['interface_ids'])
+        interfaces = Interfaces(self.api, node['interface_ids'])
 
         # Get node group information
         nodegroups = NodeGroups(self.api, node['nodegroup_ids']).dict('groupname')
@@ -277,50 +289,41 @@ class v43GetSlivers(Method):
         personsitekeys=get_all_admin_keys(self.api)
         accounts.append({'name':'root','keys':personsitekeys})
 
+        hrn = GetNodeHrn(self.api).call(auth,node['node_id'])
+
+        # XMPP config for omf federation
+        try:
+            if not self.api.config.PLC_OMF_ENABLED:
+                raise Exception,"OMF disabled"
+            xmpp={'server':self.api.config.PLC_OMF_XMPP_SERVER,
+                  'user':self.api.config.PLC_OMF_XMPP_USER,
+                  'password':self.api.config.PLC_OMF_XMPP_PASSWORD,
+                  }
+        except:
+            xmpp={'server':None,'user':None,'password':None}
+
        node.update_last_contact()
 
+        # expose leases
+        lease_exposed_fields = [ 'slice_id', 't_from', 't_until', ]
+        leases=None
+        if node['node_type'] == 'reservable':
+            # expose the leases for the next 12 hours
+            leases = [ dict ( [ (k,l[k]) for k in lease_exposed_fields ] ) 
+                       for l in Leases (self.api, {'node_id':node['node_id'],
+                                                   'clip': (timestamp, timestamp+12*Duration.HOUR)}) ]
+
         return {
             'timestamp': timestamp,
             'node_id': node['node_id'],
             'hostname': node['hostname'],
-            'networks': networks,
+            'interfaces': interfaces,
             'groups': groups,
             'conf_files': conf_files.values(),
            'initscripts': initscripts,
             'slivers': slivers,
-            'accounts': accounts
+            'accounts': accounts,
+            'xmpp':xmpp,
+            'hrn':hrn,
+            'leases':leases,
             }
-
-class v42GetSlivers(v43GetSlivers):
-    """
-    Legacy wrapper for v43GetSlivers.
-    """
-
-    def call(self, auth, node_id_or_hostname = None):
-        result = v43GetSlivers.call(self,auth,node_id_or_hostname)
-        networks = result['networks']
-
-        for i in range(0,len(networks)):
-            network = networks[i]
-            if network.has_key("interface_id"):
-                network['nodenetwork_id']=network['interface_id']
-            if network.has_key("interface_tag_ids"):
-                network['nodenetwork_setting_ids']=network['interface_tag_ids']
-            networks[i]=network
-
-        result['networks']=networks
-        return result
-
-class GetSlivers(v42GetSlivers):
-    """
-    Returns a struct containing information about the specified node
-    (or calling node, if called by a node and node_id_or_hostname is
-    not specified), including the current set of slivers bound to the
-    node.
-
-    All of the information returned by this call can be gathered from
-    other calls, e.g. GetNodes, GetInterfaces, GetSlices, etc. This
-    function exists almost solely for the benefit of Node Manager.
-    """
-
-    pass