def update(self, req, id, body): context = req.environ['nova.context'] # id is made equivalent to project_id for better readability project_id = id child_list = [] parent_id = None params = urlparse.parse_qs(req.environ.get('QUERY_STRING', '')) user_id = params.get('user_id', [None])[0] if hasattr(context, 'auth_token') and hasattr(context, 'project_id'): if (context.auth_token and context.project_id): token = context.auth_token headers = { "X-Auth-Token": token, "Content-type": "application/json", "Accept": "text/json" } parent_id = self._get_parent_id(headers, project_id) target = {"project_id": parent_id} try: if user_id: authorize_update(context) nova.context.authorize_project_context(context, id) else: if parent_id: authorize_update(context, target=target) nova.context.authorize_root_or_parent_project_context( context, parent_id) else: authorize_root_update(context) nova.context.authorize_root_or_parent_project_context( context, project_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() if parent_id: child_list = self._get_immediate_child_list( headers, parent_id) else: child_list = self._get_immediate_child_list( headers, project_id) if parent_id is not None: if id not in child_list: raise exception.InvalidParent(parent_id=parent_id, project_id=project_id) ################ quota_set = body['quota_set'] force_update = strutils.bool_from_string( quota_set.get('force', 'False')) try: settable_quotas = QUOTAS.get_settable_quotas(context, project_id, parent_id, user_id=user_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() for key, value in body['quota_set'].iteritems(): if key == 'force' or (not value and value != 0): continue # validate whether already used and reserved exceeds the new # quota, this check will be ignored if admin want to force # update value = int(value) if not force_update: minimum = settable_quotas[key]['minimum'] maximum = settable_quotas[key]['maximum'] self._validate_quota_limit(key, value, minimum, maximum) try: objects.Quotas.create_limit(context, project_id, key, value, user_id=user_id) except exception.QuotaExists: objects.Quotas.update_limit(context, project_id, key, value, user_id=user_id) if parent_id: db.quota_allocated_update(context, parent_id, child_list) return self._format_quota_set( id, self._get_quotas(context, id, user_id=user_id))
def _delete_project_quota(self, req, id,body): context = req.environ['nova.context'] # id is made equivalent to project_id for better readability project_id = id child_list = [] parent_id = None if hasattr(context, 'auth_token') and hasattr(context, 'project_id'): if(context.auth_token and context.project_id): token = context.auth_token headers = {"X-Auth-Token": token, "Content-type": "application/json", "Accept": "text/json"} params = {} auth_host = KEYSTONE_CONF.keystone_authtoken.auth_host auth_port = int(KEYSTONE_CONF.keystone_authtoken.auth_port) auth_server = '%s:%s' % (auth_host,auth_port) """ The follwing url is used for checking whether the given project is a root project or not """ auth_url = '/%s/%s/%s' % ("v3","projects",project_id) conn = httplib.HTTPConnection(auth_server) conn.request("GET", auth_url, json.dumps(params), headers=headers) response = conn.getresponse() data = response.read() data = json.loads(data) if not "project" in data: raise webob.exc.HTTPForbidden() try: parent_id = data["project"]["parent_id"] except: pass target = {"project_id":parent_id} try: if parent_id: authorize_update(context,target = target) nova.context.authorize_root_or_parent_project_context(context,parent_id) else: authorize_root_update(context) nova.context.authorize_root_or_parent_project_context(context,project_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() # The following url is for finding the subtree if parent_id: auth_url = '/%s/%s/%s?%s' % ("v3","projects",parent_id,"subtree") else: auth_url = '/%s/%s/%s?%s' % ("v3","projects",project_id,"subtree") conn.request("GET", auth_url, json.dumps(params), headers=headers) response = conn.getresponse() data = response.read() data = json.loads(data) subtree=[] try: subtree = data["project"]["subtree"] except: pass for item in subtree: project_info = item["project"] try: if project_info["parent_id"] == parent_id: child_list.append(project_info["id"]) except: pass if parent_id is not None: if id not in child_list: raise exception.InvalidParent(parent_id=parent_id,project_id=project_id) params = urlparse.parse_qs(req.environ.get('QUERY_STRING', '')) user_id = params.get('user_id', [None])[0] quota_set = body['quota_set'] force_update = strutils.bool_from_string(quota_set.get('force', 'False')) try: settable_quotas = QUOTAS.get_settable_quotas(context, project_id, parent_id,user_id=user_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() LOG.debug("Force update quotas: %s", force_update) p = body['quota_set'] for key, value in body['quota_set'].iteritems(): if key == 'force' or (not value and value != 0): continue # validate whether already used and reserved exceeds the new # quota, this check will be ignored if admin want to force # update value = int(value) if not force_update: minimum = settable_quotas[key]['minimum'] maximum = settable_quotas[key]['maximum'] self._validate_quota_limit(key, value, minimum, maximum) try: objects.Quotas.create_limit(context, project_id, key, value, user_id=user_id) except exception.QuotaExists: objects.Quotas.update_limit(context, project_id, key, value, user_id=user_id) except exception.AdminRequired: raise webob.exc.HTTPForbidden() if parent_id: db.quota_allocated_update(context, parent_id,child_list)
def _delete_project_quota(self, req, id,body): context = req.environ['nova.context'] # id is made equivalent to project_id for better readability project_id = id child_list = [] parent_id = None if hasattr(context, 'auth_token') and hasattr(context, 'project_id'): if(context.auth_token and context.project_id): token = context.auth_token headers = {"X-Auth-Token": token, "Content-type": "application/json", "Accept": "text/json"} """params = {} auth_host = KEYSTONE_CONF.keystone_authtoken.auth_host auth_port = int(KEYSTONE_CONF.keystone_authtoken.auth_port) auth_server = '%s:%s' % (auth_host,auth_port) The follwing url is used for checking whether the given project is a root project or not auth_url = '/%s/%s/%s' % ("v3","projects",project_id) conn = httplib.HTTPConnection(auth_server) conn.request("GET", auth_url, json.dumps(params), headers=headers) response = conn.getresponse() data = response.read() data = json.loads(data) if not "project" in data: raise webob.exc.HTTPForbidden() try: parent_id = data["project"]["parent_id"] except: pass""" parent_id = self._get_parent_id ( headers , project_id ) target = {"project_id":parent_id} try: if parent_id: authorize_update(context,target = target) nova.context.authorize_root_or_parent_project_context(context,parent_id) else: authorize_root_update(context) nova.context.authorize_root_or_parent_project_context(context,project_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() if parent_id : child_list = self._get_immediate_child_list( headers , parent_id ) else: child_list = self._get_immediate_child_list( headers , project_id ) # The following url is for finding the subtree """if parent_id: auth_url = '/%s/%s/%s?%s' % ("v3","projects",parent_id,"subtree") else: auth_url = '/%s/%s/%s?%s' % ("v3","projects",project_id,"subtree") conn.request("GET", auth_url, json.dumps(params), headers=headers) response = conn.getresponse() data = response.read() data = json.loads(data) subtree=[] try: subtree = data["project"]["subtree"] except: pass for item in subtree: project_info = item["project"] try: if project_info["parent_id"] == parent_id: child_list.append(project_info["id"]) except: pass""" if parent_id is not None: if id not in child_list: raise exception.InvalidParent(parent_id=parent_id,project_id=project_id) params = urlparse.parse_qs(req.environ.get('QUERY_STRING', '')) user_id = params.get('user_id', [None])[0] quota_set = body['quota_set'] force_update = strutils.bool_from_string(quota_set.get('force', 'False')) try: settable_quotas = QUOTAS.get_settable_quotas(context, project_id, parent_id,user_id=user_id) except exception.Forbidden: raise webob.exc.HTTPForbidden() LOG.debug("Force update quotas: %s", force_update) p = body['quota_set'] for key, value in body['quota_set'].iteritems(): if key == 'force' or (not value and value != 0): continue # validate whether already used and reserved exceeds the new # quota, this check will be ignored if admin want to force # update value = int(value) if not force_update: minimum = settable_quotas[key]['minimum'] maximum = settable_quotas[key]['maximum'] self._validate_quota_limit(key, value, minimum, maximum) try: objects.Quotas.create_limit(context, project_id, key, value, user_id=user_id) except exception.QuotaExists: objects.Quotas.update_limit(context, project_id, key, value, user_id=user_id) except exception.AdminRequired: raise webob.exc.HTTPForbidden() if parent_id: db.quota_allocated_update(context, parent_id,child_list)