Update and add new system tests.
-added new tests: dvs_vcenter_security dvs_vcenter_tenants_isolation dvs_vcenter_same_ip dvs_vcenter_maintenance dvs_vcenter_bind_port -updated structure of test suites according test plan. -change defaults name of external and internal admin net Change-Id: I3b89255618ba231f4cc907ef21b743ee9e2a16f6
This commit is contained in:
parent
133ab3cb4b
commit
0b746a7dfe
@ -1 +1 @@
|
|||||||
Subproject commit 202126f27c9ac907a6a26d0886397c208c042071
|
Subproject commit 5c12a9b3161820b06ee56fb0e04fd23168b46ff7
|
1
plugin_test/helpers/__init__.py
Normal file
1
plugin_test/helpers/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
237
plugin_test/helpers/openstack.py
Normal file
237
plugin_test/helpers/openstack.py
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
# Copyright 2015 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 proboscis.asserts import assert_true
|
||||||
|
from devops.helpers.helpers import wait
|
||||||
|
from devops.error import TimeoutError
|
||||||
|
|
||||||
|
|
||||||
|
from fuelweb_test.settings import SERVTEST_TENANT
|
||||||
|
from fuelweb_test import logger
|
||||||
|
|
||||||
|
#defaults
|
||||||
|
external_net_name = 'admin_floating_net'
|
||||||
|
zone_image_maps = {'vcenter': 'TestVM-VMDK',
|
||||||
|
'nova': 'TestVM'}
|
||||||
|
|
||||||
|
def create_instances(os_conn=None, vm_count=None, nics=None,
|
||||||
|
security_group=None):
|
||||||
|
"""Create Vms on available hypervisors
|
||||||
|
:param os_conn: type object, openstack
|
||||||
|
:param vm_count: type interger, count of VMs to create
|
||||||
|
:param nics: type dictionary, neutron networks
|
||||||
|
to assign to instance
|
||||||
|
:param security_group: type dictionary, security group to assign to
|
||||||
|
instances
|
||||||
|
"""
|
||||||
|
boot_timeout = 300
|
||||||
|
# Get list of available images,flavors and hipervisors
|
||||||
|
images_list = os_conn.nova.images.list()
|
||||||
|
flavors_list = os_conn.nova.flavors.list()
|
||||||
|
available_hosts = os_conn.nova.services.list(binary='nova-compute')
|
||||||
|
for host in available_hosts:
|
||||||
|
for zone in zone_image_maps.keys():
|
||||||
|
if host.zone == zone:
|
||||||
|
image = [image for image
|
||||||
|
in images_list
|
||||||
|
if image.name == zone_image_maps[zone]][0]
|
||||||
|
os_conn.nova.servers.create(
|
||||||
|
flavor=flavors_list[0],
|
||||||
|
name='test_{0}'.format(image.name),
|
||||||
|
image=image, min_count=vm_count,
|
||||||
|
availability_zone='{0}:{1}'.format(host.zone, host.host),
|
||||||
|
nics=nics
|
||||||
|
)
|
||||||
|
|
||||||
|
# Verify that current state of each VMs is Active
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
for srv in srv_list:
|
||||||
|
assert_true(os_conn.get_instance_detail(srv).status != 'ERROR',
|
||||||
|
"Current state of Vm {0} is {1}".format(
|
||||||
|
srv.name, os_conn.get_instance_detail(srv).status))
|
||||||
|
try:
|
||||||
|
wait(
|
||||||
|
lambda:
|
||||||
|
os_conn.get_instance_detail(srv).status == "ACTIVE",
|
||||||
|
timeout=boot_timeout)
|
||||||
|
except TimeoutError:
|
||||||
|
logger.error(
|
||||||
|
"Timeout is reached.Current state of Vm {0} is {1}".format(
|
||||||
|
srv.name, os_conn.get_instance_detail(srv).status))
|
||||||
|
# assign security group
|
||||||
|
if security_group:
|
||||||
|
srv.add_security_group(security_group)
|
||||||
|
|
||||||
|
|
||||||
|
def check_connection_vms(os_conn, srv_list, remote,
|
||||||
|
result_of_ping=0,
|
||||||
|
destination_ip=None):
|
||||||
|
"""Check network connectivity between instancea and destination ip
|
||||||
|
with ping
|
||||||
|
:param os_conn: type object, openstack
|
||||||
|
:param srv_list: type list, instances
|
||||||
|
:param packets: type int, packets count of icmp reply
|
||||||
|
:param remote: SSHClient to primary controller
|
||||||
|
:param destination_ip: type list, remote destination ip to
|
||||||
|
check by ping
|
||||||
|
"""
|
||||||
|
creds = ("cirros", "cubswin:)")
|
||||||
|
icmp_count = 10
|
||||||
|
|
||||||
|
for srv in srv_list:
|
||||||
|
addresses = srv.addresses[srv.addresses.keys()[0]]
|
||||||
|
fip = [add['addr'] for add in addresses
|
||||||
|
if add['OS-EXT-IPS:type'] == 'floating'][0]
|
||||||
|
|
||||||
|
logger.info("Connect to VM {0}".format(fip))
|
||||||
|
|
||||||
|
if not destination_ip:
|
||||||
|
for s in srv_list:
|
||||||
|
if s != srv:
|
||||||
|
ip = s.networks[s.networks.keys()[0]][0]
|
||||||
|
ping_command = "ping -c {0} {1}".format(
|
||||||
|
icmp_count, ip)
|
||||||
|
ping_result = os_conn.execute_through_host(
|
||||||
|
remote, fip,
|
||||||
|
ping_command,
|
||||||
|
creds)
|
||||||
|
logger.info("Ping result: \n"
|
||||||
|
"{0}\n"
|
||||||
|
"{1}\n"
|
||||||
|
"exit_code={2}"
|
||||||
|
.format(ping_result['stdout'],
|
||||||
|
ping_result['stderr'],
|
||||||
|
ping_result['exit_code']))
|
||||||
|
|
||||||
|
else:
|
||||||
|
for ip in destination_ip:
|
||||||
|
if ip != srv.networks[srv.networks.keys()[0]][0]:
|
||||||
|
ping_command = "ping -c {0} {1}".format(
|
||||||
|
icmp_count, ip)
|
||||||
|
ping_result = os_conn.execute_through_host(
|
||||||
|
remote, fip,
|
||||||
|
ping_command, creds)
|
||||||
|
logger.info("Ping result: \n"
|
||||||
|
"{0}\n"
|
||||||
|
"{1}\n"
|
||||||
|
"exit_code={2}"
|
||||||
|
.format(ping_result['stdout'],
|
||||||
|
ping_result['stderr'],
|
||||||
|
ping_result['exit_code']))
|
||||||
|
assert_true(
|
||||||
|
result_of_ping == ping_result['exit_code'],
|
||||||
|
"Ping VM{0} from Vm {1},"
|
||||||
|
" not reached {2}".format(ip, fip, ping_result)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_and_assign_floating_ip(os_conn, srv_list=None,
|
||||||
|
ext_net=None, tenant_id=None):
|
||||||
|
"""Create Vms on available hypervisors
|
||||||
|
:param os_conn: type object, openstack
|
||||||
|
:param srv_list: type list, objects of created instances
|
||||||
|
:param ext_net: type object, neutron external network
|
||||||
|
:param tenant_id: type string, tenant id
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not ext_net:
|
||||||
|
ext_net = [net for net
|
||||||
|
in os_conn.neutron.list_networks()["networks"]
|
||||||
|
if net['name'] == external_net_name][0]
|
||||||
|
if not tenant_id:
|
||||||
|
tenant_id = os_conn.get_tenant(SERVTEST_TENANT).id
|
||||||
|
|
||||||
|
if not srv_list:
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
for srv in srv_list:
|
||||||
|
fip = os_conn.neutron.create_floatingip(
|
||||||
|
{'floatingip': {
|
||||||
|
'floating_network_id': ext_net['id'],
|
||||||
|
'tenant_id': tenant_id}})
|
||||||
|
os_conn.nova.servers.add_floating_ip(
|
||||||
|
srv, fip['floatingip']['floating_ip_address']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_router(os_conn, router_name, ext_net_name=external_net_name,
|
||||||
|
tenant_name=SERVTEST_TENANT):
|
||||||
|
"""Create router with gateway
|
||||||
|
:param router_name: type string
|
||||||
|
:param ext_net_name: type string
|
||||||
|
:param tenant_name: type string
|
||||||
|
"""
|
||||||
|
|
||||||
|
ext_net = [net for net
|
||||||
|
in os_conn.neutron.list_networks()["networks"]
|
||||||
|
if net['name'] == ext_net_name][0]
|
||||||
|
|
||||||
|
gateway = {"network_id": ext_net["id"],
|
||||||
|
"enable_snat": True
|
||||||
|
}
|
||||||
|
tenant_id = os_conn.get_tenant(tenant_name).id
|
||||||
|
router_param = {'router': {'name': router_name,
|
||||||
|
'external_gateway_info': gateway,
|
||||||
|
'tenant_id': tenant_id}}
|
||||||
|
router = os_conn.neutron.create_router(body=router_param)['router']
|
||||||
|
return router
|
||||||
|
|
||||||
|
|
||||||
|
def add_subnet_to_router(os_conn, router_id, sub_id):
|
||||||
|
os_conn.neutron.add_interface_router(
|
||||||
|
router_id,
|
||||||
|
{'subnet_id': sub_id}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_network(os_conn, name,
|
||||||
|
tenant_name=SERVTEST_TENANT):
|
||||||
|
tenant_id = os_conn.get_tenant(tenant_name).id
|
||||||
|
|
||||||
|
net_body = {"network": {"name": name,
|
||||||
|
"tenant_id": tenant_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
network = os_conn.neutron.create_network(net_body)['network']
|
||||||
|
return network
|
||||||
|
|
||||||
|
|
||||||
|
def create_subnet(os_conn, network,
|
||||||
|
cidr, tenant_name=SERVTEST_TENANT):
|
||||||
|
tenant_id = os_conn.get_tenant(tenant_name).id
|
||||||
|
subnet_body = {"subnet": {"network_id": network['id'],
|
||||||
|
"ip_version": 4,
|
||||||
|
"cidr": cidr,
|
||||||
|
"name": 'subnet_{}'.format(
|
||||||
|
network['name'][-1]),
|
||||||
|
"tenant_id": tenant_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
subnet = os_conn.neutron.create_subnet(subnet_body)['subnet']
|
||||||
|
return subnet
|
||||||
|
|
||||||
|
|
||||||
|
def get_role(os_conn, role_name):
|
||||||
|
role_list = os_conn.keystone.roles.list()
|
||||||
|
for role in role_list:
|
||||||
|
if role.name == role_name:
|
||||||
|
return role
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def add_role_to_user(os_conn, user_name, role_name, tenant_name):
|
||||||
|
tenant_id = os_conn.get_tenant(tenant_name).id
|
||||||
|
user_id = os_conn.get_user(user_name).id
|
||||||
|
role_id = get_role(os_conn, role_name).id
|
||||||
|
os_conn.keystone.roles.add_user_role(user_id, role_id, tenant_id)
|
53
plugin_test/helpers/plugin.py
Normal file
53
plugin_test/helpers/plugin.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Copyright 2015 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 os
|
||||||
|
|
||||||
|
|
||||||
|
from proboscis.asserts import assert_true
|
||||||
|
|
||||||
|
|
||||||
|
from fuelweb_test.helpers import checkers
|
||||||
|
from fuelweb_test import logger
|
||||||
|
|
||||||
|
|
||||||
|
# constants
|
||||||
|
DVS_PLUGIN_PATH = os.environ.get('DVS_PLUGIN_PATH')
|
||||||
|
plugin_name = 'fuel-plugin-vmware-dvs'
|
||||||
|
msg = "Plugin couldn't be enabled. Check plugin version. Test aborted"
|
||||||
|
dvs_switch_name = ['dvSwitch']
|
||||||
|
|
||||||
|
|
||||||
|
def install_dvs_plugin(master_node):
|
||||||
|
# copy plugins to the master node
|
||||||
|
checkers.upload_tarball(
|
||||||
|
master_node,
|
||||||
|
DVS_PLUGIN_PATH, "/var")
|
||||||
|
|
||||||
|
# install plugin
|
||||||
|
checkers.install_plugin_check_code(
|
||||||
|
master_node,
|
||||||
|
plugin=os.path.basename(DVS_PLUGIN_PATH))
|
||||||
|
|
||||||
|
|
||||||
|
def enable_plugin(cluster_id, fuel_web_client):
|
||||||
|
assert_true(
|
||||||
|
fuel_web_client.check_plugin_exists(cluster_id, plugin_name),
|
||||||
|
msg)
|
||||||
|
options = {'metadata/enabled': True,
|
||||||
|
'#1_vmware_dvs_net_maps/value': dvs_switch_name[0]}
|
||||||
|
|
||||||
|
fuel_web_client.update_plugin_data(cluster_id, plugin_name, options)
|
||||||
|
|
||||||
|
logger.info("cluster is {}".format(cluster_id))
|
@ -42,8 +42,10 @@ class CloseSSHConnectionsPlugin(Plugin):
|
|||||||
|
|
||||||
|
|
||||||
def import_tests():
|
def import_tests():
|
||||||
from tests import test_plugin_vmware_dvs
|
from tests import test_plugin_vmware_dvs_destructive
|
||||||
|
from tests import test_plugin_vmware_dvs_maintenance
|
||||||
|
from tests import test_plugin_vmware_dvs_smoke
|
||||||
|
from tests import test_plugin_vmware_dvs_system
|
||||||
|
|
||||||
def run_tests():
|
def run_tests():
|
||||||
from proboscis import TestProgram # noqa
|
from proboscis import TestProgram # noqa
|
||||||
|
147
plugin_test/templates/default.yaml
Normal file
147
plugin_test/templates/default.yaml
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
adv_net_template:
|
||||||
|
default:
|
||||||
|
nic_mapping:
|
||||||
|
default:
|
||||||
|
if1: eth0 # admin
|
||||||
|
if2: eth1 # public
|
||||||
|
if3: eth4 # management
|
||||||
|
if4: eth2 # private
|
||||||
|
if5: eth3 # storage
|
||||||
|
templates_for_node_role:
|
||||||
|
controller:
|
||||||
|
- public
|
||||||
|
- private
|
||||||
|
- storage
|
||||||
|
- common
|
||||||
|
compute-vmware:
|
||||||
|
- common
|
||||||
|
- private
|
||||||
|
- storage
|
||||||
|
compute-vmware:
|
||||||
|
- common
|
||||||
|
- private
|
||||||
|
- storage
|
||||||
|
compute:
|
||||||
|
- common
|
||||||
|
- private
|
||||||
|
- storage
|
||||||
|
ceph-osd:
|
||||||
|
- common
|
||||||
|
- storage
|
||||||
|
ceph-osd:
|
||||||
|
- common
|
||||||
|
- storage
|
||||||
|
cinder-vmware:
|
||||||
|
- common
|
||||||
|
- storage
|
||||||
|
- custom
|
||||||
|
network_assignments:
|
||||||
|
storage:
|
||||||
|
ep: br-storage
|
||||||
|
private:
|
||||||
|
ep: br-prv
|
||||||
|
public:
|
||||||
|
ep: br-ex
|
||||||
|
management:
|
||||||
|
ep: br-mgmt
|
||||||
|
fuelweb_admin:
|
||||||
|
ep: br-fw-admin
|
||||||
|
network_scheme:
|
||||||
|
storage:
|
||||||
|
transformations:
|
||||||
|
- action: add-br
|
||||||
|
name: br-storage
|
||||||
|
- action: add-port
|
||||||
|
bridge: br-storage
|
||||||
|
name: <% if5 %>
|
||||||
|
endpoints:
|
||||||
|
- br-storage
|
||||||
|
roles:
|
||||||
|
cinder/iscsi: br-storage
|
||||||
|
swift/replication: br-storage
|
||||||
|
ceph/replication: br-storage
|
||||||
|
storage: br-storage
|
||||||
|
private:
|
||||||
|
transformations:
|
||||||
|
- action: add-br
|
||||||
|
name: br-prv
|
||||||
|
provider: ovs
|
||||||
|
- action: add-br
|
||||||
|
name: br-aux
|
||||||
|
- action: add-patch
|
||||||
|
bridges:
|
||||||
|
- br-prv
|
||||||
|
- br-aux
|
||||||
|
provider: ovs
|
||||||
|
mtu: 65000
|
||||||
|
- action: add-port
|
||||||
|
bridge: br-aux
|
||||||
|
name: <% if4 %>
|
||||||
|
endpoints:
|
||||||
|
- br-prv
|
||||||
|
roles:
|
||||||
|
neutron/private: br-prv
|
||||||
|
public:
|
||||||
|
transformations:
|
||||||
|
- action: add-br
|
||||||
|
name: br-ex
|
||||||
|
- action: add-br
|
||||||
|
name: br-floating
|
||||||
|
provider: ovs
|
||||||
|
- action: add-patch
|
||||||
|
bridges:
|
||||||
|
- br-floating
|
||||||
|
- br-ex
|
||||||
|
provider: ovs
|
||||||
|
mtu: 65000
|
||||||
|
- action: add-port
|
||||||
|
bridge: br-ex
|
||||||
|
name: <% if2 %>
|
||||||
|
endpoints:
|
||||||
|
- br-ex
|
||||||
|
roles:
|
||||||
|
public/vip: br-ex
|
||||||
|
neutron/floating: br-floating
|
||||||
|
ceph/radosgw: br-ex
|
||||||
|
ex: br-ex
|
||||||
|
common:
|
||||||
|
transformations:
|
||||||
|
- action: add-br
|
||||||
|
name: br-fw-admin
|
||||||
|
- action: add-port
|
||||||
|
bridge: br-fw-admin
|
||||||
|
name: <% if1 %>
|
||||||
|
- action: add-br
|
||||||
|
name: br-mgmt
|
||||||
|
- action: add-port
|
||||||
|
bridge: br-mgmt
|
||||||
|
name: <% if3 %>
|
||||||
|
endpoints:
|
||||||
|
- br-fw-admin
|
||||||
|
- br-mgmt
|
||||||
|
roles:
|
||||||
|
admin/pxe: br-fw-admin
|
||||||
|
fw-admin: br-fw-admin
|
||||||
|
mongo/db: br-mgmt
|
||||||
|
management: br-mgmt
|
||||||
|
keystone/api: br-mgmt
|
||||||
|
neutron/api: br-mgmt
|
||||||
|
neutron/mesh: br-mgmt
|
||||||
|
swift/api: br-mgmt
|
||||||
|
sahara/api: br-mgmt
|
||||||
|
ceilometer/api: br-mgmt
|
||||||
|
cinder/api: br-mgmt
|
||||||
|
glance/api: br-mgmt
|
||||||
|
heat/api: br-mgmt
|
||||||
|
nova/api: br-mgmt
|
||||||
|
nova/migration: br-mgmt
|
||||||
|
murano/api: br-mgmt
|
||||||
|
horizon: br-mgmt
|
||||||
|
mgmt/api: br-mgmt
|
||||||
|
mgmt/memcache: br-mgmt
|
||||||
|
mgmt/database: br-mgmt
|
||||||
|
mgmt/messaging: br-mgmt
|
||||||
|
mgmt/corosync: br-mgmt
|
||||||
|
mgmt/vip: br-mgmt
|
||||||
|
mgmt/api: br-mgmt
|
||||||
|
ceph/public: br-mgmt
|
File diff suppressed because it is too large
Load Diff
418
plugin_test/tests/test_plugin_vmware_dvs_destructive.py
Normal file
418
plugin_test/tests/test_plugin_vmware_dvs_destructive.py
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
# Copyright 2014 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 time
|
||||||
|
|
||||||
|
|
||||||
|
from proboscis import test
|
||||||
|
from proboscis.asserts import assert_true
|
||||||
|
from devops.helpers.helpers import wait
|
||||||
|
|
||||||
|
|
||||||
|
from fuelweb_test.helpers.decorators import log_snapshot_after_test
|
||||||
|
from fuelweb_test import logger
|
||||||
|
from fuelweb_test.settings import DEPLOYMENT_MODE
|
||||||
|
from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE
|
||||||
|
from fuelweb_test.settings import SERVTEST_USERNAME
|
||||||
|
from fuelweb_test.settings import SERVTEST_PASSWORD
|
||||||
|
from fuelweb_test.settings import SERVTEST_TENANT
|
||||||
|
from fuelweb_test.tests.base_test_case import SetupEnvironment
|
||||||
|
from fuelweb_test.tests.base_test_case import TestBasic
|
||||||
|
from fuelweb_test.helpers import os_actions
|
||||||
|
|
||||||
|
|
||||||
|
from helpers import plugin
|
||||||
|
from helpers import openstack
|
||||||
|
|
||||||
|
|
||||||
|
@test(groups=["plugins", 'dvs_vcenter_plugin', 'dvs_vcenter_system'])
|
||||||
|
class TestDVSPlugin(TestBasic):
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_9],
|
||||||
|
groups=["dvs_vcenter_add_delete_nodes", "dvs_vcenter_plugin"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_add_delete_nodes(self):
|
||||||
|
"""Deploy cluster with plugin and vmware datastore backend
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node.
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create cluster with vcenter.
|
||||||
|
4. Add 3 node with controller role.
|
||||||
|
5. Add 2 node with cinder-vmdk role.
|
||||||
|
6. Add 1 node with compute role.
|
||||||
|
7. Remove node with cinder-vmdk role.
|
||||||
|
8. Add node with cinder role.
|
||||||
|
9. Redeploy cluster.
|
||||||
|
10. Run OSTF.
|
||||||
|
11. Remove node with compute role.
|
||||||
|
12. Add node with cinder-vmdk role.
|
||||||
|
13. Redeploy cluster.
|
||||||
|
14. Run OSTF.
|
||||||
|
|
||||||
|
Duration 3 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_9_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['controller'],
|
||||||
|
'slave-03': ['controller'],
|
||||||
|
'slave-04': ['cinder-vmware'],
|
||||||
|
'slave-05': ['compute'],
|
||||||
|
'slave-06': ['compute'],
|
||||||
|
'slave-07': ['compute-vmware'], })
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
target_node_1 = self.node_name('slave-07')
|
||||||
|
self.fuel_web.vcenter_configure(
|
||||||
|
cluster_id,
|
||||||
|
target_node_1=target_node_1,
|
||||||
|
multiclusters=True
|
||||||
|
)
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
# Remove node with cinder-vmdk role
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-04': ['cinder-vmware'], }, False, True)
|
||||||
|
|
||||||
|
# Add 1 node with cinder role and redeploy cluster
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{
|
||||||
|
'slave-08': ['cinder'],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
# Remove node with compute role
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-05': ['compute'], }, False, True)
|
||||||
|
|
||||||
|
# Add 1 node with cinder-vmdk role and redeploy cluster
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{
|
||||||
|
'slave-04': ['cinder-vmware'],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_9],
|
||||||
|
groups=["dvs_vcenter_add_delete_controller", "dvs_vcenter_plugin"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_add_delete_controller(self):
|
||||||
|
"""Deploy cluster with plugin, adding and deletion controler node.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node.
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create cluster with vcenter.
|
||||||
|
4. Add 4 node with controller role.
|
||||||
|
5. Add 1 node with cinder-vmdk role.
|
||||||
|
6. Add 1 node with compute role.
|
||||||
|
7. Deploy cluster.
|
||||||
|
8. Run OSTF.
|
||||||
|
9. Remove node with controller role.
|
||||||
|
10. Redeploy cluster.
|
||||||
|
11. Run OSTF.
|
||||||
|
12. Add node with controller role.
|
||||||
|
13. Redeploy cluster.
|
||||||
|
14. Run OSTF.
|
||||||
|
|
||||||
|
Duration 3.5 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_9_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['controller'],
|
||||||
|
'slave-03': ['controller'],
|
||||||
|
'slave-04': ['controller'],
|
||||||
|
'slave-05': ['cinder-vmware'],
|
||||||
|
'slave-06': ['compute'], })
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
self.fuel_web.vcenter_configure(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
# Remove node with controller role
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'], }, False, True)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id, check_services=False)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
# Add node with controller role
|
||||||
|
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{
|
||||||
|
'slave-07': ['controller'],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id, check_services=False)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_5],
|
||||||
|
groups=["dvs_vcenter_destructive_setup", "dvs_vcenter_plugin"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_destructive_setup(self):
|
||||||
|
"""Deploy cluster with plugin and vmware datastore backend
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create cluster with vcenter.
|
||||||
|
4. Add 1 node with controller role.
|
||||||
|
5. Add 1 node with compute role.
|
||||||
|
6. Add 1 node with compute-vmware role.
|
||||||
|
7. Deploy the cluster.
|
||||||
|
8. Run OSTF.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_5_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster with 2 vcenter clusters and vcenter glance
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE,
|
||||||
|
'images_vcenter': True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['compute-vmware'],
|
||||||
|
'slave-03': ['compute']
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
target_node_2 = self.node_name('slave-02')
|
||||||
|
self.fuel_web.vcenter_configure(
|
||||||
|
cluster_id,
|
||||||
|
target_node_2=target_node_2,
|
||||||
|
multiclusters=True,
|
||||||
|
vc_glance=True
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
self.env.make_snapshot("dvs_vcenter_destructive_setup", is_make=True)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_destructive_setup],
|
||||||
|
groups=["dvs_vcenter_uninstall", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_uninstall(self):
|
||||||
|
"""Verify that it is not possibility to uninstall
|
||||||
|
of Fuel DVS plugin with deployed environment.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_bvt_2
|
||||||
|
2. Try to uninstall dvs plugin.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_destructive_setup")
|
||||||
|
|
||||||
|
# Try to uninstall dvs plugin
|
||||||
|
cmd = 'fuel plugins --remove {}==1.1.0'.format(plugin.plugin_name)
|
||||||
|
self.env.d_env.get_admin_remote().execute(cmd)['exit_code'] == 1
|
||||||
|
|
||||||
|
# Check that plugin is not removed
|
||||||
|
output = list(self.env.d_env.get_admin_remote().execute(
|
||||||
|
'fuel plugins list')['stdout'])
|
||||||
|
|
||||||
|
assert_true(
|
||||||
|
plugin.plugin_name in output[-1].split(' '),
|
||||||
|
"Plugin is removed {}".format(plugin.plugin_name)
|
||||||
|
)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_destructive_setup],
|
||||||
|
groups=["dvs_vcenter_destructive_setup", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_bind_port(self):
|
||||||
|
"""Check abilities to bind port on DVS to VM,
|
||||||
|
disable and enable this port.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_bvt_2
|
||||||
|
2. Create private networks net01 with sunet.
|
||||||
|
3. Launch instances VM_1 and VM_2 in the net01
|
||||||
|
with image TestVM and flavor m1.micro in nova az.
|
||||||
|
4. Launch instances VM_3 and VM_4 in the net01
|
||||||
|
with image TestVM-VMDK and flavor m1.micro in nova az.
|
||||||
|
4. Bind sub_net port of Vms
|
||||||
|
5. Check VMs are not available.
|
||||||
|
6. Enable sub_net port of all Vms.
|
||||||
|
7. Verify that VMs should communicate between each other.
|
||||||
|
Send icmp ping between VMs.
|
||||||
|
|
||||||
|
|
||||||
|
Duration 1,5 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_destructive_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Create new network
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
os_conn = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[os_conn.get_tenant(SERVTEST_TENANT).id] =\
|
||||||
|
os_conn.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
os_conn.get_tenant(SERVTEST_TENANT).id].id
|
||||||
|
|
||||||
|
# Launch instance VM_1 and VM_2
|
||||||
|
network = os_conn.nova.networks.find(label='net04')
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=os_conn, vm_count=1,
|
||||||
|
nics=[{'net-id': network.id}], security_group=security_group
|
||||||
|
)
|
||||||
|
|
||||||
|
openstack.create_and_assign_floating_ip(os_conn=os_conn)
|
||||||
|
|
||||||
|
time.sleep(30) # need time to apply updates
|
||||||
|
|
||||||
|
# Bind sub_net ports of Vms
|
||||||
|
ports = os_conn.neutron.list_ports()['ports']
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
for srv in srv_list:
|
||||||
|
srv_addr = srv.networks[srv.networks.keys()[0]][0]
|
||||||
|
for port in ports:
|
||||||
|
port_addr = port['fixed_ips'][0]['ip_address']
|
||||||
|
if srv_addr == port_addr:
|
||||||
|
os_conn.neutron.update_port(
|
||||||
|
port['id'], {'port': {'admin_state_up': False}}
|
||||||
|
)
|
||||||
|
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
|
||||||
|
# Verify that not connection to VMs
|
||||||
|
primary_controller = self.fuel_web.get_nailgun_primary_node(
|
||||||
|
self.env.d_env.nodes().slaves[0]
|
||||||
|
)
|
||||||
|
ssh_controller = self.fuel_web.get_ssh_for_node(
|
||||||
|
primary_controller.name
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=os_conn, srv_list=srv_list, remote=ssh_controller)
|
||||||
|
except Exception as e:
|
||||||
|
logger.info(str(e))
|
||||||
|
|
||||||
|
# Enable sub_net ports of VMs
|
||||||
|
for srv in srv_list:
|
||||||
|
srv_addr = srv.networks[srv.networks.keys()[0]][0]
|
||||||
|
for port in ports:
|
||||||
|
port_addr = port['fixed_ips'][0]['ip_address']
|
||||||
|
if srv_addr == port_addr:
|
||||||
|
os_conn.neutron.update_port(
|
||||||
|
port['id'], {'port': {'admin_state_up': True}}
|
||||||
|
)
|
||||||
|
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
for srv in srv_list:
|
||||||
|
srv.reboot()
|
||||||
|
wait(
|
||||||
|
lambda:
|
||||||
|
os_conn.get_instance_detail(srv).status == "ACTIVE",
|
||||||
|
timeout=300)
|
||||||
|
time.sleep(60) # need time after reboot to get ip by instance
|
||||||
|
|
||||||
|
# Verify that VMs should communicate between each other.
|
||||||
|
# Send icmp ping between VMs
|
||||||
|
openstack.check_connection_vms(os_conn=os_conn, srv_list=srv_list,
|
||||||
|
remote=ssh_controller)
|
90
plugin_test/tests/test_plugin_vmware_dvs_maintenance.py
Normal file
90
plugin_test/tests/test_plugin_vmware_dvs_maintenance.py
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
# Copyright 2014 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 proboscis import test
|
||||||
|
|
||||||
|
from fuelweb_test.helpers.decorators import log_snapshot_after_test
|
||||||
|
from fuelweb_test.settings import DEPLOYMENT_MODE
|
||||||
|
from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE
|
||||||
|
from fuelweb_test.tests.base_test_case import SetupEnvironment
|
||||||
|
from fuelweb_test.tests.base_test_case import TestBasic
|
||||||
|
|
||||||
|
from helpers import plugin
|
||||||
|
|
||||||
|
|
||||||
|
@test(groups=["plugins"])
|
||||||
|
class TestDVSPlugin(TestBasic):
|
||||||
|
|
||||||
|
# constants
|
||||||
|
node_name = lambda self, name_node: self.fuel_web. \
|
||||||
|
get_nailgun_node_by_name(name_node)['hostname']
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_9],
|
||||||
|
groups=["dvs_vcenter_maintenance"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_maintenance(self):
|
||||||
|
"""Deploy cluster with plugin and vmware datastore backend
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create cluster with vcenter.
|
||||||
|
4. Add 3 node with controller+mongo+cinder-vmware role.
|
||||||
|
5. Add 2 node with compute role.
|
||||||
|
6. Add 1 node with compute-vmware role.
|
||||||
|
7. Deploy the cluster.
|
||||||
|
8. Run OSTF.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_9_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster with 2 vcenter clusters and vcenter glance
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE,
|
||||||
|
'images_vcenter': True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller', 'mongo', 'cinder-vmware'],
|
||||||
|
'slave-02': ['controller', 'mongo', 'cinder-vmware'],
|
||||||
|
'slave-03': ['controller', 'mongo', 'cinder-vmware'],
|
||||||
|
'slave-04': ['compute'],
|
||||||
|
'slave-05': ['compute'],
|
||||||
|
'slave-06': ['compute-vmware']}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
target_node_2 = self.node_name('slave-06')
|
||||||
|
self.fuel_web.vcenter_configure(
|
||||||
|
cluster_id,
|
||||||
|
target_node_2=target_node_2,
|
||||||
|
multiclusters=True,
|
||||||
|
vc_glance=True
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke', 'tests_platform'])
|
171
plugin_test/tests/test_plugin_vmware_dvs_smoke.py
Normal file
171
plugin_test/tests/test_plugin_vmware_dvs_smoke.py
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
# Copyright 2014 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 proboscis import test
|
||||||
|
|
||||||
|
from fuelweb_test.helpers.decorators import log_snapshot_after_test
|
||||||
|
from fuelweb_test.settings import DEPLOYMENT_MODE
|
||||||
|
from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE
|
||||||
|
from fuelweb_test.tests.base_test_case import SetupEnvironment
|
||||||
|
from fuelweb_test.tests.base_test_case import TestBasic
|
||||||
|
|
||||||
|
from helpers import plugin
|
||||||
|
|
||||||
|
|
||||||
|
@test(groups=["plugins", 'dvs_vcenter_plugin'])
|
||||||
|
class TestDVSPlugin(TestBasic):
|
||||||
|
|
||||||
|
# constants
|
||||||
|
node_name = lambda self, name_node: self.fuel_web. \
|
||||||
|
get_nailgun_node_by_name(name_node)['hostname']
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_3],
|
||||||
|
groups=["dvs_vcenter_smoke", "dvs_vcenter_plugin"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_smoke(self):
|
||||||
|
"""Check deployment with VMware DVS plugin and one controller.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create a new environment with following parameters:
|
||||||
|
* Compute: KVM/QEMU with vCenter
|
||||||
|
* Networking: Neutron with VLAN segmentation
|
||||||
|
* Storage: default
|
||||||
|
* Additional services: default
|
||||||
|
4. Add 1 node with controller role.
|
||||||
|
5. Configure interfaces on nodes.
|
||||||
|
6. Configure network settings.
|
||||||
|
7. Enable and configure DVS plugin.
|
||||||
|
8. Enable VMWare vCenter/ESXi datastore for images (Glance)
|
||||||
|
9 Configure VMware vCenter Settings.
|
||||||
|
Add 1 vSphere clusters and configure Nova Compute instances
|
||||||
|
on conrollers.
|
||||||
|
10. Deploy the cluster.
|
||||||
|
11. Run OSTF.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_3_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster with 2 vcenter clusters
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE,
|
||||||
|
'images_vcenter': True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller']}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
self.fuel_web.vcenter_configure(cluster_id, vc_glance=True)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_9],
|
||||||
|
groups=["dvs_vcenter_bvt", "dvs_vcenter_plugin"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_bvt(self):
|
||||||
|
"""Deploy cluster with DVS plugin and ceph storage.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create a new environment with following parameters:
|
||||||
|
* Compute: KVM/QEMU with vCenter
|
||||||
|
* Networking: Neutron with VLAN segmentation
|
||||||
|
* Storage: ceph
|
||||||
|
* Additional services: default
|
||||||
|
4. Add nodes with following roles:
|
||||||
|
* Controller
|
||||||
|
* Controller
|
||||||
|
* Controller
|
||||||
|
* Compute
|
||||||
|
* CephOSD
|
||||||
|
* CephOSD
|
||||||
|
* CinderVMware
|
||||||
|
* ComputeVMware
|
||||||
|
5. Configure interfaces on nodes.
|
||||||
|
6. Configure network settings.
|
||||||
|
7. Enable and configure DVS plugin.
|
||||||
|
Configure VMware vCenter Settings. Add 2 vSphere clusters
|
||||||
|
and configure Nova Compute instances on conroller
|
||||||
|
and compute-vmware.
|
||||||
|
8. Verify networks.
|
||||||
|
9. Deploy the cluster.
|
||||||
|
10. Run OSTF.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_9_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster with 2 vcenter clusters and vcenter glance
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE,
|
||||||
|
'images_ceph': True,
|
||||||
|
'volumes_ceph': True,
|
||||||
|
'objects_ceph': True,
|
||||||
|
'volumes_lvm': False
|
||||||
|
}
|
||||||
|
)
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['controller'],
|
||||||
|
'slave-03': ['controller'],
|
||||||
|
'slave-04': ['compute'],
|
||||||
|
'slave-05': ['compute-vmware'],
|
||||||
|
'slave-06': ['cinder-vmware'],
|
||||||
|
'slave-07': ['ceph-osd'],
|
||||||
|
'slave-08': ['ceph-osd'],
|
||||||
|
'slave-09': ['ceph-osd']}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
target_node_2 = self.node_name('slave-05')
|
||||||
|
self.fuel_web.vcenter_configure(
|
||||||
|
cluster_id,
|
||||||
|
target_node_2=target_node_2,
|
||||||
|
multiclusters=True
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.verify_network(cluster_id)
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
779
plugin_test/tests/test_plugin_vmware_dvs_system.py
Normal file
779
plugin_test/tests/test_plugin_vmware_dvs_system.py
Normal file
@ -0,0 +1,779 @@
|
|||||||
|
# Copyright 2014 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 time
|
||||||
|
|
||||||
|
|
||||||
|
from proboscis import test
|
||||||
|
from proboscis.asserts import assert_true
|
||||||
|
|
||||||
|
|
||||||
|
from fuelweb_test.helpers.decorators import log_snapshot_after_test
|
||||||
|
from fuelweb_test import logger
|
||||||
|
from fuelweb_test.settings import DEPLOYMENT_MODE
|
||||||
|
from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE
|
||||||
|
from fuelweb_test.settings import SERVTEST_USERNAME
|
||||||
|
from fuelweb_test.settings import SERVTEST_PASSWORD
|
||||||
|
from fuelweb_test.settings import SERVTEST_TENANT
|
||||||
|
from fuelweb_test.tests.base_test_case import SetupEnvironment
|
||||||
|
from fuelweb_test.tests.base_test_case import TestBasic
|
||||||
|
from fuelweb_test.helpers import os_actions
|
||||||
|
|
||||||
|
|
||||||
|
from helpers import plugin
|
||||||
|
from helpers import openstack
|
||||||
|
|
||||||
|
|
||||||
|
@test(groups=["plugins", 'dvs_vcenter_system'])
|
||||||
|
class TestDVSPlugin(TestBasic):
|
||||||
|
|
||||||
|
# constants
|
||||||
|
node_name = lambda self, name_node: self.fuel_web. \
|
||||||
|
get_nailgun_node_by_name(name_node)['hostname']
|
||||||
|
|
||||||
|
net_data = [{'net_1': '192.168.112.0/24'},
|
||||||
|
{'net_2': '192.168.113.0/24'}]
|
||||||
|
|
||||||
|
# defaults
|
||||||
|
ext_net_name = 'admin_floating_net'
|
||||||
|
inter_net_name = 'admin_internal_net'
|
||||||
|
|
||||||
|
@test(depends_on=[SetupEnvironment.prepare_slaves_5],
|
||||||
|
groups=["dvs_vcenter_systest_setup", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_systest_setup(self):
|
||||||
|
"""Deploy cluster with plugin and vmware datastore backend
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Upload plugins to the master node
|
||||||
|
2. Install plugin.
|
||||||
|
3. Create cluster with vcenter.
|
||||||
|
4. Add 1 node with controller role.
|
||||||
|
5. Add 2 node with compute role.
|
||||||
|
6. Add 1 node with compute-vmware role.
|
||||||
|
7. Deploy the cluster.
|
||||||
|
8. Run OSTF.
|
||||||
|
9. Create snapshot.
|
||||||
|
|
||||||
|
Duration 1.8 hours
|
||||||
|
Snapshot dvs_vcenter_systest_setup
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("ready_with_5_slaves")
|
||||||
|
|
||||||
|
plugin.install_dvs_plugin(self.env.d_env.get_admin_remote())
|
||||||
|
|
||||||
|
# Configure cluster with 2 vcenter clusters and vcenter glance
|
||||||
|
cluster_id = self.fuel_web.create_cluster(
|
||||||
|
name=self.__class__.__name__,
|
||||||
|
mode=DEPLOYMENT_MODE,
|
||||||
|
settings={
|
||||||
|
"net_provider": 'neutron',
|
||||||
|
"net_segment_type": NEUTRON_SEGMENT_TYPE,
|
||||||
|
'images_vcenter': True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
plugin.enable_plugin(cluster_id, self.fuel_web)
|
||||||
|
|
||||||
|
# Assign role to node
|
||||||
|
self.fuel_web.update_nodes(
|
||||||
|
cluster_id,
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['compute-vmware'],
|
||||||
|
'slave-03': ['compute'],
|
||||||
|
'slave-04': ['compute']
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configure VMWare vCenter settings
|
||||||
|
target_node_2 = self.node_name('slave-02')
|
||||||
|
self.fuel_web.vcenter_configure(
|
||||||
|
cluster_id,
|
||||||
|
target_node_2=target_node_2,
|
||||||
|
multiclusters=True,
|
||||||
|
vc_glance=True
|
||||||
|
)
|
||||||
|
|
||||||
|
self.fuel_web.deploy_cluster_wait(cluster_id)
|
||||||
|
|
||||||
|
self.fuel_web.run_ostf(
|
||||||
|
cluster_id=cluster_id, test_sets=['smoke'])
|
||||||
|
|
||||||
|
self.env.make_snapshot("dvs_vcenter_systest_setup", is_make=True)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_networks", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_networks(self):
|
||||||
|
"""Check abilities to create and terminate networks on DVS.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Add 2 private networks net_1 and net_2.
|
||||||
|
3. Check that networks are created.
|
||||||
|
4. Delete net_1.
|
||||||
|
5. Check that net_1 is deleted.
|
||||||
|
6. Add net_1 again.
|
||||||
|
|
||||||
|
Duration 15 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Create new network
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
os_conn = (
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
subnets = []
|
||||||
|
networks = []
|
||||||
|
|
||||||
|
for net in self.net_data:
|
||||||
|
logger.info('Create network {}'.format(net.keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
os_conn,
|
||||||
|
net.keys()[0], tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(net.keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
os_conn,
|
||||||
|
network,
|
||||||
|
net[net.keys()[0]], tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
subnets.append(subnet)
|
||||||
|
networks.append(network)
|
||||||
|
|
||||||
|
# Check that networks are created.
|
||||||
|
for network in networks:
|
||||||
|
assert_true(
|
||||||
|
os_conn.get_network(network['name'])['id'] == network['id']
|
||||||
|
)
|
||||||
|
|
||||||
|
# Delete net_1.
|
||||||
|
logger.info('Delete network net_1')
|
||||||
|
os_conn.neutron.delete_subnet(subnets[0]['id'])
|
||||||
|
os_conn.neutron.delete_network(networks[0]['id'])
|
||||||
|
|
||||||
|
# Check that net_1 is deleted.
|
||||||
|
assert_true(
|
||||||
|
os_conn.get_network(networks[0]) is None
|
||||||
|
)
|
||||||
|
logger.info('Networks net_1 is removed.')
|
||||||
|
logger.info('Created net_1 again.')
|
||||||
|
network = openstack.create_network(
|
||||||
|
os_conn,
|
||||||
|
self.net_data[0].keys()[0])
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
os_conn,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]],
|
||||||
|
tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
assert_true(
|
||||||
|
os_conn.get_network(network['name'])['id'] == network['id']
|
||||||
|
)
|
||||||
|
logger.info('Networks net_1 and net_2 are present.')
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_ping_public", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_ping_public(self):
|
||||||
|
"""Check connectivity Vms to public network with floating ip.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Create private networks net01 with sunet.
|
||||||
|
3. Add one subnet (net01_subnet01: 192.168.101.0/24
|
||||||
|
4. Create Router_01, set gateway and add interface
|
||||||
|
to external network.
|
||||||
|
5. Launch instances VM_1 and VM_2 in the net01
|
||||||
|
with image TestVM and flavor m1.micro in nova az.
|
||||||
|
6. Launch instances VM_3 and VM_4 in the net01
|
||||||
|
with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
7. Send ping from instances to 8.8.8.8
|
||||||
|
or other outside ip.
|
||||||
|
|
||||||
|
Duration 15 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Create new network
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
os_conn = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
# Create non default network with subnet.
|
||||||
|
logger.info('Create network {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
os_conn,
|
||||||
|
self.net_data[0].keys()[0], tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
os_conn,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]],
|
||||||
|
tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check that network are created.
|
||||||
|
assert_true(
|
||||||
|
os_conn.get_network(network['name'])['id'] == network['id']
|
||||||
|
)
|
||||||
|
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[os_conn.get_tenant(SERVTEST_TENANT).id] =\
|
||||||
|
os_conn.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
os_conn.get_tenant(SERVTEST_TENANT).id].id
|
||||||
|
|
||||||
|
# Launch instance VM_1, VM_2 in the tenant network net_01
|
||||||
|
# with image TestVMDK and flavor m1.micro in the nova az.
|
||||||
|
# Launch instances VM_3 and VM_4 in the net01
|
||||||
|
# with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=os_conn, vm_count=1,
|
||||||
|
nics=[{'net-id': network['id']}], security_group=security_group
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add net_1 to default router
|
||||||
|
router = os_conn.get_router(os_conn.get_network(self.ext_net_name))
|
||||||
|
openstack.add_subnet_to_router(
|
||||||
|
os_conn,
|
||||||
|
router['id'], subnet['id'])
|
||||||
|
|
||||||
|
openstack.create_and_assign_floating_ip(os_conn=os_conn)
|
||||||
|
|
||||||
|
# Send ping from instances VM_1 and VM_2 to 8.8.8.8
|
||||||
|
# or other outside ip.
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
primary_controller = self.fuel_web.get_nailgun_primary_node(
|
||||||
|
self.env.d_env.nodes().slaves[0]
|
||||||
|
)
|
||||||
|
ssh_controller = self.fuel_web.get_ssh_for_node(
|
||||||
|
primary_controller.name)
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=os_conn, srv_list=srv_list, remote=ssh_controller,
|
||||||
|
destination_ip=['8.8.8.8']
|
||||||
|
)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_5_instances", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_5_instances(self):
|
||||||
|
"""Check creation instance in the one group simultaneously
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Create 5 instances of vcenter and 5 of nova simultaneously.
|
||||||
|
|
||||||
|
Duration 15 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Create 5 instances of vcenter and 5 of nova simultaneously.
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
os_conn = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
network = os_conn.nova.networks.find(label=self.inter_net_name)
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=os_conn, vm_count=5,
|
||||||
|
nics=[{'net-id': network.id}])
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_security", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_security(self):
|
||||||
|
"""Check abilities to create and delete security group.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Create non default network with subnet net01.
|
||||||
|
3. Launch 2 instances of nova az
|
||||||
|
in the tenant network net_01
|
||||||
|
4. Launch 2 instances of vcenter az
|
||||||
|
in the tenant net04.
|
||||||
|
5. Create security groups SG_1 to allow ICMP traffic.
|
||||||
|
6. Add Ingress rule for ICMP protocol to SG_1
|
||||||
|
7. Create security groups SG_2 to allow TCP traffic 22 port.
|
||||||
|
8. Add Ingress rule for TCP protocol to SG_2
|
||||||
|
9. Remove defauld security group and attach SG_1 and SG2 to VMs
|
||||||
|
10. Check ssh between VMs
|
||||||
|
11. Check ping between VMs
|
||||||
|
12. Delete all rules from SG_1 and SG_2
|
||||||
|
13. Check ssh are not available to VMs
|
||||||
|
and vice verse
|
||||||
|
14. Add Ingress rule for TCP protocol to SG_2
|
||||||
|
15. Add Ingress rule for ICMP protocol to SG_1
|
||||||
|
16. Check ping between VMs and vice verse
|
||||||
|
17. Check SSH between VMs
|
||||||
|
18. Delete security groups.
|
||||||
|
19. Attach Vms to default security group.
|
||||||
|
20. Check ssh are not available to VMs.
|
||||||
|
|
||||||
|
Duration 30 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Connect to cluster
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
os_conn = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
# Create non default network with subnet.
|
||||||
|
logger.info('Create network {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
os_conn,
|
||||||
|
self.net_data[0].keys()[0],
|
||||||
|
tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
os_conn,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]],
|
||||||
|
tenant_name=SERVTEST_TENANT
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check that network are created.
|
||||||
|
assert_true(
|
||||||
|
os_conn.get_network(network['name'])['id'] == network['id']
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add net_1 to default router
|
||||||
|
router = os_conn.get_router(os_conn.get_network(self.ext_net_name))
|
||||||
|
openstack.add_subnet_to_router(
|
||||||
|
os_conn,
|
||||||
|
router['id'], subnet['id'])
|
||||||
|
|
||||||
|
# Launch instance 2 VMs of vcenter and 2 VMs of nova
|
||||||
|
# in the tenant network net_01
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=os_conn, vm_count=1,
|
||||||
|
nics=[{'net-id': network['id']}]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Launch instance 2 VMs of vcenter and 2 VMs of nova
|
||||||
|
# in the tenant network net04
|
||||||
|
network = os_conn.nova.networks.find(label=self.inter_net_name)
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=os_conn, vm_count=1,
|
||||||
|
nics=[{'net-id': network.id}])
|
||||||
|
|
||||||
|
openstack.create_and_assign_floating_ip(os_conn=os_conn)
|
||||||
|
|
||||||
|
# Create security groups SG_1 to allow ICMP traffic.
|
||||||
|
# Add Ingress rule for ICMP protocol to SG_1
|
||||||
|
# Create security groups SG_2 to allow TCP traffic 22 port.
|
||||||
|
# Add Ingress rule for TCP protocol to SG_2
|
||||||
|
|
||||||
|
sec_name = ['SG1', 'SG2']
|
||||||
|
sg1 = os_conn.nova.security_groups.create(
|
||||||
|
sec_name[0], "descr")
|
||||||
|
sg2 = os_conn.nova.security_groups.create(
|
||||||
|
sec_name[1], "descr")
|
||||||
|
|
||||||
|
rulesets = [
|
||||||
|
{
|
||||||
|
# ssh
|
||||||
|
'ip_protocol': 'tcp',
|
||||||
|
'from_port': 22,
|
||||||
|
'to_port': 22,
|
||||||
|
'cidr': '0.0.0.0/0',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
# ping
|
||||||
|
'ip_protocol': 'icmp',
|
||||||
|
'from_port': -1,
|
||||||
|
'to_port': -1,
|
||||||
|
'cidr': '0.0.0.0/0',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
tcp = os_conn.nova.security_group_rules.create(
|
||||||
|
sg1.id, **rulesets[0]
|
||||||
|
)
|
||||||
|
icmp = os_conn.nova.security_group_rules.create(
|
||||||
|
sg2.id, **rulesets[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Remove defauld security group and attach SG_1 and SG2 to VMs
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
for srv in srv_list:
|
||||||
|
srv.remove_security_group(srv.security_groups[0]['name'])
|
||||||
|
srv.add_security_group(sg1.id)
|
||||||
|
srv.add_security_group(sg2.id)
|
||||||
|
|
||||||
|
time.sleep(20) # need wait to update rules on dvs
|
||||||
|
|
||||||
|
# SSh to VMs
|
||||||
|
# Check ping between VMs
|
||||||
|
primary_controller = self.fuel_web.get_nailgun_primary_node(
|
||||||
|
self.env.d_env.nodes().slaves[0]
|
||||||
|
)
|
||||||
|
ssh_controller = self.fuel_web.get_ssh_for_node(
|
||||||
|
primary_controller.name)
|
||||||
|
|
||||||
|
openstack.check_connection_vms(os_conn=os_conn, srv_list=srv_list,
|
||||||
|
remote=ssh_controller)
|
||||||
|
|
||||||
|
# Delete all rules from SG_1 and SG_2
|
||||||
|
os_conn.nova.security_group_rules.delete(tcp.id)
|
||||||
|
os_conn.nova.security_group_rules.delete(icmp.id)
|
||||||
|
|
||||||
|
# Check ssh are not available between VMs
|
||||||
|
# and vice verse
|
||||||
|
try:
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=os_conn, srv_list=srv_list, remote=ssh_controller)
|
||||||
|
except Exception as e:
|
||||||
|
logger.info('{}'.format(e))
|
||||||
|
|
||||||
|
tcp = os_conn.nova.security_group_rules.create(
|
||||||
|
sg1.id, **rulesets[0]
|
||||||
|
)
|
||||||
|
time.sleep(20) # need wait to update rules on dvs
|
||||||
|
|
||||||
|
# Check ping are not available between VMs
|
||||||
|
srv_list = os_conn.get_servers()
|
||||||
|
openstack.check_connection_vms(os_conn=os_conn, srv_list=srv_list,
|
||||||
|
remote=ssh_controller, result_of_ping=1)
|
||||||
|
|
||||||
|
icmp = os_conn.nova.security_group_rules.create(
|
||||||
|
sg2.id, **rulesets[1]
|
||||||
|
)
|
||||||
|
time.sleep(20) # need wait to update rules on dvs
|
||||||
|
|
||||||
|
# Check ping are not available between VMs
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=os_conn, srv_list=srv_list, remote=ssh_controller)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_tenants_isolation", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_tenants_isolation(self):
|
||||||
|
"""Verify that VMs on different tenants should not communicate
|
||||||
|
between each other. Send icmp ping from VMs
|
||||||
|
of admin tenant to VMs of test_tenant and vice versa.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Create non-admin tenant.
|
||||||
|
3. Create network net01 with subnet in non-admin tenant
|
||||||
|
4. Create Router_01, set gateway and add interface
|
||||||
|
to external network.
|
||||||
|
5. Launch 2 instances in the net01(non-admin network)
|
||||||
|
in nova and vcenter az.
|
||||||
|
6. Launch 2 instances in the default internal
|
||||||
|
admin network in nova and vcenter az.
|
||||||
|
7. Verify that VMs on different tenants should not communicate
|
||||||
|
between each other via no floating ip. Send icmp ping from VM_3,
|
||||||
|
VM_4 of admin tenant to VM_3 VM_4 of test_tenant and vice versa.
|
||||||
|
|
||||||
|
Duration 30 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
# Create new network
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
admin = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
# Create non-admin tenant.
|
||||||
|
admin.create_user_and_tenant('test', 'test', 'test')
|
||||||
|
openstack.add_role_to_user(admin, 'test', 'admin', 'test')
|
||||||
|
|
||||||
|
test = os_actions.OpenStackActions(
|
||||||
|
os_ip, 'test', 'test', 'test')
|
||||||
|
|
||||||
|
# Create non default network with subnet in test tenant.
|
||||||
|
logger.info('Create network {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
test,
|
||||||
|
self.net_data[0].keys()[0], tenant_name='test'
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
test,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]],
|
||||||
|
tenant_name='test'
|
||||||
|
)
|
||||||
|
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[test.get_tenant('test').id] =\
|
||||||
|
test.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
test.get_tenant('test').id].id
|
||||||
|
|
||||||
|
# Launch 2 instances in the est tenant network net_01
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=test, vm_count=1,
|
||||||
|
nics=[{'net-id': network['id']}], security_group=security_group
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create Router_01, set gateway and add interface
|
||||||
|
# to external network.
|
||||||
|
router_1 = openstack.add_router(
|
||||||
|
test,
|
||||||
|
'router_1'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add net_1 to router_1
|
||||||
|
openstack.add_subnet_to_router(
|
||||||
|
test,
|
||||||
|
router_1['id'], subnet['id'])
|
||||||
|
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[admin.get_tenant(SERVTEST_TENANT).id] =\
|
||||||
|
admin.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
admin.get_tenant(SERVTEST_TENANT).id].id
|
||||||
|
|
||||||
|
# Launch 2 instances in the admin tenant net04
|
||||||
|
network = admin.nova.networks.find(label=self.inter_net_name)
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=admin, vm_count=1,
|
||||||
|
nics=[{'net-id': network.id}], security_group=security_group)
|
||||||
|
|
||||||
|
# Send ping from instances VM_1 and VM_2 to VM_3 and VM_4
|
||||||
|
# via no floating ip
|
||||||
|
srv_1 = admin.get_servers()
|
||||||
|
srv_2 = test.get_servers()
|
||||||
|
openstack.create_and_assign_floating_ip(os_conn=admin, srv_list=srv_1)
|
||||||
|
openstack.create_and_assign_floating_ip(
|
||||||
|
os_conn=test,
|
||||||
|
srv_list=srv_2,
|
||||||
|
ext_net=None,
|
||||||
|
tenant_id=test.get_tenant('test').id)
|
||||||
|
|
||||||
|
srv_1 = admin.get_servers()
|
||||||
|
srv_2 = test.get_servers()
|
||||||
|
|
||||||
|
ips = []
|
||||||
|
for srv in srv_2:
|
||||||
|
ip = srv.networks[srv.networks.keys()[0]][0]
|
||||||
|
ips.append(ip)
|
||||||
|
|
||||||
|
logger.info(ips)
|
||||||
|
logger.info(srv_1)
|
||||||
|
primary_controller = self.fuel_web.get_nailgun_primary_node(
|
||||||
|
self.env.d_env.nodes().slaves[0]
|
||||||
|
)
|
||||||
|
ssh_controller = self.fuel_web.get_ssh_for_node(
|
||||||
|
primary_controller.name)
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=admin, srv_list=srv_1,
|
||||||
|
result_of_ping=1,
|
||||||
|
remote=ssh_controller, destination_ip=ips
|
||||||
|
)
|
||||||
|
|
||||||
|
@test(depends_on=[dvs_vcenter_systest_setup],
|
||||||
|
groups=["dvs_vcenter_same_ip", 'dvs_vcenter_system'])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def dvs_vcenter_same_ip(self):
|
||||||
|
"""Check connectivity between VMs with same ip in different tenants.
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
1. Revert snapshot to dvs_vcenter_systest_setup.
|
||||||
|
2. Create non-admin tenant.
|
||||||
|
3. Create private network net01 with sunet in non-admin tenant.
|
||||||
|
4. Create Router_01, set gateway and add interface
|
||||||
|
to external network.
|
||||||
|
5. Create private network net01 with sunet in default admin tenant
|
||||||
|
6. Create Router_01, set gateway and add interface
|
||||||
|
to external network.
|
||||||
|
7. Launch instances VM_1 and VM_2 in the net01(non-admin tenant)
|
||||||
|
with image TestVM and flavor m1.micro in nova az.
|
||||||
|
8. Launch instances VM_3 and VM_4 in the net01(non-admin tenant)
|
||||||
|
with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
9. Launch instances VM_5 and VM_6
|
||||||
|
in the net01(default admin tenant)
|
||||||
|
with image TestVM and flavor m1.micro in nova az.
|
||||||
|
10. Launch instances VM_7 and VM_8
|
||||||
|
in the net01(default admin tenant)
|
||||||
|
with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
11. Verify that VM_1, VM_2, VM_3 and VM_4 should communicate
|
||||||
|
between each other via no floating ip.
|
||||||
|
12. Verify that VM_5, VM_6, VM_7 and VM_8 should communicate
|
||||||
|
between each other via no floating ip.
|
||||||
|
|
||||||
|
Duration 30 min
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.env.revert_snapshot("dvs_vcenter_systest_setup")
|
||||||
|
|
||||||
|
cluster_id = self.fuel_web.get_last_created_cluster()
|
||||||
|
|
||||||
|
os_ip = self.fuel_web.get_public_vip(cluster_id)
|
||||||
|
admin = os_actions.OpenStackActions(
|
||||||
|
os_ip, SERVTEST_USERNAME,
|
||||||
|
SERVTEST_PASSWORD,
|
||||||
|
SERVTEST_TENANT)
|
||||||
|
|
||||||
|
# Create non-admin tenant.
|
||||||
|
admin.create_user_and_tenant('test', 'test', 'test')
|
||||||
|
openstack.add_role_to_user(admin, 'test', 'admin', 'test')
|
||||||
|
|
||||||
|
test = os_actions.OpenStackActions(
|
||||||
|
os_ip, 'test', 'test', 'test')
|
||||||
|
|
||||||
|
# Create non default network with subnet in test tenant.
|
||||||
|
logger.info('Create network {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
test,
|
||||||
|
self.net_data[0].keys()[0], tenant_name='test'
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
test,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]],
|
||||||
|
tenant_name='test'
|
||||||
|
)
|
||||||
|
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[test.get_tenant('test').id] =\
|
||||||
|
test.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
test.get_tenant('test').id].id
|
||||||
|
|
||||||
|
# Launch instances VM_1 and VM_2 in the net01(non-admin tenant)
|
||||||
|
# with image TestVM and flavor m1.micro in nova az.
|
||||||
|
# Launch instances VM_3 and VM_4 in the net01(non-admin tenant)
|
||||||
|
# with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=test, vm_count=1,
|
||||||
|
nics=[{'net-id': network['id']}], security_group=security_group
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create Router_01, set gateway and add interface
|
||||||
|
# to external network.
|
||||||
|
router_1 = openstack.add_router(
|
||||||
|
test,
|
||||||
|
'router_1',
|
||||||
|
ext_net_name=self.ext_net_name, tenant_name='test'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add net_1 to router_1
|
||||||
|
openstack.add_subnet_to_router(
|
||||||
|
test,
|
||||||
|
router_1['id'], subnet['id'])
|
||||||
|
|
||||||
|
srv_1 = test.get_servers()
|
||||||
|
openstack.create_and_assign_floating_ip(
|
||||||
|
os_conn=test,
|
||||||
|
srv_list=srv_1,
|
||||||
|
ext_net=None,
|
||||||
|
tenant_id=test.get_tenant('test').id)
|
||||||
|
srv_1 = test.get_servers()
|
||||||
|
# create security group with rules for ssh and ping
|
||||||
|
security_group = {}
|
||||||
|
security_group[admin.get_tenant(SERVTEST_TENANT).id] =\
|
||||||
|
admin.create_sec_group_for_ssh()
|
||||||
|
security_group = security_group[
|
||||||
|
admin.get_tenant(SERVTEST_TENANT).id].id
|
||||||
|
# Create non default network with subnet in admin tenant.
|
||||||
|
logger.info('Create network {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
network = openstack.create_network(
|
||||||
|
admin,
|
||||||
|
self.net_data[0].keys()[0])
|
||||||
|
|
||||||
|
logger.info('Create subnet {}'.format(self.net_data[0].keys()[0]))
|
||||||
|
subnet = openstack.create_subnet(
|
||||||
|
admin,
|
||||||
|
network,
|
||||||
|
self.net_data[0][self.net_data[0].keys()[0]])
|
||||||
|
|
||||||
|
# Launch instances VM_5 and VM_6
|
||||||
|
# in the net01(default admin tenant)
|
||||||
|
# with image TestVM and flavor m1.micro in nova az.
|
||||||
|
# Launch instances VM_7 and VM_8
|
||||||
|
# in the net01(default admin tenant)
|
||||||
|
# with image TestVM-VMDK and flavor m1.micro in vcenter az.
|
||||||
|
openstack.create_instances(
|
||||||
|
os_conn=admin, vm_count=1,
|
||||||
|
nics=[{'net-id': network['id']}], security_group=security_group)
|
||||||
|
|
||||||
|
# Create Router_01, set gateway and add interface
|
||||||
|
# to external network.
|
||||||
|
router_1 = openstack.add_router(
|
||||||
|
admin,
|
||||||
|
'router_1')
|
||||||
|
|
||||||
|
# Add net_1 to router_1
|
||||||
|
openstack.add_subnet_to_router(
|
||||||
|
admin,
|
||||||
|
router_1['id'], subnet['id'])
|
||||||
|
|
||||||
|
# Send ping between instances
|
||||||
|
# via no floating ip
|
||||||
|
srv_2 = admin.get_servers()
|
||||||
|
openstack.create_and_assign_floating_ip(
|
||||||
|
os_conn=admin,
|
||||||
|
srv_list=srv_2)
|
||||||
|
srv_2 = admin.get_servers()
|
||||||
|
|
||||||
|
# Verify that VM_1, VM_2, VM_3 and VM_4 should communicate
|
||||||
|
# between each other via fixed ip.
|
||||||
|
primary_controller = self.fuel_web.get_nailgun_primary_node(
|
||||||
|
self.env.d_env.nodes().slaves[0]
|
||||||
|
)
|
||||||
|
ssh_controller = self.fuel_web.get_ssh_for_node(
|
||||||
|
primary_controller.name)
|
||||||
|
openstack.check_connection_vms(
|
||||||
|
os_conn=test, srv_list=srv_1, remote=ssh_controller)
|
||||||
|
|
||||||
|
# Verify that VM_5, VM_6, VM_7 and VM_8 should communicate
|
||||||
|
# between each other via fixed ip.
|
||||||
|
openstack.check_connection_vms(os_conn=admin, srv_list=srv_2,
|
||||||
|
remote=ssh_controller)
|
Loading…
Reference in New Issue
Block a user