Add wrcp aio client test with real ocloud 53/6953/7
authorBin Yang <bin.yang@windriver.com>
Thu, 28 Oct 2021 04:08:54 +0000 (12:08 +0800)
committerBin Yang <bin.yang@windriver.com>
Fri, 29 Oct 2021 01:35:41 +0000 (09:35 +0800)
leverage openrc script to inject real wrcp access info

Issue-ID: INF-196

Signed-off-by: Bin Yang <bin.yang@windriver.com>
Change-Id: Ia4da4e49768e15e42034f46f7542304b348c2be7

README.md
docker-compose.yml
o2ims/adapter/clients/ocloud_sa_client.py
o2ims/adapter/clients/orm_stx.py
o2ims/config.py
o2ims/domain/stx_object.py
tests/conftest.py
tests/integration/test_clientdriver_stx_sa.py [new file with mode: 0644]
tox.ini

index e4c75d9..ea2bdb4 100644 (file)
--- a/README.md
+++ b/README.md
@@ -7,9 +7,16 @@ docker-compose build
 \r
 ## Running the tests\r
 \r
+Prerequisite: in case of testing against real ocloud, download openrc file from ocloud dashboard, e.g. admin_openrc.sh\r
+\r
 ```sh\r
+source ./admin_openrc.sh\r
+export |grep OS_AUTH_URL\r
+export |grep OS_USERNAME\r
+export |grep OS_PASSWORD\r
 docker-compose up -d\r
 docker-compose run --rm --no-deps --entrypoint=pytest api /tests/unit /tests/integration\r
+\r
 ```\r
 \r
 ## Tear down containers\r
index 255fbd9..4ffc2f1 100644 (file)
@@ -15,6 +15,9 @@ services:
       - DB_PASSWORD=o2ims123
       - REDIS_HOST=redis
       - PYTHONDONTWRITEBYTECODE=1
+      - OS_AUTH_URL=${OS_AUTH_URL}
+      - OS_USERNAME=${OS_USERNAME}
+      - OS_PASSWORD=${OS_PASSWORD}
     volumes:
       - ./o2ims:/o2ims
       - ./o2dms:/o2dms
@@ -37,9 +40,9 @@ services:
       - FLASK_APP=/o2ims/entrypoints/flask_application.py
       - FLASK_DEBUG=1
       - PYTHONUNBUFFERED=1
-      - STX_AUTH_URL=http://192.168.204.1:5000/v3
-      - STX_USERNAME=admin
-      - STX_PASSWORD=password1
+      - OS_AUTH_URL=${OS_AUTH_URL}
+      - OS_USERNAME=${OS_USERNAME}
+      - OS_PASSWORD=${OS_PASSWORD}
     volumes:
       - ./o2ims:/o2ims
       - ./o2dms:/o2dms
index b8607ef..5d1a5f9 100644 (file)
 \r
 # client talking to Stx standalone\r
 \r
-from service.client.base_client import BaseClient\r
+from o2ims.service.client.base_client import BaseClient\r
 from typing import List\r
 # Optional,  Set\r
 from o2ims.domain import stx_object as ocloudModel\r
 from o2ims import config\r
 \r
+# from dcmanagerclient.api import client\r
+from cgtsclient.client import get_client\r
+import logging\r
+logger = logging.getLogger(__name__)\r
+\r
 \r
 class StxSaOcloudClient(BaseClient):\r
-    def __init__(self):\r
+    def __init__(self, driver=None):\r
         super().__init__()\r
-        self.driver = StxSaClientImp()\r
+        self.driver = driver if driver else StxSaClientImp()\r
 \r
     # def list(self) -> List[ocloudModel.StxGenericModel]:\r
     #     return self._list()\r
@@ -33,7 +38,7 @@ class StxSaOcloudClient(BaseClient):
     #     return self._get(id)\r
 \r
     def _get(self, id) -> ocloudModel.StxGenericModel:\r
