Exemple #1
0
    def with_dataset(self, name=None):
        """Yield an editable metadata object for a dataset."""
        from renku.models._locals import with_reference
        from renku.models.refs import LinkReference

        dataset = self.load_dataset(name=name)

        if dataset is None:
            identifier = str(uuid.uuid4())
            path = (self.renku_datasets_path / identifier / self.METADATA)
            path.parent.mkdir(parents=True, exist_ok=True)

            with with_reference(path):
                dataset = Dataset(
                    identifier=identifier, name=name, client=self
                )

            if name:
                LinkReference.create(client=self, name='datasets/' +
                                     name).set_reference(path)

        dataset_path = self.path / self.datadir / dataset.name
        dataset_path.mkdir(parents=True, exist_ok=True)

        yield dataset

        # TODO
        # if path is None:
        #     path = dataset_path / self.METADATA
        #     if path.exists():
        #         raise ValueError('Dataset already exists')

        dataset.to_yaml()
Exemple #2
0
def datasets(ctx, client):
    """Migrate dataset metadata."""
    from renku.models._jsonld import asjsonld
    from renku.models.datasets import Dataset
    from renku.models.refs import LinkReference

    from ._checks.location_datasets import _dataset_metadata_pre_0_3_4

    for old_path in _dataset_metadata_pre_0_3_4(client):
        dataset = Dataset.from_yaml(old_path, client=client)

        name = str(old_path.parent.relative_to(client.path / 'data'))
        new_path = (client.renku_datasets_path / dataset.uid / client.METADATA)
        new_path.parent.mkdir(parents=True, exist_ok=True)

        dataset = dataset.rename_files(lambda key: os.path.relpath(
            str(old_path.parent / key), start=str(new_path.parent)))

        with new_path.open('w') as fp:
            yaml.dump(asjsonld(dataset), fp, default_flow_style=False)

        old_path.unlink()

        LinkReference.create(client=client,
                             name='datasets/' + name).set_reference(new_path)
Exemple #3
0
    def dataset_path(self, name):
        """Get dataset path from name."""
        from renku.models.refs import LinkReference
        path = self.renku_datasets_path / name / self.METADATA
        if not path.exists():
            path = LinkReference(client=self,
                                 name='datasets/' + name).reference

        return path
Exemple #4
0
def workflow(ctx, client):
    """List or manage workflows with subcommands."""
    if ctx.invoked_subcommand is None:
        from renku.models.refs import LinkReference

        names = defaultdict(list)
        for ref in LinkReference.iter_items(client, common_path='workflows'):
            names[ref.reference.name].append(ref.name)

        for path in client.workflow_path.glob('*.cwl'):
            click.echo('{path}: {names}'.format(
                path=path.name,
                names=', '.join(
                    click.style(_deref(name), fg='green')
                    for name in names[path.name]),
            ))
Exemple #5
0
    def with_dataset(self, name=None):
        """Yield an editable metadata object for a dataset."""
        from renku.models.refs import LinkReference

        with self.lock:
            path = None
            dataset = None

            if name:
                path = self.renku_datasets_path / name / self.METADATA

                if not path.exists():
                    path = LinkReference(client=self,
                                         name='datasets/' + name).reference

                if path.exists():
                    with path.open('r') as f:
                        source = yaml.load(f) or {}
                    dataset = Dataset.from_jsonld(source)

            if dataset is None:
                source = {}
                dataset = Dataset(name=name)

                path = (self.renku_datasets_path / dataset.identifier.hex /
                        self.METADATA)
                path.parent.mkdir(parents=True, exist_ok=True)

                if name:
                    LinkReference.create(client=self, name='datasets/' +
                                         name).set_reference(path)

            dataset_path = self.path / self.datadir / dataset.name
            dataset_path.mkdir(parents=True, exist_ok=True)

            yield dataset

            source.update(**asjsonld(dataset))

            # TODO
            # if path is None:
            #     path = dataset_path / self.METADATA
            #     if path.exists():
            #         raise ValueError('Dataset already exists')

            with path.open('w') as f:
                yaml.dump(source, f, default_flow_style=False)
Exemple #6
0
def check_missing_references(client):
    """Find missing references."""
    from renku.models.refs import LinkReference

    missing = [
        ref for ref in LinkReference.iter_items(client)
        if not ref.reference.exists()
    ]

    if not missing:
        return True

    click.secho(WARNING + 'There are missing references.'
                '\n  (use "git rm <name>" to clean them)\n\n\t' +
                '\n\t  '.join(
                    click.style(str(ref.path), fg='yellow') + ' -> ' +
                    click.style(str(ref.reference), fg='red')
                    for ref in missing) + '\n')
    return False
Exemple #7
0
def remove(client, names):
    """Delete a dataset."""
    from renku.models.refs import LinkReference
    datasets = {name: client.dataset_path(name) for name in names}

    if not datasets:
        raise click.BadParameter(
            'use dataset name or identifier', param_hint='names'
        )

    unknown = [
        name
        for name, path in datasets.items() if not path or not path.exists()
    ]
    if unknown:
        raise click.BadParameter(
            'unknown datasets ' + ', '.join(unknown), param_hint='names'
        )

    datasets = set(datasets.values())

    with progressbar(
        datasets,
        label='Removing metadata files'.ljust(30),
        item_show_func=lambda item: str(item) if item else '',
    ) as bar:
        for dataset in bar:
            if dataset and dataset.exists():
                dataset.unlink()

    with progressbar(
        list(LinkReference.iter_items(client, common_path='datasets')),
        label='Removing aliases'.ljust(30),
        item_show_func=lambda item: item.name if item else '',
    ) as bar:
        for ref in bar:
            if ref.reference in datasets:
                ref.delete()

    click.secho('OK', fg='green')
Exemple #8
0
 def workflow_names(self):
     """Return index of workflow names."""
     names = defaultdict(list)
     for ref in LinkReference.iter_items(self, common_path='workflows'):
         names[str(ref.reference.relative_to(self.path))].append(ref.name)
     return names
Exemple #9
0
def remove(client, name):
    """Remove the remote named <name>."""
    from renku.models.refs import LinkReference
    LinkReference(client=client, name=_ref(name)).delete()
Exemple #10
0
def rename(client, old, new, force):
    """Rename the workflow named <old> to <new>."""
    from renku.models.refs import LinkReference
    LinkReference(client=client, name=_ref(old)).rename(_ref(new), force=force)
Exemple #11
0
def set_name(client, name, path, force):
    """Sets the <name> for remote <path>."""
    from renku.models.refs import LinkReference
    LinkReference.create(
        client=client, name=_ref(name), force=force
    ).set_reference(path)