예제 #1
0
    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)
예제 #2
0
    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)
예제 #4
0
    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::'})
예제 #5
0
    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::'})
예제 #6
0
    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')))
예제 #7
0
    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'))
        )
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
    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'])
예제 #11
0
    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')