Merge "vCenter tests with OpenStack actions for cinder and nova"

This commit is contained in:
Jenkins 2016-05-12 09:56:07 +00:00 committed by Gerrit Code Review
commit cec46a07ad
5 changed files with 651 additions and 6 deletions

View File

@ -64,13 +64,31 @@ class OpenStackActions(common.Common):
if servers:
return servers
def get_server_by_name(self, name):
servers = self.get_servers()
for srv in servers:
if srv.name == name:
return srv
logger.warning("Instance with name {} was not found".format(name))
return None
def get_flavor_by_name(self, name):
flavor_list = self.nova.flavors.list()
for flavor in flavor_list:
if flavor.name == name:
return flavor
logger.warning("Flavor with name {} was not found".format(name))
return None
def create_server(
self,
name=None,
security_groups=None,
flavor_id=None,
net_id=None,
timeout=100
timeout=100,
image=None,
**kwargs
):
""" Creates simple server, like in OSTF.
@ -79,6 +97,7 @@ class OpenStackActions(common.Common):
:param flavor_id: micro_flavor if None
:param net_id: network id, could be omitted.
:param timeout: int=100
:param image: TestVM if None.
:return: Server, in started state
"""
def find_micro_flavor():
@ -92,15 +111,18 @@ class OpenStackActions(common.Common):
security_groups = [self.create_sec_group_for_ssh()]
if not flavor_id:
flavor_id = find_micro_flavor().id
if image is None:
image = self._get_cirros_image().id
nics = [{'net-id': net_id}] if net_id else None
srv = self.nova.servers.create(
name=name,
image=self._get_cirros_image().id,
image=image,
flavor=flavor_id,
security_groups=[sec_group.name for sec_group in security_groups],
nics=nics)
nics=nics,
**kwargs)
try:
helpers.wait(
@ -281,8 +303,9 @@ class OpenStackActions(common.Common):
server = self.get_instance_detail(server.id)
return server
def create_volume(self, size=1, image_id=None):
volume = self.cinder.volumes.create(size=size, imageRef=image_id)
def create_volume(self, size=1, image_id=None, **kwargs):
volume = self.cinder.volumes.create(size=size, imageRef=image_id,
**kwargs)
helpers.wait(
lambda: self.cinder.volumes.get(volume.id).status == "available",
timeout=100)
@ -312,6 +335,10 @@ class OpenStackActions(common.Common):
self.cinder.volumes.extend(volume, newsize)
return self.cinder.volumes.get(volume.id)
def get_volume_status(self, volume):
vol = self.cinder.volumes.get(volume.id)
return vol._info['status']
def get_hosts_for_migr(self, srv_host_name):
# Determine which host is available for live migration
return [
@ -452,6 +479,9 @@ class OpenStackActions(common.Common):
def get_image_list(self):
return self.glance.images.list()
def update_image(self, image, **kwargs):
self.glance.images.update(image, **kwargs)
def get_image(self, image_name):
image_list = self.get_image_list()
for img in image_list:
@ -462,9 +492,45 @@ class OpenStackActions(common.Common):
def get_image_data(self, image_name):
return self.glance.images.data(image_name)
def get_security_group_list(self):
return self.nova.security_groups.list()
def get_security_group(self, sg_name):
sg_list = self.get_security_group_list()
for sg in sg_list:
if sg.name == sg_name:
return sg
return None
def get_nova_service_list(self):
return self.nova.services.list()
def get_nova_service_status(self, service):
services = self.get_nova_service_list()
for s in services:
if s.host == service.host and s.binary == service.binary:
return s.status
def enable_nova_service(self, service, timeout=30):
self.nova.services.enable(service.host, service.binary)
helpers.wait(
lambda: self.get_nova_service_status(service) == "enabled",
timeout=timeout,
timeout_msg="Service {0} on {1} does not reach enabled "
"state, current state "
"is {2}".format(service.binary, service.host,
service.status))
def disable_nova_service(self, service, timeout=30):
self.nova.services.disable(service.host, service.binary)
helpers.wait(
lambda: self.get_nova_service_status(service) == "disabled",
timeout=timeout,
timeout_msg="Service {0} on {1} does not reach disabled "
"state, current state "
"is {2}".format(service.binary, service.host,
service.status))
def delete_nova_service(self, service_id):
return self.nova.services.delete(service_id)

View File

@ -350,7 +350,10 @@ VCENTER_USERNAME = os.environ.get('VCENTER_USERNAME')
VCENTER_PASSWORD = os.environ.get('VCENTER_PASSWORD')
VCENTER_DATACENTER = os.environ.get('VC_DATACENTER')
VCENTER_DATASTORE = os.environ.get('VC_DATASTORE')
VMWARE_IMG_URL = os.environ.get('VMWARE_IMG_URL')
VMWARE_IMG_NAME = os.environ.get('VMWARE_IMG_NAME')
VMWARE_IMG_LOGIN = os.environ.get('VMWARE_IMG_LOGIN')
VMWARE_IMG_PASSWORD = os.environ.get('VMWARE_IMG_PASSWORD')
# Services tests
SERVTEST_LOCAL_PATH = os.environ.get('SERVTEST_LOCAL_PATH', '/tmp')

View File

@ -12,8 +12,10 @@
# License for the specific language governing permissions and limitations
# under the License.
from time import sleep
from random import randrange
from devops.helpers import helpers
from proboscis import SkipTest
from proboscis.asserts import assert_equal
from proboscis.asserts import assert_not_equal
@ -34,6 +36,14 @@ class VMwareActions(object):
"""VMware vCenter/DVS related actions"""
plugin_version = None
vcenter_az = 'vcenter'
cinder_az = 'vcenter-cinder'
vmware_image = 'TestVM-VMDK'
net_name = 'admin_internal_net'
sg_name = 'default'
image_name = None
image_url = None
image_creds = None
@deferred_decorator([make_snapshot_if_step_fail])
@action
@ -255,6 +265,268 @@ class VMwareActions(object):
self.fuel_web.deploy_cluster_wait(self.cluster_id,
check_services=False)
@action
def create_and_attach_empty_volume(self):
"""Create and attach to instance empty volume"""
mount_point = '/dev/sdb'
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
vol = os_conn.create_volume(availability_zone=self.cinder_az)
image = os_conn.get_image(self.vmware_image)
net = os_conn.get_network(self.net_name)
sg = os_conn.get_security_group(self.sg_name)
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
security_groups=[sg],
net_id=net['id'])
floating_ip = os_conn.assign_floating_ip(vm)
helpers.wait(lambda: helpers.tcp_ping(floating_ip.ip, 22), timeout=180,
timeout_msg="Node {ip} is not accessible by SSH.".format(
ip=floating_ip.ip))
logger.info("Attaching volume via cli")
ctrl_nodes = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
self.cluster_id, ["controller"])
cmd = '. openrc; nova volume-attach {srv_id} {volume_id} {mount}' \
''.format(srv_id=vm.id, volume_id=vol.id, mount=mount_point)
logger.debug('CMD: {}'.format(cmd))
SSHManager().execute_on_remote(ctrl_nodes[0]['ip'], cmd)
helpers.wait(
lambda: os_conn.get_volume_status(vol) == "in-use",
timeout=30, timeout_msg="Volume doesn't reach 'in-use' state")
vm.reboot()
sleep(10)
helpers.wait(lambda: helpers.tcp_ping(floating_ip.ip, 22), timeout=180,
timeout_msg="Node {ip} is not accessible by SSH.".format(
ip=floating_ip.ip))
controller = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
self.cluster_id, ["controller"])[0]
with self.fuel_web.get_ssh_for_nailgun_node(controller) as remote:
cmd = 'sudo /sbin/fdisk -l | grep {}'.format(mount_point)
res = os_conn.execute_through_host(remote, floating_ip.ip, cmd)
logger.debug('OUTPUT: {}'.format(res))
assert_equal(res['exit_code'], 0, "Attached volume is not found")
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
os_conn.delete_volume(vol)
@action
def create_bootable_volume_and_run_instance(self):
"""Create bootable volume and launch instance from it"""
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
image = os_conn.get_image(self.vmware_image)
vol = os_conn.create_volume(image_id=image.id,
availability_zone=self.cinder_az)
block_device_mapping = {'vda': vol.id}
net = os_conn.get_network(self.net_name)
vm = os_conn.create_server(availability_zone=self.vcenter_az,
image=False,
net_id=net['id'],
block_device_mapping=block_device_mapping)
floating_ip = os_conn.assign_floating_ip(vm)
helpers.wait(lambda: helpers.tcp_ping(floating_ip.ip, 22), timeout=180,
timeout_msg="Node {ip} is not accessible by SSH.".format(
ip=floating_ip.ip))
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
os_conn.delete_volume_and_wait(vol)
@action
def check_vmware_service_actions(self):
"""Disable vmware host (cluster) and check instance creation
on enabled cluster"""
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
services = os_conn.get_nova_service_list()
vmware_services = []
for service in services:
if service.binary == 'nova-compute' and \
service.zone == self.vcenter_az:
vmware_services.append(service)
os_conn.disable_nova_service(service)
image = os_conn.get_image(self.vmware_image)
sg = os_conn.get_security_group(self.sg_name)
net = os_conn.get_network(self.net_name)
for service in vmware_services:
logger.info("Check {}".format(service.host))
os_conn.enable_nova_service(service)
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'], security_groups=[sg])
vm_host = getattr(vm, 'OS-EXT-SRV-ATTR:host')
assert_true(service.host == vm_host, 'Instance was launched on a'
' disabled vmware cluster')
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
os_conn.disable_nova_service(service)
@action
def upload_image(self):
"""Upload vmdk image"""
controller = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
self.cluster_id, ["controller"])[0]
cmd_add_img = 'glance image-create --name {0!r} --disk-format vmdk ' \
'--container-format bare --file {1!r} ' \
'--property hypervisor_type=vmware ' \
'--property vmware_adaptertype=lsiLogic ' \
'--property vmware_disktype=sparse' \
''.format(self.image_name, self.image_name)
cmd = '. openrc; test -f {0} || (wget -q {1} && {2})'.format(
self.image_name, self.image_url, cmd_add_img)
SSHManager().execute_on_remote(controller['ip'], cmd)
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
image = os_conn.get_image(self.image_name)
helpers.wait(lambda: os_conn.get_image(image.name).status == 'active',
timeout=60 * 2, timeout_msg='Image is not active')
@action
def check_instance_creation(self):
"""Create instance and check connection"""
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
flavor = os_conn.get_flavor_by_name('m1.small')
if self.image_name:
image = os_conn.get_image(self.image_name)
else:
image = os_conn.get_image(self.vmware_image)
sg = os_conn.get_security_group(self.sg_name)
net = os_conn.get_network(self.net_name)
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'], security_groups=[sg],
flavor_id=flavor.id, timeout=666)
floating_ip = os_conn.assign_floating_ip(vm)
helpers.wait(lambda: helpers.tcp_ping(floating_ip.ip, 22), timeout=180,
timeout_msg="Node {ip} is not accessible by SSH.".format(
ip=floating_ip.ip))
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
@action
def create_instance_with_vmxnet3_adapter(self):
"""Create instance with vmxnet3 adapter"""
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
image = os_conn.get_image(self.image_name)
os_conn.update_image(image,
properties={"hw_vif_model": "VirtualVmxnet3"})
flavor = os_conn.get_flavor_by_name('m1.small')
sg = os_conn.get_security_group(self.sg_name)
net = os_conn.get_network(self.net_name)
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'], security_groups=[sg],
flavor_id=flavor.id, timeout=666)
floating_ip = os_conn.assign_floating_ip(vm)
helpers.wait(lambda: helpers.tcp_ping(floating_ip.ip, 22), timeout=180,
timeout_msg="Node {ip} is not accessible by SSH.".format(
ip=floating_ip.ip))
controller = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
self.cluster_id, ["controller"])[0]
with self.fuel_web.get_ssh_for_nailgun_node(controller) as remote:
cmd = '/usr/bin/lshw -class network | grep vmxnet3'
res = os_conn.execute_through_host(remote, floating_ip.ip, cmd,
creds=self.image_creds)
logger.debug('OUTPUT: {}'.format(res))
assert_equal(res['exit_code'], 0, "VMxnet3 driver is not found")
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
@action
def check_batch_instance_creation(self):
"""Create several instance simultaneously"""
count = 10
vm_name = 'vcenter_vm'
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
image = os_conn.get_image(self.vmware_image)
net = os_conn.get_network(self.net_name)
sg = os_conn.get_security_group(self.sg_name)
os_conn.create_server(name=vm_name, image=image,
availability_zone=self.vcenter_az,
net_id=net['id'], security_groups=[sg],
min_count=count)
for i in range(1, count + 1):
vm = os_conn.get_server_by_name('{name}-{index}'.format(
name=vm_name, index=i))
logger.info("Check state for {} instance".format(vm.name))
helpers.wait(
lambda: os_conn.get_instance_detail(vm).status == "ACTIVE",
timeout=180, timeout_msg="Instance state is not active"
)
for i in range(1, count + 1):
vm = os_conn.get_server_by_name('{name}-{index}'.format(
name=vm_name, index=i))
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
@action
def create_instance_with_different_disktype(self):
"""Create instances with different disk type"""
public_ip = self.fuel_web.get_public_vip(self.cluster_id)
os_conn = OpenStackActions(public_ip)
image = os_conn.get_image(self.vmware_image)
net = os_conn.get_network(self.net_name)
os_conn.update_image(image,
properties={"vmware_disktype": "sparse"})
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'])
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
os_conn.update_image(image,
properties={"vmware_disktype": "preallocated "})
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'])
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
os_conn.update_image(image,
properties={"vmware_disktype": "thin "})
vm = os_conn.create_server(image=image,
availability_zone=self.vcenter_az,
net_id=net['id'])
os_conn.delete_instance(vm)
os_conn.verify_srv_deleted(vm)
@deferred_decorator([make_snapshot_if_step_fail])
@action
def check_neutron_public(self):

