blob: fe4f9c1c5fcab24fc7c326d9962ec8e1a60258f4 [file] [log] [blame]
# Copyright 2017-present Open Networking Foundation
#
# 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 __future__ import print_function
import exceptions
import os
import random
import string
import sys
import unittest
# Command-line argument of -R will cause this test to use a real grpc server
# rather than the fake stub.
# TODO: Investigate writing wrapper unit tests using mocks rather than using the ORM test framework
# by default, use fake stub rather than real core
USE_FAKE_STUB = True
PARENT_DIR = os.path.join(os.path.dirname(__file__), "..")
class TestWrappers(unittest.TestCase):
def setUp(self):
from xosconfig import Config
test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
config = os.path.join(test_path, "test_config.yaml")
Config.clear()
Config.init(config, "synchronizer-config-schema.yaml")
if USE_FAKE_STUB:
sys.path.append(PARENT_DIR)
def tearDown(self):
if USE_FAKE_STUB:
sys.path.remove(PARENT_DIR)
def make_coreapi(self):
if USE_FAKE_STUB:
import xosapi.orm
from fake_stub import FakeStub, FakeObj, FakeProtos
xosapi.orm.import_convenience_methods()
stub = FakeStub()
api = xosapi.orm.ORMStub(
stub=stub,
package_name="xos",
protos=FakeProtos(),
empty=FakeObj,
enable_backoff=False,
)
return api
else:
return xos_grpc_client.coreapi
def test_service_get_composable_networks(self):
orm = self.make_coreapi()
deployment = orm.Deployment(name="test_deployment")
deployment.save()
controller = orm.Controller(name="test_controller", deployment_id=deployment.id)
controller.save()
site = orm.Site(name="testsite")
site.save()
user = orm.User(
email="fake_"
+ "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(10)
),
site_id=site.id,
)
user.save()
vsg_access_template = orm.NetworkTemplate(name="vsg_access", vtn_kind="VSG")
vsg_access_template.save()
service_one = orm.Service(name="service_one")
service_one.save()
slice_one = orm.Slice(
name="testsite_sliceone",
service_id=service_one.id,
site_id=site.id,
creator_id=user.id,
network="noauto",
)
slice_one.save()
network_one = orm.Network(
name="testsite_sliceone_access",
owner_id=slice_one.id,
template_id=vsg_access_template.id,
)
network_one.save()
ns = orm.NetworkSlice(slice_id=slice_one.id, network_id=network_one.id)
ns.save()
cn_one = orm.ControllerNetwork(
network_id=network_one.id, controller_id=controller.id
)
cn_one.save()
if USE_FAKE_STUB:
# fake_Stub doesn't handle reverse foreign keys
service_one.slices_ids = [slice_one.id]
slice_one.networks_ids = [network_one.id]
network_one.controllernetworks_ids = [cn_one.id]
# make sure we're using a fresh copy of the object, with all its foreign keys filled in
service_one = orm.Service.objects.get(id=service_one.id)
cns = service_one.get_composable_networks()
self.assertEqual(len(cns), 1)
self.assertEqual(cns[0].id, network_one.id)
def test_service_get_service_instance_class_name(self):
orm = self.make_coreapi()
deployment = orm.Deployment(name="test_deployment")
deployment.save()
controller = orm.Controller(name="test_controller", deployment_id=deployment.id)
controller.save()
site = orm.Site(name="testsite")
site.save()
user = orm.User(
email="fake_"
+ "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(10)
),
site_id=site.id,
)
user.save()
vsg_access_template = orm.NetworkTemplate(name="vsg_access", vtn_kind="VSG")
vsg_access_template.save()
service_one = orm.Service(name="service_one")
service_one.save()
self.assertEqual(
service_one.get_service_instance_class_name(), "ServiceInstance"
)
def test_service_get_service_instance_class(self):
orm = self.make_coreapi()
deployment = orm.Deployment(name="test_deployment")
deployment.save()
controller = orm.Controller(name="test_controller", deployment_id=deployment.id)
controller.save()
site = orm.Site(name="testsite")
site.save()
user = orm.User(
email="fake_"
+ "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(10)
),
site_id=site.id,
)
user.save()
vsg_access_template = orm.NetworkTemplate(name="vsg_access", vtn_kind="VSG")
vsg_access_template.save()
service_one = orm.Service(name="service_one")
service_one.save()
self.assertEqual(
service_one.get_service_instance_class().model_name, "ServiceInstance"
)
def test_wrapper_from__class__dot_name(self):
""" The Service model has a wrapper, so it should be returned when make_ORMWrapper looks for a wrapper based
on the class name.
"""
orm = self.make_coreapi()
obj = orm.Service()
self.assertEqual(obj.__class__.__name__, "ORMWrapperService")
def test_wrapper_from_class_names(self):
""" ONOSService._wrapped_class.class_names is "ONOSService, Service" so we should fall back to getting the
Service wrapper.
"""
orm = self.make_coreapi()
obj = orm.ONOSService()
self.assertEqual(obj.__class__.__name__, "ORMWrapperService")
def main():
global USE_FAKE_STUB
global xos_grpc_client
# Command-line argument of -R will cause this test to use a real grpc server
# rather than the fake stub.
if "-R" in sys.argv:
USE_FAKE_STUB = False
sys.argv.remove("-R")
# Note: will leave lots of litter (users, sites, etc) behind in the database
if USE_FAKE_STUB:
unittest.main()
else:
# This assumes xos-client python library is installed, and a gRPC server
# is available.
from xosapi import xos_grpc_client
print("Using xos-client library and core server")
def test_callback():
try:
sys.argv = sys.argv[
:1
] # unittest does not like xos_grpc_client's command line arguments (TODO: find a cooperative approach)
unittest.main()
except exceptions.SystemExit as e:
global exitStatus
exitStatus = e.code
xos_grpc_client.start_api_parseargs(test_callback)
sys.exit(exitStatus)
if __name__ == "__main__":
main()