-        raise self.driver.getInstanceInfo()\r
+        return self.driver.getInstanceInfo()\r
 \r
     def _list(self):\r
         return [self.driver.getInstanceInfo()]\r
@@ -62,33 +67,54 @@ class StxSaDmsClient(BaseClient):
     def _list(self):\r
         return self.driver.getK8sList()\r
 \r
-# internal driver which implement client call to Stx Standalone instance\r
 \r
-# from keystoneauth1.identity import v3\r
-# from keystoneauth1 import session\r
-# # from keystoneclient.v3 import ksclient\r
-# from starlingxclient.v3 import stxclient\r
+class StxPserverClient(BaseClient):\r
+    def __init__(self):\r
+        super().__init__()\r
+        self.driver = StxSaClientImp()\r
+\r
+    def _get(self, id) -> ocloudModel.StxGenericModel:\r
+        return self.driver.getPserver(id)\r
+\r
+    def _list(self) -> List[ocloudModel.StxGenericModel]:\r
+        return self.driver.getPserverList()\r
+\r
+# internal driver which implement client call to Stx Standalone instance\r
 \r
 \r
 class StxSaClientImp(object):\r
-    def __init__(self, access_info=None) -> None:\r
+    def __init__(self, stx_client=None):\r
         super().__init__()\r
-        self.access_info = access_info\r
-        if self.access_info is None:\r
-            self.access_info = config.get_stx_access_info()\r
-        # self.auth = auth = v3.Password(\r
-        #     auth_url="http://example.com:5000/v3", username="admin",\r
-        #     password="password", project_name="admin",\r
-        #     user_domain_id="default", project_domain_id="default")\r
-        # self.session = sess = session.Session(auth=auth)\r
-        # # self.keystone = ksclient.Client(session=sess)\r
-        # self.stx = stxclient.Client(session=sess)\r
+        self.stxclient = stx_client if stx_client else self.getStxClient()\r
+\r
+    def getStxClient():\r
+        os_client_args = config.get_stx_access_info()\r
+        config_client = get_client(**os_client_args)\r
+        return config_client\r
 \r
     def getInstanceInfo(self) -> ocloudModel.StxGenericModel:\r
-        raise NotImplementedError\r
+        systems = self.stxclient.isystem.list()\r
+        logger.debug("systems:" + str(systems[0].to_dict()))\r
+        return ocloudModel.StxGenericModel(systems[0]) if systems else None\r
+\r
+    def getPserverList(self) -> List[ocloudModel.StxGenericModel]:\r
+        hosts = self.stxclient.ihost.list()\r
+        logger.debug("host 1:" + str(hosts[0].to_dict()))\r
+        return [ocloudModel.StxGenericModel(self._hostconverter(host))\r
+                for host in hosts if host]\r
+\r
+    def getPserver(self, id) -> ocloudModel.StxGenericModel:\r
+        host = self.stxclient.ihost.get(id)\r
+        logger.debug("host:" + str(host.to_dict()))\r
+        return ocloudModel.StxGenericModel(self._hostconverter(host))\r
 \r
     def getK8sList(self) -> List[ocloudModel.StxGenericModel]:\r
         raise NotImplementedError\r
 \r
     def getK8sDetail(self, id) -> ocloudModel.StxGenericModel:\r
         raise NotImplementedError\r
