Tempest: TaaS Client for Tap Service and Tap Flow
Tap-as-a-Service (TaaS) is an extension to the OpenStack network service (Neutron). It provides remote port mirroring capability for tenant virtual networks. Tap Service and Tap Flow Api's can be accessed using the TaaS Client Change-Id: I3912762ba632ba819e76a15408da08741e161a5f
This commit is contained in:
parent
abe19309ba
commit
0ea3e46388
@ -240,6 +240,12 @@ class NSXV3Client(object):
|
|||||||
"""
|
"""
|
||||||
return self.get_logical_resources("/logical-switches")
|
return self.get_logical_resources("/logical-switches")
|
||||||
|
|
||||||
|
def get_logical_switch_profiles(self):
|
||||||
|
"""
|
||||||
|
Retrieve all switching profiles on NSX backend
|
||||||
|
"""
|
||||||
|
return self.get_logical_resources("/switching-profiles")
|
||||||
|
|
||||||
def get_bridge_cluster_info(self):
|
def get_bridge_cluster_info(self):
|
||||||
"""
|
"""
|
||||||
Get bridge cluster information.
|
Get bridge cluster information.
|
||||||
|
108
vmware_nsx_tempest/services/taas_client.py
Normal file
108
vmware_nsx_tempest/services/taas_client.py
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# Copyright 2016 VMware Inc
|
||||||
|
# All Rights Reserved
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
from tempest.lib.services.network import base
|
||||||
|
|
||||||
|
from vmware_nsx_tempest._i18n import _LI
|
||||||
|
from vmware_nsx_tempest._i18n import _LW
|
||||||
|
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TaaSClient(base.BaseNetworkClient):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Request resources via API for TapService and TapFlow
|
||||||
|
|
||||||
|
create request
|
||||||
|
show request
|
||||||
|
delete request
|
||||||
|
list all request
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Tap Service
|
||||||
|
|
||||||
|
def create_tap_service(self, **kwargs):
|
||||||
|
uri = '/taas/tap_services'
|
||||||
|
post_data = {'tap_service': kwargs}
|
||||||
|
LOG.info(_LI("URI : %(uri)s, posting data : %(post_data)s") % {
|
||||||
|
"uri": uri, "post_data": post_data})
|
||||||
|
return self.create_resource(uri, post_data)
|
||||||
|
|
||||||
|
def list_tap_service(self, **filters):
|
||||||
|
uri = '/taas/tap_services'
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.list_resources(uri, **filters)
|
||||||
|
|
||||||
|
def show_tap_service(self, ts_id, **fields):
|
||||||
|
uri = '/taas/tap_services' + "/" + ts_id
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.show_resource(uri, **fields)
|
||||||
|
|
||||||
|
def delete_tap_service(self, ts_id):
|
||||||
|
uri = '/taas/tap_services' + "/" + ts_id
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.delete_resource(uri)
|
||||||
|
|
||||||
|
# Tap Flow
|
||||||
|
|
||||||
|
def create_tap_flow(self, **kwargs):
|
||||||
|
uri = '/taas/tap_flows'
|
||||||
|
post_data = {'tap_flow': kwargs}
|
||||||
|
LOG.info(_LI("URI : %(uri)s, posting data : %(post_data)s") % {
|
||||||
|
"uri": uri, "post_data": post_data})
|
||||||
|
return self.create_resource(uri, post_data)
|
||||||
|
|
||||||
|
def list_tap_flow(self, **filters):
|
||||||
|
uri = '/taas/tap_flows'
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.list_resources(uri, **filters)
|
||||||
|
|
||||||
|
def show_tap_flow(self, tf_id, **fields):
|
||||||
|
uri = '/taas/tap_flows' + "/" + tf_id
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.show_resource(uri, **fields)
|
||||||
|
|
||||||
|
def delete_tap_flow(self, tf_id):
|
||||||
|
uri = '/taas/tap_flows' + "/" + tf_id
|
||||||
|
LOG.info(_LI("URI : %(uri)s") % {"uri": uri})
|
||||||
|
return self.delete_resource(uri)
|
||||||
|
|
||||||
|
|
||||||
|
def get_client(client_mgr):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Create a TaaS client from manager or networks_client
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
manager = getattr(client_mgr, "manager", client_mgr)
|
||||||
|
net_client = getattr(manager, "networks_client")
|
||||||
|
_params = manager.default_params_with_timeout_values.copy()
|
||||||
|
except AttributeError as attribute_err:
|
||||||
|
LOG.warning(_LW("Failed to locate the attribute, Error: %(err_msg)s") %
|
||||||
|
{"err_msg": attribute_err.__str__()})
|
||||||
|
_params = {}
|
||||||
|
client = TaaSClient(net_client.auth_provider,
|
||||||
|
net_client.service,
|
||||||
|
net_client.region,
|
||||||
|
net_client.endpoint_type,
|
||||||
|
**_params)
|
||||||
|
return client
|
557
vmware_nsx_tempest/tests/nsxv3/api/test_taas.py
Normal file
557
vmware_nsx_tempest/tests/nsxv3/api/test_taas.py
Normal file
@ -0,0 +1,557 @@
|
|||||||
|
# Copyright 2016 VMware Inc
|
||||||
|
# All Rights Reserved
|
||||||
|
#
|
||||||
|
# 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.api.network import base
|
||||||
|
from tempest import config
|
||||||
|
from tempest.lib.common.utils import data_utils
|
||||||
|
from tempest import test
|
||||||
|
|
||||||
|
from vmware_nsx_tempest._i18n import _LI
|
||||||
|
from vmware_nsx_tempest._i18n import _LW
|
||||||
|
from vmware_nsx_tempest.services import nsxv3_client
|
||||||
|
from vmware_nsx_tempest.services import taas_client
|
||||||
|
|
||||||
|
CONF = config.CONF
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TaaSJsonTest(base.BaseNetworkTest):
|
||||||
|
|
||||||
|
"""Tap Service and Tap Flow API's can be accessed using the TaaS Client .
|
||||||
|
|
||||||
|
Tap Service is created by associating floating ip to the destination
|
||||||
|
port and Tap Flow is created by binding the Tap Service created with the
|
||||||
|
source port .
|
||||||
|
|
||||||
|
CRUD Operations for Tap Service and Tap Flow are covered .
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def skip_checks(cls):
|
||||||
|
super(TaaSJsonTest, cls).skip_checks()
|
||||||
|
if not test.is_extension_enabled('taas', 'network'):
|
||||||
|
msg = "taas extension not enabled."
|
||||||
|
raise cls.skipException(msg)
|
||||||
|
if not CONF.network.public_network_id:
|
||||||
|
msg = "Public network id not found."
|
||||||
|
raise cls.skipException(msg)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resource_setup(cls):
|
||||||
|
super(TaaSJsonTest, cls).resource_setup()
|
||||||
|
cls.ext_net_id = CONF.network.public_network_id
|
||||||
|
# Create the topology to test TaaS Client
|
||||||
|
cls.network = cls.create_network()
|
||||||
|
cls.subnet = cls.create_subnet(cls.network)
|
||||||
|
cls.router = cls.create_router(data_utils.rand_name('router-'),
|
||||||
|
external_network_id=cls.ext_net_id)
|
||||||
|
cls.create_router_interface(cls.router['id'], cls.subnet['id'])
|
||||||
|
for i in range(4):
|
||||||
|
cls.create_port(cls.network)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setup_clients(cls):
|
||||||
|
super(TaaSJsonTest, cls).setup_clients()
|
||||||
|
try:
|
||||||
|
cls.tclient = taas_client.get_client(cls.manager)
|
||||||
|
cls.nsx = nsxv3_client.NSXV3Client(CONF.nsxv3.nsx_manager,
|
||||||
|
CONF.nsxv3.nsx_user,
|
||||||
|
CONF.nsxv3.nsx_password)
|
||||||
|
except AttributeError as attribute_err:
|
||||||
|
LOG.warning(
|
||||||
|
_LW("Failed to locate the attribute, Error: %(err_msg)s") %
|
||||||
|
{"err_msg": attribute_err.__str__()})
|
||||||
|
|
||||||
|
def _create_floating_ip(self, port_index):
|
||||||
|
# Create and associates floating ip to the port based on port index
|
||||||
|
create_body = self.floating_ips_client.create_floatingip(
|
||||||
|
floating_network_id=self.ext_net_id,
|
||||||
|
port_id=self.ports[int(port_index)]['id'])
|
||||||
|
fip = create_body['floatingip']
|
||||||
|
return fip
|
||||||
|
|
||||||
|
def _create_tap_service_env(self, port_index):
|
||||||
|
"""
|
||||||
|
Creates floating ip and device_tap_service dict for
|
||||||
|
Tap service environment
|
||||||
|
"""
|
||||||
|
fip = self._create_floating_ip(port_index)
|
||||||
|
tap_service_name = data_utils.rand_name('tapservice-ch')
|
||||||
|
device_tap_service = {
|
||||||
|
"description": 'TAP1', "name": tap_service_name,
|
||||||
|
"port_id": self.ports[port_index]['id'],
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
return fip, device_tap_service
|
||||||
|
|
||||||
|
def _create_tap_flow_env(self, tap_service_id, tap_flow_direction,
|
||||||
|
src_port_index):
|
||||||
|
# Creates device_tap_flow dict for tap flow environment
|
||||||
|
tap_flow_name = data_utils.rand_name('tapflow-ch')
|
||||||
|
device_tap_flow = {
|
||||||
|
"description": 'tapflow1', "direction": tap_flow_direction,
|
||||||
|
"name": tap_flow_name, "source_port": self.ports[src_port_index][
|
||||||
|
'id'], "tap_service_id": tap_service_id,
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
return device_tap_flow
|
||||||
|
|
||||||
|
def _resource_cleanup(self, fip, tapservice_id, tapflow_id):
|
||||||
|
# Cleans Tap Service and Tap Flow resources after each test
|
||||||
|
if fip != 'null':
|
||||||
|
self.addCleanup(self.floating_ips_client.delete_floatingip,
|
||||||
|
fip['id'])
|
||||||
|
if tapflow_id != 'null':
|
||||||
|
self.tclient.delete_tap_flow(tapflow_id)
|
||||||
|
if tapservice_id != 'null':
|
||||||
|
self.tclient.delete_tap_service(tapservice_id)
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c1ec6-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_create_tap_service(self):
|
||||||
|
"""
|
||||||
|
Tap service create api is tested , Tap Service is created with
|
||||||
|
destination port associated with floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap Service Create api with floating ip associated to "
|
||||||
|
"destination port"))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap serive create : %(rsp)s") %
|
||||||
|
{"rsp": rsp})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
self.assertIn(self.ports[0]['id'], rsp['tap_service']['port_id'])
|
||||||
|
self._resource_cleanup(fip, rsp['tap_service']['id'], 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c21f0-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_list_tap_service(self):
|
||||||
|
"""
|
||||||
|
Tap Service List api is tested
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap Service List api with floating ip associated "
|
||||||
|
"to destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_create = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
# List Tap Service
|
||||||
|
rsp_list = self.tclient.list_tap_service()
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") % {"rsp": rsp_list})
|
||||||
|
self.assertEqual('200',
|
||||||
|
rsp_list.response["status"],
|
||||||
|
"Response code is not 200 ")
|
||||||
|
self.assertIn(device_tap_service['name'],
|
||||||
|
rsp_list['tap_services'][0]['name'])
|
||||||
|
self.assertIn(self.ports[0]['id'], rsp_list[
|
||||||
|
'tap_services'][0]['port_id'])
|
||||||
|
self._resource_cleanup(fip, rsp_create['tap_service']['id'], 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2394-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_show_tap_service(self):
|
||||||
|
"""
|
||||||
|
Tap Service Show api is tested
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap Service Show api with floating ip associated to "
|
||||||
|
"destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_create = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
# Show Tap Service
|
||||||
|
rsp_show = self.tclient.show_tap_service(
|
||||||
|
rsp_create['tap_service']['id'])
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") % {"rsp": rsp_show})
|
||||||
|
self.assertEqual('200',
|
||||||
|
rsp_show.response["status"],
|
||||||
|
"Response code is not 200 ")
|
||||||
|
self.assertIn(device_tap_service['name'],
|
||||||
|
rsp_show['tap_service']['name'])
|
||||||
|
self.assertIn(self.ports[0]['id'],
|
||||||
|
rsp_show['tap_service']['port_id'])
|
||||||
|
self._resource_cleanup(fip, rsp_create['tap_service']['id'], 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2538-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_delete_tap_service(self):
|
||||||
|
"""
|
||||||
|
Tap Service Delete api is tested
|
||||||
|
"""
|
||||||
|
LOG.info(
|
||||||
|
_LI(
|
||||||
|
"Testing Tap delete api with floating ip associated "
|
||||||
|
"to destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_create = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") % {"rsp": rsp_create})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_create.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
# Delete Tap Service
|
||||||
|
rsp_delete = self.tclient.delete_tap_service(
|
||||||
|
rsp_create['tap_service']['id'])
|
||||||
|
self.assertEqual('204',
|
||||||
|
rsp_delete.response["status"],
|
||||||
|
"Response code is not 204 ")
|
||||||
|
rsp_list = self.tclient.list_tap_service()
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") % {"rsp": rsp_list})
|
||||||
|
self._resource_cleanup(fip, 'null', 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2a7e-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_create_tap_flow(self):
|
||||||
|
"""
|
||||||
|
Tap flow create api is tested , Tap Service is created with
|
||||||
|
destination port associated with floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap flow create api with direction BOTH and "
|
||||||
|
"floating ip associated to destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service['tap_service']['id'],
|
||||||
|
tap_flow_direction='BOTH', src_port_index=1)
|
||||||
|
# Create Tap flow
|
||||||
|
rsp_tap_flow = self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
LOG.info(_LI("response from flow : %(rsp)s") % {"rsp": rsp_tap_flow})
|
||||||
|
# NSX backend check for Switch Profile
|
||||||
|
nsx_switch_profiles = self.nsx.get_logical_switch_profiles()
|
||||||
|
switch_profile = []
|
||||||
|
for ls in nsx_switch_profiles:
|
||||||
|
if ls['display_name'] == device_tap_flow['name']:
|
||||||
|
self.assertIn(ls['direction'], 'BIDIRECTIONAL')
|
||||||
|
self.assertIn(ls['destinations'][0],
|
||||||
|
fip['floating_ip_address'])
|
||||||
|
switch_profile = [ls]
|
||||||
|
self.assertNotEqual(len(switch_profile), 0, "Port mirror profile is "
|
||||||
|
"not found in NSX ")
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_flow.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
self.assertIn(self.ports[1]['id'], rsp_tap_flow[
|
||||||
|
'tap_flow']['source_port'])
|
||||||
|
self.assertEqual(device_tap_flow['name'], rsp_tap_flow['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertEqual(device_tap_flow['direction'], rsp_tap_flow[
|
||||||
|
'tap_flow']['direction'])
|
||||||
|
self.assertEqual(rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['tap_service_id'])
|
||||||
|
self._resource_cleanup(fip, rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['id'])
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2c5e-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_create_tap_flow_multiple(self):
|
||||||
|
"""
|
||||||
|
Multiple Tap flow's are created in with 'IN' and 'OUT' , Tap Service
|
||||||
|
is created with destination port associated with floating ip's for
|
||||||
|
each Tap Flow
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Multiple Tap flow's created with direction IN and OUT and"
|
||||||
|
"floating ip associated to destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip1, device_tap_service1 = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create tap service env
|
||||||
|
fip2, device_tap_service2 = self._create_tap_service_env(port_index=1)
|
||||||
|
# Create Tap Service 1 and Tap Service 2
|
||||||
|
rsp_tap_service1 = self.tclient.create_tap_service(
|
||||||
|
**device_tap_service1)
|
||||||
|
rsp_tap_service2 = self.tclient.create_tap_service(
|
||||||
|
**device_tap_service2)
|
||||||
|
LOG.info(_LI(
|
||||||
|
"response from tap service1 and tap service2 : %(rsp1)s "
|
||||||
|
"%(rsp2)s ") % {
|
||||||
|
"rsp1": rsp_tap_service1, "rsp2": rsp_tap_service2
|
||||||
|
})
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow1 = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service1['tap_service']['id'],
|
||||||
|
tap_flow_direction='IN', src_port_index=2)
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow2 = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service2['tap_service']['id'],
|
||||||
|
tap_flow_direction='OUT', src_port_index=3)
|
||||||
|
# Create Tap Flow1 and Tap Flow2
|
||||||
|
rsp_tap_flow1 = self.tclient.create_tap_flow(**device_tap_flow1)
|
||||||
|
rsp_tap_flow2 = self.tclient.create_tap_flow(**device_tap_flow2)
|
||||||
|
LOG.info(_LI(
|
||||||
|
"response from tap flow1 and tap flow2 : %(rsp1)s %(rsp2)s ") % {
|
||||||
|
"rsp1": rsp_tap_flow1,
|
||||||
|
"rsp2": rsp_tap_flow2
|
||||||
|
})
|
||||||
|
# NSX backend check for Switch Profile
|
||||||
|
nsx_switch_profiles = self.nsx.get_logical_switch_profiles()
|
||||||
|
profile_count = 0
|
||||||
|
for ls in nsx_switch_profiles:
|
||||||
|
if ls['display_name'].startswith('tapflow-ch-'):
|
||||||
|
if ls['direction'] == 'INGRESS' or 'EGRESS':
|
||||||
|
profile_count += 1
|
||||||
|
self.assertEqual(profile_count, 2, "Port mirror profile is "
|
||||||
|
"not found in NSX ")
|
||||||
|
self.assertEqual(device_tap_flow1['name'], rsp_tap_flow1['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertEqual(device_tap_flow2['name'], rsp_tap_flow2['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertEqual(device_tap_flow1['direction'], rsp_tap_flow1[
|
||||||
|
'tap_flow']['direction'])
|
||||||
|
self.assertEqual(device_tap_flow2['direction'], rsp_tap_flow2[
|
||||||
|
'tap_flow']['direction'])
|
||||||
|
self._resource_cleanup(fip1, rsp_tap_service1['tap_service'][
|
||||||
|
'id'], rsp_tap_flow1['tap_flow']['id'])
|
||||||
|
self._resource_cleanup(fip2, rsp_tap_service2['tap_service'][
|
||||||
|
'id'], rsp_tap_flow2['tap_flow']['id'])
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2dda-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_list_tap_flow(self):
|
||||||
|
"""
|
||||||
|
Tap flow list api is tested , Tap Service is created with
|
||||||
|
destination port associated with floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(
|
||||||
|
_LI(
|
||||||
|
"Testing Tap Flow list api with floating ip associated to "
|
||||||
|
"destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service['tap_service']['id'],
|
||||||
|
tap_flow_direction='BOTH', src_port_index=1)
|
||||||
|
# Create Tap flow
|
||||||
|
rsp_tap_flow = self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
LOG.info(_LI("response from flow : %(rsp)s") % {"rsp": rsp_tap_flow})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_flow.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
self.assertIn(self.ports[1]['id'], rsp_tap_flow[
|
||||||
|
'tap_flow']['source_port'])
|
||||||
|
self.assertEqual(device_tap_flow['name'], rsp_tap_flow['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertEqual(device_tap_flow['direction'], rsp_tap_flow[
|
||||||
|
'tap_flow']['direction'])
|
||||||
|
self.assertEqual(rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['tap_service_id'])
|
||||||
|
# List Tap Flow
|
||||||
|
rsp_tap_list_flow = self.tclient.list_tap_flow()
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_list_flow})
|
||||||
|
self.assertEqual('200',
|
||||||
|
rsp_tap_list_flow.response["status"],
|
||||||
|
"Response code is not 200 ")
|
||||||
|
self.assertIn(device_tap_flow['name'], rsp_tap_list_flow[
|
||||||
|
'tap_flows'][0][
|
||||||
|
'name'])
|
||||||
|
self.assertIn(self.ports[1]['id'], rsp_tap_list_flow[
|
||||||
|
'tap_flows'][0]['source_port'])
|
||||||
|
self._resource_cleanup(fip, rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['id'])
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c2f6a-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_show_tap_flow(self):
|
||||||
|
"""
|
||||||
|
Tap flow show api is tested , Tap Service is created with
|
||||||
|
destination port associated with floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap Service Show api with floating ip associated "
|
||||||
|
"to destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service['tap_service']['id'],
|
||||||
|
tap_flow_direction='BOTH', src_port_index=1)
|
||||||
|
# Create Tap flow
|
||||||
|
rsp_tap_flow = self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
# Show Tap Flow
|
||||||
|
rsp_tap_flow_show = self.tclient.show_tap_flow(
|
||||||
|
rsp_tap_flow['tap_flow']['id'])
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_flow_show})
|
||||||
|
self.assertEqual('200',
|
||||||
|
rsp_tap_flow_show.response["status"],
|
||||||
|
"Response code is not 200 ")
|
||||||
|
self.assertIn(device_tap_flow['name'], rsp_tap_flow_show['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertIn(self.ports[1]['id'], rsp_tap_flow_show[
|
||||||
|
'tap_flow']['source_port'])
|
||||||
|
self._resource_cleanup(fip, rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['id'])
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c310e-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_delete_tap_flow(self):
|
||||||
|
"""
|
||||||
|
Tap flow delete api is tested , Tap Service is created with
|
||||||
|
destination port associated with floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap flow delete api with floating ip associated to "
|
||||||
|
"destination port "))
|
||||||
|
# Create tap service env
|
||||||
|
fip, device_tap_service = self._create_tap_service_env(port_index=0)
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
# Create Tap Flow env
|
||||||
|
device_tap_flow = self._create_tap_flow_env(
|
||||||
|
tap_service_id=rsp_tap_service['tap_service']['id'],
|
||||||
|
tap_flow_direction='BOTH', src_port_index=1)
|
||||||
|
# Create Tap flow
|
||||||
|
rsp_tap_flow = self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
|
||||||
|
LOG.info(_LI("response from flow : %(rsp)s") % {"rsp": rsp_tap_flow})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_flow.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
self.assertIn(self.ports[1]['id'], rsp_tap_flow[
|
||||||
|
'tap_flow']['source_port'])
|
||||||
|
self.assertEqual(device_tap_flow['name'], rsp_tap_flow['tap_flow'][
|
||||||
|
'name'])
|
||||||
|
self.assertEqual(device_tap_flow['direction'], rsp_tap_flow[
|
||||||
|
'tap_flow']['direction'])
|
||||||
|
self.assertEqual(rsp_tap_service['tap_service'][
|
||||||
|
'id'], rsp_tap_flow['tap_flow']['tap_service_id'])
|
||||||
|
rsp_tap_flow_delete = self.tclient.delete_tap_flow(
|
||||||
|
rsp_tap_flow['tap_flow']['id'])
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_flow_delete})
|
||||||
|
self.assertEqual('204',
|
||||||
|
rsp_tap_flow_delete.response["status"],
|
||||||
|
"Response code is not 204 ")
|
||||||
|
rsp_tap_list_flow = self.tclient.list_tap_flow()
|
||||||
|
LOG.info(_LI("response from tap list : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_list_flow})
|
||||||
|
self._resource_cleanup(fip, rsp_tap_service[
|
||||||
|
'tap_service']['id'], 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c328a-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_create_tap_flow_negative_nofloatingip(self):
|
||||||
|
"""
|
||||||
|
Tap flow create api is tested , Tap Service is created with
|
||||||
|
destination port associated to non floating ip
|
||||||
|
"""
|
||||||
|
LOG.info(_LI(
|
||||||
|
"Testing Tap flow create api with non floating ip "
|
||||||
|
"associated to destination port "))
|
||||||
|
tap_service_name = data_utils.rand_name('tapservice-ch')
|
||||||
|
device_tap_service = {
|
||||||
|
"description": 'tapservice1', "name": tap_service_name,
|
||||||
|
"port_id": self.ports[0]['id'],
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
tap_flow_name = data_utils.rand_name('tapflow-ch')
|
||||||
|
device_tap_flow = {
|
||||||
|
"description": 'tapflow1', "direction": "BOTH",
|
||||||
|
"name": tap_flow_name, "source_port": self.ports[1]['id'],
|
||||||
|
"tap_service_id": rsp_tap_service['tap_service']['id'],
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
# Create Tap Flow with a non floating ip associated to destination port
|
||||||
|
try:
|
||||||
|
self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.info(_LI("response from exception %(rsp)s") % {"rsp": e})
|
||||||
|
self._resource_cleanup('null', rsp_tap_service[
|
||||||
|
'tap_service']['id'], 'null')
|
||||||
|
|
||||||
|
@test.attr(type='nsxv3')
|
||||||
|
@test.idempotent_id('dc5c3802-8c18-11e6-ae22-56b6b6499611')
|
||||||
|
def test_create_tap_flow_negative_nosrcport(self):
|
||||||
|
"""
|
||||||
|
Tap flow create api is tested with non existent src port
|
||||||
|
"""
|
||||||
|
LOG.info(
|
||||||
|
_LI("Testing Tap flow create api with non existent src port "))
|
||||||
|
tap_service_name = data_utils.rand_name('tapservice-ch')
|
||||||
|
device_tap_service = {
|
||||||
|
"description": 'tapservice1', "name": tap_service_name,
|
||||||
|
"port_id": self.ports[0]['id'],
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
# Create Tap Service
|
||||||
|
rsp_tap_service = self.tclient.create_tap_service(**device_tap_service)
|
||||||
|
LOG.info(_LI("response from tap service : %(rsp)s") %
|
||||||
|
{"rsp": rsp_tap_service})
|
||||||
|
self.assertEqual('201',
|
||||||
|
rsp_tap_service.response["status"],
|
||||||
|
"Response code is not 201 ")
|
||||||
|
tap_flow_name = data_utils.rand_name('tapflow-ch')
|
||||||
|
device_tap_flow = {
|
||||||
|
"description": 'tapflow1', "direction": "BOTH",
|
||||||
|
"name": tap_flow_name,
|
||||||
|
"source_port": '2ad76061-252e-xxxx-9d0f-dd94188be9cc',
|
||||||
|
"tap_service_id": rsp_tap_service['tap_service']['id'],
|
||||||
|
"tenant_id": self.ports[0]['tenant_id']
|
||||||
|
}
|
||||||
|
# Create Tap Flow with a dummy non existent source port
|
||||||
|
try:
|
||||||
|
self.tclient.create_tap_flow(**device_tap_flow)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.info(_LI("response from exception %(rsp)s") % {"rsp": e})
|
||||||
|
self._resource_cleanup('null', rsp_tap_service[
|
||||||
|
'tap_service']['id'], 'null')
|
Loading…
Reference in New Issue
Block a user