def test_update_project(self):
     object = ExperimentConfig(faker.word())
     experiment_uuid = uuid.uuid4().hex
     httpretty.register_uri(httpretty.PATCH,
                            ExperimentClient._build_url(
                                self.client.base_url,
                                ExperimentClient.ENDPOINT, experiment_uuid),
                            body=json.dumps(object.to_dict()),
                            content_type='application/json',
                            status=200)
     result = self.client.update_experiment(experiment_uuid,
                                            {'name': 'new'})
     assert result.to_dict() == object.to_dict()
 def test_stop_experiment(self):
     object = ExperimentConfig(name=faker.word())
     experiment_uuid = uuid.uuid4().hex
     httpretty.register_uri(httpretty.POST,
                            ExperimentClient._build_url(
                                self.client.base_url,
                                ExperimentClient.ENDPOINT, experiment_uuid,
                                'stop'),
                            body=json.dumps(object.to_dict()),
                            content_type='application/json',
                            status=200)
     result = self.client.stop(experiment_uuid)
     assert result.to_dict() == object.to_dict()
 def test_create_experiment(self):
     project_uuid = uuid.uuid4().hex
     object = ExperimentConfig(name=faker.word(), project=project_uuid)
     httpretty.register_uri(httpretty.POST,
                            ProjectClient._build_url(
                                self.client.base_url,
                                ProjectClient.ENDPOINT, project_uuid,
                                'experiments'),
                            body=json.dumps(object.to_dict()),
                            content_type='application/json',
                            status=200)
     result = self.client.create_experiment(project_uuid, object)
     assert result.to_dict() == object.to_dict()
Esempio n. 4
0
 def test_update_project(self):
     object = ExperimentConfig(config={})
     httpretty.register_uri(httpretty.PATCH,
                            ExperimentClient._build_url(
                                self.client.base_url,
                                ExperimentClient.ENDPOINT, 'username',
                                'project_name', 'experiments', 1),
                            body=json.dumps(object.to_dict()),
                            content_type='application/json',
                            status=200)
     result = self.client.update_experiment('username', 'project_name', 1,
                                            {'name': 'new'})
     assert result.to_dict() == object.to_dict()
Esempio n. 5
0
    def test_project_experiments_and_groups_config(self):
        uuid_value = uuid.uuid4().hex
        config_dict = {
            'name':
            'test',
            'description':
            '',
            'is_public':
            True,
            'experiment_groups': [
                ExperimentGroupConfig(content='content',
                                      uuid=uuid_value,
                                      project=uuid_value).to_dict()
            ],
            'experiments': [
                ExperimentConfig(config={},
                                 uuid=uuid_value,
                                 project=uuid_value).to_dict()
            ]
        }
        config = ProjectConfig.from_dict(config_dict)
        assert_equal_dict(config_dict, config.to_dict())

        config_dict.pop('description')
        config_dict.pop('experiment_groups')
        config_dict.pop('experiments')
        assert_equal_dict(config_dict, config.to_light_dict())
Esempio n. 6
0
 def test_experiment_with_jobs_config(self):
     config_dict = {
         'sequence':
         2,
         'config': {},
         'content':
         '',
         'uuid':
         uuid.uuid4().hex,
         'project':
         uuid.uuid4().hex,
         'group':
         uuid.uuid4().hex,
         'last_status':
         'Running',
         'num_jobs':
         1,
         'jobs': [
             ExperimentJobConfig(uuid.uuid4().hex,
                                 uuid.uuid4().hex,
                                 datetime.now(),
                                 definition={}).to_dict()
         ]
     }
     config = ExperimentConfig.from_dict(config_dict)
     assert config.to_dict() == config_dict
 def test_experiment_config(self):
     config_dict = {
         'name': 'test',
         'uuid': uuid.uuid4().hex,
         'project': uuid.uuid4().hex
     }
     config = ExperimentConfig.from_dict(config_dict)
     assert config.to_dict() == config_dict
