Add tempest coverage for namespace creation

It adds coverage to test namespace creation when the namespace
handler and subnet driver are used. It checks the namespace gets
created but also that the related resources get created too, in this
case the Neutron Subnet, as well as the Kuryr Net CRD. In addition,
it check the KuryrNet CRD has the right information about the network
and subnet IDs created.

Depends-On: I84580201f38c219f1943510bb493da0f07e07153

Change-Id: Iafc08ede300aecf1dc52135c6e51b89875e729d6
This commit is contained in:
Luis Tomas Bolivar 2018-05-09 09:52:47 +00:00
parent cec652300d
commit 41990e9ce7
4 changed files with 109 additions and 1 deletions

View File

@ -33,3 +33,8 @@ port_pool_enabled = cfg.BoolOpt("port_pool_enabled",
lb_build_timeout = cfg.IntOpt("lb_build_timeout",
default=900,
help="The max time it should take to create LB")
namespace_enabled = cfg.BoolOpt("namespace_enabled",
default=False,
help="Whether or not namespace handler and "
"driver are enabled")

View File

@ -38,9 +38,12 @@ class KuryrTempestPlugin(plugins.TempestPlugin):
group='kuryr_kubernetes')
conf.register_opt(project_config.lb_build_timeout,
group='kuryr_kubernetes')
conf.register_opt(project_config.namespace_enabled,
group='kuryr_kubernetes')
def get_opt_lists(self):
return [('service_available', [project_config.service_option]),
('kuryr_kubernetes', [project_config.port_pool_enabled]),
('kuryr_kubernetes', [project_config.port_pool_enabled,
project_config.namespace_enabled]),
('vif_pool', [project_config.ports_pool_batch,
project_config.lb_build_timeout])]

View File

@ -30,6 +30,10 @@ from tempest.scenario import manager
CONF = config.CONF
LOG = logging.getLogger(__name__)
KURYR_NET_CRD_GROUP = 'openstack.org'
KURYR_NET_CRD_VERSION = 'v1'
KURYR_NET_CRD_PLURAL = 'kuryrnets'
class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
@ -225,3 +229,36 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
cls.service_ip, CONF.kuryr_kubernetes.lb_build_timeout)
cls.addClassResourceCleanup(cls.delete_service, service_name)
@classmethod
def create_namespace(cls, name=None):
if not name:
name = data_utils.rand_name(prefix='kuryr-namespace')
namespace = cls.k8s_client.V1Namespace()
namespace.metadata = cls.k8s_client.V1ObjectMeta(name=name)
namespace_obj = cls.k8s_client.CoreV1Api().create_namespace(
body=namespace)
# wait until namespace gets created
while True:
time.sleep(1)
ns = cls.k8s_client.CoreV1Api().read_namespace_status(name)
if ns.metadata.annotations is not None:
break
return name, namespace_obj
@classmethod
def delete_namespace(cls, name, **kwargs):
body = cls.k8s_client.V1DeleteOptions(**kwargs)
cls.k8s_client.CoreV1Api().delete_namespace(name=name, body=body)
@classmethod
def list_namespaces(cls, **kwargs):
return cls.k8s_client.CoreV1Api().list_namespace(**kwargs)
@classmethod
def get_kuryr_net_crds(cls, name):
return cls.k8s_client.CustomObjectsApi().get_cluster_custom_object(
group=KURYR_NET_CRD_GROUP, version=KURYR_NET_CRD_VERSION,
plural=KURYR_NET_CRD_PLURAL, name=name)

View File

@ -0,0 +1,63 @@
# Copyright 2018 Red Hat, 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 oslo_log import log as logging
from tempest import config
from kuryr_tempest_plugin.tests.scenario import base
LOG = logging.getLogger(__name__)
CONF = config.CONF
class TestNamespaceScenario(base.BaseKuryrScenarioTest):
@classmethod
def skip_checks(cls):
super(TestNamespaceScenario, cls).skip_checks()
if not CONF.kuryr_kubernetes.namespace_enabled:
raise cls.skipException('Namespace driver and handler must be '
'enabled to run this tests')
@classmethod
def setup_clients(cls):
super(TestNamespaceScenario, cls).setup_clients()
def test_namespace(self):
namespace_name, namespace = self.create_namespace()
self.addCleanup(self.delete_namespace, namespace_name)
existing_namespaces = [ns.metadata.name
for ns in self.list_namespaces().items]
self.assertIn(namespace_name, existing_namespaces)
subnet_name = 'ns/' + namespace_name + '-subnet'
kuryr_net_crd_name = 'ns-' + namespace_name
seen_subnets = self.os_admin.subnets_client.list_subnets()
seen_subnet_names = [n['name'] for n in seen_subnets['subnets']]
self.assertIn(subnet_name, seen_subnet_names)
subnet_id = [n['id'] for n in seen_subnets['subnets']
if n['name'] == subnet_name]
net_id = [n['network_id'] for n in seen_subnets['subnets']
if n['name'] == subnet_name]
kuryr_net_crd = self.get_kuryr_net_crds(kuryr_net_crd_name)
self.assertIn(kuryr_net_crd_name, kuryr_net_crd['metadata']['name'])
self.assertIn(kuryr_net_crd['spec']['subnetId'], subnet_id)
self.assertIn(kuryr_net_crd['spec']['netId'], net_id)