summaryrefslogtreecommitdiffstats
path: root/multivimbroker
diff options
context:
space:
mode:
Diffstat (limited to 'multivimbroker')
-rw-r--r--multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py67
-rw-r--r--multivimbroker/multivimbroker/forwarder/views.py4
-rw-r--r--multivimbroker/multivimbroker/tests/test_check_capacity.py39
3 files changed, 108 insertions, 2 deletions
diff --git a/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py b/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py
index 10922e5..83b4260 100644
--- a/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py
+++ b/multivimbroker/multivimbroker/api_v2/api_router/v0_controller.py
@@ -10,9 +10,22 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import logging
import pecan
from multivimbroker.swagger import utils
+from multivimbroker.pub import exceptions
+from multivimbroker.pub.utils import restcall
+from multivimbroker.pub.utils import syscomm
+
+
+logger = logging.getLogger(__name__)
+
+# TODO: Move to a constant file.
+REGISTRY_URI = "registry"
+UNREGISTRY_URI = ""
+IDENTITY_URI = "identity/v3"
+IDENTITY_AUTH_URI = "identity/v3/auth/tokens"
class V0_Controller(object):
@@ -20,3 +33,57 @@ class V0_Controller(object):
@pecan.expose('json', route="swagger.json")
def swagger_json(self):
return utils.get_swagger_json_data()
+
+ 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)
+
+ for k in syscomm.getHeadersKeys(resp):
+ response.headers[k] = resp[k]
+
+ return response
diff --git a/multivimbroker/multivimbroker/forwarder/views.py b/multivimbroker/multivimbroker/forwarder/views.py
index c77fe94..83d3172 100644
--- a/multivimbroker/multivimbroker/forwarder/views.py
+++ b/multivimbroker/multivimbroker/forwarder/views.py
@@ -104,7 +104,7 @@ class CheckCapacity(BaseServer):
def post(self, request):
try:
body = json.loads(request.body)
- except json.JSONDecodeError as e:
+ except ValueError as e:
return Response(
data={'error': 'Invalidate request body %s.' % e},
status=status.HTTP_400_BAD_REQUEST)
@@ -123,7 +123,7 @@ class CheckCapacity(BaseServer):
continue
try:
resp_body = json.loads(resp.body)
- except json.JSONDecodeError:
+ except ValueError:
continue
if not resp_body.get("result", False):
continue
diff --git a/multivimbroker/multivimbroker/tests/test_check_capacity.py b/multivimbroker/multivimbroker/tests/test_check_capacity.py
index 0a852e8..60035e0 100644
--- a/multivimbroker/multivimbroker/tests/test_check_capacity.py
+++ b/multivimbroker/multivimbroker/tests/test_check_capacity.py
@@ -52,3 +52,42 @@ class CheckCapacityTest(unittest.TestCase):
}
self.assertEqual(status.HTTP_200_OK, resp.status_code)
self.assertDictEqual(expect_body, resp.data)
+
+ def test_check_capacity_no_suitable_vim(self):
+ req = mock.Mock()
+ req.body = """
+ {
+ "vCPU": 1,
+ "Memory": 1,
+ "Storage": 500,
+ "VIMs": ["openstack_RegionOne"]
+ }"""
+ req.get_full_path.return_value = ("http://msb.onap.org/api/multicloud"
+ "/v0/check_vim_capacity")
+ with mock.patch.object(self.view, "send") as send:
+ plugin_resp = mock.Mock()
+ plugin_resp.body = """{
+ "result": false
+ }"""
+ plugin_resp.status_code = status.HTTP_200_OK
+ send.return_value = plugin_resp
+
+ resp = self.view.post(req)
+ expect_body = {
+ "VIMs": []
+ }
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertDictEqual(expect_body, resp.data)
+
+ def test_check_capacity_invalid_input(self):
+ req = mock.Mock()
+ req.body = "hello world"
+ req.get_full_path.return_value = ("http://msb.onap.org/api/multicloud"
+ "/v0/check_vim_capacity")
+ expect_body = {
+ "error": ("Invalidate request body "
+ "No JSON object could be decoded.")
+ }
+ resp = self.view.post(req)
+ self.assertEqual(status.HTTP_400_BAD_REQUEST, resp.status_code)
+ self.assertDictEqual(expect_body, resp.data)