From 538565e5923ef71a009e6cf4395822d5cd26120b Mon Sep 17 00:00:00 2001 From: Hampapur Ajay Date: Fri, 15 May 2015 13:35:01 -0700 Subject: [PATCH] config-errhdl: Handle NoIdError from dbe_read. This commit is in prepartion for a follow-on to contrail-controller where dbe_read will raise NoIdError and have caller decide on course of action. Partial-Bug: #1452835 Change-Id: Ib146e5fa00f09b3fc330bd793ddb0bb87d46d94b (cherry picked from commit 788d7b5dd99062856df59b2fab5cac5ded201982) --- ifmap_frontend.py | 51 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/ifmap_frontend.py b/ifmap_frontend.py index 64bdbda..64e3f44 100644 --- a/ifmap_frontend.py +++ b/ifmap_frontend.py @@ -1721,11 +1721,15 @@ def _generate_server_impl(self, gen_fname, gen_type_pfx): write(gen_file, " if 'exclude_children' not in request.query:") write(gen_file, " obj_fields = obj_fields + children") write(gen_file, "") - write(gen_file, " (ok, result) = db_conn.dbe_read('%s', obj_ids, obj_fields)" %(ident_name)) - write(gen_file, " if not ok:") + write(gen_file, " try:") + write(gen_file, " (ok, result) = db_conn.dbe_read('%s', obj_ids, obj_fields)" %(ident_name)) + write(gen_file, " if not ok:") + write(gen_file, " self.config_object_error(id, None, '%s', 'http_get', result)" % (method_name)) + write(gen_file, " except NoIdError as e:") write(gen_file, " # Not present in DB") - write(gen_file, " self.config_object_error(id, None, '%s', 'http_get', result)" % (method_name)) - write(gen_file, " abort(404, result)") + write(gen_file, " abort(404, str(e))") + write(gen_file, " if not ok:") + write(gen_file, " abort(500, result)") write(gen_file, "") write(gen_file, " # check visibility") write(gen_file, " if (not result['id_perms'].get('user_visible', True) and") @@ -1861,7 +1865,12 @@ def _generate_server_impl(self, gen_fname, gen_type_pfx): write(gen_file, " back_references = %s" %(back_ref_fields)) write(gen_file, " children = %s" %(children_fields)) write(gen_file, " obj_fields = children + back_references") - write(gen_file, " (read_ok, read_result) = db_conn.dbe_read('%s', obj_ids, obj_fields)" %(ident_name)) + write(gen_file, " try:") + write(gen_file, " (read_ok, read_result) = db_conn.dbe_read('%s', obj_ids, obj_fields)" %(ident_name)) + write(gen_file, " except NoIdError as e:") + write(gen_file, " abort(404, str(e))") + write(gen_file, " except DatabaseUnavailableError as e:") + write(gen_file, " abort(500, 'Error in database access: %s' %(str(e)))") write(gen_file, " if not read_ok:") write(gen_file, " if read_result.startswith('Unknown id:'):") write(gen_file, " abort(404, 'ID %s does not exist' %(id))") @@ -2883,8 +2892,19 @@ def _generate_cassandra_db_impl(self, gen_fname, gen_type_pfx): write(gen_file, " column_count = 10000000,") write(gen_file, " include_timestamp = True)") write(gen_file, "") - write(gen_file, " if (len(obj_uuids) == 1) and not obj_rows:") - write(gen_file, " raise cfgm_common.exceptions.NoIdError(obj_uuids[0])") + write(gen_file, " def err_handle_single(obj_uuid, obj_type=None, fq_name=None):") + write(gen_file, " raise cfgm_common.exceptions.NoIdError(obj_uuid)") + write(gen_file, "") + write(gen_file, " def err_handle_multi(obj_uuid, obj_type=None, fq_name=None):") + write(gen_file, " pass") + write(gen_file, "") + write(gen_file, " if len(obj_uuids) == 1:") + write(gen_file, " err_handler = err_handle_single") + write(gen_file, " else:") + write(gen_file, " err_handler = err_handle_multi") + write(gen_file, "") + write(gen_file, " if not obj_rows:") + write(gen_file, " err_handler(obj_uuids[0])") write(gen_file, "") write(gen_file, " results = []") write(gen_file, " for row_key in obj_rows:") @@ -2894,19 +2914,24 @@ def _generate_cassandra_db_impl(self, gen_fname, gen_type_pfx): write(gen_file, " obj_cols = obj_rows[obj_uuid]") write(gen_file, " result = {}") write(gen_file, " result['uuid'] = obj_uuid") - write(gen_file, " result['fq_name'] = json.loads(obj_cols['fq_name'][0])") + write(gen_file, " try:") + write(gen_file, " # while updating last-modified of idperms(rd-mo-wr) object could be deleted") + write(gen_file, " result['fq_name'] = json.loads(obj_cols['fq_name'][0])") + write(gen_file, " except KeyError:") + write(gen_file, " err_handler(obj_uuid)") + write(gen_file, " continue") write(gen_file, " for col_name in obj_cols.keys():") write(gen_file, " if self._re_match_parent.match(col_name):") write(gen_file, " # non config-root child") write(gen_file, " (_, _, parent_uuid) = col_name.split(':')") - write(gen_file, " parent_type = json.loads(obj_cols['parent_type'][0])") - write(gen_file, " result['parent_type'] = parent_type") write(gen_file, " try:") + write(gen_file, " parent_type = json.loads(obj_cols['parent_type'][0])") + write(gen_file, " result['parent_type'] = parent_type") write(gen_file, " result['parent_uuid'] = parent_uuid") write(gen_file, " result['parent_href'] = self._generate_url(parent_type, parent_uuid)") - write(gen_file, " except cfgm_common.exceptions.NoIdError:") - write(gen_file, " err_msg = 'Unknown uuid for parent ' + result['fq_name'][-2]") - write(gen_file, " return (False, err_msg)") + write(gen_file, " except KeyError:") + write(gen_file, " err_handler(obj_uuid)") + write(gen_file, " continue") write(gen_file, "") write(gen_file, " # TODO use compiled RE") write(gen_file, " if self._re_match_prop.match(col_name):")