Esempio n. 8
0
def run(ctx, file, description, u):  # pylint:disable=redefined-builtin
    """Run polyaxonfile specification.

    Example:

    \b
    ```bash
    $ polyaxon run -f file -f file_override ...
    ```

    Example: upload before running

    \b
    ```bash
    $ polyaxon run -f file -u
    ```

    """
    file = file or 'polyaxonfile.yml'
    specification = check_polyaxonfile(file, log=False).specification

    # Check if we need to upload
    if u:
        ctx.invoke(upload, async=False)

    project = ProjectManager.get_config_or_raise()
    project_client = PolyaxonClients().project

    if specification.is_experiment:
        click.echo('Creating an independent experiment.')
        experiment = ExperimentConfig(
            description=description,
            config=specification.parsed_data)
        try:
            project_client.create_experiment(project.user,
                                             project.name,
                                             experiment)
        except (PolyaxonHTTPError, PolyaxonShouldExitError) as e:
            Printer.print_error('Could not create experiment.')
            Printer.print_error('Error message `{}`.'.format(e))
            sys.exit(1)
        Printer.print_success('Experiment was created')
    else:
        click.echo('Creating an experiment group with the following definition:')
        experiments_def = specification.experiments_def
        get_group_experiments_info(**experiments_def)
        experiment_group = ExperimentGroupConfig(
            description=description,
            content=specification._data)  # pylint:disable=protected-access
        try:
            project_client.create_experiment_group(project.user,
                                                   project.name,
                                                   experiment_group)
            Printer.print_success('Experiment group was created')
        except (PolyaxonHTTPError, PolyaxonShouldExitError) as e:
            Printer.print_error('Could not create experiment group.')
            Printer.print_error('Error message `{}`.'.format(e))
            sys.exit(1)
Esempio n. 9
0
    def test_experiment_with_jobs_config(self):
        config_dict = {
            'sequence':
            2,
            'config': {},
            'content':
            '',
            'unique_name':
            'adam.proj.1',
            'uuid':
            uuid.uuid4().hex,
            'project':
            uuid.uuid4().hex,
            'project_name':
            'user.name',
            'experiment_group':
            uuid.uuid4().hex,
            'experiment_group_name':
            'user.name.1',
            'last_status':
            'Running',
            'num_jobs':
            1,
            'created_at':
            local_now().isoformat(),
            'updated_at':
            local_now().isoformat(),
            'started_at':
            local_now().isoformat(),
            'finished_at':
            local_now().isoformat(),
            'jobs': [
                ExperimentJobConfig(uuid=uuid.uuid4().hex,
                                    experiment=uuid.uuid4().hex,
                                    experiment_name='name.name.1',
                                    created_at=local_now(),
                                    updated_at=local_now(),
                                    definition={}).to_dict()
            ]
        }
        config = ExperimentConfig.from_dict(config_dict)
        config_to_dict = config.to_dict()
        assert config_to_dict.pop('total_run') == '0s'
        config_to_dict.pop('declarations')
        config_to_dict.pop('description')
        config_to_dict.pop('is_clone')
        config_to_dict.pop('is_done')
        config_to_dict.pop('is_running')
        config_to_dict.pop('last_metric')
        config_to_dict.pop('resources')
        config_to_dict.pop('user')
        assert config_to_dict == config_dict

        config_to_dict = config.to_light_dict(humanize_values=True)
        assert config_to_dict.pop('total_run') == '0s'
        assert config_to_dict.pop('created_at') == 'a few seconds ago'
        assert config_to_dict.pop('started_at') == 'a few seconds ago'
        assert config_to_dict.pop('finished_at') == 'a few seconds ago'
Esempio n. 10
0
 def update_experiment(self, experiment_uuid, patch_dict):
     request_url = self._build_url(self._get_http_url(), experiment_uuid)
     try:
         response = self.patch(request_url, json=patch_dict)
         return ExperimentConfig.from_dict(response.json())
     except PolyaxonException as e:
         self.handle_exception(
             e=e, log_message='Error while updating experiment')
         return None
Esempio n. 11
0
    def create_experiment(self, username, project_name, experiment_config):
        request_url = self._build_url(self._get_http_url(), username, project_name, 'experiments')

        try:
            response = self.post(request_url, json=experiment_config.to_dict())
            return ExperimentConfig.from_dict(response.json())
        except PolyaxonException as e:
            self.handle_exception(e=e, log_message='Error while creating experiment group')
            return None
Esempio n. 12
0
 def get_experiment(self, experiment_uuid):
     request_url = self._build_url(self._get_http_url(), experiment_uuid)
     try:
         response = self.get(request_url)
         return ExperimentConfig.from_dict(response.json())
     except PolyaxonException as e:
         self.handle_exception(
             e=e, log_message='Error while retrieving experiment')
         return None
