diff --git a/timmy/cli.py b/timmy/cli.py index 704f30e..5b7be24 100755 --- a/timmy/cli.py +++ b/timmy/cli.py @@ -135,6 +135,9 @@ def parse_args(): 'selected if more -v are provided it will ' 'step to INFO and DEBUG unless the option ' '-q(--quiet) is specified')) + parser.add_argument('--fuel-cli', action='store_true', + help=('Use fuel command line client instead of ' + 'fuelclient library')) return parser @@ -201,6 +204,8 @@ def main(argv=None): if args.dest_file: conf['archive_dir'] = os.path.split(args.dest_file)[0] conf['archive_name'] = os.path.split(args.dest_file)[1] + if args.fuel_cli: + conf['fuelclient'] = False logger.info('Using rqdir: %s, rqfile: %s' % (conf['rqdir'], conf['rqfile'])) nm = pretty_run(args.quiet, 'Initializing node data', diff --git a/timmy/conf.py b/timmy/conf.py index 6aa3bf9..3112fbb 100644 --- a/timmy/conf.py +++ b/timmy/conf.py @@ -15,6 +15,8 @@ def load_conf(filename): conf['fuel_ip'] = '127.0.0.1' conf['fuel_user'] = 'admin' conf['fuel_pass'] = 'admin' + conf['fuel_tenant'] = 'admin' + conf['fuelclient'] = True # use fuelclient library by default conf['timeout'] = 15 conf['prefix'] = 'nice -n 19 ionice -c 3' rqdir = 'rq' diff --git a/timmy/env.py b/timmy/env.py index 7d26a8a..765912b 100644 --- a/timmy/env.py +++ b/timmy/env.py @@ -1,5 +1,5 @@ project_name = 'timmy' -version = '1.5.1' +version = '1.6.0' if __name__ == '__main__': exit(0) diff --git a/timmy/nodes.py b/timmy/nodes.py index ada503c..9c8bc00 100644 --- a/timmy/nodes.py +++ b/timmy/nodes.py @@ -29,6 +29,12 @@ from datetime import datetime import tools from tools import w_list, run_with_lock from copy import deepcopy +try: + from fuelclient.client import Client + from fuelclient.client import logger + logger.handlers = [] +except: + Client = None class Node(object): @@ -167,10 +173,10 @@ class Node(object): self.logger.warning('node: %s: could not determine' ' MOS release' % self.id) else: - self.release = release.strip('\n "\'') + release = release.strip('\n "\'') self.logger.info('node: %s, MOS release: %s' % - (self.id, self.release)) - return self.release + (self.id, release)) + return release def exec_cmd(self, fake=False, ok_codes=None): sn = 'node-%s' % self.id @@ -391,7 +397,13 @@ class NodeManager(object): if nodes_json: self.nodes_json = tools.load_json_file(nodes_json) else: - self.nodes_json = json.loads(self.get_nodes_json()) + 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) self.nodes_init() # apply soft-filter on all nodes for node in self.nodes.values(): @@ -505,7 +517,25 @@ class NodeManager(object): fuelnode.filtered_out = True self.nodes[self.conf['fuel_ip']] = fuelnode - def get_nodes_json(self): + def get_nodes_fuelclient(self): + 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.logger.debug(self.nodes_json) + return True + except Exception as e: + self.logger.warning(("NodeManager: can't " + "get node list from fuel client:\n%s" % (e)), + exc_info=True) + return False + + def get_nodes_cli(self): + self.logger.info('use CLI for getting node information') fuelnode = self.nodes[self.conf['fuel_ip']] fuel_node_cmd = ('fuel node list --json --user %s --password %s' % (self.conf['fuel_user'], @@ -516,10 +546,12 @@ class NodeManager(object): timeout=fuelnode.timeout, prefix=fuelnode.prefix) if code != 0: - self.logger.critical(('NodeManager: cannot get ' - 'fuel node list: %s') % err) - sys.exit(4) - return nodes_json + self.logger.warning(('NodeManager: cannot get ' + 'fuel node list from CLI: %s') % err) + self.nodes_json = None + return False + self.nodes_json = json.loads(nodes_json) + return True def nodes_init(self): for node_data in self.nodes_json: diff --git a/timmy/tools.py b/timmy/tools.py index 9434c63..50a85c5 100644 --- a/timmy/tools.py +++ b/timmy/tools.py @@ -31,7 +31,6 @@ from flock import FLock from tempfile import gettempdir from pipes import quote - logger = logging.getLogger(__name__) slowpipe = ''' import sys @@ -343,5 +342,6 @@ def free_space(destdir, timeout): def w_list(value): return value if type(value) == list else [value] + if __name__ == '__main__': exit(0)