fuel-plugin-contrail/plugin_test/vapor/vapor/tests/test_sriov.py

99 lines
3.8 KiB
Python

# 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 pytest
import six
from stepler import config as stepler_config
from stepler.third_party import utils
from vapor.helpers import sriov
pytestmark = pytest.mark.requires('sriov_enabled')
def test_virtual_function_exhaustion_and_reuse(
cirros_image, flavor, network, subnet, create_network, create_subnet,
create_port, agent_steps, os_faults_steps, server_steps):
"""Verify Nova can schedule VM to all the VF of a PF.
Steps:
#. Create management network with subnet
#. Create SRIOV network and subnet
#. Get total_vfs parameter for SRIOV interface
#. Create 1 port for management network and 1 port for SRIOV network
#. Boot server with created 2 ports, check that is reaches ACTIVE
status
#. Repeat last 2 steps `total_vfs` times
#. Create 1 port for management network and 1 port for SRIOV network
#. Create another one server with created 2 ports
#. Check that server reaches ERROR status
#. Delete last created server
#. Delete first created server
#. Create 1 port for management network and 1 port for SRIOV network
#. Create another one server with created 2 ports, check that is
reaches ACTIVE status
"""
sriov_device_mappings = sriov.get_sriov_device_mapping(agent_steps)
compute_name, device_mapping = next(six.iteritems(sriov_device_mappings))
sriov_physnet = next(six.iterkeys(device_mapping))
sriov_iface = device_mapping[sriov_physnet][0]
numvfs = sriov.get_sriov_numvfs(os_faults_steps, compute_name, sriov_iface)
# Create SRIOV net and subnet
kwargs = {
'provider:network_type': 'vlan',
'provider:physical_network': sriov_physnet,
'provider:segmentation_id': 200
}
sriov_net_name, = utils.generate_ids()
sriov_net = create_network(sriov_net_name, **kwargs)
create_subnet(sriov_net_name + '__subnet', sriov_net, cidr="55.1.1.0/24")
# Create servers
servers = []
sriov_port_kwargs = {'binding:vnic_type': 'direct'}
server_create_args = dict(
image=cirros_image,
flavor=flavor,
availability_zone='nova:{}'.format(compute_name))
for _ in range(numvfs):
mgmt_port = create_port(network)
sriov_port = create_port(sriov_net, **sriov_port_kwargs)
server = server_steps.create_servers(
ports=[mgmt_port, sriov_port], **server_create_args)[0]
servers.append(server)
# Try to create one more server
mgmt_port = create_port(network)
sriov_port = create_port(sriov_net, **sriov_port_kwargs)
error_server = server_steps.create_servers(
ports=[mgmt_port, sriov_port], check=False, **server_create_args)[0]
server_steps.check_server_status(
error_server,
[stepler_config.STATUS_ERROR],
transit_statuses=[stepler_config.STATUS_BUILD],
timeout=stepler_config.SERVER_ACTIVE_TIMEOUT)
# Delete last created server on error status
server_steps.delete_servers([error_server])
# Delete first created server
server_steps.delete_servers(servers[:1])
# Create another server
mgmt_port = create_port(network)
sriov_port = create_port(sriov_net, **sriov_port_kwargs)
server_steps.create_servers(
ports=[mgmt_port, sriov_port], **server_create_args)[0]