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_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_site_assoctiation(self): """Test working site associations.""" # One site / assoc assocs = experiment.site_association('grenoble', script='script.sh') self.assertEqual(assocs, (('grenoble',), {'script': 'script.sh'})) # Multiple sites / asocs assocs = experiment.site_association( 'grenoble', 'strasbourg', script='script.sh', ipv6='2001::') self.assertEqual(assocs, (('grenoble', 'strasbourg'), {'script': 'script.sh', 'ipv6': '2001::'})) self.assertEqual(assocs.sites, ('grenoble', 'strasbourg')) self.assertEqual(assocs.associations, {'script': 'script.sh', 'ipv6': '2001::'})
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_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 site_association_from_str(site_assoc_str): """Extract site_association from given string. Format is: site,name=value site1,site2,site3,assoc_name=assoc_value,assoc2=assoc_val2 Sites validity is checked :raises argparse.ArgumentTypeError: on invalid site_assoc_str """ # Decode keywoard associations try: sites, kwassocs = _args_kwargs(site_assoc_str.split(',')) # Validate site and add domain sites = [common.site_with_domain_checked(site) for site in sites] return experiment.site_association(*sites, **kwassocs) except ValueError as err: raise argparse.ArgumentTypeError('Invalid site_association: %s' % err)
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_run_site_assocs_from_str(self, assoc_str, *sites, **kwassocs): """Test if sites association is the expected one.""" self.assertEqual( experiment_parser.run_site_association_from_str(assoc_str), experiment.site_association(*sites, **kwassocs))
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')