c58830a97f461cedc2612e385ea2f779c59ec19c
[plcapi.git] / PLC / Methods / GetNodeFlavour.py
1 # $Id$
2 # $URL$
3 from PLC.Method import Method
4 from PLC.Auth import Auth
5 from PLC.Faults import *
6 from PLC.Parameter import *
7 from PLC.Nodes import Node, Nodes
8
9 from PLC.Accessors.Accessors_standard import *                  # import node accessors
10
11 class GetNodeFlavour(Method):
12     """
13     Returns detailed information on a given node's flavour, i.e. its
14     base installation. 
15
16     This depends on the global PLC settings in the PLC_FLAVOUR area,
17     optionnally overridden by any of the following tags if set on that node:
18
19     'arch', 'pldistro', 'fcdistro', (xxx fcdistro not yet supported)
20     'deployment', 'extensions',
21     """
22
23     roles = ['admin', 'user', 'node']
24
25     accepts = [
26         Auth(),
27         Mixed(Node.fields['node_id'],
28               Node.fields['hostname']),
29         ]
30
31     returns = { 
32         'nodefamily' : Parameter (str, "the nodefamily this node should be based upon"),
33         'extensions' : [ Parameter (str, "extensions to add to the base install") ],
34         'plain' : Parameter (bool, "use plain bootstrapfs image if set (for tests)" ) ,
35         }
36
37     
38     ########## nodefamily
39     def nodefamily (self, auth, node_id, fcdistro, arch):
40
41         # the deployment tag, if set, wins
42         deployment = GetNodeDeployment (self.api).call(auth,node_id)
43         if deployment: return deployment
44
45         pldistro = GetNodePldistro (self.api).call(auth, node_id)
46         if not pldistro: pldistro = self.api.config.PLC_FLAVOUR_NODE_PLDISTRO
47
48         # xxx would make sense to check the corresponding bootstrapfs is available
49         return "%s-%s-%s"%(pldistro,fcdistro,arch)
50
51     def extensions (self, auth, node_id, fcdistro, arch):
52         try:
53             return [ "%s-%s-%s"%(e,fcdistro,arch) for e in GetNodeExtensions(self.api).call(auth,node_id).split() ]
54         except:
55             return []
56
57     def plain (self, auth, node_id):
58         return not not GetNodePlainBootstrapfs(self.api).call(auth,node_id)
59
60     def call(self, auth, node_id_or_name):
61         # Get node information
62         nodes = Nodes(self.api, [node_id_or_name])
63         if not nodes:
64             raise PLCInvalidArgument, "No such node %r"%node_id_or_name
65         node = nodes[0]
66         node_id = node['node_id']
67
68         arch = GetNodeArch (self.api).call(auth,node_id)
69         if not arch: arch = self.api.config.PLC_FLAVOUR_NODE_ARCH
70
71         fcdistro = GetNodeFcdistro (self.api).call(auth, node_id)
72         if not fcdistro: fcdistro = self.api.config.PLC_FLAVOUR_NODE_FCDISTRO
73
74         # xxx could use some sanity checking, and could provide fallbacks
75         return { 'nodefamily' : self.nodefamily(auth,node_id, fcdistro, arch),
76                  'fcdistro' : fcdistro,
77                  'extensions' : self.extensions(auth,node_id, fcdistro, arch),
78                  'plain' : self.plain(auth,node_id),
79                  }