Esempio n. 13
0
 def test_experiment_config(self):
     config_dict = {
         'uuid': uuid.uuid4().hex,
         'project': uuid.uuid4().hex,
         'group': uuid.uuid4().hex,
         'last_status': 'Running',
         'num_jobs': 1,
     }
     config = ExperimentConfig.from_dict(config_dict)
     assert config.to_dict() == config_dict
Esempio n. 14
0
    def test_experiment_config(self):
        config_dict = {
            'uuid': uuid.uuid4().hex,
            'project': uuid.uuid4().hex,
            'project_name': 'name.name',
            'experiment_group': uuid.uuid4().hex,
            'experiment_group_name': 'name.name.1',
            'unique_name': 'user.proj.1',
            'last_status': 'Running',
            'description': 'description',
            'content': 'content',
            'config': {
                'k': 'v'
            },
            'num_jobs': 1,
            'created_at': local_now().isoformat(),
            'updated_at': local_now().isoformat(),
        }
        config = ExperimentConfig.from_dict(config_dict)
        config_to_dict = config.to_dict()
        config_to_dict.pop('declarations')
        config_to_dict.pop('finished_at')
        config_to_dict.pop('is_clone')
        config_to_dict.pop('is_done')
        config_to_dict.pop('is_running')
        config_to_dict.pop('jobs')
        config_to_dict.pop('last_metric')
        config_to_dict.pop('resources')
        config_to_dict.pop('sequence')
        config_to_dict.pop('started_at')
        config_to_dict.pop('total_run')
        config_to_dict.pop('user')
        assert config_to_dict == config_dict

        config_to_dict = config.to_light_dict()
        config_dict.pop('uuid')
        config_dict.pop('description')
        config_dict.pop('content')
        config_dict.pop('config')
        config_dict.pop('project')
        config_dict.pop('experiment_group')
        config_dict.pop('updated_at')
        config_dict.pop('project_name')
        config_to_dict.pop('finished_at')
        config_to_dict.pop('is_done')
        config_to_dict.pop('is_running')
        config_to_dict.pop('sequence')
        config_to_dict.pop('started_at')
        config_to_dict.pop('total_run')
        config_to_dict.pop('user')
        assert config_to_dict == config_dict

        config_to_dict = config.to_light_dict(humanize_values=True)
        assert config_to_dict.pop('created_at') == 'a few seconds ago'
        assert config_to_dict.pop('started_at') is None
Esempio n. 15
0
    def test_experiment_group_config(self):
        uuid_value = uuid.uuid4().hex
        config_dict = {
            'sequence':
            1,
            'content':
            'some content',
            'uuid':
            uuid_value,
            'project':
            uuid_value,
            'project_name':
            'user.name',
            'num_experiments':
            0,
            'created_at':
            local_now().isoformat(),
            'updated_at':
            local_now().isoformat(),
            'experiments': [
                ExperimentConfig(config={},
                                 uuid=uuid_value,
                                 experiment_group=uuid_value,
                                 project=uuid_value).to_dict()
            ]
        }
        config = ExperimentGroupConfig.from_dict(config_dict)
        config_to_dict = config.to_dict()
        config_to_dict.pop('concurrency', None)
        config_to_dict.pop('description', None)
        config_to_dict.pop('num_failed_experiments', None)
        config_to_dict.pop('num_pending_experiments', None)
        config_to_dict.pop('num_running_experiments', None)
        config_to_dict.pop('num_scheduled_experiments', None)
        config_to_dict.pop('num_stopped_experiments', None)
        config_to_dict.pop('num_succeeded_experiments', None)
        config_to_dict.pop('unique_name', None)
        config_to_dict.pop('user', None)
        assert config_to_dict == config_dict

        config_dict.pop('content')
        config_dict.pop('uuid')
        config_dict.pop('project')
        config_dict.pop('updated_at')
        config_dict.pop('sequence')
        config_dict.pop('experiments')
        config_dict.pop('project_name')
        assert_equal_dict(config_dict, config.to_light_dict())

        config_to_dict = config.to_dict(humanize_values=True)
        assert config_to_dict.pop('created_at') == 'a few seconds ago'
        assert config_to_dict.pop('updated_at') == 'a few seconds ago'

        config_to_dict = config.to_light_dict(humanize_values=True)
        assert config_to_dict.pop('created_at') == 'a few seconds ago'
 def test_get_experiment(self):
     object = ExperimentConfig(faker.word()).to_dict()
     httpretty.register_uri(httpretty.GET,
                            ExperimentClient._build_url(
                                self.client.base_url,
                                ExperimentClient.ENDPOINT, 'uuid'),
                            body=json.dumps(object),
                            content_type='application/json',
                            status=200)
     result = self.client.get_experiment('uuid')
     assert object == result.to_dict()
