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_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(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) if mode: self.failUnless('sudo chmod %s %s' % (mode, 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_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_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_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_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_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_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(bootstrap.rc_eos)) log = file_log(bootstrap.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_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(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(STARTUP_CONFIG)) log = file_log(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 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('add_config')) contents = random_string() bootstrap.ztps.set_file_response(config, contents) bootstrap.start_test() try: self.failUnless(os.path.isfile(bootstrap.startup_config)) self.failUnless( contents.split() == 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_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_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(bootstrap.startup_config)) log = file_log(bootstrap.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_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_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_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_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(self): filenames = { 'DEBUG' : '/tmp/ztps-log-%s-debug' % os.getpid(), 'ERROR' : '/tmp/ztps-log-%s-error' % os.getpid(), 'INFO' : '/tmp/ztps-log-%s-info' % os.getpid(), 'bogus' : '/tmp/ztps-log-%s-bogus' % os.getpid() } logging = [] for level, filename in filenames.iteritems(): logging += {'destination' : 'file:%s' % filename, 'level' : level}, for filename in filenames.itervalues(): self.failIf(os.path.isfile(filename)) bootstrap = Bootstrap() bootstrap.ztps.set_config_response(logging=logging) 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()) for filename in filenames.itervalues(): self.failUnless(file_log(filename)) self.assertEquals(file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['bogus'], ignore_string='SyslogManager')) self.assertEquals(file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['INFO'], ignore_string='SyslogManager')) self.failIfEqual(file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['ERROR'], ignore_string='SyslogManager')) self.failUnless(set(file_log(filenames['ERROR'])).issubset( set(file_log(filenames['DEBUG'])))) for filename in filenames.itervalues(): remove_file(filename) 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(self): filenames = { 'DEBUG': '/tmp/ztps-log-%s-debug' % os.getpid(), 'ERROR': '/tmp/ztps-log-%s-error' % os.getpid(), 'INFO': '/tmp/ztps-log-%s-info' % os.getpid(), 'bogus': '/tmp/ztps-log-%s-bogus' % os.getpid() } logging = [] for level, filename in filenames.iteritems(): logging += {'destination': 'file:%s' % filename, 'level': level}, for filename in filenames.itervalues(): self.failIf(os.path.isfile(filename)) bootstrap = Bootstrap() bootstrap.ztps.set_config_response(logging=logging) 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()) for filename in filenames.itervalues(): self.failUnless(file_log(filename)) self.assertEquals( file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['bogus'], ignore_string='SyslogManager')) self.assertEquals( file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['INFO'], ignore_string='SyslogManager')) self.failIfEqual( file_log(filenames['DEBUG'], ignore_string='SyslogManager'), file_log(filenames['ERROR'], ignore_string='SyslogManager')) self.failUnless( set(file_log(filenames['ERROR'])).issubset( set(file_log(filenames['DEBUG'])))) for filename in filenames.itervalues(): remove_file(filename) 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_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(bootstrap.rc_eos)) log = file_log(bootstrap.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_success(self): bootstrap = Bootstrap(ztps_default_config=True) source = random_string() destination = '/tmp/%s' % random_string() ztps_server = 'http://%s' % bootstrap.server 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, '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(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_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(bootstrap.startup_config)) log = file_log(bootstrap.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_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_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 xmpp_sanity_test(self, xmpp): log = '/tmp/ztps-log-%s-debug' % os.getpid() bootstrap = Bootstrap() bootstrap.ztps.set_config_response(logging=[ {'destination' : 'file:%s' % log, 'level' : 'DEBUG'},], xmpp=xmpp) 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(bootstrap.error) self.failIf('XmppClient' not in ''.join(file_log(log))) except AssertionError as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise assertion finally: bootstrap.end_test()
def test_url_success(self): bootstrap = Bootstrap(ztps_default_config=True) config = random_string() url = 'http://%s/%s' % (bootstrap.server, 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 as assertion: print 'Output: %s' % bootstrap.output print 'Error: %s' % bootstrap.error raise_exception(assertion) finally: 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 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(STARTUP_CONFIG)) log = file_log(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_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_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()