def info(args): """`conduct info` command""" url = conduct_url.url('bundles', args) response = requests.get(url) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) data = [ { 'id': ('! ' if bundle.get('hasError', False) else '') + (bundle['bundleId'] if args.long_ids else bundle_utils.short_id(bundle['bundleId'])), 'name': bundle['attributes']['bundleName'], 'replications': len(bundle['bundleInstallations']), 'starting': sum([not execution['isStarted'] for execution in bundle['bundleExecutions']]), 'executions': sum([execution['isStarted'] for execution in bundle['bundleExecutions']]) } for bundle in json.loads(response.text) ] data.insert(0, {'id': 'ID', 'name': 'NAME', 'replications': '#REP', 'starting': '#STR', 'executions': '#RUN'}) padding = 2 column_widths = dict(calc_column_widths(data), **{'padding': ' ' * padding}) has_error = False for row in data: has_error |= '!' in row['id'] print('''\ {id: <{id_width}}{padding}\ {name: <{name_width}}{padding}\ {replications: >{replications_width}}{padding}\ {starting: >{starting_width}}{padding}\ {executions: >{executions_width}}'''.format(**dict(row, **column_widths))) if has_error: print('There are errors: use `conduct events` or `conduct logs` for further information')
def unload(args): """`conduct unload` command""" path = 'bundles/{}'.format(args.bundle) url = conduct_url.url(path, args) response = requests.delete(url) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) print('Bundle unload request sent.') print('Print ConductR info with: conduct info{}'.format(args.cli_parameters))
def services(args): """`conduct services` command""" url = conduct_url.url('bundles', args) response = requests.get(url) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) data = sorted([ ( { 'service': service, 'bundle_id': bundle['bundleId'] if args.long_ids else bundle_utils.short_id(bundle['bundleId']), 'bundle_name': bundle['attributes']['bundleName'], 'status': 'Running' if execution['isStarted'] else 'Starting' } ) for bundle in json.loads(response.text) for execution in bundle['bundleExecutions'] for endpoint_name, endpoint in bundle['bundleConfig']['endpoints'].items() for service in endpoint['services'] ], key=lambda line: line['service']) service_endpoints = {} for service in data: url = urlparse(service['service']) if not (url.path == '' or url.path == '/'): try: service_endpoints[url.path] |= {service['service']} except KeyError: service_endpoints[url.path] = {service['service']} duplicate_endpoints = [service for (service, endpoint) in service_endpoints.items() if len(endpoint) > 1] \ if len(service_endpoints) > 0 else [] data.insert(0, {'service': 'SERVICE', 'bundle_id': 'BUNDLE ID', 'bundle_name': 'BUNDLE NAME', 'status': 'STATUS'}) padding = 2 column_widths = dict(conduct_info.calc_column_widths(data), **{'padding': ' ' * padding}) for row in data: print('{service: <{service_width}}{padding}{bundle_id: <{bundle_id_width}}{padding}{bundle_name: <{bundle_name_width}}{padding}{status: <{status_width}}'.format(**dict(row, **column_widths))) if len(duplicate_endpoints) > 0: print() conduct_logging.warning('Multiple endpoints found for the following services: {}'.format(', '.join(duplicate_endpoints))) conduct_logging.warning('Service resolution for these services is undefined.')
def run(args): """`conduct run` command""" path = 'bundles/{}?scale={}'.format(args.bundle, args.scale) url = conduct_url.url(path, args) response = requests.put(url) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) response_json = json.loads(response.text) bundle_id = response_json['bundleId'] if args.long_ids else bundle_utils.short_id(response_json['bundleId']) print('Bundle run request sent.') print('Stop bundle with: conduct stop{} {}'.format(args.cli_parameters, bundle_id)) print('Print ConductR info with: conduct info{}'.format(args.cli_parameters))
def stop(args): """`conduct stop` command""" path = "bundles/{}?scale=0".format(args.bundle) url = conduct_url.url(path, args) response = requests.put(url) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) response_json = json.loads(response.text) bundle_id = response_json["bundleId"] if args.long_ids else bundle_utils.short_id(response_json["bundleId"]) print("Bundle stop request sent.") print("Unload bundle with: conduct unload{} {}".format(args.cli_parameters, bundle_id)) print("Print ConductR info with: conduct info{}".format(args.cli_parameters))
def load(args): """`conduct load` command""" print('Retrieving bundle...') bundle_name, bundle_url = get_url(args.bundle) bundle_file, bundle_headers = urlretrieve(bundle_url) configuration_file, configuration_headers, configuration_name = (None, None, None) if args.configuration is not None: print('Retrieving configuration...') configuration_name, configuration_url = get_url(args.configuration) configuration_file, configuration_headers = urlretrieve(configuration_url) bundle_conf = ConfigFactory.parse_string(bundle_utils.conf(bundle_file)) overlay_bundle_conf = None if configuration_file is None else \ ConfigFactory.parse_string(bundle_utils.conf(configuration_file)) with_bundle_configurations = partial(apply_to_configurations, bundle_conf, overlay_bundle_conf) url = conduct_url.url('bundles', args) files = get_payload(args.api_version, bundle_name, bundle_file, with_bundle_configurations) if configuration_file is not None: files.append(('configuration', (configuration_name, open(configuration_file, 'rb')))) print('Loading bundle to ConductR...') response = requests.post(url, files=files) conduct_logging.raise_for_status_inc_3xx(response) if args.verbose: conduct_logging.pretty_json(response.text) response_json = json.loads(response.text) bundle_id = response_json['bundleId'] if args.long_ids else bundle_utils.short_id(response_json['bundleId']) print('Bundle loaded.') print('Start bundle with: conduct run{} {}'.format(args.cli_parameters, bundle_id)) print('Unload bundle with: conduct unload{} {}'.format(args.cli_parameters, bundle_id)) print('Print ConductR info with: conduct info{}'.format(args.cli_parameters))