122 lines
4.6 KiB
Python
122 lines
4.6 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
|
|
from vapor import settings
|
|
|
|
pytestmark = pytest.mark.requires('sriov_enabled')
|
|
|
|
|
|
def test_virtual_function_exhaustion_and_reuse(
|
|
ubuntu_xenial_image, flavor, network, subnet, net_subnet_router,
|
|
neutron_security_group, floating_ip, keypair, create_network,
|
|
create_subnet, create_port, os_faults_steps, computes,
|
|
floating_ip_steps, server_steps, nova_availability_zone_hosts):
|
|
"""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
|
|
#. Create 1 port for SRIOV network
|
|
#. Repeat last 2 steps `total_vfs` - 1 times
|
|
#. Check ping from 1st server to all another
|
|
#. 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_devices = sriov.get_sriov_devices(os_faults_steps, computes)
|
|
compute_name, ifaces = next(six.iteritems(sriov_devices))
|
|
sriov_iface = next(six.iterkeys(ifaces))
|
|
numvfs = ifaces[sriov_iface]['sriov_numvfs']
|
|
|
|
# Find availability zone compute host
|
|
compute_host = next(
|
|
host for host in nova_availability_zone_hosts
|
|
if compute_name.startswith(host))
|
|
|
|
# Create SRIOV net and subnet
|
|
kwargs = {
|
|
'provider:network_type': 'vlan',
|
|
'provider:physical_network': settings.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="10.200.54.0/24")
|
|
|
|
# Create servers
|
|
servers = []
|
|
sriov_port_kwargs = {
|
|
'binding:vnic_type': 'direct',
|
|
'security_groups': [neutron_security_group['id']]
|
|
}
|
|
server_create_args = dict(
|
|
image=ubuntu_xenial_image,
|
|
flavor=flavor,
|
|
availability_zone='nova:{}'.format(compute_host),
|
|
keypair=keypair,
|
|
username=stepler_config.UBUNTU_USERNAME)
|
|
for i in range(numvfs):
|
|
sriov_port = create_port(sriov_net, **sriov_port_kwargs)
|
|
ports = [sriov_port]
|
|
if i == 0:
|
|
mgmt_port = create_port(
|
|
network, security_groups=[neutron_security_group['id']])
|
|
ports.insert(0, mgmt_port)
|
|
server = server_steps.create_servers(
|
|
ports=ports, **server_create_args)[0]
|
|
servers.append(server)
|
|
if i == 0:
|
|
floating_ip_steps.attach_floating_ip(floating_ip, mgmt_port)
|
|
|
|
# Check ping between servers
|
|
ping_plan = {servers[0]: servers[1:]}
|
|
server_steps.check_ping_by_plan(
|
|
ping_plan, timeout=stepler_config.PING_BETWEEN_SERVERS_TIMEOUT)
|
|
|
|
# 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
|
|
sriov_port = create_port(sriov_net, **sriov_port_kwargs)
|
|
|
|
server_steps.create_servers(ports=[sriov_port], **server_create_args)[0]
|