check in all bootmanager sources
[bootmanager.git] / source / steps / GetAndUpdateNodeDetails.py
1 import string
2
3 from Exceptions import *
4 import BootAPI
5
6
7 SKIP_MODEL_STRING= "/minhw"
8
9
10 def Run( vars, log ):
11     """
12     Contact PLC and get the attributes for this node. Also, if the node model
13     string ends in SKIP_MODEL_STRING, override the hardware requirements
14     configuration value, and skip the checks.
15
16     Also, update any node network settings at PLC, minus the ip address,
17     so, upload the mac (if node_id was in conf file), gateway, network,
18     broadcast, netmask, dns1/2, and the hostname/domainname.
19
20     Expect the following keys to be set:
21     BOOT_CD_VERSION          A tuple of the current bootcd version
22     SKIP_HARDWARE_REQUIREMENT_CHECK     Whether or not we should skip hardware
23                                         requirement checks
24                                         
25     The following keys are set/updated:
26     WAS_NODE_ID_IN_CONF      Set to 1 if the node id was in the conf file
27     WAS_NODE_KEY_IN_CONF     Set to 1 if the node key was in the conf file
28     BOOT_STATE               The current node boot state
29     NODE_MODEL               The user specified model of this node
30     NETWORK_SETTINGS         A dictionary of the values of the network settings
31     SKIP_HARDWARE_REQUIREMENT_CHECK     Whether or not we should skip hardware
32                                         requirement checks
33                                         
34     Return 1 if able to contact PLC and get node info.
35     Raise a BootManagerException if anything fails.
36     """
37
38     log.write( "\n\nStep: Retrieving details of node from PLC.\n" )
39
40     # make sure we have the variables we need
41     try:
42         BOOT_CD_VERSION= vars["BOOT_CD_VERSION"]
43         if BOOT_CD_VERSION == "":
44             raise ValueError, "BOOT_CD_VERSION"
45
46         SKIP_HARDWARE_REQUIREMENT_CHECK= vars["SKIP_HARDWARE_REQUIREMENT_CHECK"]
47         if SKIP_HARDWARE_REQUIREMENT_CHECK == "":
48             raise ValueError, "SKIP_HARDWARE_REQUIREMENT_CHECK"
49
50         NETWORK_SETTINGS= vars["NETWORK_SETTINGS"]
51         if NETWORK_SETTINGS == "":
52             raise ValueError, "NETWORK_SETTINGS"
53
54         WAS_NODE_ID_IN_CONF= vars["WAS_NODE_ID_IN_CONF"]
55         if WAS_NODE_ID_IN_CONF == "":
56             raise ValueError, "WAS_NODE_ID_IN_CONF"
57
58         WAS_NODE_KEY_IN_CONF= vars["WAS_NODE_KEY_IN_CONF"]
59         if WAS_NODE_KEY_IN_CONF == "":
60             raise ValueError, "WAS_NODE_KEY_IN_CONF"
61
62     except KeyError, var:
63         raise BootManagerException, "Missing variable in vars: %s\n" % var
64     except ValueError, var:
65         raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var
66
67
68     details= BootAPI.call_api_function( vars, "BootGetNodeDetails", () )
69
70     vars['BOOT_STATE']= details['boot_state']
71     vars['NODE_MODEL']= string.strip(details['model'])
72
73     log.write( "Successfully retrieved node record.\n" )
74     log.write( "Current boot state: %s\n" % vars['BOOT_STATE'] )
75     log.write( "Node make/model: %s\n" % vars['NODE_MODEL'] )
76     
77     # if the end of NODE_MODEL string ends in SKIP_MODEL_STRING, skip hardware
78     # requirement checks (overrides configuration)
79     model= vars['NODE_MODEL']
80     len_skip_str= len(SKIP_MODEL_STRING)
81     if model[-len_skip_str:] == SKIP_MODEL_STRING:
82         vars['SKIP_HARDWARE_REQUIREMENT_CHECK']= 1
83         log.write( "node model indicates override to hardware requirements.\n" )
84         
85
86     # this contains all the node networks, for now, we are only concerned
87     # in the primary network
88     node_networks= details['networks']
89     got_primary= 0
90     for network in node_networks:
91         if network['is_primary'] == 1:
92             got_primary= 1
93             break
94
95     if not got_primary:
96         raise BootManagerException, "Node did not have a primary network."
97     
98     log.write( "Primary network as returned from PLC: %s\n" % str(network) )
99
100     # if we got this far, the ip on the floppy and the ip in plc match,
101     # make the rest of the PLC information match whats on the floppy
102     network['method']= NETWORK_SETTINGS['method']
103
104     # only nodes that have the node_id specified directly in the configuration
105     # file can change their mac address
106     if BOOT_CD_VERSION[0] == 3 and WAS_NODE_ID_IN_CONF == 1:
107         network['mac']= NETWORK_SETTINGS['mac']
108         
109     network['gateway']= NETWORK_SETTINGS['gateway']
110     network['network']= NETWORK_SETTINGS['network']
111     network['broadcast']= NETWORK_SETTINGS['broadcast']
112     network['netmask']= NETWORK_SETTINGS['netmask']
113     network['dns1']= NETWORK_SETTINGS['dns1']
114     network['dns2']= NETWORK_SETTINGS['dns2']
115     
116     log.write( "Updating network settings at PLC to match floppy " \
117                "(except for node ip).\n" )
118     update_vals= {}
119     update_vals['primary_network']= network
120     BootAPI.call_api_function( vars, "BootUpdateNode", (update_vals,) )
121     
122     return 1