Add annotation project driver scenario test cases
Depends-on: https://review.opendev.org/832768 Depends-On: https://review.opendev.org/c/openstack/neutron/+/853261 Implements: blueprint specify-project-by-annotation Change-Id: Ia4591ef96ce642f53ead6147ff4b56960746e510
This commit is contained in:
parent
d0840287fa
commit
4b0fceea70
@ -113,5 +113,8 @@ kuryr_k8s_opts = [
|
|||||||
cfg.BoolOpt("trigger_namespace_upon_pod", default=False,
|
cfg.BoolOpt("trigger_namespace_upon_pod", default=False,
|
||||||
help="Whether or not Namespace should be handled upon Pod "
|
help="Whether or not Namespace should be handled upon Pod "
|
||||||
"creation"),
|
"creation"),
|
||||||
|
cfg.BoolOpt("annotation_project_driver", default=False,
|
||||||
|
help="Whether or not annotation project tests will be "
|
||||||
|
"running"),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
@ -890,7 +890,7 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_namespace(cls, name=None, labels=None,
|
def create_namespace(cls, name=None, labels=None, annotations=None,
|
||||||
wait_for_crd=True,
|
wait_for_crd=True,
|
||||||
timeout_period=consts.NS_TIMEOUT):
|
timeout_period=consts.NS_TIMEOUT):
|
||||||
if CONF.kuryr_kubernetes.trigger_namespace_upon_pod:
|
if CONF.kuryr_kubernetes.trigger_namespace_upon_pod:
|
||||||
@ -898,8 +898,8 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
|
|||||||
if not name:
|
if not name:
|
||||||
name = data_utils.rand_name(prefix='kuryr-namespace')
|
name = data_utils.rand_name(prefix='kuryr-namespace')
|
||||||
namespace = cls.k8s_client.V1Namespace()
|
namespace = cls.k8s_client.V1Namespace()
|
||||||
namespace.metadata = cls.k8s_client.V1ObjectMeta(name=name,
|
namespace.metadata = cls.k8s_client.V1ObjectMeta(
|
||||||
labels=labels)
|
name=name, labels=labels, annotations=annotations)
|
||||||
namespace_obj = cls.k8s_client.CoreV1Api().create_namespace(
|
namespace_obj = cls.k8s_client.CoreV1Api().create_namespace(
|
||||||
body=namespace)
|
body=namespace)
|
||||||
|
|
||||||
@ -996,6 +996,33 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
|
|||||||
namespace=namespace, plural=KURYR_LOAD_BALANCER_CRD_PLURAL,
|
namespace=namespace, plural=KURYR_LOAD_BALANCER_CRD_PLURAL,
|
||||||
name=name)
|
name=name)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def wait_for_kuryr_resource(cls, namespace, resource_kind, name,
|
||||||
|
status_key=None):
|
||||||
|
start = time.time()
|
||||||
|
while time.time() - start < consts.KURYR_RESOURCE_CHECK_TIMEOUT:
|
||||||
|
time.sleep(5)
|
||||||
|
try:
|
||||||
|
resource_crd = cls.k8s_client.CustomObjectsApi(
|
||||||
|
).get_namespaced_custom_object(
|
||||||
|
group=KURYR_CRD_GROUP, version=KURYR_CRD_VERSION,
|
||||||
|
namespace=namespace, plural=resource_kind, name=name)
|
||||||
|
except kubernetes.client.rest.ApiException:
|
||||||
|
continue
|
||||||
|
if not status_key:
|
||||||
|
return resource_crd
|
||||||
|
try:
|
||||||
|
if resource_crd['status'][status_key]:
|
||||||
|
return resource_crd
|
||||||
|
continue
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
msg = ("Timed out waiting for %(resource_kind)s/%(resource_name)s "
|
||||||
|
"status %(status_key)s" % {"resource_kind": resource_kind,
|
||||||
|
"resource_name": name,
|
||||||
|
"status_key": status_key})
|
||||||
|
raise lib_exc.TimeoutException(msg)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_pod_list(cls, namespace='default', label_selector=''):
|
def get_pod_list(cls, namespace='default', label_selector=''):
|
||||||
return cls.k8s_client.CoreV1Api().list_namespaced_pod(
|
return cls.k8s_client.CoreV1Api().list_namespaced_pod(
|
||||||
|
@ -24,3 +24,8 @@ POD_CHECK_SLEEP_TIME = 5
|
|||||||
NP_CHECK_SLEEP_TIME = 10
|
NP_CHECK_SLEEP_TIME = 10
|
||||||
NS_TIMEOUT = 600
|
NS_TIMEOUT = 600
|
||||||
REPETITIONS_PER_BACKEND = 10
|
REPETITIONS_PER_BACKEND = 10
|
||||||
|
KURYR_RESOURCE_CHECK_TIMEOUT = 300
|
||||||
|
KURYR_PORT_CRD_PLURAL = 'kuryrports'
|
||||||
|
KURYR_LOAD_BALANCER_CRD_PLURAL = 'kuryrloadbalancers'
|
||||||
|
KURYR_NETWORK_POLICY_CRD_PLURAL = 'kuryrnetworkpolicies'
|
||||||
|
K8s_ANNOTATION_PROJECT = 'openstack.org/kuryr-project'
|
||||||
|
@ -0,0 +1,99 @@
|
|||||||
|
# Copyright 2022 Troila.
|
||||||
|
#
|
||||||
|
# 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 tempest import config
|
||||||
|
from tempest.lib import decorators
|
||||||
|
|
||||||
|
from kuryr_tempest_plugin.tests.scenario import base
|
||||||
|
from kuryr_tempest_plugin.tests.scenario import consts
|
||||||
|
|
||||||
|
CONF = config.CONF
|
||||||
|
|
||||||
|
|
||||||
|
class TestAnnotationProjectScenario(base.BaseKuryrScenarioTest):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def skip_checks(cls):
|
||||||
|
super(TestAnnotationProjectScenario, cls).skip_checks()
|
||||||
|
if not CONF.kuryr_kubernetes.annotation_project_driver:
|
||||||
|
raise cls.skipException('Annotation project driver must be '
|
||||||
|
'enabled to run these tests')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resource_setup(cls):
|
||||||
|
super(TestAnnotationProjectScenario, cls).resource_setup()
|
||||||
|
cls.project_id = cls.os_primary.projects_client.project_id
|
||||||
|
|
||||||
|
@decorators.idempotent_id('edb10a26-4572-4565-80e4-af16af4186d3')
|
||||||
|
def test_create_namespace_and_pod(self):
|
||||||
|
annotations = {consts.K8s_ANNOTATION_PROJECT: self.project_id}
|
||||||
|
namespace_name, namespace = self.create_namespace(
|
||||||
|
annotations=annotations)
|
||||||
|
# Ensure the namespace can be cleaned up upon tests finishing
|
||||||
|
self.namespaces.append(namespace)
|
||||||
|
|
||||||
|
pod_name, _ = self.create_pod(labels={"app": 'pod-label'},
|
||||||
|
namespace=namespace_name)
|
||||||
|
self.wait_for_kuryr_resource(
|
||||||
|
namespace_name, consts.KURYR_PORT_CRD_PLURAL,
|
||||||
|
pod_name, status_key='vifs')
|
||||||
|
|
||||||
|
if CONF.kuryr_kubernetes.kuryrnetworks:
|
||||||
|
kuryr_net_crd = self.get_kuryr_network_crds(namespace_name)
|
||||||
|
subnet = self.os_admin.subnets_client.show_subnet(
|
||||||
|
subnet_id=kuryr_net_crd['status']['subnetId'])
|
||||||
|
self.assertEqual(subnet['subnet']['project_id'], self.project_id)
|
||||||
|
network = self.os_admin.networks_client.show_network(
|
||||||
|
kuryr_net_crd['status']['netId'])
|
||||||
|
self.assertEqual(network['network']['project_id'], self.project_id)
|
||||||
|
|
||||||
|
ports = self.os_admin.ports_client.list_ports(
|
||||||
|
**{'project_id': self.project_id, 'device_owner': 'compute:kuryr'})
|
||||||
|
self.assertTrue(len(ports['ports']) > 0)
|
||||||
|
|
||||||
|
def test_create_service(self):
|
||||||
|
if not CONF.kuryr_kubernetes.kuryrloadbalancers:
|
||||||
|
raise self.skipException("Kuryrloadbalancers CRD should be "
|
||||||
|
"used to run this test.")
|
||||||
|
annotations = {consts.K8s_ANNOTATION_PROJECT: self.project_id}
|
||||||
|
namespace_name, namespace = self.create_namespace(
|
||||||
|
annotations=annotations)
|
||||||
|
self.namespaces.append(namespace)
|
||||||
|
service_name, pods = self.create_setup_for_service_test(
|
||||||
|
namespace=namespace_name)
|
||||||
|
kuryr_loadbalancer_crd = self.wait_for_kuryr_resource(
|
||||||
|
namespace_name, consts.KURYR_LOAD_BALANCER_CRD_PLURAL,
|
||||||
|
service_name, status_key='loadbalancer')
|
||||||
|
lb = self.lbaas.show_loadbalancer(
|
||||||
|
kuryr_loadbalancer_crd['status']['loadbalancer']['id'])
|
||||||
|
self.assertEqual(lb['project_id'], self.project_id)
|
||||||
|
|
||||||
|
def test_create_network_policy(self):
|
||||||
|
if not CONF.kuryr_kubernetes.network_policy_enabled:
|
||||||
|
raise self.skipException("Network policy handler and driver "
|
||||||
|
"should be used to run this test.")
|
||||||
|
annotations = {consts.K8s_ANNOTATION_PROJECT: self.project_id}
|
||||||
|
namespace_name, namespace = self.create_namespace(
|
||||||
|
annotations=annotations)
|
||||||
|
self.namespaces.append(namespace)
|
||||||
|
self.create_network_policy(
|
||||||
|
name='network-policy', namespace=namespace_name)
|
||||||
|
kuryr_network_policy_crd = self.wait_for_kuryr_resource(
|
||||||
|
namespace_name, consts.KURYR_NETWORK_POLICY_CRD_PLURAL,
|
||||||
|
'network-policy', status_key="securityGroupId")
|
||||||
|
sg_id = kuryr_network_policy_crd['status']['securityGroupId']
|
||||||
|
security_group = \
|
||||||
|
self.os_admin.security_groups_client.show_security_group(sg_id)
|
||||||
|
self.assertEqual(security_group['security_group']['project_id'],
|
||||||
|
self.project_id)
|
Loading…
Reference in New Issue
Block a user