def test_detect_invalid_version_in_meta(repo_w, tmpdir): rp = str(tmpdir) + '/r1' generate_structure(rp, ['0.1.0'], versions_meta=['0.1'], number=1) repo = Repository('repo_in_meta') with pytest.raises(RepositoryException) as ex: repo.create(rp) assert 'r1/first/0.1.0' in str(ex)
def add(name, source, overwrite, resource_name): repo = Repository(name) if resource_name is None: resource_name = os.path.split(source)[-1] repo.add_single(name=resource_name, source=source, overwrite=overwrite)
def test_simple_select(repo_r, spec, exp): spec = Repository._parse_spec(spec) assert Repository.contains(spec) is exp if exp: metadata = Repository.get_metadata(spec) assert metadata['version'] == spec['version'] assert spec['version_sign'] == '=='
def test_get_latest(repo_r, spec, exp): spec = Repository._parse_spec(spec) assert spec['version'] is None assert Repository.contains(spec) is exp if exp: Repository.get_metadata(spec) assert spec['version_sign'] == '>='
def repo_w(request, tmpdir_factory): path = generator(request, tmpdir_factory) r = Repository('rwtest') r.create(path) request.addfinalizer(lambda: shutil.rmtree(path)) request.addfinalizer(lambda: r.remove()) return r
def _import(name, source, link): if name is None: name = os.path.split(source)[-1] repo = Repository(name) repo.create(source, link) cnt = len(list(repo.iter_contents())) click.echo( "Created new repository with {} resources".format(cnt))
def show(repository): if not repository: repos = Repository.list_repos() str_repos = '\n'.join(sorted(repos)) click.echo(str_repos) else: repo = Repository(repository) content = yaml.safe_dump(dict(repo.get_contents()), default_flow_style=False) click.echo_via_pager(content)
def test_create_from_src(mock_mkdtemp, mock_rename, _): tmp_dir = '/tmp/dir' mock_mkdtemp.return_value = tmp_dir repo = Repository('create_from_src') real_path = repo.fpath repo.create(source='source') mock_rename.assert_called_with(tmp_dir, real_path) assert repo.fpath == real_path
def test_create_from_src_failed(mock_rmtree, mock_mkdtemp, mock_add_contents): tmp_dir = '/tmp/dir' mock_mkdtemp.return_value = tmp_dir mock_add_contents.side_effect = Exception() repo = Repository('fail_create') real_path = repo.fpath with pytest.raises(Exception): repo.create(source='source') mock_rmtree.assert_called_with(tmp_dir) assert repo.fpath == real_path
def update(name, source, overwrite): repo = Repository(name) prev = len(list(repo.iter_contents())) repo.update(source, overwrite) now = len(list(repo.iter_contents())) diff = now - prev if diff: click.echo( "Updated repository, with {} new resources".format(diff)) else: click.echo( "Repository updated".format(diff))
def contains(spec, bool): repo, spec = Repository.parse(spec) if bool: result = Repository.contains(spec) if result: click.echo(click.style("Exists", fg='green')) return else: result_version = Repository.what_version(spec) if result_version: click.echo(click.style("Found: {}".format(result_version), fg='green')) return spec_data = yaml.safe_dump(spec, default_flow_style=False) click.echo(click.style("Not found: \n{}".format(spec_data), fg='red'))
def create(name, spec, inputs=None, tags=None): inputs = inputs or {} if isinstance(spec, provider.BaseProvider): spec = spec.directory # fullpath # TODO: (jnowak) find a better way to code this part if spec.startswith('/'): if os.path.isfile(spec): template = _compile_file(name, spec, inputs) yaml_template = yaml.load(StringIO(template)) rs = apply_composer_file(spec, name, yaml_template, tags) else: r = create_resource(name, spec, inputs=inputs, tags=tags,) rs = [r] return rs repo, parsed_spec = Repository.parse(spec) if repo.is_composer_file(spec): path = repo.get_composer_file_path(spec) template = _compile_file(name, path, inputs) yaml_template = yaml.load(StringIO(template)) rs = apply_composer_file(path, name, yaml_template, tags) else: r = create_resource(name, spec, inputs=inputs, tags=tags) rs = [r] return CreatedResources(rs)
def create_from_spec(self, name, spec, args=None, tags=None): args = args or {} self.name = name if spec: if spec.startswith('/'): # it's full path, don't use repo self.base_path = spec metadata = read_meta(spec) else: repo, spec = Repository.parse(spec) metadata = repo.get_metadata(spec) self.base_path = repo.get_path(spec) else: metadata = deepcopy(self._metadata) self.base_path = spec # TODO: remove this old method? if tags is None: tags = [] m_tags = metadata.get('tags', []) tags.extend(m_tags) tags.append('resource={}'.format(name)) inputs = metadata.get('input', {}) self.auto_extend_inputs(inputs) self.db_obj = DBResource.from_dict( name, { 'id': name, 'name': name, 'actions_path': metadata.get('actions_path', ''), 'actions': metadata.get('actions', {}), 'base_name': metadata.get('base_name', ''), 'base_path': metadata.get('base_path', ''), 'handler': metadata.get('handler', ''), 'version': metadata.get('version', ''), 'meta_inputs': inputs, 'tags': tags, 'state': RESOURCE_STATE.created.name, 'managers': metadata.get('managers', []) }) self.create_inputs(args) self.db_obj.save() LogItem.new({ 'resource': self.name, 'action': 'run', 'log': 'staged', 'tags': self.tags }).save_lazy()
def create_from_spec(self, name, spec, args=None, tags=None): args = args or {} self.name = name if spec: if spec.startswith('/'): # it's full path, don't use repo self.base_path = spec metadata = read_meta(spec) else: repo, spec = Repository.parse(spec) metadata = repo.get_metadata(spec) self.base_path = repo.get_path(spec) else: metadata = deepcopy(self._metadata) self.base_path = spec # TODO: remove this old method? if tags is None: tags = [] m_tags = metadata.get('tags', []) tags.extend(m_tags) tags.append('resource={}'.format(name)) inputs = metadata.get('input', {}) self.auto_extend_inputs(inputs) self.db_obj = DBResource.from_dict( name, { 'id': name, 'name': name, 'actions_path': metadata.get('actions_path', ''), 'actions': metadata.get('actions', {}), 'base_name': metadata.get('base_name', ''), 'base_path': metadata.get('base_path', ''), 'handler': metadata.get('handler', ''), 'version': metadata.get('version', ''), 'meta_inputs': inputs, 'tags': tags, 'state': RESOURCE_STATE.created.name, 'managers': metadata.get('managers', []) }) self.create_inputs(args) self.db_obj.save() LogItem.new({ 'resource': self.name, 'action': 'run', 'log': 'staged', 'tags': self.tags}).save_lazy()
def create_resources(base_path, resources, tags=None): add_tags = tags created_resources = [] for r in resources: resource_name = r['id'] inputs = r.get('input', {}) node = r.get('location', None) values_from = r.get('values_from') spec = r.get('from', None) tags = r.get('tags', []) if add_tags: tags.extend(add_tags) is_composer_file = False if spec.startswith('./') or spec.endswith('.yaml'): spec = os.path.join(base_path, '..', spec) spec = os.path.abspath(os.path.normpath(spec)) is_composer_file = True new_resources = create(resource_name, spec, inputs=inputs, tags=tags) created_resources += new_resources if not spec.startswith('/'): repo, parsed_spec = Repository.parse(spec) is_composer_file = repo.is_composer_file(spec) if not is_composer_file: if node: node = load_resource(node) r = new_resources[0] node.connect(r, mapping={}) r.add_tags('location={}'.format(node.name)) update_inputs(resource_name, inputs) if values_from: from_resource = load_resource(values_from) from_resource.connect_with_events(r, use_defaults=False) return created_resources
def remove(spec): repo, spec = Repository.parse(spec) repo.remove_single(spec)
def destroy(name): repo = Repository(name) repo.remove()
def test_create_empty(): repo = Repository('empty') repo.create() assert 'empty' in Repository.list_repos()
def test_simple_create(ct): r = Repository('test') r.create(ct) for k, v in r.get_contents().items(): assert len(v) == 3
def create(name): repo = Repository(name) repo.create() click.echo("Repository created")
def repo_r(request, tmpdir_factory): path = generator(request, tmpdir_factory) r = Repository('rtest') r.create(path) return r
def test_two_repos(tmpdir): rp1 = str(tmpdir) + '/r1' rp2 = str(tmpdir) + '/r2' generate_structure(rp1, 2) generate_structure(rp2, 5) r1 = Repository('repo1') r1.create(rp1) r2 = Repository('repo2') r2.create(rp2) exp = set(['repo1', 'repo2']) got = set(Repository.list_repos()) assert got.intersection(exp) == exp assert Repository.contains('repo1/first:0.0.1') assert Repository.contains('repo2/first:0.0.1') assert Repository.contains('repo1/first:2.0.0') is False assert Repository.contains('repo2/first:2.0.0') r2.remove() exp = set(['repo1']) got = set(Repository.list_repos()) assert got.intersection(exp) == exp assert Repository.contains('repo2/first:2.0.0') is False
def test_remove_single(repo_w, spec): assert Repository.contains(spec) repo_w.remove_single(spec) assert Repository.contains(spec) is False
def test_guess_version_soft(repo_r, spec, exp, exp_ver): assert Repository.contains(spec) is exp if exp: metadata = Repository.get_metadata(spec) assert metadata['version'] == exp_ver
def repos_path(tmpdir_factory): Repository._REPOS_LOCATION = str(tmpdir_factory.mktemp('repositories')) repo = Repository('resources') repo.create()