def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes': {'url' : url}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) bootstrap.ztps.set_action_response('test_action', get_action('run_cli_commands')) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) self.failUnless(eapi_log()[-1] == contents) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_missing_receivers(self): self.basic_test('send_email', 'Missing attribute(\'receivers\')', attributes={'smarthost' : random_string(), 'sender' : random_string()})
def test(self): bootstrap = Bootstrap() open(bootstrap.rc_eos, 'w').write(random_string()) open(bootstrap.boot_extensions, 'w').write(random_string()) os.makedirs(bootstrap.boot_extensions_folder) open('%s/%s' % (bootstrap.boot_extensions_folder, random_string()), 'w').write(random_string()) bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response() bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.missing_startup_config_failure()) self.failIf(os.path.exists(bootstrap.rc_eos)) self.failIf(os.path.exists(bootstrap.boot_extensions)) self.failIf(os.path.exists(bootstrap.boot_extensions_folder)) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_url_failure(self): self.basic_test('install_image', 'Unable to retrieve image file from URL', attributes={'url' : random_string(), 'version' : random_string()})
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes': {'url' : url}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) bootstrap.ztps.set_action_response('test_action', get_action('run_bash_script')) print_string = random_string() contents = '''#!/usr/bin/env python print "%s"''' % print_string bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) self.failUnless(print_string in bootstrap.output) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_failure(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes': {'url' : url}}]) bootstrap.ztps.set_action_response('test_action', get_action('run_cli_commands')) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.eapi.add_failing_command(contents) bootstrap.start_test() try: self.failUnless(eapi_log()[-1] == contents) self.failUnless(bootstrap.action_failure()) self.failUnless('Running CLI commands [\'%s\'] failed' % contents in bootstrap.output) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_variables_failure(self): url = random_string() contents = random_string() self.basic_test('add_config', 3, attributes={'url' : url, 'variables' : random_string()}, file_responses={url : contents})
def test_multiple_actions(self): bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'print_action_1'}, {'action' : 'print_action_2'}]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) text_1 = random_string() bootstrap.ztps.set_action_response('print_action_1', print_action(text_1)) text_2 = random_string() bootstrap.ztps.set_action_response('print_action_2', print_action(text_2)) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.success()) self.failUnless(text_1 in bootstrap.output) self.failUnless(text_2 in bootstrap.output) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise assertion finally: bootstrap.end_test()
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) version = random_string() image = random_string() url = 'http://%s/%s' % (bootstrap.server, image) bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes' : { 'url' : url, 'version' : version}}]) boot_file = '/tmp/boot-config' action = get_action('install_image') action = action.replace('/mnt/flash/boot-config', boot_file) bootstrap.ztps.set_action_response('test_action', action) bootstrap.ztps.set_file_response(image, print_action()) bootstrap.start_test() image_file = '%s/%s.swi' % (FLASH, version) try: self.failUnless('! boot system flash:/%s.swi' % version in file_log(STARTUP_CONFIG)) self.failUnless(os.path.isfile(image_file)) self.failUnless(['SWI=flash:/%s.swi' % version] == file_log(boot_file)) self.failUnless(bootstrap.success()) except AssertionError: raise finally: remove_file(image_file) remove_file(boot_file) bootstrap.end_test()
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) version = random_string() image = random_string() url = 'http://%s/%s' % (bootstrap.server, image) bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes' : { 'url' : url, 'version' : version}}, {'action' :'startup_config_action'}]) action = get_action('install_image') bootstrap.ztps.set_action_response('test_action', action) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.ztps.set_file_response(image, print_action()) bootstrap.start_test() image_file = '%s/EOS-%s.swi' % (FLASH, version) try: self.failUnless(os.path.isfile(image_file)) self.failUnless(bootstrap.success()) self.failUnless(eapi_log()[-1] == 'install source flash:EOS-%s.swi' % version) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(image_file) bootstrap.end_test()
def test(self): open(RC_EOS, 'w').write(random_string()) open(BOOT_EXTENSIONS, 'w').write(random_string()) os.makedirs(BOOT_EXTENSIONS_FOLDER) open('%s/%s' % (BOOT_EXTENSIONS_FOLDER, random_string()), 'w').write(random_string()) bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response() bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.missing_startup_config_failure()) self.failIf(os.path.exists(RC_EOS)) self.failIf(os.path.exists(BOOT_EXTENSIONS)) self.failIf(os.path.exists(BOOT_EXTENSIONS_FOLDER)) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise assertion finally: bootstrap.end_test()
def test_append(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = 'http://%s/%s' % (bootstrap.server, config) bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes': {'url' : url}}]) bootstrap.ztps.set_action_response('test_action', get_action('add_config')) startup_config_text = random_string() bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action(lines=[startup_config_text])) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) log = file_log(bootstrap.startup_config) self.failUnless(contents in log) self.failUnless(startup_config_text in log) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_replace(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = random_string() url = 'http://%s/%s' % (bootstrap.server, source) attributes = {'src_url' : url, 'dst_url' : destination} # 'replace' is the default if bool(random.getrandbits(1)): attributes['overwrite'] = 'replace' mode = None if True or bool(random.getrandbits(1)): mode = random_permissions() attributes['mode'] = mode bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : attributes}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) persistent_dir = '/tmp' action = get_action('copy_file') action = action.replace('/mnt/flash/.ztp-files', persistent_dir) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) destination_path = '%s/%s' % (persistent_dir, source) bootstrap.start_test() try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failUnless(os.path.isfile(RC_EOS)) log = file_log(RC_EOS) self.failUnless('#!/bin/bash' in log) self.failUnless('sudo cp %s %s' % (destination_path, destination) in log) if mode: self.failUnless('sudo chmod %s %s' % (mode, destination) in log) self.failUnless(bootstrap.success()) except AssertionError: raise finally: remove_file(destination_path) bootstrap.end_test()
def test_replace(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = '/tmp/%s' % random_string() url = 'http://%s/%s' % (bootstrap.server, source) attributes = {'src_url' : url, 'dst_url' : destination} # 'replace' is the default if bool(random.getrandbits(1)): attributes['overwrite'] = 'replace' mode = None if True or bool(random.getrandbits(1)): mode = random_permissions() attributes['mode'] = mode bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : attributes}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) action = get_action('copy_file') # Make the destinaton persistent action = action.replace('PERSISTENT_STORAGE = [', 'PERSISTENT_STORAGE = [\'%s\', ' % destination) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) destination_path = '%s/%s' % (destination, source) bootstrap.start_test() try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failIf(os.path.isfile(bootstrap.rc_eos)) if mode: self.failUnless(mode == oct(os.stat(destination_path)[ST_MODE])[-3:]) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(destination_path) shutil.rmtree(destination) bootstrap.end_test()
def test_keep_backup(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = '/tmp/%s' % random_string() url = 'http://%s/%s' % (bootstrap.server, source) bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : {'src_url' : url, 'dst_url' : destination, 'overwrite' : 'backup'}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) action = get_action('copy_file') # Make the destinaton persistent action = action.replace('PERSISTENT_STORAGE = [', 'PERSISTENT_STORAGE = [\'%s\', ' % destination) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) destination_path = '%s/%s' % (destination, source) backup_contents = random_string() os.makedirs(destination) file_descriptor = open(destination_path, 'w') file_descriptor.write(backup_contents) file_descriptor.close() bootstrap.start_test() backup_path = '%s.backup' % destination_path try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failUnless(os.path.isfile(backup_path)) self.failUnless([backup_contents] == file_log(backup_path)) self.failIf(os.path.isfile(bootstrap.rc_eos)) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(destination_path) remove_file(backup_path) shutil.rmtree(destination) bootstrap.end_test()
def test_variable_missing_failure(self): url = random_string() contents = random_string() + ' $missing_var' self.basic_test('add_config', 4, attributes={'url' : url, 'substitution_mode': 'strict', 'variables' : {}}, file_responses={url : contents})
def test_wrong_overwrite_value(self): self.basic_test('copy_file', 3, attributes={'src_url' : random_string(), 'dst_url' : random_string(), 'overwrite' : 'bogus'})
def test_variable_missing_failure(self): url = random_string() contents = random_string() + ' $missing_var' self.basic_test('run_bash_script', 'Unable to perform variable substitution - ' '\'missing_var\' missing from list of substitutions', attributes={'url' : url, 'variables' : {}}, file_responses={url : contents})
def test_variables_failure(self): url = random_string() contents = random_string() self.basic_test('run_bash_script', 'Unable to perform variable substitution - ' 'invalid variables', attributes={'url' : url, 'variables' : random_string()}, file_responses={url : contents})
def test_url_failure(self): action = get_action('copy_file') action = action.replace('/mnt/flash/.ztp-files', '/tmp') self.basic_test('copy_file', 4, attributes={'src_url' : random_string(), 'dst_url' : random_string()}, action_value=action)
def test_keep_backup(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = random_string() url = 'http://%s/%s' % (bootstrap.server, source) bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : {'src_url' : url, 'dst_url' : destination, 'overwrite' : 'backup'}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) persistent_dir = '/tmp' action = get_action('copy_file') action = action.replace('/mnt/flash/.ztp-files', persistent_dir) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) bootstrap.start_test() destination_path = '%s/%s' % (persistent_dir, source) try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failUnless(os.path.isfile(bootstrap.rc_eos)) log = file_log(bootstrap.rc_eos) self.failUnless('#!/bin/bash' in log) self.failUnless('sudo cp %s %s' % (destination_path, destination) in log) self.failUnless('[ -f %s ] && sudo mv %s %s.backup' % (destination, destination, destination) in log) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(destination_path) bootstrap.end_test()
def test_no_downgrade(self): bootstrap = Bootstrap(ztps_default_config=True) version1 = '4.18.1F' version2 = '4.17.2F' bootstrap.eapi.version = version1 bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes': { 'downgrade' : False, 'url' : random_string(), 'version' : version2}}, {'action' :'startup_config_action'}]) bootstrap.ztps.set_action_response('test_action', get_action('install_image')) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.start_test() image_file = '%s/EOS-%s.swi' % (bootstrap.flash, version2) try: self.failUnless(bootstrap.success()) self.failUnless('install_image: nothing to do: downgrade disabled' in bootstrap.output) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(image_file) bootstrap.end_test()
def test_duplicate_actions(self): bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'print_action'}, {'action' : 'print_action'}]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) text = random_string() bootstrap.ztps.set_action_response('print_action', print_action(text)) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.success()) self.failUnless(bootstrap.output.count('Downloading action ' 'print_action') == 1) self.failUnless(bootstrap.output.count('Executing action ' 'print_action') == 2) self.failUnless(bootstrap.output.count(text) == 2) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise assertion finally: bootstrap.end_test()
def test_attribute(self): bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() text = random_string() bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'print_action', 'attributes' : {'print_action-attr':text}}]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.ztps.set_action_response('print_action', print_action(use_attribute=True)) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.success()) self.failUnless(text in bootstrap.output) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise assertion finally: bootstrap.end_test()
def test_variables_loose(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config var_dict = { 'a' : 'A', 'b' : 'A', 'xxx' : '999', 'dummy': 'DUMMY'} bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes': {'url' : url, 'substitution_mode': 'loose', 'variables': var_dict}}]) bootstrap.ztps.set_action_response('test_action', get_action('add_config')) contents = '$a 1234 $b 4 321 $xxx$a' expected_contents = Template(contents).safe_substitute(var_dict) bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) self.failUnless([expected_contents] == file_log(bootstrap.startup_config)) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_append_server(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = '/tmp/%s' % random_string() ztps_server = 'http://%s' % bootstrap.server bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : {'src_url' : source, 'dst_url' : destination, 'ztps_server': ztps_server}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) action = get_action('copy_file') # Make the destinaton persistent action = action.replace('PERSISTENT_STORAGE = [', 'PERSISTENT_STORAGE = [\'%s\', ' % destination) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) bootstrap.start_test() destination_path = '%s/%s' % (destination, source) try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failIf(os.path.isfile(bootstrap.rc_eos)) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(destination_path) shutil.rmtree(destination) bootstrap.end_test()
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = random_string() url = 'http://%s/%s' % (bootstrap.server, source) bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : {'src_url' : url, 'dst_url' : destination}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) persistent_dir = '/tmp' action = get_action('copy_file') action = action.replace('/mnt/flash/.ztp-files', persistent_dir) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(source, contents) bootstrap.start_test() destination_path = '%s/%s' % (persistent_dir, source) try: self.failUnless(os.path.isfile(destination_path)) self.failUnless([contents] == file_log(destination_path)) self.failUnless(os.path.isfile(RC_EOS)) log = file_log(RC_EOS) self.failUnless('#!/bin/bash' in log) self.failUnless('sudo cp %s %s' % (destination_path, destination) in log) self.failUnless(bootstrap.success()) except AssertionError: raise finally: remove_file(destination_path) bootstrap.end_test()
def test_ztps_path_success(self): bootstrap = Bootstrap(ztps_default_config=True) plugin = url = random_string() ztps_server = 'http://%s' % bootstrap.server bootstrap.ztps.set_definition_response( actions=[{'action' : 'startup_config_action'}, {'action' : 'test_action', 'attributes' : {'url' : url, 'ztps_server': ztps_server}}]) bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action()) plugin_dir = '/tmp' persistent_dir = '/tmp/persistent' action = get_action('install_cli_plugin') action = action.replace('/usr/lib/python2.7/site-packages/CliPlugin', plugin_dir) action = action.replace('/mnt/flash/.ztp-plugins', persistent_dir) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(plugin, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(RC_EOS)) log = file_log(RC_EOS) self.failUnless('#!/bin/bash' in log) self.failUnless('sudo cp %s/%s %s' % (persistent_dir, plugin, plugin_dir) in log) self.failUnless(contents in file_log('%s/%s' % (persistent_dir, plugin))) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: shutil.rmtree(persistent_dir) bootstrap.end_test()
def test_action_success_log(self): log = '/tmp/ztps-log-%s-debug' % os.getpid() bootstrap = Bootstrap() bootstrap.ztps.set_config_response(logging=[ { 'destination': 'file:%s' % log, 'level': 'DEBUG' }, ]) bootstrap.ztps.set_node_check_response() text_onstart = random_string() text_onsuccess = random_string() text_onfailure = random_string() bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action', 'onstart': text_onstart, 'onsuccess': text_onsuccess, 'onfailure': text_onfailure, }]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.success()) self.failIf(bootstrap.error) log = ''.join(file_log(log)) self.failUnless('startup_config_action: %s' % text_onstart in log) self.failUnless('startup_config_action: %s' % text_onsuccess in log) self.failUnless('startup_config_action: %s' % text_onfailure not in log) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action', 'attributes': {'url' : url}}]) bootstrap.ztps.set_action_response('test_action', get_action('replace_config')) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(STARTUP_CONFIG)) self.failUnless(contents.split() == file_log(STARTUP_CONFIG)) self.failUnless(bootstrap.success()) except AssertionError: raise finally: bootstrap.end_test()
def test_action_failure(self): bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response( actions=[{'action' : 'test_action'}]) flash_filename = random_string() bootstrap.ztps.set_action_response( 'test_action', fail_flash_file_action(bootstrap.flash, flash_filename)) open(bootstrap.rc_eos, 'w').write(random_string()) open(bootstrap.startup_config, 'w').write(random_string()) open(bootstrap.boot_extensions, 'w').write(random_string()) os.mkdir(bootstrap.boot_extensions_folder) open('%s/my_extension' % bootstrap.boot_extensions_folder, 'w').write(random_string()) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.action_failure()) self.failIf(bootstrap.error) self.failIf(os.path.isfile('%s/%s' % (bootstrap.flash, flash_filename))) self.failIf(os.path.isfile(bootstrap.rc_eos)) self.failIf(os.path.isfile(bootstrap.startup_config)) self.failIf(os.path.isfile(bootstrap.boot_extensions)) self.failIf(os.path.isdir(bootstrap.boot_extensions_folder)) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) version = random_string() image = random_string() url = 'http://%s/%s' % (bootstrap.server, image) bootstrap.ztps.set_definition_response( actions=[{ 'action': 'test_action', 'attributes': { 'url': url, 'version': version } }, { 'action': 'startup_config_action' }]) action = get_action('install_image') bootstrap.ztps.set_action_response('test_action', action) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.ztps.set_file_response(image, print_action()) bootstrap.start_test() image_file = '%s/EOS-%s.swi' % (bootstrap.flash, version) try: self.failUnless(os.path.isfile(image_file)) self.failUnless(bootstrap.success()) self.failUnless( eapi_log()[-1] == 'install source flash:EOS-%s.swi' % version) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: remove_file(image_file) bootstrap.end_test()
def test_append(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = 'http://%s/%s' % (bootstrap.server, config) bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action' }, { 'action': 'test_action', 'attributes': { 'url': url } }]) bootstrap.ztps.set_action_response('test_action', get_action('add_config')) startup_config_text = random_string() bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action(lines=[startup_config_text])) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) log = file_log(bootstrap.startup_config) self.failUnless(contents in log) self.failUnless(startup_config_text in log) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_variables(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = config var_dict = {'a': 'A', 'b': 'A', 'xxx': '999', 'dummy': 'DUMMY'} bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action' }, { 'action': 'test_action', 'attributes': { 'url': url, 'substitution_mode': 'strict', 'variables': var_dict } }]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) bootstrap.ztps.set_action_response('test_action', get_action('run_bash_script')) print_string = '$a 1234 $b 4 321 $xxx$a' contents = '''#!/usr/bin/env bash echo %s''' % print_string bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() expected_contents = Template(print_string).substitute(var_dict) try: self.failUnless(os.path.isfile(bootstrap.startup_config)) self.failUnless(expected_contents in bootstrap.output) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_duplicate_actions(self): bootstrap = Bootstrap() bootstrap.ztps.set_config_response() bootstrap.ztps.set_node_check_response() bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action' }, { 'action': 'print_action' }, { 'action': 'print_action' }]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) text = random_string() bootstrap.ztps.set_action_response('print_action', print_action(text)) bootstrap.start_test() try: self.failUnless(bootstrap.eapi_node_information_collected()) self.failUnless(bootstrap.success()) self.failUnless( bootstrap.output.count('Downloading action ' 'print_action') == 1) self.failUnless( bootstrap.output.count('Executing action ' 'print_action') == 2) self.failUnless(bootstrap.output.count(text) == 2) self.failIf(bootstrap.error) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_missing_version(self): self.basic_test('install_image', 'Missing attribute(\'version\')', attributes={'url': random_string()})
def test_missing_dst_url(self): self.basic_test('copy_file', 'Missing attribute(\'dst_url\')', attributes={'src_url': random_string()})
def test_url_failure(self): self.basic_test('install_cli_plugin', 'Unable to retrieve CliPlugin from URL', attributes={'url': random_string()})
def test_url_failure(self): self.basic_test('replace_config', 'Unable to retrieve config from URL', attributes={'url': random_string()})
def test_url_failure(self): self.basic_test('install_extension', 'Unable to retrieve extension from URL', attributes={'url': random_string()})
def test_success(self): bootstrap = Bootstrap(ztps_default_config=True) extension = random_string() url = extension extension_force = random_string() url_force = 'http://%s/%s' % (bootstrap.server, extension_force) bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action' }, { 'action': 'test_action', 'attributes': { 'url': url } }, { 'action': 'test_action_force', 'attributes': { 'url': url_force, 'force': True } }]) bootstrap.ztps.set_action_response('startup_config_action', startup_config_action()) extensions_dir = '/tmp/extensions' boot_extensions = '/tmp/boot-extensions' action = get_action('install_extension') action = action.replace('/mnt/flash/.extensions', extensions_dir) action = action.replace('/mnt/flash/boot-extensions', boot_extensions) bootstrap.ztps.set_action_response('test_action', action) contents = random_string() bootstrap.ztps.set_file_response(extension, contents) bootstrap.ztps.set_action_response('test_action_force', action) contents_force = random_string() bootstrap.ztps.set_file_response(extension_force, contents_force) bootstrap.start_test() try: ext_filename = '%s/%s' % (extensions_dir, extension) self.failUnless(os.path.isfile(ext_filename)) self.failUnless([contents] == file_log(ext_filename)) self.failUnless(extension in file_log(boot_extensions)) ext_filename_force = '%s/%s' % (extensions_dir, extension_force) self.failUnless(os.path.isfile(ext_filename_force)) self.failUnless([contents_force] == file_log(ext_filename_force)) self.failUnless('%s force' % extension_force in file_log(boot_extensions)) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: shutil.rmtree(extensions_dir) remove_file(boot_extensions) bootstrap.end_test()
def test_multi_lines(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = 'http://%s/%s' % (bootstrap.server, config) bootstrap.ztps.set_definition_response( actions=[{ 'action': 'startup_config_action' }, { 'action': 'test_action', 'attributes': { 'url': url } }]) bootstrap.ztps.set_action_response('test_action', get_action('add_config')) startup_config_lines = [ random_string(), random_string(), random_string(), random_string() ] bootstrap.ztps.set_action_response( 'startup_config_action', startup_config_action(lines=startup_config_lines)) contents = '\n'.join([ random_string(), random_string(), random_string(), random_string(), random_string(), random_string() ]) bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(STARTUP_CONFIG)) log = file_log(STARTUP_CONFIG) all_lines = startup_config_lines + contents.split() for line in all_lines: self.failUnless(line in log) self.failUnless(bootstrap.success()) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: bootstrap.end_test()
def test_missing_sender(self): self.basic_test('send_email', 'Missing attribute(\'sender\')', attributes={'smarthost': random_string()})
def test_url_failure(self): self.basic_test('run_bash_script', 'Unable to retrieve config from URL', attributes={'url': random_string()})