better parsing of PLC_VSYS_DEFAULTS
[plcapi.git] / PLC / Methods / GetNodeFlavour.py
index c58830a..92c0fc4 100644 (file)
@@ -1,22 +1,20 @@
-# $Id$
-# $URL$
 from PLC.Method import Method
 from PLC.Auth import Auth
 from PLC.Faults import *
 from PLC.Parameter import *
 from PLC.Nodes import Node, Nodes
 
-from PLC.Accessors.Accessors_standard import *                 # import node accessors
+from PLC.Accessors.Accessors_standard import *                  # import node accessors
 
 class GetNodeFlavour(Method):
     """
     Returns detailed information on a given node's flavour, i.e. its
-    base installation. 
+    base installation.
 
     This depends on the global PLC settings in the PLC_FLAVOUR area,
     optionnally overridden by any of the following tags if set on that node:
 
-    'arch', 'pldistro', 'fcdistro', (xxx fcdistro not yet supported)
+    'arch', 'pldistro', 'fcdistro',
     'deployment', 'extensions',
     """
 
@@ -28,34 +26,39 @@ class GetNodeFlavour(Method):
               Node.fields['hostname']),
         ]
 
-    returns = { 
+    returns = {
         'nodefamily' : Parameter (str, "the nodefamily this node should be based upon"),
+        'fcdistro': Parameter (str, "the fcdistro this node should be based upon"),
         'extensions' : [ Parameter (str, "extensions to add to the base install") ],
         'plain' : Parameter (bool, "use plain bootstrapfs image if set (for tests)" ) ,
         }
 
-    
+
     ########## nodefamily
     def nodefamily (self, auth, node_id, fcdistro, arch):
 
         # the deployment tag, if set, wins
-        deployment = GetNodeDeployment (self.api).call(auth,node_id)
+        # xxx Thierry: this probably is wrong; we need fcdistro to be set anyway
+        # for generating the proper yum config....
+        deployment = GetNodeDeployment (self.api,self.caller).call(auth,node_id)
         if deployment: return deployment
 
-        pldistro = GetNodePldistro (self.api).call(auth, node_id)
-        if not pldistro: pldistro = self.api.config.PLC_FLAVOUR_NODE_PLDISTRO
+        pldistro = GetNodePldistro (self.api,self.caller).call(auth, node_id)
+        if not pldistro:
+            pldistro = self.api.config.PLC_FLAVOUR_NODE_PLDISTRO
+            SetNodePldistro(self.api,self.caller).call(auth,node_id,pldistro)
 
         # xxx would make sense to check the corresponding bootstrapfs is available
         return "%s-%s-%s"%(pldistro,fcdistro,arch)
 
     def extensions (self, auth, node_id, fcdistro, arch):
         try:
-            return [ "%s-%s-%s"%(e,fcdistro,arch) for e in GetNodeExtensions(self.api).call(auth,node_id).split() ]
+            return [ "%s-%s-%s"%(e,fcdistro,arch) for e in GetNodeExtensions(self.api,self.caller).call(auth,node_id).split() ]
         except:
             return []
 
     def plain (self, auth, node_id):
-        return not not GetNodePlainBootstrapfs(self.api).call(auth,node_id)
+        return not not GetNodePlainBootstrapfs(self.api,self.caller).call(auth,node_id)
 
     def call(self, auth, node_id_or_name):
         # Get node information
@@ -65,11 +68,16 @@ class GetNodeFlavour(Method):
         node = nodes[0]
         node_id = node['node_id']
 
-        arch = GetNodeArch (self.api).call(auth,node_id)
-        if not arch: arch = self.api.config.PLC_FLAVOUR_NODE_ARCH
+        arch = GetNodeArch (self.api,self.caller).call(auth,node_id)
+        # if not set, use the global default and tag the node, in case the global default changes later on
+        if not arch:
+            arch = self.api.config.PLC_FLAVOUR_NODE_ARCH
+            SetNodeArch (self.api,self.caller).call(auth,node_id,arch)
 
-        fcdistro = GetNodeFcdistro (self.api).call(auth, node_id)
-        if not fcdistro: fcdistro = self.api.config.PLC_FLAVOUR_NODE_FCDISTRO
+        fcdistro = GetNodeFcdistro (self.api,self.caller).call(auth, node_id)
+        if not fcdistro:
+            fcdistro = self.api.config.PLC_FLAVOUR_NODE_FCDISTRO
+            SetNodeFcdistro (self.api,self.caller).call (auth, node_id, fcdistro)
 
         # xxx could use some sanity checking, and could provide fallbacks
         return { 'nodefamily' : self.nodefamily(auth,node_id, fcdistro, arch),