def main(args, file=sys.stdout): #pylint: disable=redefined-builtin _logging.configure_logging(args) if len(args) > 0 and args[0] == '--version': show_version_info_exit(file) azure_folder = os.path.expanduser('~/.azure') if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) config = Configuration(args) APPLICATION.initialize(config) try: cmd_result = APPLICATION.execute(args) # Commands can return a dictionary/list of results # If they do, we print the results. if cmd_result and cmd_result.result: formatter = OutputProducer.get_formatter( APPLICATION.configuration.output_format) OutputProducer(formatter=formatter, file=file).out(cmd_result) except Exception as ex: # pylint: disable=broad-except log_telemetry('Error', log_type='trace') error_code = handle_exception(ex) return error_code
def test_out_list_valid_array_complex(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out( CommandResultItem([{ 'active': True, 'id': '783yesdf' }, { 'active': False, 'id': '3hjnme32' }, { 'active': False, 'id': '23hiujbs' }])) self.assertEqual( util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""Active : True Id : 783yesdf Active : False Id : 3hjnme32 Active : False Id : 23hiujbs """))
def cli_execute(self, cmd): try: args = parse_quotes(cmd) azlogging.configure_logging(args) azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) config = Configuration(args) self.app.initialize(config) result = self.app.execute(args) self.last_exit = 0 if result and result.result is not None: from azure.cli.core._output import OutputProducer if self.output: self.output.out(result) else: formatter = OutputProducer.get_formatter( self.app.configuration.output_format) OutputProducer(formatter=formatter, file=sys.stdout).out(result) self.last = result except Exception as ex: # pylint: disable=broad-except self.last_exit = handle_exception(ex) except SystemExit as ex: self.last_exit = int(ex.code)
def test_out_json_byte_empty(self): output_producer = OutputProducer(formatter=format_json, file=self.io) output_producer.out(CommandResultItem({'active': True, 'contents': b''})) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """{ "active": true, "contents": "" } """))
def test_out_list_valid_none_val(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem({'active': None, 'id': '0b1f6472'})) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Active : None Id : 0b1f6472 """))
def test_out_list_valid_caps(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem({'active': True, 'TESTStuff': 'blah'})) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Test Stuff : blah Active : True """))
def cli_execute(self, cmd): """ sends the command to the CLI to be executed """ try: args = parse_quotes(cmd) if args and args[0] == 'feedback': self.config.set_feedback('yes') self.user_feedback = False azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) invocation = self.cli_ctx.invocation_cls( cli_ctx=self.cli_ctx, parser_cls=self.cli_ctx.parser_cls, commands_loader_cls=self.cli_ctx.commands_loader_cls, help_cls=self.cli_ctx.help_cls) if '--progress' in args: args.remove('--progress') execute_args = [args] thread = Thread(target=invocation.execute, args=execute_args) thread.daemon = True thread.start() self.threads.append(thread) self.curr_thread = thread progress_args = [self] thread = Thread(target=progress_view, args=progress_args) thread.daemon = True thread.start() self.threads.append(thread) result = None else: result = invocation.execute(args) self.last_exit = 0 if result and result.result is not None: from azure.cli.core._output import OutputProducer if self.output: self.output.write(result) self.output.flush() else: formatter = OutputProducer.get_formatter( self.cli_ctx.invocation.data['output']) OutputProducer(formatter=formatter).out(result) self.last = result except Exception as ex: # pylint: disable=broad-except self.last_exit = handle_exception(ex) except SystemExit as ex: self.last_exit = int(ex.code)
def test_out_table_list_of_lists(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = [['a', 'b'], ['c', 'd']] output_producer.out(CommandResultItem(obj)) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Column1 Column2 --------- --------- a b c d """))
def test_out_json_from_ordered_dict(self): # The JSON output when the input is OrderedDict should be serialized to JSON output_producer = OutputProducer(formatter=format_json, file=self.io) output_producer.out(CommandResultItem(OrderedDict({'active': True, 'id': '0b1f6472'}))) self.assertEqual(normalize_newlines(self.io.getvalue()), normalize_newlines( """{ "active": true, "id": "0b1f6472" } """))
def test_out_table(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = OrderedDict() obj['active'] = True obj['val'] = '0b1f6472' output_producer.out(CommandResultItem(obj)) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """ Active Val -------- -------- 1 0b1f6472 """))
def test_out_table(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = OrderedDict() obj['active'] = True obj['val'] = '0b1f6472' output_producer.out(CommandResultItem(obj)) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Active Val -------- -------- True 0b1f6472 """))
def test_out_table_no_query_no_transformer_order(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = {'name': 'qwerty', 'val': '0b1f6472qwerty', 'active': True, 'sub': '0b1f6472'} result_item = CommandResultItem(obj, table_transformer=None, is_query_active=False) output_producer.out(result_item) # Should be alphabetical order as no table transformer and query is not active. self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """ Active Name Sub Val -------- ------ -------- -------------- 1 qwerty 0b1f6472 0b1f6472qwerty """))
def cli_execute(self, cmd): """ sends the command to the CLI to be executed """ try: args = parse_quotes(cmd) azlogging.configure_logging(args) if len(args) > 0 and args[0] == 'feedback': SHELL_CONFIGURATION.set_feedback('yes') self.user_feedback = False azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) self.app.initialize(Configuration()) if '--progress' in args: args.remove('--progress') thread = ExecuteThread(self.app.execute, args) thread.daemon = True thread.start() self.threads.append(thread) self.curr_thread = thread thread = ProgressViewThread(progress_view, self) thread.daemon = True thread.start() self.threads.append(thread) result = None else: result = self.app.execute(args) self.last_exit = 0 if result and result.result is not None: from azure.cli.core._output import OutputProducer if self.output: self.output.write(result) self.output.flush() else: formatter = OutputProducer.get_formatter( self.app.configuration.output_format) OutputProducer(formatter=formatter, file=self.output).out(result) self.last = result except Exception as ex: # pylint: disable=broad-except self.last_exit = handle_exception(ex) except SystemExit as ex: self.last_exit = int(ex.code)
def test_out_table_no_query_no_transformer_order(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = {'name': 'qwerty', 'val': '0b1f6472qwerty', 'active': True, 'sub': '0b1f6472'} result_item = CommandResultItem(obj, table_transformer=None, is_query_active=False) output_producer.out(result_item) # Should be alphabetical order as no table transformer and query is not active. self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Active Name Sub Val -------- ------ -------- -------------- True qwerty 0b1f6472 0b1f6472qwerty """))
def test_out_json_from_ordered_dict(self): """ The JSON output when the input is OrderedDict should be serialized to JSON """ output_producer = OutputProducer(formatter=format_json, file=self.io) output_producer.out(CommandResultItem(OrderedDict({'active': True, 'id': '0b1f6472'}))) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """{ "active": true, "id": "0b1f6472" } """))
def test_out_table_no_query_yes_jmespath_table_transformer(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = {'name': 'qwerty', 'val': '0b1f6472qwerty', 'active': True, 'sub': '0b1f6472'} result_item = CommandResultItem(obj, table_transformer='{Name:name, Val:val, Active:active}', is_query_active=False) output_producer.out(result_item) # Should be table transformer order self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Name Val Active ------ -------------- -------- qwerty 0b1f6472qwerty True """))
def test_out_json_valid(self): """ The JSON output when the input is a dict should be the dict serialized to JSON """ output_producer = OutputProducer(formatter=format_json, file=self.io) output_producer.out(CommandResultItem({'active': True, 'id': '0b1f6472'})) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """{ "active": true, "id": "0b1f6472" } """))
def test_out_table_complex_obj(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = OrderedDict() obj['name'] = 'qwerty' obj['val'] = '0b1f6472qwerty' obj['sub'] = {'1'} result_item = CommandResultItem(obj) output_producer.out(result_item) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Name Val ------ -------------- qwerty 0b1f6472qwerty """))
def test_out_list_valid_none_val(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out( CommandResultItem({ 'active': None, 'id': '0b1f6472' })) self.assertEqual( util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""Active : None Id : 0b1f6472 """))
def test_out_list_valid_caps(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out( CommandResultItem({ 'active': True, 'TESTStuff': 'blah' })) self.assertEqual( util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""Test Stuff : blah Active : True """))
def test_out_list_valid_str_array(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem(['location', 'id', 'host', 'server'])) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """location id host server """))
def test_out_list_valid_complex_array(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem({'active': True, 'id': '0b1f6472', 'myarray': ['1', '2', '3', '4']})) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Active : True Id : 0b1f6472 Myarray : 1 2 3 4 """))
def test_out_json_valid(self): # The JSON output when the input is a dict should be the dict serialized to JSON output_producer = OutputProducer(formatter=format_json, file=self.io) output_producer.out( CommandResultItem({ 'active': True, 'id': '0b1f6472' })) self.assertEqual( normalize_newlines(self.io.getvalue()), normalize_newlines("""{ "active": true, "id": "0b1f6472" } """))
def test_out_table_no_query_yes_transformer_order(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = {'name': 'qwerty', 'val': '0b1f6472qwerty', 'active': True, 'sub': '0b1f6472'} def transformer(r): return OrderedDict([('Name', r['name']), ('Val', r['val']), ('Active', r['active']), ('Sub', r['sub'])]) result_item = CommandResultItem(obj, table_transformer=transformer, is_query_active=False) output_producer.out(result_item) # Should be table transformer order self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Name Val Active Sub ------ -------------- -------- -------- qwerty 0b1f6472qwerty 1 0b1f6472 """))
def main(args, file=sys.stdout): #pylint: disable=redefined-builtin _logging.configure_logging(args) if len(args) > 0 and args[0] == '--version': show_version_info_exit(file) azure_folder = os.path.expanduser('~/.azure') if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) config = Configuration(args) APPLICATION.initialize(config) try: cmd_result = APPLICATION.execute(args) # Commands can return a dictionary/list of results # If they do, we print the results. if cmd_result and cmd_result.result: from azure.cli.core._output import OutputProducer formatter = OutputProducer.get_formatter(APPLICATION.configuration.output_format) OutputProducer(formatter=formatter, file=file).out(cmd_result) except Exception as ex: # pylint: disable=broad-except from azure.cli.core.telemetry import log_telemetry log_telemetry('Error', log_type='trace') error_code = handle_exception(ex) return error_code
def test_out_table_no_query_yes_transformer_order(self): output_producer = OutputProducer(formatter=format_table, file=self.io) obj = {'name': 'qwerty', 'val': '0b1f6472qwerty', 'active': True, 'sub': '0b1f6472'} def transformer(r): return OrderedDict([('Name', r['name']), ('Val', r['val']), ('Active', r['active']), ('Sub', r['sub'])]) result_item = CommandResultItem(obj, table_transformer=transformer, is_query_active=False) output_producer.out(result_item) # Should be table transformer order self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Name Val Active Sub ------ -------------- -------- -------- qwerty 0b1f6472qwerty True 0b1f6472 """))
def main(args, file=sys.stdout): # pylint: disable=redefined-builtin azlogging.configure_logging(args) logger.debug('Command arguments %s', args) if len(args) > 0 and args[0] == '--version': show_version_info_exit(file) azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) APPLICATION.initialize(Configuration()) try: cmd_result = APPLICATION.execute(args) # Commands can return a dictionary/list of results # If they do, we print the results. if cmd_result and cmd_result.result is not None: from azure.cli.core._output import OutputProducer formatter = OutputProducer.get_formatter(APPLICATION.configuration.output_format) OutputProducer(formatter=formatter, file=file).out(cmd_result) except Exception as ex: # pylint: disable=broad-except # TODO: include additional details of the exception in telemetry telemetry.set_exception(ex, 'outer-exception', 'Unexpected exception caught during application execution.') telemetry.set_failure() error_code = handle_exception(ex) return error_code
def test_out_list_valid_str_array(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out( CommandResultItem(['location', 'id', 'host', 'server'])) self.assertEqual( util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""location id host server """))
def test_out_list_valid_array_complex(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem([ {'active': True, 'id': '783yesdf'}, {'active': False, 'id': '3hjnme32'}, {'active': False, 'id': '23hiujbs'}])) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines( """Active : True Id : 783yesdf Active : False Id : 3hjnme32 Active : False Id : 23hiujbs """))
def cli_execute(self, cmd): """ sends the command to the CLI to be executed """ try: args = parse_quotes(cmd) if args and args[0] == 'feedback': self.config.set_feedback('yes') self.user_feedback = False azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) invocation = self.cli_ctx.invocation_cls(cli_ctx=self.cli_ctx, parser_cls=self.cli_ctx.parser_cls, commands_loader_cls=self.cli_ctx.commands_loader_cls, help_cls=self.cli_ctx.help_cls) if '--progress' in args: args.remove('--progress') execute_args = [args] thread = Thread(target=invocation.execute, args=execute_args) thread.daemon = True thread.start() self.threads.append(thread) self.curr_thread = thread progress_args = [self] thread = Thread(target=progress_view, args=progress_args) thread.daemon = True thread.start() self.threads.append(thread) result = None else: result = invocation.execute(args) self.last_exit = 0 if result and result.result is not None: from azure.cli.core._output import OutputProducer if self.output: self.output.write(result) self.output.flush() else: formatter = OutputProducer.get_formatter(self.cli_ctx.invocation.data['output']) OutputProducer(formatter=formatter).out(result) self.last = result except Exception as ex: # pylint: disable=broad-except self.last_exit = handle_exception(ex) except SystemExit as ex: self.last_exit = int(ex.code)
def test_out_list_valid_complex_array(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out( CommandResultItem({ 'active': True, 'id': '0b1f6472', 'myarray': ['1', '2', '3', '4'] })) self.assertEqual( util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""Active : True Id : 0b1f6472 Myarray : 1 2 3 4 """))
def main(args, output=sys.stdout, logging_stream=None): configure_logging(args, logging_stream) logger = get_az_logger(__name__) logger.debug('Command arguments %s', args) if args and (args[0] == '--version' or args[0] == '-v'): show_version_info_exit(output) azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) APPLICATION.initialize(Configuration()) try: cmd_result = APPLICATION.execute(args) # Commands can return a dictionary/list of results # If they do, we print the results. if cmd_result and cmd_result.result is not None: from azure.cli.core._output import OutputProducer formatter = OutputProducer.get_formatter( APPLICATION.configuration.output_format) OutputProducer(formatter=formatter, file=output).out(cmd_result) except Exception as ex: # pylint: disable=broad-except # TODO: include additional details of the exception in telemetry telemetry.set_exception( ex, 'outer-exception', 'Unexpected exception caught during application execution.') telemetry.set_failure() error_code = handle_exception(ex) return error_code
def run(self): """ runs the CLI """ telemetry.start() self.cli.buffers['symbols'].reset( initial_document=Document(u'%s' %shell_help) ) while True: try: document = self.cli.run(reset_current_buffer=True) text = document.text cmd = text outside = False if text.split() and text.split()[0] == 'az': cmd = ' '.join(text.split()[1:]) if self.default_command: cmd = self.default_command + " " + cmd # if self.default_params: # for param in self.default_params: # cmd += ' ' + param except AttributeError: # when the user pressed Control Q break else: if text.strip() == "quit" or text.strip() == "exit": break elif text.strip() == "clear": # clears the history, but only when you restart outside = True cmd = 'echo -n "" >' +\ os.path.join( SHELL_CONFIGURATION.get_config_dir(), SHELL_CONFIGURATION.get_history()) elif text.strip() == "help": print(help_doc.dump(shell_help)) if text: if text[0] == SELECT_SYMBOL['outside']: cmd = text[1:] outside = True # elif text.split()[0] == "az": # dumps the extra az # cmd = " ".join(text.split()[1:]) elif text[0] == SELECT_SYMBOL['exit_code']: print(self.last_exit) self.set_prompt() continue elif SELECT_SYMBOL['query'] in text: # query previous output if self.last and self.last.result: if hasattr(self.last.result, '__dict__'): input_dict = dict(self.last.result) else: input_dict = self.last.result try: result = jmespath.search( text.partition(SELECT_SYMBOL['query'])[2], input_dict) if isinstance(result, str): print(result) else: print(json.dumps(result, sort_keys=True, indent=2)) except jmespath.exceptions.ParseError: print("Invalid Query") self.set_prompt() continue elif "|" in text or ">" in text: # anything I don't parse, send off outside = True cmd = "az " + cmd elif SELECT_SYMBOL['example'] in text: global NOTIFICATIONS cmd = self.handle_example(text) if SELECT_SYMBOL['default'] in text: default = text.partition(SELECT_SYMBOL['default'])[2].split() if default[0].startswith('-'): value = self.handle_default_param(default) else: value = self.handle_default_command(default) print("defaulting: " + value) self.set_prompt() continue if SELECT_SYMBOL['undefault'] in text: value = text.partition(SELECT_SYMBOL['undefault'])[2].split() if len(value) == 0: self.default_command = "" set_default_command("", add=False) # self.default_params = [] print('undefaulting all') elif len(value) == 1 and value[0] == self.default_command: self.default_command = "" set_default_command("", add=False) print('undefaulting: ' + value[0]) # elif len(value) == 2 and ' '.join(value[:2]) in self.default_params: # self.default_params.remove(' '.join(value[:2])) # print('undefaulting: ' + ' '.join(value[:2])) self.set_prompt() continue if not text: # not input self.set_prompt() continue self.history.append(cmd) self.set_prompt() if outside: subprocess.Popen(cmd, shell=True).communicate() else: try: args = [str(command) for command in cmd.split()] azlogging.configure_logging(args) azure_folder = get_config_dir() if not os.path.exists(azure_folder): os.makedirs(azure_folder) ACCOUNT.load(os.path.join(azure_folder, 'azureProfile.json')) CONFIG.load(os.path.join(azure_folder, 'az.json')) SESSION.load(os.path.join(azure_folder, 'az.sess'), max_age=3600) config = Configuration(args) self.app.initialize(config) result = self.app.execute(args) if result and result.result is not None: from azure.cli.core._output import OutputProducer, format_json if self.output: self.output.out(result) else: formatter = OutputProducer.get_formatter( self.app.configuration.output_format) OutputProducer(formatter=formatter, file=self.input).out(result) self.last = result self.last_exit = 0 except Exception as ex: # pylint: disable=broad-except self.last_exit = handle_exception(ex) except SystemExit as ex: self.last_exit = ex.code if self.last_exit != 0: telemetry.set_failure() else: telemetry.set_success() print('Have a lovely day!!') telemetry.conclude()
def test_out_boolean_valid(self): output_producer = OutputProducer(formatter=format_list, file=self.io) output_producer.out(CommandResultItem(True)) self.assertEqual(util.normalize_newlines(self.io.getvalue()), util.normalize_newlines("""True\n\n\n"""))