188 lines
6.6 KiB
Python
188 lines
6.6 KiB
Python
# Copyright (c) 2015 Huawei Tech. Co., Ltd.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import pecan
|
|
from pecan import expose
|
|
from pecan import Response
|
|
from pecan import rest
|
|
|
|
import oslo_db.exception as db_exc
|
|
from oslo_log import log as logging
|
|
from oslo_utils import uuidutils
|
|
|
|
import tricircle.common.context as t_context
|
|
import tricircle.common.exceptions as t_exc
|
|
from tricircle.common.i18n import _
|
|
from tricircle.common.i18n import _LE
|
|
from tricircle.common import policy
|
|
|
|
from tricircle.db import api as db_api
|
|
from tricircle.db import core
|
|
from tricircle.db import models
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class PodsController(rest.RestController):
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
@expose(generic=True, template='json')
|
|
def post(self, **kw):
|
|
context = t_context.extract_context_from_environ()
|
|
|
|
if not policy.enforce(context, policy.ADMIN_API_PODS_CREATE):
|
|
pecan.abort(401, _('Unauthorized to create pods'))
|
|
return
|
|
|
|
if 'pod' not in kw:
|
|
pecan.abort(400, _('Request body pod not found'))
|
|
return
|
|
|
|
pod = kw['pod']
|
|
|
|
# if az_name is null, and there is already one in db
|
|
region_name = pod.get('region_name', '').strip()
|
|
pod_az_name = pod.get('pod_az_name', '').strip()
|
|
dc_name = pod.get('dc_name', '').strip()
|
|
az_name = pod.get('az_name', '').strip()
|
|
_uuid = uuidutils.generate_uuid()
|
|
|
|
if az_name == '' and region_name == '':
|
|
return Response(_('Valid region_name is required for top region'),
|
|
422)
|
|
|
|
if az_name != '' and region_name == '':
|
|
return Response(_('Valid region_name is required for pod'), 422)
|
|
|
|
if pod.get('az_name') is None:
|
|
if self._get_top_region(context) != '':
|
|
return Response(_('Top region already exists'), 409)
|
|
|
|
# if az_name is not null, then the pod region name should not
|
|
# be same as that the top region
|
|
if az_name != '':
|
|
if (self._get_top_region(context) == region_name and
|
|
region_name != ''):
|
|
return Response(
|
|
_('Pod region name duplicated with the top region name'),
|
|
409)
|
|
|
|
# to create the top region, make the pod_az_name to null value
|
|
if az_name == '':
|
|
pod_az_name = ''
|
|
|
|
try:
|
|
with context.session.begin():
|
|
new_pod = core.create_resource(
|
|
context, models.Pod,
|
|
{'pod_id': _uuid,
|
|
'region_name': region_name,
|
|
'pod_az_name': pod_az_name,
|
|
'dc_name': dc_name,
|
|
'az_name': az_name})
|
|
except db_exc.DBDuplicateEntry as e1:
|
|
LOG.exception(_LE('Record already exists on %(region_name)s: '
|
|
'%(exception)s'),
|
|
{'region_name': region_name,
|
|
'exception': e1})
|
|
return Response(_('Record already exists'), 409)
|
|
except Exception as e2:
|
|
LOG.exception(_LE('Failed to create pod: %(region_name)s,'
|
|
'pod_az_name: %(pod_az_name)s,'
|
|
'dc_name: %(dc_name)s,'
|
|
'az_name: %(az_name)s'
|
|
'%(exception)s '),
|
|
{'region_name': region_name,
|
|
'pod_az_name': pod_az_name,
|
|
'dc_name': dc_name,
|
|
'az_name': az_name,
|
|
'exception': e2})
|
|
return Response(_('Failed to create pod'), 500)
|
|
|
|
return {'pod': new_pod}
|
|
|
|
@expose(generic=True, template='json')
|
|
def get_one(self, _id):
|
|
context = t_context.extract_context_from_environ()
|
|
|
|
if not policy.enforce(context, policy.ADMIN_API_PODS_SHOW):
|
|
pecan.abort(401, _('Unauthorized to show pods'))
|
|
return
|
|
|
|
try:
|
|
return {'pod': db_api.get_pod(context, _id)}
|
|
except t_exc.ResourceNotFound:
|
|
pecan.abort(404, _('Pod not found'))
|
|
return
|
|
|
|
@expose(generic=True, template='json')
|
|
def get_all(self):
|
|
context = t_context.extract_context_from_environ()
|
|
|
|
if not policy.enforce(context, policy.ADMIN_API_PODS_LIST):
|
|
pecan.abort(401, _('Unauthorized to list pods'))
|
|
return
|
|
|
|
try:
|
|
return {'pods': db_api.list_pods(context)}
|
|
except Exception as e:
|
|
LOG.exception(_LE('Failed to list all pods: %(exception)s '),
|
|
{'exception': e})
|
|
|
|
pecan.abort(500, _('Failed to list pods'))
|
|
return
|
|
|
|
@expose(generic=True, template='json')
|
|
def delete(self, _id):
|
|
context = t_context.extract_context_from_environ()
|
|
|
|
if not policy.enforce(context, policy.ADMIN_API_PODS_DELETE):
|
|
pecan.abort(401, _('Unauthorized to delete pods'))
|
|
return
|
|
|
|
try:
|
|
with context.session.begin():
|
|
core.delete_resource(context, models.Pod, _id)
|
|
pecan.response.status = 200
|
|
return {}
|
|
except t_exc.ResourceNotFound:
|
|
return Response(_('Pod not found'), 404)
|
|
except Exception as e:
|
|
LOG.exception(_LE('Failed to delete pod: %(pod_id)s,'
|
|
'%(exception)s'),
|
|
{'pod_id': _id,
|
|
'exception': e})
|
|
|
|
return Response(_('Failed to delete pod'), 500)
|
|
|
|
def _get_top_region(self, ctx):
|
|
top_region_name = ''
|
|
try:
|
|
with ctx.session.begin():
|
|
pods = core.query_resource(ctx,
|
|
models.Pod, [], [])
|
|
for pod in pods:
|
|
if pod['az_name'] == '' and pod['region_name'] != '':
|
|
return pod['region_name']
|
|
except Exception as e:
|
|
LOG.exception(_LE('Failed to get top region: %(exception)s '),
|
|
{'exception': e})
|
|
|
|
return top_region_name
|
|
|
|
return top_region_name
|