From 530818aab2a02921e0445b6062260aad9e4b2810 Mon Sep 17 00:00:00 2001 From: Bin Yang Date: Wed, 13 Sep 2017 08:54:03 +0800 Subject: Add plugin for OpenStack Ocata add plugin for openstack ocata, reuse most of source code from plugin for newton. Change-Id: I444a4e6dd80e34d06d35e0e711de426f10d8db35 Issue-Id: MULTICLOUD-89 Signed-off-by: Bin Yang --- ocata/.gitignore | 11 +++ ocata/README.md | 12 ++++ ocata/assembly.xml | 70 +++++++++++++++++++ ocata/docker/Dockerfile | 30 +++++++++ ocata/docker/build-image.sh | 32 +++++++++ ocata/initialize.sh | 13 ++++ ocata/logs/empty.txt | 0 ocata/manage.py | 19 ++++++ ocata/ocata/__init__.py | 10 +++ ocata/ocata/extensions/__init__.py | 10 +++ ocata/ocata/extensions/urls.py | 28 ++++++++ ocata/ocata/proxy/__init__.py | 10 +++ ocata/ocata/proxy/urls.py | 34 ++++++++++ ocata/ocata/proxy/views/__init__.py | 10 +++ ocata/ocata/proxy/views/identityV3.py | 33 +++++++++ ocata/ocata/proxy/views/services.py | 35 ++++++++++ ocata/ocata/pub/__init__.py | 10 +++ ocata/ocata/pub/config/__init__.py | 10 +++ ocata/ocata/pub/config/config.py | 34 ++++++++++ ocata/ocata/requests/__init__.py | 13 ++++ ocata/ocata/requests/urls.py | 47 +++++++++++++ ocata/ocata/samples/__init__.py | 10 +++ ocata/ocata/samples/tests.py | 29 ++++++++ ocata/ocata/samples/urls.py | 16 +++++ ocata/ocata/samples/views.py | 26 ++++++++ ocata/ocata/settings.py | 122 ++++++++++++++++++++++++++++++++++ ocata/ocata/swagger/__init__.py | 10 +++ ocata/ocata/swagger/tests.py | 29 ++++++++ ocata/ocata/swagger/urls.py | 21 ++++++ ocata/ocata/swagger/views.py | 45 +++++++++++++ ocata/ocata/urls.py | 34 ++++++++++ ocata/ocata/wsgi.py | 19 ++++++ ocata/pom.xml | 58 ++++++++++++++++ ocata/requirements.txt | 17 +++++ ocata/run.sh | 32 +++++++++ ocata/stop.sh | 16 +++++ ocata/tox.ini | 14 ++++ 37 files changed, 969 insertions(+) create mode 100644 ocata/.gitignore create mode 100644 ocata/README.md create mode 100644 ocata/assembly.xml create mode 100644 ocata/docker/Dockerfile create mode 100644 ocata/docker/build-image.sh create mode 100644 ocata/initialize.sh create mode 100644 ocata/logs/empty.txt create mode 100644 ocata/manage.py create mode 100644 ocata/ocata/__init__.py create mode 100644 ocata/ocata/extensions/__init__.py create mode 100644 ocata/ocata/extensions/urls.py create mode 100644 ocata/ocata/proxy/__init__.py create mode 100644 ocata/ocata/proxy/urls.py create mode 100644 ocata/ocata/proxy/views/__init__.py create mode 100644 ocata/ocata/proxy/views/identityV3.py create mode 100644 ocata/ocata/proxy/views/services.py create mode 100644 ocata/ocata/pub/__init__.py create mode 100644 ocata/ocata/pub/config/__init__.py create mode 100644 ocata/ocata/pub/config/config.py create mode 100644 ocata/ocata/requests/__init__.py create mode 100644 ocata/ocata/requests/urls.py create mode 100644 ocata/ocata/samples/__init__.py create mode 100644 ocata/ocata/samples/tests.py create mode 100644 ocata/ocata/samples/urls.py create mode 100644 ocata/ocata/samples/views.py create mode 100644 ocata/ocata/settings.py create mode 100644 ocata/ocata/swagger/__init__.py create mode 100644 ocata/ocata/swagger/tests.py create mode 100644 ocata/ocata/swagger/urls.py create mode 100644 ocata/ocata/swagger/views.py create mode 100644 ocata/ocata/urls.py create mode 100644 ocata/ocata/wsgi.py create mode 100644 ocata/pom.xml create mode 100644 ocata/requirements.txt create mode 100644 ocata/run.sh create mode 100644 ocata/stop.sh create mode 100644 ocata/tox.ini (limited to 'ocata') diff --git a/ocata/.gitignore b/ocata/.gitignore new file mode 100644 index 00000000..e86d02b0 --- /dev/null +++ b/ocata/.gitignore @@ -0,0 +1,11 @@ +.project +.classpath +.settings/ +.checkstyle +target/ +logs/*.log +*.pyc +.tox +.coverage +htmlcov/ + diff --git a/ocata/README.md b/ocata/README.md new file mode 100644 index 00000000..c8f0d119 --- /dev/null +++ b/ocata/README.md @@ -0,0 +1,12 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +# Micro service of MultiCloud plugin for ocata. diff --git a/ocata/assembly.xml b/ocata/assembly.xml new file mode 100644 index 00000000..7ae321af --- /dev/null +++ b/ocata/assembly.xml @@ -0,0 +1,70 @@ + + + ocata + + zip + + + + ocata + /ocata + + **/*.py + **/*.json + **/*.xml + **/*.wsdl + **/*.xsd + **/*.bpel + + + + logs + /logs + + *.txt + + + + docker + /docker + + *.sh + Dockerfile + + + + . + / + + *.py + *.txt + *.sh + *.ini + *.md + + + + + + true + /lib + + org.onap.multicloud.openstack:multicloud-openstack-newton + + + + ocata + diff --git a/ocata/docker/Dockerfile b/ocata/docker/Dockerfile new file mode 100644 index 00000000..6283cd25 --- /dev/null +++ b/ocata/docker/Dockerfile @@ -0,0 +1,30 @@ +FROM python:2 + +ARG HTTP_PROXY=${HTTP_PROXY} +ARG HTTPS_PROXY=${HTTPS_PROXY} + +ENV http_proxy $HTTP_PROXY +ENV https_proxy $HTTPS_PROXY + +ENV MSB_ADDR "127.0.0.1" +ENV MSB_PORT "80" +ENV AAI_ADDR "aai.api.simpledemo.openecomp.org" +ENV AAI_PORT "8443" +ENV AAI_SCHEMA_VERSION "v11" +ENV AAI_USERNAME "AAI" +ENV AAI_PASSWORD "AAI" + +EXPOSE 9004 + +# COPY ./ /opt/ocata/ +RUN apt-get update && \ + apt-get install -y memcached && \ + apt-get install -y unzip && \ + cd /opt/ && \ + wget -O multicloud-openstack-ocata.zip "https://nexus.onap.org/service/local/artifact/maven/redirect?r=snapshots&g=org.onap.multicloud.openstack&a=multicloud-openstack-ocata&e=zip&v=LATEST" && \ + unzip -q -o -B multicloud-openstack-ocata.zip && \ + rm -f multicloud-openstack-ocata.zip && \ + pip install -r /opt/ocata/requirements.txt + +WORKDIR /opt/ocata +CMD /bin/sh -c /opt/ocata/run.sh \ No newline at end of file diff --git a/ocata/docker/build-image.sh b/ocata/docker/build-image.sh new file mode 100644 index 00000000..b0d72264 --- /dev/null +++ b/ocata/docker/build-image.sh @@ -0,0 +1,32 @@ +#!/bin/bash +DIRNAME=`dirname $0` +DOCKER_BUILD_DIR=`cd $DIRNAME/; pwd` +echo "DOCKER_BUILD_DIR=${DOCKER_BUILD_DIR}" +cd ${DOCKER_BUILD_DIR} + +BUILD_ARGS="--no-cache" +ORG="onap" +VERSION="1.0.0-SNAPSHOT" +PROJECT="multicloud" +IMAGE="openstack-ocata" +DOCKER_REPOSITORY="nexus3.onap.org:10003" +IMAGE_NAME="${DOCKER_REPOSITORY}/${ORG}/${PROJECT}/${IMAGE}" + +if [ $HTTP_PROXY ]; then + BUILD_ARGS+=" --build-arg HTTP_PROXY=${HTTP_PROXY}" +fi +if [ $HTTPS_PROXY ]; then + BUILD_ARGS+=" --build-arg HTTPS_PROXY=${HTTPS_PROXY}" +fi + +function build_image { + docker build ${BUILD_ARGS} -t ${IMAGE_NAME}:${VERSION} -t ${IMAGE_NAME}:latest . +} + +function push_image { + docker push ${IMAGE_NAME}:${VERSION} + docker push ${IMAGE_NAME}:latest +} + +build_image +push_image \ No newline at end of file diff --git a/ocata/initialize.sh b/ocata/initialize.sh new file mode 100644 index 00000000..5fed1714 --- /dev/null +++ b/ocata/initialize.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +pip install -r requirements.txt diff --git a/ocata/logs/empty.txt b/ocata/logs/empty.txt new file mode 100644 index 00000000..e69de29b diff --git a/ocata/manage.py b/ocata/manage.py new file mode 100644 index 00000000..00030bf3 --- /dev/null +++ b/ocata/manage.py @@ -0,0 +1,19 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import os +import sys + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ocata.settings") + +if __name__ == "__main__": + from django.core.management import execute_from_command_line + execute_from_command_line(sys.argv) diff --git a/ocata/ocata/__init__.py b/ocata/ocata/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/extensions/__init__.py b/ocata/ocata/extensions/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/extensions/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/extensions/urls.py b/ocata/ocata/extensions/urls.py new file mode 100644 index 00000000..e87a02eb --- /dev/null +++ b/ocata/ocata/extensions/urls.py @@ -0,0 +1,28 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import url +from rest_framework.urlpatterns import format_suffix_patterns + +from newton.extensions.views import extensions +from newton.extensions.views import epacaps + +urlpatterns = [ + url(r'^sions$', extensions.Extensions.as_view()), + url(r'^sions/$', extensions.Extensions.as_view()), + url(r'^sions/epa-caps$', epacaps.EpaCaps.as_view()), + url(r'^sions/epa-caps/$', epacaps.EpaCaps.as_view()), +] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/ocata/ocata/proxy/__init__.py b/ocata/ocata/proxy/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/proxy/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/proxy/urls.py b/ocata/ocata/proxy/urls.py new file mode 100644 index 00000000..7d52a4ed --- /dev/null +++ b/ocata/ocata/proxy/urls.py @@ -0,0 +1,34 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import url +from rest_framework.urlpatterns import format_suffix_patterns + +from ocata.proxy.views import identityV3 +from ocata.proxy.views import services + +urlpatterns = [ + # url(r'^identity/v2)$', + # identityV2.Tokens.as_view()), + url(r'^identity/v3/auth/tokens$', + identityV3.Tokens.as_view()), + url(r'^identity/v3/auth/catalog$', + identityV3.Catalog.as_view()), + url(r'^identity/(?:v2.0/|)tenants$', + services.GetTenants.as_view()), + url(r'^(?P[0-9a-zA-Z_-]+)/(?P[0-9a-zA-Z./_-]*)$', + services.Services.as_view()), +] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/ocata/ocata/proxy/views/__init__.py b/ocata/ocata/proxy/views/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/proxy/views/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/proxy/views/identityV3.py b/ocata/ocata/proxy/views/identityV3.py new file mode 100644 index 00000000..5e018e2a --- /dev/null +++ b/ocata/ocata/proxy/views/identityV3.py @@ -0,0 +1,33 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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 logging + +from newton.pub.config import config +from newton.proxy.views import identityV3 as newton_identityV3 + +logger = logging.getLogger(__name__) + +DEBUG=True + +class Tokens(newton_identityV3.Tokens): + + def __init__(self): + self.proxy_prefix = config.MULTICLOUD_PREFIX + self._logger = logger + +class Catalog(newton_identityV3.Catalog): + + def __init__(self): + self.proxy_prefix = config.MULTICLOUD_PREFIX + self._logger = logger diff --git a/ocata/ocata/proxy/views/services.py b/ocata/ocata/proxy/views/services.py new file mode 100644 index 00000000..5a022fe4 --- /dev/null +++ b/ocata/ocata/proxy/views/services.py @@ -0,0 +1,35 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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 logging + +from newton.pub.config import config +from newton.proxy.views import services as newton_services + +logger = logging.getLogger(__name__) + +DEBUG=True + +class Services(newton_services.Services): + + def __init__(self): + self._logger = logger + + +class GetTenants(newton_services.GetTenants): + ''' + Backward compatible API for /v2.0/tenants + ''' + + def __init__(self): + self._logger = logger diff --git a/ocata/ocata/pub/__init__.py b/ocata/ocata/pub/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/pub/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/pub/config/__init__.py b/ocata/ocata/pub/config/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/pub/config/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/pub/config/config.py b/ocata/ocata/pub/config/config.py new file mode 100644 index 00000000..4de698f5 --- /dev/null +++ b/ocata/ocata/pub/config/config.py @@ -0,0 +1,34 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import os + +# [MSB] +MSB_SERVICE_IP = '127.0.0.1' +MSB_SERVICE_PORT = '80' + +#[Multicloud] +MULTICLOUD_PREFIX = "http://%s:%s/api/multicloud-ocata/v0" %(MSB_SERVICE_IP, MSB_SERVICE_PORT) + +# [A&AI] +AAI_ADDR = "aai.api.simpledemo.openecomp.org" +AAI_PORT = "8443" +AAI_SERVICE_URL = 'https://%s:%s/aai' % (AAI_ADDR, AAI_PORT) +AAI_SCHEMA_VERSION = "v11" +AAI_USERNAME = 'AAI' +AAI_PASSWORD = 'AAI' + +AAI_BASE_URL = "%s/%s" % (AAI_SERVICE_URL, AAI_SCHEMA_VERSION) + +MULTICLOUD_APP_ID = 'MultiCloud-Ocata' + +# [IMAGE LOCAL PATH] +ROOT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/ocata/ocata/requests/__init__.py b/ocata/ocata/requests/__init__.py new file mode 100644 index 00000000..48b6e44b --- /dev/null +++ b/ocata/ocata/requests/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/requests/urls.py b/ocata/ocata/requests/urls.py new file mode 100644 index 00000000..69f0e444 --- /dev/null +++ b/ocata/ocata/requests/urls.py @@ -0,0 +1,47 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import url +from rest_framework.urlpatterns import format_suffix_patterns + +from newton.requests.views import network +from newton.requests.views import subnet +from newton.requests.views import image +from newton.requests.views import volume +from newton.requests.views import server +from newton.requests.views import vport +from newton.requests.views import limits +from newton.requests.views import hosts +from newton.requests.views import flavor + +urlpatterns = [ + url(r'^networks(/(?P[0-9a-zA-Z_-]+))?', + network.Networks.as_view()), + url(r'^subnets(/(?P[0-9a-zA-Z_-]+))?', + subnet.Subnets.as_view()), + url(r'^images(/(?P[0-9a-zA-Z_-]+))?', + image.Images.as_view()), + url(r'^volumes(/(?P[0-9a-zA-Z_-]+))?', + volume.Volumes.as_view()), + url(r'^servers(/(?P[0-9a-zA-Z_-]+))?', + server.Servers.as_view()), + url(r'^ports(/(?P[0-9a-zA-Z_-]+))?', + vport.Vports.as_view()), + url(r'^flavors(/(?P[0-9a-zA-Z_-]+))?', + flavor.Flavors.as_view()), + url(r'^limits$', limits.Limits.as_view()), + url(r'^hosts(/(?P[0-9a-zA-Z_-]+))?', hosts.Hosts.as_view()), +] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/ocata/ocata/samples/__init__.py b/ocata/ocata/samples/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/samples/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/samples/tests.py b/ocata/ocata/samples/tests.py new file mode 100644 index 00000000..d419efa5 --- /dev/null +++ b/ocata/ocata/samples/tests.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import unittest +import json +from django.test import Client +from rest_framework import status + + +class SampleViewTest(unittest.TestCase): + def setUp(self): + self.client = Client() + + def tearDown(self): + pass + + def test_sample(self): + response = self.client.get("/samples/") + self.assertEqual(status.HTTP_200_OK, response.status_code, response.content) + resp_data = response.json() + self.assertEqual({"status": "active"}, resp_data) diff --git a/ocata/ocata/samples/urls.py b/ocata/ocata/samples/urls.py new file mode 100644 index 00000000..c56bc627 --- /dev/null +++ b/ocata/ocata/samples/urls.py @@ -0,0 +1,16 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import url +from ocata.samples import views + +urlpatterns = [ + url(r'^samples/$', views.SampleList.as_view()), ] diff --git a/ocata/ocata/samples/views.py b/ocata/ocata/samples/views.py new file mode 100644 index 00000000..e51044ad --- /dev/null +++ b/ocata/ocata/samples/views.py @@ -0,0 +1,26 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import logging + +from rest_framework.views import APIView +from rest_framework.response import Response + +logger = logging.getLogger(__name__) + + +class SampleList(APIView): + """ + List all samples. + """ + def get(self, request, format=None): + logger.debug("get") + return Response({"status": "active"}) diff --git a/ocata/ocata/settings.py b/ocata/ocata/settings.py new file mode 100644 index 00000000..1e8473b7 --- /dev/null +++ b/ocata/ocata/settings.py @@ -0,0 +1,122 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import os +import sys + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '3o-wney!99y)^h3v)0$j16l9=fdjxcb+a8g+q3tfbahcnu2b0o' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'ocata.urls' + +WSGI_APPLICATION = 'ocata.wsgi.application' + +REST_FRAMEWORK = { + 'DEFAULT_RENDERER_CLASSES': ( + 'rest_framework.renderers.JSONRenderer', + ), + + 'DEFAULT_PARSER_CLASSES': ( + 'rest_framework.parsers.JSONParser', + 'rest_framework.parsers.MultiPartParser', + # 'rest_framework.parsers.FormParser', + # 'rest_framework.parsers.FileUploadParser', + ) +} + +TIME_ZONE = 'UTC' + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.6/howto/static-files/ + +STATIC_URL = '/static/' + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': True, + 'formatters': { + 'standard': { + 'format': '%(asctime)s:[%(name)s]:[%(filename)s]-[%(lineno)d] [%(levelname)s]:%(message)s', + }, + }, + 'filters': { + }, + 'handlers': { + 'ocata_handler': { + 'level': 'DEBUG', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(BASE_DIR, 'logs/runtime_ocata.log'), + 'formatter': 'standard', + 'maxBytes': 1024 * 1024 * 50, + 'backupCount': 5, + }, + }, + + 'loggers': { + 'ocata': { + 'handlers': ['ocata_handler'], + 'level': 'DEBUG', + 'propagate': False + }, + } +} + +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', + 'LOCATION': '127.0.0.1:11211', + } +} + +if 'test' in sys.argv: + from ocata.pub.config import config + + REST_FRAMEWORK = {} + import platform + + if platform.system() == 'Linux': + TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' + TEST_OUTPUT_VERBOSE = True + TEST_OUTPUT_DESCRIPTIONS = True + TEST_OUTPUT_DIR = 'test-reports' diff --git a/ocata/ocata/swagger/__init__.py b/ocata/ocata/swagger/__init__.py new file mode 100644 index 00000000..802f3fba --- /dev/null +++ b/ocata/ocata/swagger/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. diff --git a/ocata/ocata/swagger/tests.py b/ocata/ocata/swagger/tests.py new file mode 100644 index 00000000..8d4fa6a0 --- /dev/null +++ b/ocata/ocata/swagger/tests.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import unittest +import json +from django.test import Client +from rest_framework import status + + +class SampleViewTest(unittest.TestCase): + def setUp(self): + self.client = Client() + + def tearDown(self): + pass + + def test_sample(self): + response = self.client.get("/api/multicloud-ocata/v0/swagger.json") + self.assertEqual(status.HTTP_200_OK, response.status_code, response.content) +# resp_data = response.json() +# self.assertEqual({"status": "active"}, resp_data) diff --git a/ocata/ocata/swagger/urls.py b/ocata/ocata/swagger/urls.py new file mode 100644 index 00000000..b85d3cff --- /dev/null +++ b/ocata/ocata/swagger/urls.py @@ -0,0 +1,21 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import patterns, url +from rest_framework.urlpatterns import format_suffix_patterns + +from ocata.swagger.views import SwaggerJsonView + +urlpatterns = [ + url(r'^api/multicloud-ocata/v0/swagger.json$', SwaggerJsonView.as_view()), +] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/ocata/ocata/swagger/views.py b/ocata/ocata/swagger/views.py new file mode 100644 index 00000000..0a90e1e6 --- /dev/null +++ b/ocata/ocata/swagger/views.py @@ -0,0 +1,45 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +import json +import logging +import os +import traceback + +from rest_framework import status +from rest_framework.response import Response +from rest_framework.views import APIView + +from newton.pub.exceptions import VimDriverNewtonException +from newton.swagger import views as newton_json_view + +logger = logging.getLogger(__name__) + + +class SwaggerJsonView(newton_json_view.SwaggerJsonView): + + def get(self, request): + ''' + reuse newton code and update the basePath + :param request: + :return: + ''' + + resp = super(SwaggerJsonView,self).get(request) + json_data = resp.data if resp else None + if json_data: + json_data["basePath"] = "/api/multicloud-ocata/v0/" + json_data["info"]["title"] = "MultiVIM driver of OpenStack Ocata Service NBI" + return Response(data=json_data, status=200) + else: + return Response(data={'error':'internal error'}, status=500) + + diff --git a/ocata/ocata/urls.py b/ocata/ocata/urls.py new file mode 100644 index 00000000..db488bff --- /dev/null +++ b/ocata/ocata/urls.py @@ -0,0 +1,34 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +from django.conf.urls import include, url + +from newton.registration.views import registration +from newton.requests.views import tenants + +urlpatterns = [ + url(r'^', include('ocata.swagger.urls')), + url(r'^', include('ocata.samples.urls')), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)/registry$', + registration.Registry.as_view()), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)$', + registration.Registry.as_view()), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)/exten', + include('ocata.extensions.urls')), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)/', + include('ocata.proxy.urls')), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)/tenants$', + tenants.Tenants.as_view()), + url(r'^api/multicloud-ocata/v0/(?P[0-9a-zA-Z_-]+)/' + '(?P[0-9a-zA-Z_-]{8,})/', include('ocata.requests.urls')), +] + + diff --git a/ocata/ocata/wsgi.py b/ocata/ocata/wsgi.py new file mode 100644 index 00000000..8471a58a --- /dev/null +++ b/ocata/ocata/wsgi.py @@ -0,0 +1,19 @@ +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ocata.settings") + +application = get_wsgi_application() diff --git a/ocata/pom.xml b/ocata/pom.xml new file mode 100644 index 00000000..bd703378 --- /dev/null +++ b/ocata/pom.xml @@ -0,0 +1,58 @@ + + + + + org.onap.oparent + oparent + 1.0.0-SNAPSHOT + ../oparent + + 4.0.0 + org.onap.multicloud.openstack + multicloud-openstack-ocata + 1.0.0-SNAPSHOT + pom + multicloud/openstack/ocata + multicloud for openstack ocata + + + org.onap.multicloud.openstack + multicloud-openstack-newton + 1.0.0-SNAPSHOT + zip + + + + + + maven-assembly-plugin + + false + + assembly.xml + + + + + make-assembly + package + + single + + + + + + + diff --git a/ocata/requirements.txt b/ocata/requirements.txt new file mode 100644 index 00000000..841fe278 --- /dev/null +++ b/ocata/requirements.txt @@ -0,0 +1,17 @@ +# rest framework +Django==1.9.6 +djangorestframework==3.3.3 + +# for call rest api +httplib2==0.9.2 + +# for call openstack auth and transport api +keystoneauth1==2.18.0 + +#python-memcached +python-memcached + +# for unit test +coverage==4.2 +mock==2.0.0 +unittest_xml_reporting==1.12.0 diff --git a/ocata/run.sh b/ocata/run.sh new file mode 100644 index 00000000..02c26f5a --- /dev/null +++ b/ocata/run.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +#!/bin/bash + +sed -i "s/MSB_SERVICE_ADDR =.*/MSB_SERVICE_ADDR = \"${MSB_ADDR}\"/g" ocata/pub/config/config.py +sed -i "s/MSB_SERVICE_PORT =.*/MSB_SERVICE_PORT = \"${MSB_PORT}\"/g" ocata/pub/config/config.py +sed -i "s/AAI_ADDR =.*/AAI_ADDR = \"${AAI_ADDR}\"/g" ocata/pub/config/config.py +sed -i "s/AAI_PORT =.*/AAI_PORT = \"${AAI_PORT}\"/g" ocata/pub/config/config.py +sed -i "s/AAI_SCHEMA_VERSION =.*/AAI_SCHEMA_VERSION = \"${AAI_SCHEMA_VERSION}\"/g" ocata/pub/config/config.py +sed -i "s/AAI_USERNAME =.*/AAI_USERNAME = \"${AAI_USERNAME}\"/g" ocata/pub/config/config.py +sed -i "s/AAI_PASSWORD =.*/AAI_PASSWORD = \"${AAI_PASSWORD}\"/g" ocata/pub/config/config.py + +memcached -d -m 2048 -u root -c 1024 -p 11211 -P /tmp/memcached1.pid +export PYTHONPATH=lib/newton +nohup python manage.py runserver 0.0.0.0:9004 2>&1 & + +while [ ! -f logs/runtime_ocata.log ]; do + sleep 1 +done + +tail -F logs/runtime_ocata.log + diff --git a/ocata/stop.sh b/ocata/stop.sh new file mode 100644 index 00000000..13a19ef4 --- /dev/null +++ b/ocata/stop.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright (c) 2017 Wind River Systems, Inc. +# +# 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. + +#!/bin/bash + +ps auxww | grep 'manage.py runserver 0.0.0.0:9004' | awk '{print $2}' | xargs kill -9 +ps auxww | grep 'memcached -d -m 2048 -u root -c 1024 -p 11211 -P /tmp/memcached1.pid' | awk '{print $2}' | xargs kill -9 diff --git a/ocata/tox.ini b/ocata/tox.ini new file mode 100644 index 00000000..05ef3c70 --- /dev/null +++ b/ocata/tox.ini @@ -0,0 +1,14 @@ +[tox] +envlist = py27,py35 +skipsdist = true + +[tox:jenkins] +downloadcache = ~/cache/pip + +[testenv] +setenv = + PYTHONPATH = {toxinidir}/../newton +deps = -r{toxinidir}/requirements.txt +commands = coverage run --branch manage.py test ocata + coverage html --omit=".tox*,*test*,*__init__.py" -d htmlcov + -- cgit 1.2.3-korg