Wrap API module calls with KeyError handling

It happens that applications do not have keys that murano-dashboard
uses explicitly, such as 'name' or 'description'.
So, when some required keys are absent, handle appeared error
and provide error to user.

Change-Id: I66216e47d30d14f63ae3746f532a493e0a119fca
This commit is contained in:
Artem Tiumentcev 2017-07-10 19:19:32 +03:00
parent 69a23fed3b
commit 1ae03d181c
1 changed files with 44 additions and 10 deletions

View File

@ -13,6 +13,7 @@
# under the License.
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from oslo_log import log as logging
import six
@ -24,6 +25,9 @@ from muranodashboard.environments import consts
from muranodashboard.environments import topology
KEY_ERROR_TEMPLATE = _(
"Error fetching the environment. The page may be rendered incorrectly. "
"Reason: %s")
LOG = logging.getLogger(__name__)
@ -179,13 +183,23 @@ def _update_env(env, request):
deployments = deployments_list(request, env.id)
if deployments:
latest_deployment = deployments[0]
deployed_services = {service['?']['id'] for service in
latest_deployment.description['services']}
try:
deployed_services = {service['?']['id'] for service in
latest_deployment.description['services']}
except KeyError as e:
deployed_services = set()
exceptions.handle_recoverable(
request, KEY_ERROR_TEMPLATE % e.message)
else:
deployed_services = set()
if env.services:
current_services = {service['?']['id'] for service in env.services}
try:
current_services = {service['?']['id'] for service in env.services}
except KeyError as e:
current_services = set()
exceptions.handle_recoverable(
request, KEY_ERROR_TEMPLATE % e.message)
else:
current_services = set()
@ -291,7 +305,12 @@ def services_list(request, environment_id):
for service_item in environment.services or []:
service_data = service_item
service_id = service_data['?']['id']
try:
service_id = service_data['?']['id']
except KeyError as e:
exceptions.handle_recoverable(
request, KEY_ERROR_TEMPLATE % e.message)
continue
if service_id in reports and reports[service_id]:
last_operation = strip(reports[service_id].text)
@ -312,7 +331,12 @@ def services_list(request, environment_id):
service_data['name'] = service_data['?']['name']
if (consts.DASHBOARD_ATTRS_KEY not in service_data['?'] or
not service_data['?'][consts.DASHBOARD_ATTRS_KEY].get('name')):
fqn = service_data['?']['type']
try:
fqn = service_data['?']['type']
except KeyError as e:
exceptions.handle_recoverable(
request, KEY_ERROR_TEMPLATE % e.message)
continue
version = None
if '/' in fqn:
version, fqn = fqn.split('/')[1].split('@')
@ -334,8 +358,14 @@ def service_list_by_fqns(request, environment_id, fqns):
return []
services = services_list(request, environment_id)
LOG.debug('Service::Instances::List')
return [service for service in services
if service['?']['type'].split('/')[0] in fqns]
try:
services = [service for service in services
if service['?']['type'].split('/')[0] in fqns]
except KeyError as e:
services = []
exceptions.handle_recoverable(request, KEY_ERROR_TEMPLATE % e.message)
return services
def service_create(request, environment_id, parameters):
@ -360,9 +390,13 @@ def service_delete(request, environment_id, service_id):
def service_get(request, environment_id, service_id):
services = services_list(request, environment_id)
LOG.debug("Return service detail for a specified id")
for service in services:
if service['?']['id'] == service_id:
return service
try:
for service in services:
if service['?']['id'] == service_id:
return service
except KeyError as e:
exceptions.handle_recoverable(request, KEY_ERROR_TEMPLATE % e.message)
return None
def extract_actions_list(service):