def _parse_constraint(self, constraint): try: name, val = constraint.split('=') except Exception: raise HTTPClientError('incorrect value for constraint, should' ' be key=value') if name not in CONSTRAINTS.keys(): raise HTTPClientError('incorrect type of constraint %s' % name) try: val = CONSTRAINTS[name](val) except Exception: raise HTTPClientError('incorrect value for type %s: %s' % (name, val)) return name, val
def _parse_subjects(self, parsed_args): umsScheme = self.app.client.request( method='GET', url='/management/%s/midgard/schema' % parsed_args.project) ums = next((r['id'] for r in umsScheme if r['name'] == 'umsUsers'), None) if not ums: raise HTTPClientError('Userset scheme not found') subjects = list() subjects += ['ums:%s' % k for k in parsed_args.userset] subjects += ['apk:%s' % k for k in parsed_args.api_key] subjects += ['nsp:%s' % k for k in parsed_args.namespace] if not subjects: raise HTTPClientError('at least one option of --userset, ' '--api-key, --namespace required') return subjects
def _parse_policy_result(self, project_id, result): umsScheme = self.app.client.request( method='GET', url='/management/%s/midgard/schema' % project_id) ums = next((r['id'] for r in umsScheme if r['name'] == 'umsUsers'), None) if not ums: raise HTTPClientError('Userset scheme not found') datasets = self.app.client.request(method='GET', url='/management/%s/mimir/ds' % project_id) datasets = [d['id'] for d in datasets] filesets = self.app.client.request(method='GET', url='/management/%s/bestla/fs' % project_id) filesets = [f['id'] for f in filesets] for policy in result: translated_resources = list() for resource in policy['resources']: if resource == ums: translated_resources.append('All users') elif resource in datasets: translated_resources.append('dataset: %s' % resource) elif resource in filesets: translated_resources.append('fileset: %s' % resource) else: translated_resources.append('unknown: %s' % resource) policy['resources'] = translated_resources return result
def take_action(self, parsed_args): self.cleanup_resources = list() result = self.app.client.request( method='GET', url='/management/%s/mimir/ds' % parsed_args.project) res_datasets = [r['id'] for r in result] if not parsed_args.dataset: parsed_args.dataset = res_datasets else: for ds in parsed_args.dataset: if ds not in res_datasets: raise HTTPClientError('Dataset %s not found' % parsed_args.dataset) if parsed_args.with_data: # create API key for data exporting api_key = self.app.client.request( method='POST', url='/management/%s/utgard/' % parsed_args.project, data={'description': 'jexia-cli-dataset-export'} ) self.cleanup_resources.append({ 'method': 'DELETE', 'url': '/management/%s/utgard/%s' % (parsed_args.project, api_key['key'])}) # create policy for API key policy = self.app.client.request( method='POST', url='/management/%s/rakshak/policies/' % parsed_args.project, data={'description': 'jexia-cli-dataset-export', 'subjects': ['apk:%s' % api_key['key']], 'resources': parsed_args.dataset, 'actions': {'read': []}} ) self.cleanup_resources.append({ 'method': 'DELETE', 'url': ('/management/%s/rakshak/policies/%s' % (parsed_args.project, policy['id']))}) # auth in consumption API self.app.consumption_client.auth_consumption( project=parsed_args.project, method='apk', key=api_key['key'], secret=api_key['secret'], ) dump = list() for ds in result: if ds['id'] not in parsed_args.dataset: continue dataset_dump = self._prepare_dataset_dump(ds, parsed_args.filter) if parsed_args.with_data: dataset_dump['data'] = self._prepare_data_dump(dataset_dump) dump.append(dataset_dump) json_dump = json.dumps(dump, indent=2, sort_keys=True) if parsed_args.to: with open(parsed_args.to, "w") as f: f.write(json_dump) else: self.app.stdout.write(json_dump)
def take_action(self, parsed_args): resource_id = getattr(parsed_args, self.resource) result = self.app.client.request( method='GET', url='/management/%s/%s' % (parsed_args.project, self.svc_url)) rs_data = next((r for r in result if r['id'] == resource_id), None) if not rs_data: raise HTTPClientError( '%s %s not found' % (self.resource.capitalize(), resource_id)) return self.setup_columns(rs_data['inputs'] or [])
def take_action(self, parsed_args): result = self.app.client.request( method='GET', url=('/project/%s/app/%s/deploy' % (parsed_args.project, parsed_args.app))) deployment = next((d for d in result['deployments'] if d['id'] == parsed_args.deployment), None) if not deployment: raise HTTPClientError('deployment %s not found' % parsed_args.deployment) return self.setup_columns(deployment)
def take_action(self, parsed_args): result = self.app.client.request(method='GET', url='/project/%s/app' % parsed_args.project) app = next( (a for a in result['applications'] if a['id'] == parsed_args.app), None) if not app: raise HTTPClientError('application %s not found' % parsed_args.app) repo_url = parsed_args.repo or app['repo_url'] env_vars = app.get('env_vars', {}) for opt in parsed_args.var: try: key = opt[:opt.index('=')] val = opt[opt.index('=') + 1:] except Exception: raise HTTPClientError('incorrect value for --var option, ' 'should be key=value') if val == '': if key in env_vars: env_vars.pop(key) else: raise HTTPClientError('incorrect value for --var option, ' 'value or variable cannot be empty') else: env_vars[key] = val body = { "env_vars": env_vars, "repo_url": repo_url, } if parsed_args.branch: body["repo_branch"] = parsed_args.branch result = self.app.client.request( method='PATCH', url='/project/%s/app/%s' % (parsed_args.project, parsed_args.app), data=body, ) result['public_url'] = 'https://%s' % result['public_url'] return self.setup_columns(result)
def take_action(self, parsed_args): self.columns = ['id', 'relation'] result = self.app.client.request(method='GET', url='/management/%s/midgard/schema' % parsed_args.project) ums = next((r['id'] for r in result if r['name'] == 'umsUsers'), None) if not ums: raise HTTPClientError('Userset scheme not found') data = { 'to_resource': { 'namespace': 'midgard', 'resource_id': ums, }, } relation = parsed_args.relation.split('-') data['type'] = { 'from_cardinality': relation[1], 'to_cardinality': relation[0], } url_namespace = '' to_resource = '' if parsed_args.dataset: data['from_resource'] = { 'namespace': 'mimir', 'resource_id': parsed_args.dataset, } url_namespace = 'mimir/ds/relation' to_resource = 'dataset' if parsed_args.fileset: data['from_resource'] = { 'namespace': 'bestla', 'resource_id': parsed_args.fileset, } url_namespace = 'bestla/fs/relation' to_resource = 'fileset' result = self.app.client.request(method='POST', url='/management/%s/%s' % (parsed_args.project, url_namespace), data=data) formatted_result = { 'id': result['id'], to_resource: result['to_resource']['resource_id'], 'relation': '%s-%s' % (result['type']['to_cardinality'], result['type']['from_cardinality']), } self.columns.insert(2, to_resource) return self.setup_columns(formatted_result)
def take_action(self, parsed_args): resource_id = getattr(parsed_args, self.resource) result = self.app.client.request( method='GET', url='/management/%s/%s' % (parsed_args.project, self.svc_url)) rs_data = next((r for r in result if r['id'] == resource_id), None) if not rs_data: raise HTTPClientError( '%s %s not found' % (self.resource.capitalize(), resource_id)) if self.field_action == 'create': result = self._action_create( parsed_args.constraint, parsed_args.name, parsed_args.type, parsed_args.project, resource_id) if self.field_action == 'update': result = self._action_update( parsed_args.constraint, parsed_args.project, parsed_args.field, resource_id, rs_data) return self.setup_columns(result)
def _action_update(self, opt_constraint, opt_project, opt_field, resource_id, resource_data): field = next((f for f in resource_data['inputs'] if f['id'] == opt_field), None) if not field: raise HTTPClientError('Field %s not found' % opt_field) constraints = {c['type']: c['value'] for c in field['constraints']} for con in opt_constraint: name, val = self._parse_constraint(con) constraints[name] = val if not val: constraints.pop(name) result = self.app.client.request( method='PUT', data=[{'type': k, 'value': v} for k, v in constraints.items()], url=('/management/%s/%s/%s/constraints/%s' % (opt_project, self.svc_url, resource_id, opt_field))) field['constraints'] = result return field
def take_action(self, parsed_args): env_vars = dict() for opt in parsed_args.var: try: key, val = opt.split('=') except Exception: raise HTTPClientError('incorrect value for --var option, ' 'should be key=value') env_vars[key] = val body = { "env_vars": env_vars, "repo_url": parsed_args.repo, } if parsed_args.branch: body["repo_branch"] = parsed_args.branch result = self.app.client.request(method='POST', url='/project/%s/app' % parsed_args.project, data=body) if result: result['public_url'] = ('https://%s.%s' % (result['id'], APP_HOSTING_DOMAIN)) return self.setup_columns(result)