diff --git a/timmy/env.py b/timmy/env.py index 6019929..03adf45 100644 --- a/timmy/env.py +++ b/timmy/env.py @@ -16,7 +16,7 @@ # under the License. project_name = 'timmy' -version = '1.8.0' +version = '1.8.1' if __name__ == '__main__': exit(0) diff --git a/timmy/nodes.py b/timmy/nodes.py index 7754473..a117af7 100644 --- a/timmy/nodes.py +++ b/timmy/nodes.py @@ -31,9 +31,9 @@ from tools import w_list, run_with_lock from copy import deepcopy try: - from fuelclient.client import Client + from fuelclient.client import Client as FuelClient except: - Client = None + FuelClient = None try: from fuelclient.client import logger @@ -177,6 +177,7 @@ class Node(object): if code != 0: self.logger.warning('node: %s: could not determine' ' MOS release' % self.id) + release = 'n/a' else: release = release.strip('\n "\'') self.logger.info('node: %s, MOS release: %s' % @@ -405,23 +406,34 @@ class NodeManager(object): self.import_rq() self.nodes = {} self.fuel_init() + if FuelClient and conf['fuelclient']: + try: + self.logger.info('Setup fuelclient instance') + self.fuelclient = FuelClient() + self.fuelclient.username = self.conf['fuel_user'] + self.fuelclient.password = self.conf['fuel_pass'] + self.fuelclient.tenant_name = self.conf['fuel_tenant'] + # self.fuelclient.debug_mode(True) + except: + self.logger.info('Failed to setup fuelclient instance') + self.fuelclient = None + else: + self.logger.info('Skipping setup fuelclient instance') + self.fuelclient = None if nodes_json: self.nodes_json = tools.load_json_file(nodes_json) else: - if Client and conf['fuelclient']: - if ((not self.get_nodes_fuelclient()) and - (not self.get_nodes_cli())): - sys.exit(4) - else: - if not self.get_nodes_cli(): - sys.exit(4) + if (not self.get_nodes_fuelclient() and + not self.get_nodes_cli()): + sys.exit(4) self.nodes_init() # apply soft-filter on all nodes for node in self.nodes.values(): if not self.filter(node, self.conf['soft_filter']): node.filtered_out = True if not conf['shell_mode']: - self.nodes_get_release() + if not self.get_release_fuel_client(): + self.get_release_cli() self.nodes_reapply_conf() self.conf_assign_once() if extended: @@ -529,14 +541,10 @@ class NodeManager(object): self.nodes[self.conf['fuel_ip']] = fuelnode def get_nodes_fuelclient(self): + if not self.fuelclient: + return False try: - self.logger.info('Setup fuelclient instance') - c = Client() - c.username = self.conf['fuel_user'] - c.password = self.conf['fuel_pass'] - c.tenant_name = self.conf['fuel_tenant'] - # c.debug_mode(True) - self.nodes_json = c.get_request('nodes') + self.nodes_json = self.fuelclient.get_request('nodes') self.logger.debug(self.nodes_json) return True except Exception as e: @@ -545,6 +553,36 @@ class NodeManager(object): exc_info=True) return False + def get_release_fuel_client(self): + if not self.fuelclient: + return False + try: + self.logger.info('getting release from fuel') + v = self.fuelclient.get_request('version') + fuel_version = v['release'] + self.logger.debug('version response:%s' % v) + clusters = self.fuelclient.get_request('clusters') + self.logger.debug('clusters response:%s' % clusters) + except: + self.logger.warning(("Can't get fuel version or " + "clusters information")) + return False + self.nodes[self.conf['fuel_ip']].release = fuel_version + cldict = {} + for cluster in clusters: + cldict[cluster['id']] = cluster + if cldict: + for node in self.nodes.values(): + if node.cluster: + node.release = cldict[node.cluster]['fuel_version'] + else: + # set to n/a or may be fuel_version + if node.id != 0: + node.release = 'n/a' + self.logger.info('node: %s - release: %s' % (node.id, + node.release)) + return True + def get_nodes_cli(self): self.logger.info('use CLI for getting node information') fuelnode = self.nodes[self.conf['fuel_ip']] @@ -564,6 +602,16 @@ class NodeManager(object): self.nodes_json = json.loads(nodes_json) return True + def get_release_cli(self): + run_items = [] + for key, node in self.nodes.items(): + if not node.filtered_out: + run_items.append(tools.RunItem(target=node.get_release, + key=key)) + result = tools.run_batch(run_items, 100, dict_result=True) + for key in result: + self.nodes[key].release = result[key] + def nodes_init(self): for node_data in self.nodes_json: node_roles = node_data.get('roles') @@ -587,16 +635,6 @@ class NodeManager(object): if self.filter(node, self.conf['hard_filter']): self.nodes[node.ip] = node - def nodes_get_release(self): - run_items = [] - for key, node in self.nodes.items(): - if not node.filtered_out: - run_items.append(tools.RunItem(target=node.get_release, - key=key)) - result = tools.run_batch(run_items, 100, dict_result=True) - for key in result: - self.nodes[key].release = result[key] - def conf_assign_once(self): once = Node.conf_once_prefix p = Node.conf_match_prefix