Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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 [])
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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)