Esempio n. 17
0
    def restart(self, experiment_uuid):
        """Restart an experiment."""
        request_url = self._build_url(self._get_http_url(), experiment_uuid,
                                      'restart')

        try:
            response = self.post(request_url)
            return ExperimentConfig.from_dict(response.json())
        except PolyaxonException as e:
            self.handle_exception(
                e=e, log_message='Error while restarting experiment')
            return None
Esempio n. 18
0
 def test_get_experiment(self):
     object = ExperimentConfig(config={}).to_dict()
     httpretty.register_uri(httpretty.GET,
                            ExperimentClient._build_url(
                                self.client.base_url,
                                ExperimentClient.ENDPOINT, 'username',
                                'project_name', 'experiments', 1),
                            body=json.dumps(object),
                            content_type='application/json',
                            status=200)
     result = self.client.get_experiment('username', 'project_name', 1)
     assert object == result.to_dict()
Esempio n. 19
0
 def test_experiment_group_config(self):
     uuid_value = uuid.uuid4().hex
     config_dict = {'sequence': 1,
                    'content': 'some content',
                    'uuid': uuid_value,
                    'project': uuid_value,
                    'num_experiments': 0,
                    'experiments': [
                        ExperimentConfig(config={},
                                         uuid=uuid_value,
                                         group=uuid_value,
                                         project=uuid_value).to_dict()]}
     config = ExperimentGroupConfig.from_dict(config_dict)
     assert config.to_dict() == config_dict
Esempio n. 20
0
 def list_experiments(self, page=1):
     """This gets all experiments visible to the user from the server."""
     try:
         response = self.get(self._get_http_url(),
                             params=self.get_page(page=page))
         experiments_dict = response.json()
         return [
             ExperimentConfig.from_dict(experiment)
             for experiment in experiments_dict.get("results", [])
         ]
     except PolyaxonException as e:
         self.handle_exception(
             e=e, log_message='Error while retrieving experiments')
         return []
Esempio n. 21
0
    def list_experiments(self, project_uuid, page=1):
        """Fetch list of experiments related to this project."""
        request_url = self._build_url(self._get_http_url(), project_uuid,
                                      'experiments')

        try:
            response = self.get(request_url, params=self.get_page(page=page))
            experiment_dicts = response.json()
            return [
                ExperimentConfig.from_dict(experiment_group)
                for experiment_group in experiment_dicts.get("results", [])
            ]
        except PolyaxonException as e:
            self.handle_exception(
                e=e, log_message='Error while retrieving experiments')
            return []
Esempio n. 22
0
    def test_list_experiments(self):
        group_uuid = uuid.uuid4().hex
        project_uuid = uuid.uuid4().hex
        xp_uuid = uuid.uuid4().hex
        xps = [ExperimentConfig(uuid=xp_uuid,
                                config={},
                                project=project_uuid,
                                group=group_uuid).to_dict()
               for _ in range(10)]
        httpretty.register_uri(
            httpretty.GET,
            ExperimentGroupClient._build_url(
                self.client.base_url,
                ExperimentGroupClient.ENDPOINT,
                'username',
                'project_name',
                'groups',
                1,
                'experiments'),
            body=json.dumps({'results': xps, 'count': 10, 'next': None}),
            content_type='application/json',
            status=200)

        response = self.client.list_experiments('username', 'project_name', 1)
        assert len(response['results']) == 10
        assert response['count'] == 10
        assert response['next'] is None
        assert response['previous'] is None

        # pagination

        httpretty.register_uri(
            httpretty.GET,
            ExperimentGroupClient._build_url(
                self.client.base_url,
                ExperimentGroupClient.ENDPOINT,
                'username',
                'project_name',
                'groups',
                1,
                'experiments') + '?offset=2',
            body=json.dumps({'results': xps, 'count': 10, 'next': None}),
            content_type='application/json',
            status=200)

        response = self.client.list_experiments('username', 'project_name', 1, page=2)
        assert len(response['results']) == 10