View File

@ -14,6 +14,10 @@
from fuelweb_test.settings import DVS_PLUGIN_PATH
from fuelweb_test.settings import DVS_PLUGIN_VERSION
from fuelweb_test.settings import VMWARE_IMG_NAME
from fuelweb_test.settings import VMWARE_IMG_URL
from fuelweb_test.settings import VMWARE_IMG_LOGIN
from fuelweb_test.settings import VMWARE_IMG_PASSWORD
from system_test import testcase
from system_test.tests import ActionTest
@ -288,6 +292,261 @@ class CheckCinderVmwareSrv(ActionTest, BaseActions, VMwareActions):
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.attach_empty_volume'])
class AttachEmptyVol(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Create and attach to instance empty volume
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'create_and_attach_empty_volume'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.bootable_vol'])
class BootableVol(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Create bootable volume and launch instance from it
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'create_bootable_volume_and_run_instance'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.disable_enable_compute_service'])
class DisableEnableVMwareServices(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Disable/enable vmware compute hosts and run instance
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'check_vmware_service_actions'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.upload_image'])
class UploadImage(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Upload ubuntu cloud image
9. Launch instance
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
image_name = VMWARE_IMG_NAME
image_url = VMWARE_IMG_URL
image_creds = (VMWARE_IMG_LOGIN, VMWARE_IMG_PASSWORD)
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'upload_image',
'check_instance_creation'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.vmxnet3'])
class Vmxnet3(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Upload ubuntu cloud image
9. Launch instance with vmware vmxnet3 adapter
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
image_name = VMWARE_IMG_NAME
image_url = VMWARE_IMG_URL
image_creds = (VMWARE_IMG_LOGIN, VMWARE_IMG_PASSWORD)
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'upload_image',
'create_instance_with_vmxnet3_adapter'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.create_batch_of_instances'])
class CreateBatchInstances(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Create several instances simultaneously
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'check_batch_instance_creation'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.diff_disk_types'])
class DiffDiskTypes(ActionTest, BaseActions, VMwareActions):
"""Deploy cluster with vCenter and dvs plugin
Scenario:
1. Upload plugin to the master node
2. Install plugin
3. Create cluster
4. Configure dvs settings (depends on yaml config)
5. Add nodes (depends on yaml config)
6. Configure vmware settings (depends on yaml config)
7. Deploy the cluster
8. Create instances with different disk type
Duration 2h 00min
Snapshot deploy_vcenter_dvs
"""
plugin_name = "fuel-plugin-vmware-dvs"
plugin_path = DVS_PLUGIN_PATH
plugin_version = DVS_PLUGIN_VERSION
actions_order = [
'prepare_env_with_plugin',
'create_env',
'configure_dvs_plugin',
'add_nodes',
'configure_vcenter',
'deploy_cluster',
'create_instance_with_different_disktype'
]
@testcase(groups=['system_test',
'system_test.vcenter',
'system_test.vcenter.neutron_public_net'])

View File

@ -0,0 +1,45 @@
---
template:
name: 1 controller, 1 cinder-vmware, 1 compute-vmware on Neutron/VLAN with DVS plugin
slaves: 3
cluster_template:
name: vcenter_roles_local_ds
release: ubuntu
network:
!include cluster_configs/networks/neutron_vlan.yaml
settings:
components:
!include cluster_configs/settings/components/wo_components.yaml
storages:
!include cluster_configs/settings/storages/cinder_only.yaml
vmware_vcenter:
settings:
!include cluster_configs/settings/vmware/vcenter_main.yaml
nova-compute:
- cluster: Cluster1
srv_name: srv_cluster1
datastore: datastore1
target_node: controllers
- cluster: Cluster2
srv_name: srv_cluster2
datastore: datastore1
target_node: compute-vmware
glance:
enable: false
vmware_dvs:
!include cluster_configs/settings/vmware/dvs/dvs_main.yaml
nodes:
- roles:
- controller
iface: !include cluster_configs/settings/vmware/vcenter_ifaces.yaml
count: 1
- roles:
- cinder-vmware
iface: !include cluster_configs/settings/vmware/vcenter_ifaces.yaml
count: 1
- roles:
- compute-vmware
iface: !include cluster_configs/settings/vmware/vcenter_ifaces.yaml
count: 1