+
+ def _filter_illegal_uri(self, uri, method):
+ """
+ Filter unsupported actions, so they can be stopped at begginning.
+ """
+
+ if uri == REGISTRY_URI and method != "POST":
+ pecan.abort(405)
+
+ if uri == UNREGISTRY_URI and method != "DELETE":
+ pecan.abort(405)
+
+ if (uri in (IDENTITY_URI, IDENTITY_AUTH_URI) and
+ method not in ("POST", "GET")):
+ pecan.abort(405)
+
+ @pecan.expose()
+ def _route(self, remainder, request):
+ uri = "/".join(remainder[1:])
+ method = request.method
+ self._filter_illegal_uri(uri, method)
+
+ return self.forwarder, remainder
+
+ @pecan.expose('json')
+ def forwarder(self, *remainder, **kwargs):
+ """ Forward any requests that don't have a specific match """
+
+ # TODO(xiaohhui): Add validator for vim_id.
+ vim_id = remainder[0]
+ request = pecan.request
+ try:
+ vim_url = syscomm.getMultivimDriver(vim_id,
+ full_path=request.path)
+
+ # NOTE: Not sure headers should be set here. According to original
+ # code, headers are discarded.
+ retcode, content, status_code, resp = restcall.req_by_msb(
+ vim_url, request.method, content=request.body)
+ except exceptions.NotFound as e:
+ pecan.abort(404, detail=str(e))
+ except Exception as e:
+ pecan.abort(500, detail=str(e))
+
+ if retcode:
+ # Execptions are handled within req_by_msb
+ logger.error("Status code is %s, detail is %s.",
+ status_code, content)
+ response = pecan.Response(body=content, status=status_code)
+ if retcode == 0:
+ for k in syscomm.getHeadersKeys(resp):
+ response.headers[k] = resp[k]
+
+ return response