def test_experiment_script_run(self): """Test running experiment script run.""" experiment.script_experiment( self.api, 123, 'run', experiment.site_association( 'grenoble', script=tests.resource_file('script.sh'), scriptconfig=tests.resource_file('scriptconfig')), experiment.site_association( 'strasbourg', script=tests.resource_file('script_2.sh')), ) scripts_json = helpers.json_dumps({ 'script': [ {'scriptname': 'script.sh', 'sites': ['grenoble']}, {'scriptname': 'script_2.sh', 'sites': ['strasbourg']}, ], 'scriptconfig': [ {'scriptconfigname': 'scriptconfig', 'sites': ['grenoble']}, ], }) expected_files = { 'script.json': scripts_json, 'script.sh': SCRIPTS['script.sh'], 'script_2.sh': SCRIPTS['script_2.sh'], 'scriptconfig': SCRIPTCONFIG['scriptconfig'], } self.api.script_command.assert_called_with(123, 'run', files=expected_files)
def test_experiment_submit_duplicated_basenames(self): """ Run experiment_submit physical """ # Physical tests resources = [ experiment.exp_resources(['m3-1.grenoble.iot-lab.info'], tests.resource_file('firmware.elf')), experiment.exp_resources( ['m3-2.grenoble.iot-lab.info'], tests.resource_file('other/firmware.elf')), ] experiment.submit_experiment(self.api, 'exp_name', 20, resources, start_time=314159) call_dict = self.api.submit_experiment.call_args[0][0] expected = { 'name': 'exp_name', 'duration': 20, 'type': 'physical', 'nodes': [ 'm3-1.grenoble.iot-lab.info', 'm3-2.grenoble.iot-lab.info', ], 'reservation': 314159, 'profileassociations': None, 'firmwareassociations': [ { 'firmwarename': 'e77d9b8dcb84d1fcd21187b03eac74f1_firmware.elf', 'nodes': ['m3-2.grenoble.iot-lab.info'] }, { 'firmwarename': 'firmware.elf', 'nodes': ['m3-1.grenoble.iot-lab.info'] }, ], 'associations': None, 'siteassociations': None, 'profiles': None, 'mobilities': None, } self.assertEqual(expected, json.loads(call_dict['new_exp.json']))
def test_main_submit_parser_site_assocs(self, submit_exp): """Run experiment_parser.main.submit site associations.""" script_sh = resource_file('script.sh') script_2_sh = resource_file('script_2.sh') scriptconfig = resource_file('scriptconfig') submit_exp.return_value = {} # Groupped assocs experiment_parser.main([ 'submit', '--name', 'exp_name', '--duration', '20', '--list', 'grenoble,m3,1', '--list', 'strasbourg,m3,1', '--site-association', 'grenoble,strasbourg,script=%s' % script_sh, ]) sites_assocs = [ experiment.site_association('grenoble.iot-lab.info', 'strasbourg.iot-lab.info', script=script_sh), ] resources = [ experiment.exp_resources(['m3-1.grenoble.iot-lab.info']), experiment.exp_resources(['m3-1.strasbourg.iot-lab.info']), ] submit_exp.assert_called_with(self.api, 'exp_name', 20, resources, None, False, sites_assocs) # Different assocs experiment_parser.main([ 'submit', '--name', 'exp_name', '--duration', '20', '--list', 'grenoble,m3,1', '--list', 'strasbourg,m3,1', '--site-association', 'grenoble,script=%s,ipv6=2001::' % script_sh, '--site-association', 'strasbourg,script=%s,scriptconfig=%s' % ( script_2_sh, scriptconfig), ]) sites_assocs = [ experiment.site_association('grenoble.iot-lab.info', script=script_sh, ipv6='2001::'), experiment.site_association('strasbourg.iot-lab.info', script=script_2_sh, scriptconfig=scriptconfig), ] resources = [ experiment.exp_resources(['m3-1.grenoble.iot-lab.info']), experiment.exp_resources(['m3-1.strasbourg.iot-lab.info']), ] submit_exp.assert_called_with(self.api, 'exp_name', 20, resources, None, False, sites_assocs)
def test_experiment_submit_alias(self): """ Run experiment_submit alias """ # Alias tests resources = [ experiment.exp_resources( experiment.AliasNodes(1, 'grenoble', 'm3:at86rf231', False), tests.resource_file('firmware.elf'), 'profile1'), experiment.exp_resources( experiment.AliasNodes(2, 'grenoble', 'm3:at86rf231', False), tests.resource_file('firmware.elf'), 'profile1'), experiment.exp_resources( experiment.AliasNodes(4, 'grenoble', 'm3:at86rf231', False), tests.resource_file('firmware_2.elf'), 'profile2'), ] experiment.submit_experiment(self.api, None, 20, resources) files_dict = self.api.submit_experiment.call_args[0][0] exp_desc = json.loads(files_dict['new_exp.json']) expected = { 'name': None, 'duration': 20, 'type': 'alias', 'nodes': [ {"alias": '1', "nbnodes": 1, "properties": { "archi": "m3:at86rf231", "site": "grenoble", "mobile": False }}, {"alias": '2', "nbnodes": 2, "properties": { "archi": "m3:at86rf231", "site": "grenoble", "mobile": False }}, {"alias": '3', "nbnodes": 4, "properties": { "archi": "m3:at86rf231", "site": "grenoble", "mobile": False }}, ], 'reservation': None, 'profileassociations': [ {'profilename': 'profile1', 'nodes': ['1', '2']}, {'profilename': 'profile2', 'nodes': ['3']}, ], 'firmwareassociations': [ {'firmwarename': 'firmware.elf', 'nodes': ['1', '2']}, {'firmwarename': 'firmware_2.elf', 'nodes': ['3']} ], 'associations': None, 'siteassociations': None, 'profiles': None, 'mobilities': None, } self.assertEqual(expected, exp_desc) self.assertTrue('firmware.elf' in files_dict)
def test_script_run_error(self): """Test running experiment run with argument errors.""" # No sites/scripts self.assertRaises(ValueError, experiment.script_experiment, self.api, 123, 'run') # site multiple times self.assertRaises( ValueError, experiment.script_experiment, self.api, 123, 'run', experiment.site_association( 'grenoble', script=tests.resource_file('script.sh')), experiment.site_association( 'grenoble', script=tests.resource_file('script_2.sh')))
def test_exp_submit_associations(self): """Test experiment submission with associations.""" nodes = ['m3-1.grenoble.iot-lab.info'] assocs = {'mobility': 'controlled', 'kernel': 'linux'} resources = [ experiment.exp_resources(nodes, tests.resource_file('firmware.elf'), None, **assocs), ] experiment.submit_experiment(self.api, None, 20, resources) call_dict = self.api.submit_experiment.call_args[0][0] expected = { 'name': None, 'duration': 20, 'type': 'physical', 'nodes': nodes, 'reservation': None, 'profileassociations': None, 'firmwareassociations': [ {'firmwarename': 'firmware.elf', 'nodes': nodes}], 'associations': { 'mobility': [ {'mobilityname': 'controlled', 'nodes': nodes}], 'kernel': [ {'kernelname': 'linux', 'nodes': nodes}], }, 'siteassociations': None, 'profiles': None, 'mobilities': None, } self.assertEqual(expected, json.loads(call_dict['new_exp.json']))
def test_script_run_error(self): """Test running experiment run with argument errors.""" # No sites/scripts self.assertRaises(ValueError, experiment.script_experiment, self.api, 123, 'run') # site multiple times self.assertRaises( ValueError, experiment.script_experiment, self.api, 123, 'run', experiment.site_association( 'grenoble', script=tests.resource_file('script.sh')), experiment.site_association( 'grenoble', script=tests.resource_file('script_2.sh')) )
def test_exp_submit_types_detect(self): """ Try experiment submit types detection""" # Physical tests and Alias Nodes resources = [] resources.append(experiment.exp_resources( ['m3-%u.grenoble.iot-lab.info' % i for i in range(1, 6)])) resources.append(experiment.exp_resources( experiment.AliasNodes(1, 'grenoble', 'm3:at86rf231', False), tests.resource_file('firmware.elf'), 'profile1')) self.assertRaises(ValueError, experiment.submit_experiment, self.api, 'exp_name', 20, resources)
def test_exp_submit_site_association(self): """Test experiment submission with site associations.""" nodes = ['m3-1.grenoble.iot-lab.info', 'a8-1.strasbourg.iot-lab.info'] resources = [experiment.exp_resources(nodes)] site_assocs = [ experiment.site_association( 'grenoble', script=tests.resource_file('script.sh'), ipv6='aaaa::/64', ), experiment.site_association( 'strasbourg', script=tests.resource_file('script_2.sh'), scriptconfig=tests.resource_file('scriptconfig'), ), ] experiment.submit_experiment(self.api, None, 20, resources, sites_assocs=site_assocs) files_dict = self.api.submit_experiment.call_args[0][0] expected = { 'name': None, 'duration': 20, 'type': 'physical', 'nodes': nodes, 'reservation': None, 'profileassociations': None, 'firmwareassociations': None, 'associations': None, 'siteassociations': { 'script': [ { 'scriptname': 'script.sh', 'sites': ['grenoble'] }, { 'scriptname': 'script_2.sh', 'sites': ['strasbourg'] }, ], 'scriptconfig': [ { 'scriptconfigname': 'scriptconfig', 'sites': ['strasbourg'] }, ], 'ipv6': [ { 'ipv6name': 'aaaa::/64', 'sites': ['grenoble'] }, ], }, 'profiles': None, 'mobilities': None, } self.assertEqual(expected, json.loads(files_dict['new_exp.json'])) self.assertEqual(files_dict['script.sh'], SCRIPTS['script.sh']) self.assertEqual(files_dict['script_2.sh'], SCRIPTS['script_2.sh']) self.assertEqual(files_dict['scriptconfig'], SCRIPTCONFIG['scriptconfig'])
def test_main_script_parser(self, script): """ Run experiment_parser.main.run """ # Run script script_sh = resource_file('script.sh') scriptconfig = resource_file('scriptconfig') script.return_value = {} experiment_parser.main(['script', '--run', 'grenoble,script=%s' % script_sh]) script.assert_called_with( self.api, 123, 'run', experiment.site_association('grenoble.iot-lab.info', script=script_sh) ) # Multiple sites experiment_parser.main(['script', '--run', 'grenoble,strasbourg,script=%s' % script_sh]) script.assert_called_with( self.api, 123, 'run', experiment.site_association('grenoble.iot-lab.info', 'strasbourg.iot-lab.info', script=script_sh) ) # Multiple sites associations script.return_value = {} experiment_parser.main(['script', '--run', 'grenoble,script=%s,scriptconfig=%s' % ( script_sh, scriptconfig), 'strasbourg,script=%s' % script_sh]) script.assert_called_with( self.api, 123, 'run', experiment.site_association('grenoble.iot-lab.info', script=script_sh, scriptconfig=scriptconfig), experiment.site_association('strasbourg.iot-lab.info', script=script_sh) ) # Error no arguments self.assertRaises(SystemExit, experiment_parser.main, ['script', '--run']) # Unknown assoc self.assertRaises(SystemExit, experiment_parser.main, ['script', '--run', 'grenoble,script=%s,assoc=new' % script_sh]) # Error no script self.assertRaises(SystemExit, experiment_parser.main, ['script', '--run', 'grenoble,assoc=test']) self.assertRaises(SystemExit, experiment_parser.main, ['script', '--run', 'assoc=test']) # kill script experiment_parser.main(['script', '--kill']) script.assert_called_with(self.api, 123, 'kill') experiment_parser.main(['script', '--kill', 'grenoble']) script.assert_called_with(self.api, 123, 'kill', 'grenoble.iot-lab.info') experiment_parser.main(['script', '--kill', 'grenoble', 'strasbourg']) script.assert_called_with(self.api, 123, 'kill', 'grenoble.iot-lab.info', 'strasbourg.iot-lab.info') # Status script experiment_parser.main(['script', '--status']) script.assert_called_with(self.api, 123, 'status') experiment_parser.main(['script', '--status', 'grenoble']) script.assert_called_with(self.api, 123, 'status', 'grenoble.iot-lab.info') experiment_parser.main(['script', '--status', 'grenoble', 'strasbourg']) script.assert_called_with(self.api, 123, 'status', 'grenoble.iot-lab.info', 'strasbourg.iot-lab.info')