From f10107e78b324fc607fe06486764588f38fc220d Mon Sep 17 00:00:00 2001 From: Bin Yang Date: Thu, 28 Oct 2021 12:08:54 +0800 Subject: [PATCH] Add wrcp aio client test with real ocloud leverage openrc script to inject real wrcp access info Issue-ID: INF-196 Signed-off-by: Bin Yang Change-Id: Ia4da4e49768e15e42034f46f7542304b348c2be7 --- README.md | 7 +++ docker-compose.yml | 9 ++-- o2ims/adapter/clients/ocloud_sa_client.py | 68 ++++++++++++++++++--------- o2ims/adapter/clients/orm_stx.py | 8 ++-- o2ims/config.py | 40 ++++++++++++++-- o2ims/domain/stx_object.py | 22 ++++++--- tests/conftest.py | 5 ++ tests/integration/test_clientdriver_stx_sa.py | 64 +++++++++++++++++++++++++ tox.ini | 4 +- 9 files changed, 186 insertions(+), 41 deletions(-) create mode 100644 tests/integration/test_clientdriver_stx_sa.py diff --git a/README.md b/README.md index e4c75d9..ea2bdb4 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,16 @@ docker-compose build ## Running the tests +Prerequisite: in case of testing against real ocloud, download openrc file from ocloud dashboard, e.g. admin_openrc.sh + ```sh +source ./admin_openrc.sh +export |grep OS_AUTH_URL +export |grep OS_USERNAME +export |grep OS_PASSWORD docker-compose up -d docker-compose run --rm --no-deps --entrypoint=pytest api /tests/unit /tests/integration + ``` ## Tear down containers diff --git a/docker-compose.yml b/docker-compose.yml index 255fbd9..4ffc2f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/o2ims/adapter/clients/ocloud_sa_client.py b/o2ims/adapter/clients/ocloud_sa_client.py index b8607ef..5d1a5f9 100644 --- a/o2ims/adapter/clients/ocloud_sa_client.py +++ b/o2ims/adapter/clients/ocloud_sa_client.py @@ -14,17 +14,22 @@ # client talking to Stx standalone -from service.client.base_client import BaseClient +from o2ims.service.client.base_client import BaseClient from typing import List # Optional, Set from o2ims.domain import stx_object as ocloudModel from o2ims import config +# from dcmanagerclient.api import client +from cgtsclient.client import get_client +import logging +logger = logging.getLogger(__name__) + class StxSaOcloudClient(BaseClient): - def __init__(self): + def __init__(self, driver=None): super().__init__() - self.driver = StxSaClientImp() + self.driver = driver if driver else StxSaClientImp() # def list(self) -> List[ocloudModel.StxGenericModel]: # return self._list() @@ -33,7 +38,7 @@ class StxSaOcloudClient(BaseClient): # return self._get(id) def _get(self, id) -> ocloudModel.StxGenericModel: - raise self.driver.getInstanceInfo() + return self.driver.getInstanceInfo() def _list(self): return [self.driver.getInstanceInfo()] @@ -62,33 +67,54 @@ class StxSaDmsClient(BaseClient): def _list(self): return self.driver.getK8sList() -# internal driver which implement client call to Stx Standalone instance -# from keystoneauth1.identity import v3 -# from keystoneauth1 import session -# # from keystoneclient.v3 import ksclient -# from starlingxclient.v3 import stxclient +class StxPserverClient(BaseClient): + def __init__(self): + super().__init__() + self.driver = StxSaClientImp() + + def _get(self, id) -> ocloudModel.StxGenericModel: + return self.driver.getPserver(id) + + def _list(self) -> List[ocloudModel.StxGenericModel]: + return self.driver.getPserverList() + +# internal driver which implement client call to Stx Standalone instance class StxSaClientImp(object): - def __init__(self, access_info=None) -> None: + def __init__(self, stx_client=None): super().__init__() - self.access_info = access_info - if self.access_info is None: - self.access_info = config.get_stx_access_info() - # self.auth = auth = v3.Password( - # auth_url="http://example.com:5000/v3", username="admin", - # password="password", project_name="admin", - # user_domain_id="default", project_domain_id="default") - # self.session = sess = session.Session(auth=auth) - # # self.keystone = ksclient.Client(session=sess) - # self.stx = stxclient.Client(session=sess) + self.stxclient = stx_client if stx_client else self.getStxClient() + + def getStxClient(): + os_client_args = config.get_stx_access_info() + config_client = get_client(**os_client_args) + return config_client def getInstanceInfo(self) -> ocloudModel.StxGenericModel: - raise NotImplementedError + systems = self.stxclient.isystem.list() + logger.debug("systems:" + str(systems[0].to_dict())) + return ocloudModel.StxGenericModel(systems[0]) if systems else None + + def getPserverList(self) -> List[ocloudModel.StxGenericModel]: + hosts = self.stxclient.ihost.list() + logger.debug("host 1:" + str(hosts[0].to_dict())) + return [ocloudModel.StxGenericModel(self._hostconverter(host)) + for host in hosts if host] + + def getPserver(self, id) -> ocloudModel.StxGenericModel: + host = self.stxclient.ihost.get(id) + logger.debug("host:" + str(host.to_dict())) + return ocloudModel.StxGenericModel(self._hostconverter(host)) def getK8sList(self) -> List[ocloudModel.StxGenericModel]: raise NotImplementedError def getK8sDetail(self, id) -> ocloudModel.StxGenericModel: raise NotImplementedError + + @staticmethod + def _hostconverter(host): + setattr(host, "name", host.hostname) + return host diff --git a/o2ims/adapter/clients/orm_stx.py b/o2ims/adapter/clients/orm_stx.py index 02f9bec..4b825c4 100644 --- a/o2ims/adapter/clients/orm_stx.py +++ b/o2ims/adapter/clients/orm_stx.py @@ -17,7 +17,7 @@ import logging from sqlalchemy import ( Table, - MetaData, + # MetaData, Column, # Integer, String, @@ -31,17 +31,19 @@ from sqlalchemy.orm import mapper # from sqlalchemy.sql.expression import true from o2ims.domain import stx_object as ocloudModel +from o2ims.adapter.orm import metadata logger = logging.getLogger(__name__) -metadata = MetaData() +# metadata = MetaData() stxobject = Table( "stxcache", metadata, Column("id", String(255), primary_key=True), Column("name", String(255)), - Column("lastupdate", DateTime), + Column("updatetime", DateTime), + Column("createtime", DateTime), Column("content", String(255)) ) diff --git a/o2ims/config.py b/o2ims/config.py index f42ec72..e55d00b 100644 --- a/o2ims/config.py +++ b/o2ims/config.py @@ -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 diff --git a/o2ims/domain/stx_object.py b/o2ims/domain/stx_object.py index a3adaf2..ee4f718 100644 --- a/o2ims/domain/stx_object.py +++ b/o2ims/domain/stx_object.py @@ -14,15 +14,23 @@ # from dataclasses import dataclass import datetime +import json class StxGenericModel: - def __init__(self, id: str, name: str, - lastupdate: datetime, content: str) -> None: - self.id = id - self.name = name - self.lastupdate = lastupdate - self.content = content + def __init__(self, api_response: dict) -> None: + self.id = api_response.uuid + self.content = json.dumps(api_response.to_dict()) + self.updatetime = api_response.updated_at + self.createtime = api_response.created_at + self.name = api_response.name + + # def __init__(self, id: str, name: str, + # lastupdate: datetime, content: str) -> None: + # self.id = id + # self.name = name + # self.lastupdate = lastupdate + # self.content = content def isChanged(self, updatetime: datetime) -> bool: - return True if self.lastupdate > updatetime else False + return True if self.updatetime > updatetime else False diff --git a/tests/conftest.py b/tests/conftest.py index 7744dbd..c6b0904 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,6 +12,7 @@ from sqlalchemy.orm import sessionmaker, clear_mappers from tenacity import retry, stop_after_delay from o2ims.adapter.orm import metadata, start_o2ims_mappers +from o2ims.adapter.clients.orm_stx import start_o2ims_stx_mappers from o2ims import config @@ -31,9 +32,13 @@ def sqlite_session_factory(in_memory_sqlite_db): @pytest.fixture def mappers(): start_o2ims_mappers() + start_o2ims_stx_mappers() yield clear_mappers() +@pytest.fixture +def fake_stx_client(): + pass @retry(stop=stop_after_delay(10)) def wait_for_postgres_to_come_up(engine): diff --git a/tests/integration/test_clientdriver_stx_sa.py b/tests/integration/test_clientdriver_stx_sa.py new file mode 100644 index 0000000..551a4c5 --- /dev/null +++ b/tests/integration/test_clientdriver_stx_sa.py @@ -0,0 +1,64 @@ +# Copyright (C) 2021 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 sys +import pytest +from o2ims.adapter import ocloud_repository as repository +from o2ims.domain import ocloud +from o2ims import config +import uuid +from o2ims.adapter.clients.ocloud_sa_client import StxSaClientImp +from cgtsclient.client import get_client + +import logging + + +@pytest.fixture +def real_stx_aio_client(): + os_client_args = config.get_stx_access_info() + config_client = get_client(**os_client_args) + yield config_client + +# pytestmark = pytest.mark.usefixtures("mappers") + + +def test_get_instanceinfo(real_stx_aio_client): + logger = logging.getLogger(__name__) + stxclientimp = StxSaClientImp(real_stx_aio_client) + assert stxclientimp is not None + systeminfo = stxclientimp.getInstanceInfo() + assert systeminfo is not None + assert systeminfo.id is not None + assert systeminfo.name is not None + assert systeminfo.content is not None + + +def test_get_pserverlist(real_stx_aio_client): + stxSaClientImp = StxSaClientImp(real_stx_aio_client) + assert stxSaClientImp is not None + hosts = stxSaClientImp.getPserverList() + assert hosts is not None + assert len(hosts) > 0 + + +def test_get_pserver(real_stx_aio_client): + stxSaClientImp = StxSaClientImp(real_stx_aio_client) + assert stxSaClientImp is not None + hosts = stxSaClientImp.getPserverList() + assert hosts is not None + assert len(hosts) > 0 + host1 = hosts[0] + host2 = stxSaClientImp.getPserver(host1.id) + assert host1 != host2 + assert host1.id == host2.id diff --git a/tox.ini b/tox.ini index 3480ef8..39016e9 100644 --- a/tox.ini +++ b/tox.ini @@ -28,8 +28,8 @@ commands = [testenv:code] commands = - pytest tests + pytest tests/unit [testenv:nosetests] commands = - pytest tests + pytest tests/unit -- 2.16.6