+\r
+    @staticmethod\r
+    def _hostconverter(host):\r
+        setattr(host, "name", host.hostname)\r
+        return host\r
index 02f9bec..4b825c4 100644 (file)
@@ -17,7 +17,7 @@ import logging
 \r
 from sqlalchemy import (\r
     Table,\r
-    MetaData,\r
+    MetaData,\r
     Column,\r
     # Integer,\r
     String,\r
@@ -31,17 +31,19 @@ from sqlalchemy.orm import mapper
 # from sqlalchemy.sql.expression import true\r
 \r
 from o2ims.domain import stx_object as ocloudModel\r
+from o2ims.adapter.orm import metadata\r
 \r
 logger = logging.getLogger(__name__)\r
 \r
-metadata = MetaData()\r
+metadata = MetaData()\r
 \r
 stxobject = Table(\r
     "stxcache",\r
     metadata,\r
     Column("id", String(255), primary_key=True),\r
     Column("name", String(255)),\r
-    Column("lastupdate", DateTime),\r
+    Column("updatetime", DateTime),\r
+    Column("createtime", DateTime),\r
     Column("content", String(255))\r
 )\r
 \r
index f42ec72..e55d00b 100644 (file)
@@ -13,6 +13,8 @@
 #  limitations under the License.
 
 import os
+import sys
+import logging
 
 
 def get_postgres_uri():
@@ -46,8 +48,36 @@ def get_smo_o2endpoint():
 
 
 def get_stx_access_info():
-    authurl = os.environ.get("STX_AUTH_URL", "http://192.168.204.1:5000/v3")
-    username = os.environ.get("STX_USERNAME", "admin")
-    pswd = os.environ.get("STX_PASSWORD", "passwd1")
-    stx_access_info = (authurl, username, pswd)
-    return stx_access_info
+    # authurl = os.environ.get("STX_AUTH_URL", "http://192.168.204.1:5000/v3")
+    # username = os.environ.get("STX_USERNAME", "admin")
+    # pswd = os.environ.get("STX_PASSWORD", "passwd1")
+    # stx_access_info = (authurl, username, pswd)
+    try:
+        client_args = dict(
+            auth_url=os.environ.get('OS_AUTH_URL',
+                                    "http://192.168.204.1:5000/v3"),
+            username=os.environ.get('OS_USERNAME', "admin"),
+            api_key=os.environ.get('OS_PASSWORD', "fakepasswd1"),
+            project_name=os.environ.get('OS_PROJECT_NAME', "admin"),
+        )
+        # dc_client_args = dict(
+        #     auth_url=os.environ['OS_AUTH_URL'],
+        #     username=os.environ['OS_USERNAME'],
+        #     api_key=os.environ['OS_PASSWORD'],
+        #     project_name=os.environ['OS_PROJECT_NAME'],
+        #     user_domain_name=os.environ['OS_USER_DOMAIN_NAME'],
+        #     project_domain_name=os.environ['OS_PROJECT_NAME'],
+        #     project_domain_id=os.environ['OS_PROJECT_DOMAIN_ID']
+        # )
+    except KeyError:
+        logging.error('Please source your RC file before execution, '
+                      'e.g.: `source ~/downloads/admin-rc.sh`')
+        sys.exit(1)
+
+    os_client_args = {}
+    for key, val in client_args.items():
+        os_client_args['os_{key}'.format(key=key)] = val
+    os_client_args['os_password'] = os_client_args.pop('os_api_key')
+    os_client_args['os_region_name'] = 'RegionOne'
+    os_client_args['api_version'] = 1
+    return os_client_args
index a3adaf2..ee4f718 100644 (file)
 \r
 # from dataclasses import dataclass\r
 import datetime\r
+import json\r
 \r
 \r
 class StxGenericModel:\r
-    def __init__(self, id: str, name: str,\r
-                 lastupdate: datetime, content: str) -> None:\r
-        self.id = id\r
-        self.name = name\r
-        self.lastupdate = lastupdate\r
-        self.content = content\r
+    def __init__(self, api_response: dict) -> None:\r
+        self.id = api_response.uuid\r
+        self.content = json.dumps(api_response.to_dict())\r
+        self.updatetime = api_response.updated_at\r
+        self.createtime = api_response.created_at\r
+        self.name = api_response.name\r
+\r
+    # def __init__(self, id: str, name: str,\r
+    #              lastupdate: datetime, content: str) -> None:\r
+    #     self.id = id\r
+    #     self.name = name\r
+    #     self.lastupdate = lastupdate\r
+    #     self.content = content\r
 \r
     def isChanged(self, updatetime: datetime) -> bool:\r
-        return True if self.lastupdate > updatetime else False\r
+        return True if self.updatetime > updatetime else False\r
index 7744dbd..c6b0904 100644 (file)
@@ -12,6 +12,7 @@ from sqlalchemy.orm import sessionmaker, clear_mappers
 from tenacity import retry, stop_after_delay\r
 \r
 from o2ims.adapter.orm import metadata, start_o2ims_mappers\r
+from o2ims.adapter.clients.orm_stx import start_o2ims_stx_mappers\r
 from o2ims import config\r
 \r
 \r
@@ -31,9 +32,13 @@ def sqlite_session_factory(in_memory_sqlite_db):
 @pytest.fixture\r
 def mappers():\r
     start_o2ims_mappers()\r
+    start_o2ims_stx_mappers()\r
     yield\r
     clear_mappers()\r
 \r
+@pytest.fixture\r
+def fake_stx_client():\r
+    pass\r
 \r
 @retry(stop=stop_after_delay(10))\r
 def wait_for_postgres_to_come_up(engine):\r
diff --git a/tests/integration/test_clientdriver_stx_sa.py b/tests/integration/test_clientdriver_stx_sa.py
new file mode 100644 (file)
index 0000000..551a4c5
--- /dev/null
@@ -0,0 +1,64 @@
+# Copyright (C) 2021 Wind River Systems, Inc.\r
+#\r
+#  Licensed under the Apache License, Version 2.0 (the "License");\r
+#  you may not use this file except in compliance with the License.\r
+#  You may obtain a copy of the License at\r
+#\r
+#      http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+#  Unless required by applicable law or agreed to in writing, software\r
+#  distributed under the License is distributed on an "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+#  See the License for the specific language governing permissions and\r
+#  limitations under the License.\r
+\r
+import sys\r
+import pytest\r
+from o2ims.adapter import ocloud_repository as repository\r
+from o2ims.domain import ocloud\r
+from o2ims import config\r
+import uuid\r
+from o2ims.adapter.clients.ocloud_sa_client import StxSaClientImp\r
+from cgtsclient.client import get_client\r
+\r
+import logging\r
+\r
+\r
+@pytest.fixture\r
+def real_stx_aio_client():\r
+    os_client_args = config.get_stx_access_info()\r
+    config_client = get_client(**os_client_args)\r
+    yield config_client\r
+\r
+# pytestmark = pytest.mark.usefixtures("mappers")\r
+\r
+\r
+def test_get_instanceinfo(real_stx_aio_client):\r
+    logger = logging.getLogger(__name__)\r
+    stxclientimp = StxSaClientImp(real_stx_aio_client)\r
+    assert stxclientimp is not None\r
+    systeminfo = stxclientimp.getInstanceInfo()\r
+    assert systeminfo is not None\r
+    assert systeminfo.id is not None\r
+    assert systeminfo.name is not None\r
+    assert systeminfo.content is not None\r
+\r
+\r
+def test_get_pserverlist(real_stx_aio_client):\r
+    stxSaClientImp = StxSaClientImp(real_stx_aio_client)\r
+    assert stxSaClientImp is not None\r
+    hosts = stxSaClientImp.getPserverList()\r
+    assert hosts is not None\r
+    assert len(hosts) > 0\r
+\r
+\r
+def test_get_pserver(real_stx_aio_client):\r
+    stxSaClientImp = StxSaClientImp(real_stx_aio_client)\r
+    assert stxSaClientImp is not None\r
+    hosts = stxSaClientImp.getPserverList()\r
+    assert hosts is not None\r
+    assert len(hosts) > 0\r
+    host1 = hosts[0]\r
+    host2 = stxSaClientImp.getPserver(host1.id)\r
+    assert host1 != host2\r
+    assert host1.id == host2.id\r
diff --git a/tox.ini b/tox.ini
index 3480ef8..39016e9 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -28,8 +28,8 @@ commands =
 \r
 [testenv:code]\r
 commands =\r
-    pytest tests\r
+    pytest tests/unit\r
 \r
 [testenv:nosetests]\r
 commands =\r
-    pytest tests\r
+    pytest tests/unit\r