Fix some MCP-related issues
Change-Id: I9e670a03ca6169edfdb81a04b86ca7d0d1c6569b
This commit is contained in:
parent
cad0646015
commit
68dc1ebb45
|
@ -5,4 +5,4 @@ markers =
|
|||
performance_test: mark test as Performance.
|
||||
|
||||
#addopts = -vv --color=yes --junit-xml=report.xml
|
||||
addopts = -vv --color=yes -ra -p stepler.third_party.destructive_dispatcher -p stepler.third_party.idempotent_id
|
||||
addopts = -vv --color=yes -ra -p stepler.third_party.destructive_dispatcher -p stepler.third_party.idempotent_id -p stepler.third_party.default_project
|
||||
|
|
|
@ -89,7 +89,8 @@ def contrail_api_endpoint(os_faults_steps):
|
|||
def contrail_vrouter_agent_endpoint(contrail_services_http_introspect_ports):
|
||||
"""Return contrail agent endpoint."""
|
||||
service_name = 'contrail-vrouter-agent'
|
||||
ip = contrail_services_http_introspect_ports[service_name]['ips'][0]
|
||||
ip = contrail_services_http_introspect_ports[service_name]['nodes'][0][
|
||||
'ip']
|
||||
port = contrail_services_http_introspect_ports[service_name]['port']
|
||||
return {'ip': ip, 'port': port}
|
||||
|
||||
|
@ -128,7 +129,10 @@ def contrail_services_http_introspect_ports(os_faults_steps, contrail_nodes):
|
|||
filename = os.path.basename(path)
|
||||
service_name = os.path.splitext(filename)[0]
|
||||
if service_name in results:
|
||||
results[service_name]['ips'].append(node_ip)
|
||||
results[service_name]['nodes'].append({
|
||||
'ip': node_ip,
|
||||
'fqdn': node.get_fqdns()[0]
|
||||
})
|
||||
continue
|
||||
if service_name not in default_ports:
|
||||
continue
|
||||
|
@ -148,7 +152,13 @@ def contrail_services_http_introspect_ports(os_faults_steps, contrail_nodes):
|
|||
except configparser.NoSectionError:
|
||||
pass
|
||||
if port:
|
||||
results[service_name] = {'port': port, 'ips': [node_ip]}
|
||||
results[service_name] = {
|
||||
'port': port,
|
||||
'nodes': [{
|
||||
'ip': node_ip,
|
||||
'fqdn': node.get_fqdns()[0]
|
||||
}],
|
||||
}
|
||||
return results
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@ import six
|
|||
import stepler.config as stepler_config
|
||||
from stepler.third_party import utils
|
||||
|
||||
from vapor.helpers import project
|
||||
|
||||
if six.PY2:
|
||||
import contextlib2 as contextlib
|
||||
else:
|
||||
|
@ -121,6 +123,7 @@ class ResourceManager(object):
|
|||
'server': server,
|
||||
'port': port,
|
||||
'floating_ip': floating_ip,
|
||||
'security_group': security_group,
|
||||
})
|
||||
|
||||
|
||||
|
@ -144,7 +147,8 @@ def different_tenants_resources(
|
|||
cirros_image, sorted_hypervisors, get_network_steps, get_subnet_steps,
|
||||
get_server_steps, port_steps, get_floating_ip_steps, public_flavor,
|
||||
public_network, get_neutron_security_group_steps,
|
||||
get_neutron_security_group_rule_steps, nova_availability_zone_hosts):
|
||||
get_neutron_security_group_rule_steps, nova_availability_zone_hosts,
|
||||
get_current_project, contrail_api_client):
|
||||
"""Fixture to create network, subnet and server on each of 2 projects.
|
||||
|
||||
Created subnets has same CIDR.
|
||||
|
@ -185,11 +189,17 @@ def different_tenants_resources(
|
|||
project_resources = mrg.create(subnet_cidr, ips[0], cirros_image,
|
||||
public_flavor, host)
|
||||
|
||||
contrail_project = project.get_contrail_project(get_current_project(),
|
||||
contrail_api_client)
|
||||
project_resources.contrail_project = contrail_project
|
||||
projects_resources.append(project_resources)
|
||||
|
||||
with credentials.change(project_2):
|
||||
|
||||
project_resources = mrg.create(subnet_cidr, ips[1], cirros_image,
|
||||
public_flavor, host)
|
||||
contrail_project = project.get_contrail_project(
|
||||
get_current_project(), contrail_api_client)
|
||||
project_resources.contrail_project = contrail_project
|
||||
projects_resources.append(project_resources)
|
||||
yield projects_resources
|
||||
|
|
|
@ -10,8 +10,8 @@ def contrail_policies_cleanup(contrail_api_client):
|
|||
|
||||
def _get_policies_uuids():
|
||||
return {
|
||||
net['uuid']
|
||||
for net in contrail_api_client.network_policys_list()[
|
||||
policy['uuid']
|
||||
for policy in contrail_api_client.network_policys_list()[
|
||||
'network-policys']
|
||||
}
|
||||
|
||||
|
@ -24,15 +24,31 @@ def contrail_policies_cleanup(contrail_api_client):
|
|||
|
||||
|
||||
@pytest.fixture
|
||||
def contrail_network_policy(contrail_api_client, contrail_current_project):
|
||||
policy_name, = utils.generate_ids()
|
||||
policy = types.NetworkPolicy(
|
||||
policy_name, parent_obj=contrail_current_project)
|
||||
contrail_api_client.network_policy_create(policy)
|
||||
def create_network_policy(contrail_api_client, contrail_current_project):
|
||||
"""Fixture to create network policy."""
|
||||
|
||||
yield policy
|
||||
policies = []
|
||||
|
||||
try:
|
||||
def _create_network_policy(name=None, parent=None):
|
||||
name = name or next(utils.generate_ids())
|
||||
parent = parent or contrail_current_project
|
||||
policy = types.NetworkPolicy(name, parent_obj=parent)
|
||||
contrail_api_client.network_policy_create(policy)
|
||||
|
||||
policies.append(policy)
|
||||
|
||||
return policy
|
||||
|
||||
yield _create_network_policy
|
||||
|
||||
for policy in policies:
|
||||
try:
|
||||
policy = contrail_api_client.network_policy_read(id=policy.uuid)
|
||||
except exceptions.NoIdError:
|
||||
continue
|
||||
contrail_api_client.network_policy_delete(id=policy.uuid)
|
||||
except exceptions.NoIdError:
|
||||
pass
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def contrail_network_policy(create_network_policy):
|
||||
return create_network_policy()
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from pycontrail import exceptions
|
||||
import pycontrail.types as types
|
||||
import pytest
|
||||
|
||||
|
@ -74,6 +75,11 @@ def contrail_create_subnet(contrail_api_client, contrail_default_ipam):
|
|||
yield _contrail_create_subnet
|
||||
|
||||
for network, ipam in networks:
|
||||
try:
|
||||
network = contrail_api_client.virtual_network_read(id=network.uuid)
|
||||
ipam = contrail_api_client.network_ipam_read(id=ipam.uuid)
|
||||
except exceptions.NoIdError:
|
||||
continue
|
||||
network.del_network_ipam(ipam)
|
||||
contrail_api_client.virtual_network_update(network)
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ from stepler.third_party import waiter
|
|||
|
||||
from vapor.helpers import asserts
|
||||
from vapor.helpers import nodes_steps
|
||||
from vapor import settings
|
||||
|
||||
|
||||
STATUS_ACTIVE = 'active'
|
||||
|
@ -84,7 +85,7 @@ def check_services_statuses(os_faults_steps):
|
|||
|
||||
statuses = set(statuses)
|
||||
active = {x for x in statuses if x.status == STATUS_ACTIVE}
|
||||
if service in ('contrail-svc-monitor', 'contrail-schema'):
|
||||
if service in settings.ACTIVE_BACKUP_SERVICES:
|
||||
backup = {x for x in statuses if x.status == STATUS_BACKUP}
|
||||
broken = statuses - active - backup
|
||||
collector.check(active,
|
||||
|
|
|
@ -13,13 +13,14 @@
|
|||
import pycontrail.types as types
|
||||
|
||||
|
||||
def make_policy_entry(protocol, src_ports_range, dst_ports_range):
|
||||
def make_policy_entry(protocol, src_ports_range, dst_ports_range,
|
||||
action='pass'):
|
||||
address = types.AddressType(virtual_network='any')
|
||||
src_port = types.PortType(
|
||||
start_port=src_ports_range[0], end_port=src_ports_range[1])
|
||||
dst_port = types.PortType(
|
||||
start_port=dst_ports_range[0], end_port=dst_ports_range[1])
|
||||
action = types.ActionListType(simple_action='pass')
|
||||
action = types.ActionListType(simple_action=action)
|
||||
rule = types.PolicyRuleType(
|
||||
protocol=protocol,
|
||||
direction='<>',
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
# 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 uuid
|
||||
|
||||
|
||||
def get_contrail_project(os_project, contrail_api_client):
|
||||
"""Return contrail project by keystone project."""
|
||||
project_id = str(uuid.UUID(os_project.id))
|
||||
return contrail_api_client.project_read(id=project_id)
|
|
@ -159,6 +159,8 @@ CONTRAIL_ANALYTIC_PROCESSES = {
|
|||
],
|
||||
}
|
||||
|
||||
ACTIVE_BACKUP_SERVICES = ('contrail-svc-monitor', 'contrail-schema')
|
||||
|
||||
HEAT_TEMPLATES_PATH = os.path.join(BASE_DIR, 'heat')
|
||||
|
||||
VROUTER_HEADLESS_MODE_CMD = r"grep -iP '^headless_mode\s*=\s*true' /etc/contrail/contrail-vrouter-agent.conf" # noqa
|
||||
|
|
|
@ -24,7 +24,7 @@ import pytest
|
|||
|
||||
from vapor.helpers import agent_steps
|
||||
from vapor.helpers import asserts
|
||||
from vapor.helpers import contrail_status, policy, connectivity
|
||||
from vapor.helpers import contrail_status, connectivity
|
||||
from vapor import settings
|
||||
from vapor.settings import logger
|
||||
|
||||
|
@ -90,8 +90,8 @@ def test_delete_vm_with_associated_vn(contrail_network, contrail_subnet,
|
|||
|
||||
def test_two_nets_same_name(contrail_api_client, contrail_network,
|
||||
contrail_subnet):
|
||||
"""Description: Test to validate that with the same subnet and
|
||||
name provided, two different VNs cannot be created.
|
||||
"""Description: check creating 2 VNs with same name and parent.
|
||||
|
||||
Test steps:
|
||||
1. Create a VN.
|
||||
2. Create a second VN with the same name and subnet as the first VN.
|
||||
|
@ -99,7 +99,9 @@ def test_two_nets_same_name(contrail_api_client, contrail_network,
|
|||
Pass criteria:
|
||||
There is a single VN created.
|
||||
"""
|
||||
net = contrail_types.VirtualNetwork(contrail_network.name)
|
||||
project = contrail_api_client.project_read(id=contrail_network.parent_uuid)
|
||||
net = contrail_types.VirtualNetwork(
|
||||
contrail_network.name, parent_obj=project)
|
||||
assert_that(
|
||||
calling(contrail_api_client.virtual_network_create).with_args(net),
|
||||
raises(exceptions.RefsExistError))
|
||||
|
@ -110,6 +112,7 @@ def test_metadata_service(security_group, port_steps,
|
|||
create_floating_ip, tiny_flavor, cirros_image,
|
||||
server_steps):
|
||||
"""Description: Test to validate metadata service
|
||||
|
||||
Test steps:
|
||||
1. Create a VN.
|
||||
2. Launch a VM in this VN.
|
||||
|
@ -118,7 +121,7 @@ def test_metadata_service(security_group, port_steps,
|
|||
Pass criteria:
|
||||
The output of the metadata script should be seen in the VM.
|
||||
"""
|
||||
output_filename = 'output.txt'
|
||||
output_filename, = utils.generate_ids('output')
|
||||
userdata = (
|
||||
u'#!/bin/sh\n'
|
||||
u'echo "TestMetadataService.'
|
||||
|
@ -227,7 +230,8 @@ def test_create_server_on_exhausted_subnet(cirros_image, flavor, network,
|
|||
|
||||
assert_that(
|
||||
calling(server_steps.create_servers).with_args(**create_server_args),
|
||||
raises(AssertionError, 'No valid host was found'))
|
||||
raises(AssertionError, '(No valid host was found)|'
|
||||
'(Exceeded maximum number of retries)'))
|
||||
|
||||
|
||||
def test_file_transfer_with_scp(
|
||||
|
@ -254,10 +258,12 @@ def test_file_transfer_with_scp(
|
|||
userdata = '\n'.join([
|
||||
"#!/bin/bash -v",
|
||||
"echo '{content}' > {path}",
|
||||
"chown {user} {path}",
|
||||
"chown {user}:{user} {path}",
|
||||
"chmod 600 {path}",
|
||||
"echo {done_marker}",
|
||||
]).format(
|
||||
content=key_content, path=key_path, user=username)
|
||||
content=key_content, path=key_path, user=username,
|
||||
done_marker=stepler_config.USERDATA_DONE_MARKER)
|
||||
|
||||
ssh_opts = ('-o UserKnownHostsFile=/dev/null '
|
||||
'-o StrictHostKeyChecking=no')
|
||||
|
@ -282,6 +288,12 @@ def test_file_transfer_with_scp(
|
|||
floating_ip = create_floating_ip(public_network, port=port)
|
||||
floating_ips.append(floating_ip)
|
||||
|
||||
# Wait userdata to be done
|
||||
server_steps.check_server_log_contains_record(
|
||||
servers[0],
|
||||
stepler_config.USERDATA_DONE_MARKER,
|
||||
timeout=stepler_config.USERDATA_EXECUTING_TIMEOUT)
|
||||
|
||||
ip = server_steps.get_fixed_ip(servers[1])
|
||||
with asserts.AssertsCollector() as collector:
|
||||
for size in sizes:
|
||||
|
@ -383,24 +395,30 @@ def test_create_server_on_network_without_subnet(
|
|||
raises(nova_exceptions.BadRequest, 'requires a subnet'))
|
||||
|
||||
|
||||
def test_vm_multi_intf_in_same_vn_chk_ping(network,
|
||||
subnet,
|
||||
cirros_image,
|
||||
flavor,
|
||||
security_group,
|
||||
server_steps,
|
||||
port_steps,
|
||||
create_floating_ip,
|
||||
public_network):
|
||||
def test_vm_multi_intf_in_same_vn_chk_ping(
|
||||
network,
|
||||
cirros_image,
|
||||
flavor,
|
||||
security_group,
|
||||
server,
|
||||
server_steps,
|
||||
port_steps,
|
||||
create_floating_ip,
|
||||
public_network):
|
||||
"""Test to validate that a multiple interfaces of the same VM can be
|
||||
associated to the same VN and ping is successful.
|
||||
"""
|
||||
userdata = (
|
||||
u'#!/bin/sh\n'
|
||||
u"/sbin/ifconfig -a\n"
|
||||
u"/sbin/cirros-dhcpc up eth1\n")
|
||||
server_port = port_steps.get_ports(
|
||||
device_owner=stepler_config.PORT_DEVICE_OWNER_SERVER,
|
||||
device_id=server.id)[0]
|
||||
|
||||
server = server_steps.create_servers(
|
||||
floating_ip = create_floating_ip(public_network, port=server_port)
|
||||
|
||||
userdata = (u'#!/bin/sh\n'
|
||||
u"/sbin/ifconfig -a\n"
|
||||
u"/sbin/cirros-dhcpc up eth1\n")
|
||||
|
||||
server2 = server_steps.create_servers(
|
||||
userdata=userdata,
|
||||
image=cirros_image,
|
||||
flavor=flavor,
|
||||
|
@ -409,19 +427,12 @@ def test_vm_multi_intf_in_same_vn_chk_ping(network,
|
|||
username=stepler_config.CIRROS_USERNAME,
|
||||
password=stepler_config.CIRROS_PASSWORD)[0]
|
||||
|
||||
server_ports = port_steps.get_ports(
|
||||
device_owner=stepler_config.PORT_DEVICE_OWNER_SERVER,
|
||||
device_id=server.id)
|
||||
|
||||
server_port = server_ports[0]
|
||||
floating_ip = create_floating_ip(public_network, port=server_port)
|
||||
server_steps.check_server_ip(server,
|
||||
floating_ip['floating_ip_address'],
|
||||
timeout=settings.FLOATING_IP_BIND_TIMEOUT)
|
||||
|
||||
server_steps.check_ping_between_servers_via_floating(
|
||||
[server, server],
|
||||
ip_types=(stepler_config.FIXED_IP,))
|
||||
with server_steps.get_server_ssh(
|
||||
server, floating_ip['floating_ip_address']) as server_ssh:
|
||||
for ip in server_steps.get_ips(
|
||||
server2, ip_type=stepler_config.FIXED_IP).keys():
|
||||
server_steps.check_ping_for_ip(
|
||||
ip, server_ssh, timeout=stepler_config.PING_CALL_TIMEOUT)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('flavor', [dict(ram=128, disk=1)], indirect=True)
|
||||
|
@ -462,11 +473,12 @@ def test_network_in_agent_with_server_add_delete(
|
|||
id=network['id'])
|
||||
network_fq_name = contrail_network.get_fq_name_str()
|
||||
|
||||
nodes = contrail_services_http_introspect_ports['contrail-vrouter-agent']
|
||||
port = nodes['port']
|
||||
service_data = contrail_services_http_introspect_ports[
|
||||
'contrail-vrouter-agent']
|
||||
port = service_data['port']
|
||||
agent_networks = []
|
||||
for ip in nodes['ips']:
|
||||
agent_network = agent_steps.get_vna_vn(session, ip, port,
|
||||
for node in service_data['nodes']:
|
||||
agent_network = agent_steps.get_vna_vn(session, node['ip'], port,
|
||||
network_fq_name)
|
||||
if agent_network:
|
||||
agent_networks.append(agent_network)
|
||||
|
@ -476,8 +488,8 @@ def test_network_in_agent_with_server_add_delete(
|
|||
server_steps.delete_servers([server])
|
||||
|
||||
agent_networks = []
|
||||
for ip in nodes['ips']:
|
||||
agent_network = agent_steps.get_vna_vn(session, ip, port,
|
||||
for node in service_data['nodes']:
|
||||
agent_network = agent_steps.get_vna_vn(session, node['ip'], port,
|
||||
network_fq_name)
|
||||
if agent_network:
|
||||
agent_networks.append(agent_network)
|
||||
|
@ -485,12 +497,10 @@ def test_network_in_agent_with_server_add_delete(
|
|||
assert_that(agent_networks, empty())
|
||||
|
||||
|
||||
def test_policy_between_vns_diff_proj(different_tenants_resources,
|
||||
server_steps,
|
||||
contrail_api_client,
|
||||
create_contrail_security_group):
|
||||
"""Test to validate that policy to deny and pass under different
|
||||
projects should behave accordingly.
|
||||
def test_policy_between_vns_diff_proj(
|
||||
different_tenants_resources, server_steps, contrail_api_client,
|
||||
create_network_policy, set_network_policy):
|
||||
"""Check policy to deny and pass under different projects.
|
||||
|
||||
Test steps:
|
||||
1. Create 2 different projects.
|
||||
|
@ -500,41 +510,70 @@ def test_policy_between_vns_diff_proj(different_tenants_resources,
|
|||
"""
|
||||
project1, project2 = different_tenants_resources
|
||||
|
||||
client = project1.server
|
||||
client_floating_ip = project1.floating_ip
|
||||
server_floating_ip = project2.floating_ip
|
||||
project1_policy = create_network_policy(parent=project1.contrail_project)
|
||||
project2_policy = create_network_policy(parent=project2.contrail_project)
|
||||
|
||||
prj1_conrail_sg = contrail_api_client.security_group_read(
|
||||
id=project1.security_group.id)
|
||||
prj2_conrail_sg = contrail_api_client.security_group_read(
|
||||
id=project2.security_group.id)
|
||||
project1_network = contrail_api_client.virtual_network_read(
|
||||
id=project1.network['id'])
|
||||
project2_network = contrail_api_client.virtual_network_read(
|
||||
id=project2.network['id'])
|
||||
set_network_policy(project1_network, project1_policy)
|
||||
set_network_policy(project2_network, project2_policy)
|
||||
|
||||
client_sg_entries = prj1_conrail_sg.security_group_entries
|
||||
server_sg_entries = prj2_conrail_sg.security_group_entries
|
||||
# Create allow ICMP policy entries
|
||||
src_address = contrail_types.AddressType(
|
||||
virtual_network=project1_network.get_fq_name_str())
|
||||
dst_address = contrail_types.AddressType(
|
||||
virtual_network=project2_network.get_fq_name_str())
|
||||
port = contrail_types.PortType(start_port=-1, end_port=-1)
|
||||
pass_action = contrail_types.ActionListType(simple_action='pass')
|
||||
allow_rule = contrail_types.PolicyRuleType(
|
||||
protocol='icmp',
|
||||
direction='<>',
|
||||
src_addresses=[src_address],
|
||||
src_ports=[port],
|
||||
dst_addresses=[dst_address],
|
||||
dst_ports=[port],
|
||||
action_list=pass_action)
|
||||
allow_icmp_policy_entries = contrail_types.PolicyEntriesType(
|
||||
policy_rule=[allow_rule])
|
||||
|
||||
# Add allow policy
|
||||
client_sg_entries.add_policy_rule(policy.POLICY_RULE_ALLOW_EGRESS_ICMP)
|
||||
client_sg_entries.add_policy_rule(policy.POLICY_RULE_ALLOW_INGRESS_ICMP)
|
||||
prj1_conrail_sg.security_group_entries = client_sg_entries
|
||||
contrail_api_client.security_group_update(prj1_conrail_sg)
|
||||
# Create deny ICMP policy entries
|
||||
deny_action = contrail_types.ActionListType(simple_action='deny')
|
||||
deny_rule = contrail_types.PolicyRuleType(
|
||||
protocol='icmp',
|
||||
direction='<>',
|
||||
src_addresses=[src_address],
|
||||
src_ports=[port],
|
||||
dst_addresses=[dst_address],
|
||||
dst_ports=[port],
|
||||
action_list=deny_action)
|
||||
deny_icmp_policy_entries = contrail_types.PolicyEntriesType(
|
||||
policy_rule=[deny_rule])
|
||||
|
||||
project1_policy.network_policy_entries = allow_icmp_policy_entries
|
||||
contrail_api_client.network_policy_update(project1_policy)
|
||||
|
||||
project2_policy.network_policy_entries = deny_icmp_policy_entries
|
||||
contrail_api_client.network_policy_update(project2_policy)
|
||||
|
||||
project2_server_fixed_ip = project2.server_steps.get_fixed_ip(
|
||||
project2.server)
|
||||
|
||||
with server_steps.get_server_ssh(
|
||||
client,
|
||||
ip=client_floating_ip['floating_ip_address']) as server_ssh:
|
||||
project1.server,
|
||||
ip=project1.floating_ip['floating_ip_address']) as server_ssh:
|
||||
connectivity.check_icmp_connection_status(
|
||||
server_floating_ip['floating_ip_address'],
|
||||
project2_server_fixed_ip,
|
||||
server_ssh,
|
||||
must_available=False,
|
||||
timeout=settings.SECURITY_GROUP_APPLY_TIMEOUT)
|
||||
|
||||
server_sg_entries.add_policy_rule(policy.POLICY_RULE_ALLOW_EGRESS_ICMP)
|
||||
server_sg_entries.add_policy_rule(
|
||||
policy.POLICY_RULE_ALLOW_INGRESS_ICMP)
|
||||
prj2_conrail_sg.security_group_entries = server_sg_entries
|
||||
contrail_api_client.security_group_update(prj2_conrail_sg)
|
||||
project2_policy.network_policy_entries = allow_icmp_policy_entries
|
||||
contrail_api_client.network_policy_update(project2_policy)
|
||||
|
||||
connectivity.check_icmp_connection_status(
|
||||
server_floating_ip['floating_ip_address'],
|
||||
project2_server_fixed_ip,
|
||||
server_ssh,
|
||||
timeout=settings.SECURITY_GROUP_APPLY_TIMEOUT)
|
||||
|
||||
|
|
|
@ -1,3 +1,17 @@
|
|||
# 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 collections
|
||||
|
||||
import dpath.util
|
||||
import jmespath
|
||||
from hamcrest import (assert_that, is_, empty, has_key, all_of, has_length,
|
||||
|
@ -8,6 +22,7 @@ from six.moves import filter
|
|||
from vapor.helpers import analytic_steps
|
||||
from vapor.helpers import asserts
|
||||
from vapor.helpers.asserts import superset_of
|
||||
from vapor.helpers import contrail_status
|
||||
from vapor import settings
|
||||
|
||||
|
||||
|
@ -27,15 +42,27 @@ def test_db_purge(client_contrail_analytics):
|
|||
|
||||
|
||||
def test_collector_generator_connections_through_uves(
|
||||
session, client_contrail_analytics,
|
||||
session, client_contrail_analytics, os_faults_steps,
|
||||
contrail_services_http_introspect_ports):
|
||||
"""Check collector generator connections through UVES."""
|
||||
with asserts.AssertsCollector() as collector:
|
||||
for _, nodes in contrail_services_http_introspect_ports.items():
|
||||
port = nodes['port']
|
||||
for ip in nodes['ips']:
|
||||
status = analytic_steps.get_collector_connectivity(session, ip,
|
||||
port)
|
||||
expected_backup_services = collections.defaultdict(set)
|
||||
for node, services in contrail_status.get_services_statuses(
|
||||
os_faults_steps).items():
|
||||
for service in services:
|
||||
if (service['service'] in settings.ACTIVE_BACKUP_SERVICES and
|
||||
service['status'] == 'backup'):
|
||||
expected_backup_services[service['service']].add(node)
|
||||
|
||||
for service, data in contrail_services_http_introspect_ports.items():
|
||||
port = data['port']
|
||||
for node in data['nodes']:
|
||||
# Skip services with backup status
|
||||
if node['fqdn'] in expected_backup_services[service]:
|
||||
continue
|
||||
|
||||
status = analytic_steps.get_collector_connectivity(
|
||||
session, node['ip'], port)
|
||||
collector.check(status['status'], is_('Established'))
|
||||
|
||||
for name in client_contrail_analytics.get_uves_generators():
|
||||
|
|
|
@ -13,10 +13,12 @@
|
|||
from hamcrest import assert_that, is_not
|
||||
import pytest
|
||||
from stepler import config as stepler_config
|
||||
from stepler.third_party import waiter
|
||||
|
||||
from vapor import settings
|
||||
from vapor.helpers.asserts import intersects_with
|
||||
from vapor.helpers import analytic_steps
|
||||
from vapor.helpers import contrail_status
|
||||
|
||||
pytestmark = pytest.mark.destructive
|
||||
|
||||
|
@ -230,3 +232,31 @@ def test_agent_cleanup_with_control_node_stop(
|
|||
for server in servers:
|
||||
server_steps.check_ping_to_server_floating(
|
||||
server, timeout=stepler_config.PING_CALL_TIMEOUT)
|
||||
|
||||
|
||||
@pytest.mark.requires('contrail_control_nodes_count >= 2')
|
||||
def test_contrail_services_status_after_restart_master_node(os_faults_steps):
|
||||
"""Verify contrail services status after master node restart.
|
||||
|
||||
Steps:
|
||||
#. Restart node with contrail-schema (active)
|
||||
#. Wait some time
|
||||
#. Check that contrail services statuses is correct
|
||||
"""
|
||||
services_statuses = contrail_status.get_services_statuses(os_faults_steps)
|
||||
master_node_fqdn = None
|
||||
for fqdn, services in services_statuses.items():
|
||||
for service in services:
|
||||
if (service['service'] == 'contrail-schema' and
|
||||
service['status'] == contrail_status.STATUS_ACTIVE):
|
||||
master_node_fqdn = fqdn
|
||||
break
|
||||
assert master_node_fqdn is not None, "Can't find master node"
|
||||
master_node = os_faults_steps.get_node(fqdns=[master_node_fqdn])
|
||||
os_faults_steps.reset_nodes(master_node)
|
||||
|
||||
waiter.wait(
|
||||
contrail_status.check_services_statuses,
|
||||
args=(os_faults_steps),
|
||||
expected_exceptions=AssertionError,
|
||||
timeout=settings.CONTRAIL_NODE_RESET_TIMEOUT)
|
||||
|
|
|
@ -5,6 +5,8 @@ from stepler import config as stepler_config
|
|||
|
||||
from vapor import settings
|
||||
|
||||
pytestmark = pytest.mark.destructive
|
||||
|
||||
|
||||
def restart_nodes(os_faults_steps, nodes):
|
||||
for node in nodes:
|
||||
|
|
|
@ -66,14 +66,15 @@ def test_ipam_virtual_dns(
|
|||
"""
|
||||
# Create DNS records
|
||||
ip = '1.2.3.4'
|
||||
name = 'test.example.com'
|
||||
name = 'vapor.' + contrail_dns.virtual_DNS_data.domain_name
|
||||
add_dns_record(contrail_dns, r_name=name, r_data=ip)
|
||||
|
||||
# Add DNS to IPAM
|
||||
contrail_ipam.set_virtual_DNS(contrail_dns)
|
||||
contrail_ipam.network_ipam_mgmt = types.IpamType(
|
||||
ipam_dns_method='virtual-dns-server',
|
||||
ipam_dns_server=types.IpamDnsAddressType(
|
||||
virtual_dns_server_name=':'.join(contrail_dns.fq_name)))
|
||||
virtual_dns_server_name=contrail_dns.get_fq_name_str()))
|
||||
contrail_api_client.network_ipam_update(contrail_ipam)
|
||||
|
||||
# Create subnet
|
||||
|
|
|
@ -16,7 +16,6 @@ import jmespath
|
|||
import pycontrail.types as types
|
||||
import pytest
|
||||
from stepler.third_party import utils
|
||||
from stepler.third_party import waiter
|
||||
|
||||
from vapor.helpers import contrail_status
|
||||
from vapor.helpers import asserts
|
||||
|
@ -176,31 +175,3 @@ def test_contrail_alarms_is_empty(client_contrail_analytics):
|
|||
def test_zookeeper_status(znodes_list):
|
||||
expected_znodes_list = settings.ZOOKEEPER_NODES
|
||||
assert_that(znodes_list, contains_inanyorder(*expected_znodes_list))
|
||||
|
||||
|
||||
@pytest.mark.requires('contrail_control_nodes_count >= 2')
|
||||
def test_contrail_services_status_after_restart_master_node(os_faults_steps):
|
||||
"""Verify contrail services status after master node restart.
|
||||
|
||||
Steps:
|
||||
#. Restart node with contrail-schema (active)
|
||||
#. Wait some time
|
||||
#. Check that contrail services statuses is correct
|
||||
"""
|
||||
services_statuses = contrail_status.get_services_statuses(os_faults_steps)
|
||||
master_node_fqdn = None
|
||||
for fqdn, services in services_statuses.items():
|
||||
for service in services:
|
||||
if (service['service'] == 'contrail-schema' and
|
||||
service['status'] == contrail_status.STATUS_ACTIVE):
|
||||
master_node_fqdn = fqdn
|
||||
break
|
||||
assert master_node_fqdn is not None, "Can't find master node"
|
||||
master_node = os_faults_steps.get_node(fqdns=[master_node_fqdn])
|
||||
os_faults_steps.reset_nodes(master_node)
|
||||
|
||||
waiter.wait(
|
||||
contrail_status.check_services_statuses,
|
||||
args=(os_faults_steps),
|
||||
expected_exceptions=AssertionError,
|
||||
timeout=settings.CONTRAIL_NODE_RESET_TIMEOUT)
|
||||
|
|
|
@ -319,7 +319,8 @@ def test_admin_user_can_get_user_token_info(current_project, token_steps,
|
|||
|
||||
|
||||
def test_connectivity_from_server_without_floating(
|
||||
cirros_image, flavor, net_subnet_router, security_group, server_steps):
|
||||
cirros_image, flavor, net_subnet_router, neutron_security_group,
|
||||
server_steps):
|
||||
"""Check connectivity via external Contrail network without floating IP.
|
||||
|
||||
Steps:
|
||||
|
@ -342,7 +343,7 @@ def test_connectivity_from_server_without_floating(
|
|||
image=cirros_image,
|
||||
flavor=flavor,
|
||||
networks=[network],
|
||||
security_groups=[security_group],
|
||||
security_groups=[neutron_security_group],
|
||||
userdata=userdata)[0]
|
||||
server_steps.check_server_log_contains_record(
|
||||
server, done, timeout=stepler_config.USERDATA_EXECUTING_TIMEOUT)
|
||||
|
|
|
@ -23,6 +23,7 @@ from vapor.helpers import vrouter_steps
|
|||
@pytest.mark.requires('computes_count >= 2')
|
||||
def test_router_table_cleanup(cirros_image, flavor, network, subnet,
|
||||
current_project, server_steps,
|
||||
nova_availability_zone_hosts,
|
||||
sorted_hypervisors, port_steps, os_faults_steps,
|
||||
contrail_api_client, iface_route_table_create):
|
||||
"""Check that added routes are cleaned up after servers to be deleted."""
|
||||
|
@ -40,11 +41,18 @@ def test_router_table_cleanup(cirros_image, flavor, network, subnet,
|
|||
route_table_before = vrouter_steps.get_route_table(os_faults_steps,
|
||||
computes)
|
||||
|
||||
host1 = next(
|
||||
host for host in nova_availability_zone_hosts
|
||||
if hypervisor1.hypervisor_hostname.startswith(host))
|
||||
server1 = server_steps.create_servers(
|
||||
availability_zone='nova:' + hypervisor1.hypervisor_hostname,
|
||||
availability_zone='nova:' + host1,
|
||||
**server_create_args)[0]
|
||||
|
||||
host2 = next(
|
||||
host for host in nova_availability_zone_hosts
|
||||
if hypervisor2.hypervisor_hostname.startswith(host))
|
||||
server2 = server_steps.create_servers(
|
||||
availability_zone='nova:' + hypervisor2.hypervisor_hostname,
|
||||
availability_zone='nova:' + host2,
|
||||
**server_create_args)[0]
|
||||
port = port_steps.get_port(
|
||||
device_owner=stepler_config.PORT_DEVICE_OWNER_SERVER,
|
||||
|
|
Loading…
Reference in New Issue