Esempio n. 23
0
    def test_list_experiments(self):
        experiments = [
            ExperimentConfig(config={}).to_dict() for _ in range(10)
        ]
        httpretty.register_uri(httpretty.GET,
                               ExperimentClient._build_url(
                                   self.client.base_url,
                                   ExperimentClient.ENDPOINT, 'experiments'),
                               body=json.dumps({
                                   'results': experiments,
                                   'count': 10,
                                   'next': None
                               }),
                               content_type='application/json',
                               status=200)

        response = self.client.list_experiments()
        assert len(response['results']) == 10
Esempio n. 24
0
def run(file, description):
    """Command for running polyaxonfile specification.

    Example:

    ```
    polyaxon run -f file -f file_override ...
    ```
    """
    file = file or 'polyaxonfile.yml'
    plx_file = check_polyaxonfile(file)
    num_experiments, concurrency = plx_file.experiments_def
    project = get_current_project_or_exit()
    project_client = PolyaxonClients().project
    if num_experiments == 1:
        click.echo('Creating an independent experiment.')
        experiment = ExperimentConfig(
            description=description,
            content=plx_file._data,
            config=plx_file.experiment_specs[0].parsed_data)
        try:
            response = project_client.create_experiment(
                project.user, project.name, experiment)
        except (PolyaxonHTTPError, PolyaxonShouldExitError) as e:
            Printer.print_error('Could not create experiment.')
            Printer.print_error('Error message `{}`.'.format(e))
            sys.exit(1)
        Printer.print_success('Experiment was created')
    else:
        click.echo('Creating an experiment group with {} experiments.'.format(
            num_experiments))
        experiment_group = ExperimentGroupConfig(description=description,
                                                 content=plx_file._data)
        try:
            response = project_client.create_experiment_group(
                project.user, project.name, experiment_group)
            Printer.print_success('Experiment group was created')
        except (PolyaxonHTTPError, PolyaxonShouldExitError) as e:
            Printer.print_error('Could not create experiment group.')
            Printer.print_error('Error message `{}`.'.format(e))
            sys.exit(1)
    response = response.to_dict()
    dict_tabulate(response)
    def test_list_experiments(self):
        group_uuid = uuid.uuid4().hex
        project_uuid = uuid.uuid4().hex
        xp_uuid = uuid.uuid4().hex
        xps = [
            ExperimentConfig(name='xp',
                             uuid=xp_uuid,
                             project=project_uuid,
                             group=group_uuid).to_dict() for _ in range(10)
        ]
        httpretty.register_uri(httpretty.GET,
                               ExperimentGroupClient._build_url(
                                   self.client.base_url,
                                   ExperimentGroupClient.ENDPOINT, group_uuid,
                                   'experiments'),
                               body=json.dumps({
                                   'results': xps,
                                   'count': 10,
                                   'next': None
                               }),
                               content_type='application/json',
                               status=200)

        xps_results = self.client.list_experiments(group_uuid)
        assert len(xps_results) == 10

        # pagination

        httpretty.register_uri(
            httpretty.GET,
            ExperimentGroupClient._build_url(
                self.client.base_url, ExperimentGroupClient.ENDPOINT,
                group_uuid, 'experiments') + '?offset=2',
            body=json.dumps({
                'results': xps,
                'count': 10,
                'next': None
            }),
            content_type='application/json',
            status=200)

        xps_results = self.client.list_experiments(group_uuid, page=2)
        assert len(xps_results) == 10
 def test_experiment_with_jobs_config(self):
     config_dict = {
         'name':
         'test',
         'uuid':
         uuid.uuid4().hex,
         'project':
         uuid.uuid4().hex,
         'group':
         uuid.uuid4().hex,
         'jobs': [
             ExperimentJobConfig(uuid.uuid4().hex,
                                 uuid.uuid4().hex,
                                 datetime.now(),
                                 definition='').to_dict()
         ]
     }
     config = ExperimentConfig.from_dict(config_dict)
     assert config.to_dict() == config_dict