mirror of https://github.com/ansible/ansible.git
VMware: new module vmware_dvswitch_uplink_pg (#48846)
parent
92ef500185
commit
f431e5b0e2
@ -0,0 +1,478 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright: (c) 2018, Christian Kotte <christian.kotte@gmx.de>
|
||||
#
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
from __future__ import absolute_import, division, print_function
|
||||
__metaclass__ = type
|
||||
|
||||
ANSIBLE_METADATA = {
|
||||
'metadata_version': '1.1',
|
||||
'status': ['preview'],
|
||||
'supported_by': 'community'
|
||||
}
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
module: vmware_dvswitch_uplink_pg
|
||||
short_description: Manage uplink portproup configuration of a Distributed Switch
|
||||
description:
|
||||
- This module can be used to configure the uplink portgroup of a Distributed Switch.
|
||||
version_added: 2.8
|
||||
author:
|
||||
- Christian Kotte (@ckotte)
|
||||
notes:
|
||||
- Tested on vSphere 6.5 and 6.7
|
||||
requirements:
|
||||
- "python >= 2.6"
|
||||
- PyVmomi
|
||||
options:
|
||||
switch:
|
||||
description:
|
||||
- The name of the Distributed Switch.
|
||||
type: str
|
||||
required: True
|
||||
aliases: ['dvswitch']
|
||||
name:
|
||||
description:
|
||||
- The name of the uplink portgroup.
|
||||
- The current name will be used if not specified.
|
||||
type: str
|
||||
description:
|
||||
description:
|
||||
- The description of the uplink portgroup.
|
||||
type: str
|
||||
advanced:
|
||||
description:
|
||||
- Dictionary which configures the advanced policy settings for the uplink portgroup.
|
||||
- 'Valid attributes are:'
|
||||
- '- C(port_config_reset_at_disconnect) (bool): indicates if the configuration of a port is reset automatically after disconnect. (default: true)'
|
||||
- '- C(block_override) (bool): indicates if the block policy can be changed per port. (default: true)'
|
||||
- '- C(netflow_override) (bool): indicates if the NetFlow policy can be changed per port. (default: false)'
|
||||
- '- C(traffic_filter_override) (bool): indicates if the traffic filter can be changed per port. (default: false)'
|
||||
- '- C(vendor_config_override) (bool): indicates if the vendor config can be changed per port. (default: false)'
|
||||
- '- C(vlan_override) (bool): indicates if the vlan can be changed per port. (default: false)'
|
||||
required: False
|
||||
default: {
|
||||
port_config_reset_at_disconnect: True,
|
||||
block_override: True,
|
||||
vendor_config_override: False,
|
||||
vlan_override: False,
|
||||
netflow_override: False,
|
||||
traffic_filter_override: False,
|
||||
}
|
||||
aliases: ['port_policy']
|
||||
vlan_trunk_range:
|
||||
description:
|
||||
- The VLAN trunk range that should be configured with the uplink portgroup.
|
||||
- 'This can be a combination of multiple ranges and numbers, example: [ 2-3967, 4049-4092 ].'
|
||||
type: list
|
||||
default: [ '0-4094' ]
|
||||
lacp:
|
||||
description:
|
||||
- Dictionary which configures the LACP settings for the uplink portgroup.
|
||||
- The options are only used if the LACP support mode is set to 'basic'.
|
||||
- 'The following parameters are required:'
|
||||
- '- C(status) (str): Indicates if LACP is enabled. (default: disabled)'
|
||||
- '- C(mode) (str): The negotiating state of the uplinks/ports. (default: passive)'
|
||||
required: False
|
||||
default: {
|
||||
status: 'disabled',
|
||||
mode: 'passive',
|
||||
}
|
||||
netflow_enabled:
|
||||
description:
|
||||
- Indicates if NetFlow is enabled on the uplink portgroup.
|
||||
type: bool
|
||||
default: False
|
||||
block_all_ports:
|
||||
description:
|
||||
- Indicates if all ports are blocked on the uplink portgroup.
|
||||
type: bool
|
||||
default: False
|
||||
extends_documentation_fragment: vmware.documentation
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
- name: Configure Uplink portgroup
|
||||
vmware_dvswitch_uplink_pg:
|
||||
hostname: '{{ inventory_hostname }}'
|
||||
username: '{{ vcsa_username }}'
|
||||
password: '{{ vcsa_password }}'
|
||||
switch: dvSwitch
|
||||
name: dvSwitch-DVUplinks
|
||||
advanced:
|
||||
port_config_reset_at_disconnect: True
|
||||
block_override: True
|
||||
vendor_config_override: False
|
||||
vlan_override: False
|
||||
netflow_override: False
|
||||
traffic_filter_override: False
|
||||
vlan_trunk_range:
|
||||
- '0-4094'
|
||||
netflow_enabled: False
|
||||
block_all_ports: False
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Enabled LACP on Uplink portgroup
|
||||
vmware_dvswitch_uplink_pg:
|
||||
hostname: '{{ inventory_hostname }}'
|
||||
username: '{{ vcsa_username }}'
|
||||
password: '{{ vcsa_password }}'
|
||||
switch: dvSwitch
|
||||
lacp:
|
||||
status: enabled
|
||||
mode: active
|
||||
delegate_to: localhost
|
||||
'''
|
||||
|
||||
RETURN = """
|
||||
result:
|
||||
description: information about performed operation
|
||||
returned: always
|
||||
type: string
|
||||
sample: {
|
||||
"adv_block_ports": true,
|
||||
"adv_netflow": false,
|
||||
"adv_reset_at_disconnect": true,
|
||||
"adv_traffic_filtering": false,
|
||||
"adv_vendor_conf": false,
|
||||
"adv_vlan": false,
|
||||
"block_all_ports": false,
|
||||
"changed": false,
|
||||
"description": null,
|
||||
"dvswitch": "dvSwitch",
|
||||
"lacp_status": "disabled",
|
||||
"lacp_status_previous": "enabled",
|
||||
"name": "dvSwitch-DVUplinks",
|
||||
"netflow_enabled": false,
|
||||
"result": "Uplink portgroup already configured properly",
|
||||
"vlan_trunk_range": [
|
||||
"2-3967",
|
||||
"4049-4092"
|
||||
]
|
||||
}
|
||||
"""
|
||||
|
||||
try:
|
||||
from pyVmomi import vim
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.module_utils.vmware import (
|
||||
PyVmomi, TaskError, find_dvs_by_name, vmware_argument_spec, wait_for_task
|
||||
)
|
||||
|
||||
|
||||
class VMwareDvSwitchUplinkPortgroup(PyVmomi):
|
||||
"""Class to manage a uplink portgroup on a Distributed Virtual Switch"""
|
||||
|
||||
def __init__(self, module):
|
||||
super(VMwareDvSwitchUplinkPortgroup, self).__init__(module)
|
||||
self.switch_name = self.module.params['switch']
|
||||
self.uplink_pg_name = self.params['name']
|
||||
self.uplink_pg_description = self.params['description']
|
||||
self.uplink_pg_reset = self.params['advanced'].get('port_config_reset_at_disconnect')
|
||||
self.uplink_pg_block_ports = self.params['advanced'].get('block_override')
|
||||
self.uplink_pg_vendor_conf = self.params['advanced'].get('vendor_config_override')
|
||||
self.uplink_pg_vlan = self.params['advanced'].get('vlan_override')
|
||||
self.uplink_pg_netflow = self.params['advanced'].get('netflow_override')
|
||||
self.uplink_pg_tf = self.params['advanced'].get('traffic_filter_override')
|
||||
self.uplink_pg_vlan_trunk_range = self.params['vlan_trunk_range']
|
||||
self.uplink_pg_netflow_enabled = self.params['netflow_enabled']
|
||||
self.uplink_pg_block_all_ports = self.params['block_all_ports']
|
||||
self.lacp_status = self.params['lacp'].get('status')
|
||||
self.lacp_mode = self.params['lacp'].get('mode')
|
||||
self.dvs = find_dvs_by_name(self.content, self.switch_name)
|
||||
if self.dvs is None:
|
||||
self.module.fail_json(msg="Failed to find DVS %s" % self.switch_name)
|
||||
self.support_mode = self.dvs.config.lacpApiVersion
|
||||
|
||||
def ensure(self):
|
||||
"""Manage uplink portgroup"""
|
||||
changed = changed_uplink_pg_policy = changed_vlan_trunk_range = changed_lacp = False
|
||||
results = dict(changed=changed)
|
||||
results['dvswitch'] = self.switch_name
|
||||
changed_list = []
|
||||
|
||||
uplink_pg_spec = vim.dvs.DistributedVirtualPortgroup.ConfigSpec()
|
||||
# Use the same version in the new spec; The version will be increased by one by the API automatically
|
||||
uplink_pg_spec.configVersion = self.dvs.config.uplinkPortgroup[0].config.configVersion
|
||||
uplink_pg_config = self.dvs.config.uplinkPortgroup[0].config
|
||||
|
||||
# Check name
|
||||
if self.uplink_pg_name:
|
||||
results['name'] = self.uplink_pg_name
|
||||
if uplink_pg_config.name != self.uplink_pg_name:
|
||||
changed = True
|
||||
changed_list.append("name")
|
||||
results['name_previous'] = uplink_pg_config.name
|
||||
uplink_pg_spec.name = self.uplink_pg_name
|
||||
else:
|
||||
results['name'] = uplink_pg_config.name
|
||||
|
||||
# Check description
|
||||
results['description'] = self.uplink_pg_description
|
||||
if uplink_pg_config.description != self.uplink_pg_description:
|
||||
changed = True
|
||||
changed_list.append("description")
|
||||
results['description_previous'] = uplink_pg_config.description
|
||||
uplink_pg_spec.description = self.uplink_pg_description
|
||||
|
||||
# Check port policies
|
||||
results['adv_reset_at_disconnect'] = self.uplink_pg_reset
|
||||
results['adv_block_ports'] = self.uplink_pg_block_ports
|
||||
results['adv_vendor_conf'] = self.uplink_pg_vendor_conf
|
||||
results['adv_vlan'] = self.uplink_pg_vlan
|
||||
results['adv_netflow'] = self.uplink_pg_netflow
|
||||
results['adv_traffic_filtering'] = self.uplink_pg_tf
|
||||
uplink_pg_policy_spec = vim.dvs.VmwareDistributedVirtualSwitch.VMwarePortgroupPolicy()
|
||||
uplink_pg_policy_spec.portConfigResetAtDisconnect = self.uplink_pg_reset
|
||||
uplink_pg_policy_spec.blockOverrideAllowed = self.uplink_pg_block_ports
|
||||
uplink_pg_policy_spec.vendorConfigOverrideAllowed = self.uplink_pg_vendor_conf
|
||||
uplink_pg_policy_spec.vlanOverrideAllowed = self.uplink_pg_vlan
|
||||
uplink_pg_policy_spec.ipfixOverrideAllowed = self.uplink_pg_netflow
|
||||
uplink_pg_policy_spec.trafficFilterOverrideAllowed = self.uplink_pg_tf
|
||||
# There's no information available if the following option are deprecated, but
|
||||
# they aren't visible in the vSphere Client
|
||||
uplink_pg_policy_spec.shapingOverrideAllowed = False
|
||||
uplink_pg_policy_spec.livePortMovingAllowed = False
|
||||
uplink_pg_policy_spec.uplinkTeamingOverrideAllowed = False
|
||||
uplink_pg_policy_spec.securityPolicyOverrideAllowed = False
|
||||
uplink_pg_policy_spec.networkResourcePoolOverrideAllowed = False
|
||||
# Check policies
|
||||
if uplink_pg_config.policy.portConfigResetAtDisconnect != self.uplink_pg_reset:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_reset_at_disconnect_previous'] = uplink_pg_config.policy.portConfigResetAtDisconnect
|
||||
if uplink_pg_config.policy.blockOverrideAllowed != self.uplink_pg_block_ports:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_block_ports_previous'] = uplink_pg_config.policy.blockOverrideAllowed
|
||||
if uplink_pg_config.policy.vendorConfigOverrideAllowed != self.uplink_pg_vendor_conf:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_vendor_conf_previous'] = uplink_pg_config.policy.vendorConfigOverrideAllowed
|
||||
if uplink_pg_config.policy.vlanOverrideAllowed != self.uplink_pg_vlan:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_vlan_previous'] = uplink_pg_config.policy.vlanOverrideAllowed
|
||||
if uplink_pg_config.policy.ipfixOverrideAllowed != self.uplink_pg_netflow:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_netflow_previous'] = uplink_pg_config.policy.ipfixOverrideAllowed
|
||||
if uplink_pg_config.policy.trafficFilterOverrideAllowed != self.uplink_pg_tf:
|
||||
changed_uplink_pg_policy = True
|
||||
results['adv_traffic_filtering_previous'] = uplink_pg_config.policy.trafficFilterOverrideAllowed
|
||||
if changed_uplink_pg_policy:
|
||||
changed = True
|
||||
changed_list.append("advanced")
|
||||
uplink_pg_spec.policy = uplink_pg_policy_spec
|
||||
|
||||
uplink_pg_spec.defaultPortConfig = vim.dvs.VmwareDistributedVirtualSwitch.VmwarePortConfigPolicy()
|
||||
|
||||
# Check VLAN trunk
|
||||
results['vlan_trunk_range'] = self.uplink_pg_vlan_trunk_range
|
||||
vlan_id_ranges = self.uplink_pg_vlan_trunk_range
|
||||
trunk_vlan_spec = vim.dvs.VmwareDistributedVirtualSwitch.TrunkVlanSpec()
|
||||
vlan_id_list = []
|
||||
for vlan_id_range in vlan_id_ranges:
|
||||
vlan_id_range_found = False
|
||||
vlan_id_start, vlan_id_end = self.get_vlan_ids_from_range(vlan_id_range)
|
||||
# Check if range is already configured
|
||||
for current_vlan_id_range in uplink_pg_config.defaultPortConfig.vlan.vlanId:
|
||||
if current_vlan_id_range.start == int(vlan_id_start) and current_vlan_id_range.end == int(vlan_id_end):
|
||||
vlan_id_range_found = True
|
||||
break
|
||||
if vlan_id_range_found is False:
|
||||
changed_vlan_trunk_range = True
|
||||
vlan_id_list.append(
|
||||
vim.NumericRange(start=int(vlan_id_start), end=int(vlan_id_end))
|
||||
)
|
||||
# Check if range needs to be removed
|
||||
for current_vlan_id_range in uplink_pg_config.defaultPortConfig.vlan.vlanId:
|
||||
vlan_id_range_found = False
|
||||
for vlan_id_range in vlan_id_ranges:
|
||||
vlan_id_start, vlan_id_end = self.get_vlan_ids_from_range(vlan_id_range)
|
||||
if (current_vlan_id_range.start == int(vlan_id_start)
|
||||
and current_vlan_id_range.end == int(vlan_id_end)):
|
||||
vlan_id_range_found = True
|
||||
break
|
||||
if vlan_id_range_found is False:
|
||||
changed_vlan_trunk_range = True
|
||||
trunk_vlan_spec.vlanId = vlan_id_list
|
||||
if changed_vlan_trunk_range:
|
||||
changed = True
|
||||
changed_list.append("vlan trunk range")
|
||||
current_vlan_id_list = []
|
||||
for current_vlan_id_range in uplink_pg_config.defaultPortConfig.vlan.vlanId:
|
||||
if current_vlan_id_range.start == current_vlan_id_range.end:
|
||||
current_vlan_id_range_string = current_vlan_id_range.start
|
||||
else:
|
||||
current_vlan_id_range_string = '-'.join(
|
||||
[str(current_vlan_id_range.start), str(current_vlan_id_range.end)]
|
||||
)
|
||||
current_vlan_id_list.append(current_vlan_id_range_string)
|
||||
results['vlan_trunk_range_previous'] = current_vlan_id_list
|
||||
uplink_pg_spec.defaultPortConfig.vlan = trunk_vlan_spec
|
||||
|
||||
# Check LACP
|
||||
lacp_support_mode = self.get_lacp_support_mode(self.support_mode)
|
||||
if lacp_support_mode == 'basic':
|
||||
results['lacp_status'] = self.lacp_status
|
||||
lacp_spec = vim.dvs.VmwareDistributedVirtualSwitch.UplinkLacpPolicy()
|
||||
lacp_enabled = False
|
||||
if self.lacp_status == 'enabled':
|
||||
lacp_enabled = True
|
||||
if uplink_pg_config.defaultPortConfig.lacpPolicy.enable.value != lacp_enabled:
|
||||
changed_lacp = True
|
||||
changed_list.append("lacp status")
|
||||
if uplink_pg_config.defaultPortConfig.lacpPolicy.enable.value:
|
||||
results['lacp_status_previous'] = 'enabled'
|
||||
else:
|
||||
results['lacp_status_previous'] = 'disabled'
|
||||
lacp_spec.enable = vim.BoolPolicy()
|
||||
lacp_spec.enable.inherited = False
|
||||
lacp_spec.enable.value = lacp_enabled
|
||||
if lacp_enabled and uplink_pg_config.defaultPortConfig.lacpPolicy.mode.value != self.lacp_mode:
|
||||
results['lacp_mode'] = self.lacp_mode
|
||||
changed_lacp = True
|
||||
changed_list.append("lacp mode")
|
||||
results['lacp_mode_previous'] = uplink_pg_config.defaultPortConfig.lacpPolicy.mode.value
|
||||
lacp_spec.mode = vim.StringPolicy()
|
||||
lacp_spec.mode.inherited = False
|
||||
lacp_spec.mode.value = self.lacp_mode
|
||||
if changed_lacp:
|
||||
changed = True
|
||||
uplink_pg_spec.defaultPortConfig.lacpPolicy = lacp_spec
|
||||
|
||||
# Check NetFlow
|
||||
results['netflow_enabled'] = self.uplink_pg_netflow_enabled
|
||||
netflow_enabled_spec = vim.BoolPolicy()
|
||||
netflow_enabled_spec.inherited = False
|
||||
netflow_enabled_spec.value = self.uplink_pg_netflow_enabled
|
||||
if uplink_pg_config.defaultPortConfig.ipfixEnabled.value != self.uplink_pg_netflow_enabled:
|
||||
changed = True
|
||||
results['netflow_enabled_previous'] = uplink_pg_config.defaultPortConfig.ipfixEnabled.value
|
||||
changed_list.append("netflow")
|
||||
uplink_pg_spec.defaultPortConfig.ipfixEnabled = netflow_enabled_spec
|
||||
|
||||
# TODO: Check Traffic filtering and marking
|
||||
|
||||
# Check Block all ports
|
||||
results['block_all_ports'] = self.uplink_pg_block_all_ports
|
||||
block_all_ports_spec = vim.BoolPolicy()
|
||||
block_all_ports_spec.inherited = False
|
||||
block_all_ports_spec.value = self.uplink_pg_block_all_ports
|
||||
if uplink_pg_config.defaultPortConfig.blocked.value != self.uplink_pg_block_all_ports:
|
||||
changed = True
|
||||
changed_list.append("block all ports")
|
||||
results['block_all_ports_previous'] = uplink_pg_config.defaultPortConfig.blocked.value
|
||||
uplink_pg_spec.defaultPortConfig.blocked = block_all_ports_spec
|
||||
|
||||
if changed:
|
||||
if self.module.check_mode:
|
||||
changed_suffix = ' would be changed'
|
||||
else:
|
||||
changed_suffix = ' changed'
|
||||
if len(changed_list) > 2:
|
||||
message = ', '.join(changed_list[:-1]) + ', and ' + str(changed_list[-1])
|
||||
elif len(changed_list) == 2:
|
||||
message = ' and '.join(changed_list)
|
||||
elif len(changed_list) == 1:
|
||||
message = changed_list[0]
|
||||
message += changed_suffix
|
||||
if not self.module.check_mode:
|
||||
try:
|
||||
task = self.dvs.config.uplinkPortgroup[0].ReconfigureDVPortgroup_Task(uplink_pg_spec)
|
||||
wait_for_task(task)
|
||||
except TaskError as invalid_argument:
|
||||
self.module.fail_json(msg="Failed to update uplink portgroup : %s" % to_native(invalid_argument))
|
||||
else:
|
||||
message = "Uplink portgroup already configured properly"
|
||||
results['changed'] = changed
|
||||
results['result'] = message
|
||||
|
||||
self.module.exit_json(**results)
|
||||
|
||||
@staticmethod
|
||||
def get_vlan_ids_from_range(vlan_id_range):
|
||||
"""Get start and end VLAN ID from VLAN ID range"""
|
||||
try:
|
||||
vlan_id_start, vlan_id_end = vlan_id_range.split('-')
|
||||
except (AttributeError, TypeError):
|
||||
vlan_id_start = vlan_id_end = vlan_id_range
|
||||
except ValueError:
|
||||
vlan_id_start = vlan_id_end = vlan_id_range.strip()
|
||||
return vlan_id_start, vlan_id_end
|
||||
|
||||
@staticmethod
|
||||
def get_lacp_support_mode(mode):
|
||||
"""Get LACP support mode"""
|
||||
return_mode = None
|
||||
if mode == 'basic':
|
||||
return_mode = 'singleLag'
|
||||
elif mode == 'enhanced':
|
||||
return_mode = 'multipleLag'
|
||||
elif mode == 'singleLag':
|
||||
return_mode = 'basic'
|
||||
elif mode == 'multipleLag':
|
||||
return_mode = 'enhanced'
|
||||
return return_mode
|
||||
|
||||
|
||||
def main():
|
||||
"""Main"""
|
||||
argument_spec = vmware_argument_spec()
|
||||
argument_spec.update(
|
||||
dict(
|
||||
switch=dict(required=True, aliases=['dvswitch']),
|
||||
name=dict(type='str'),
|
||||
description=dict(type='str'),
|
||||
advanced=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
port_config_reset_at_disconnect=dict(type='bool', default=True),
|
||||
block_override=dict(type='bool', default=True),
|
||||
vendor_config_override=dict(type='bool', default=False),
|
||||
vlan_override=dict(type='bool', default=False),
|
||||
netflow_override=dict(type='bool', default=False),
|
||||
traffic_filter_override=dict(type='bool', default=False),
|
||||
),
|
||||
default=dict(
|
||||
port_config_reset_at_disconnect=True,
|
||||
block_override=True,
|
||||
vendor_config_override=False,
|
||||
vlan_override=False,
|
||||
netflow_override=False,
|
||||
traffic_filter_override=False,
|
||||
),
|
||||
aliases=['port_policy'],
|
||||
),
|
||||
lacp=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
status=dict(type='str', choices=['enabled', 'disabled'], default=['disabled']),
|
||||
mode=dict(type='str', choices=['active', 'passive'], default=['passive']),
|
||||
),
|
||||
default=dict(
|
||||
status='disabled',
|
||||
mode='passive',
|
||||
),
|
||||
),
|
||||
vlan_trunk_range=dict(type='list', default=['0-4094']),
|
||||
netflow_enabled=dict(type='bool', default=False),
|
||||
block_all_ports=dict(type='bool', default=False),
|
||||
)
|
||||
)
|
||||
|
||||
module = AnsibleModule(
|
||||
argument_spec=argument_spec,
|
||||
supports_check_mode=True,
|
||||
)
|
||||
|
||||
vmware_dvswitch_uplink_pg = VMwareDvSwitchUplinkPortgroup(module)
|
||||
vmware_dvswitch_uplink_pg.ensure()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,2 @@
|
||||
cloud/vcenter
|
||||
unsupported
|
@ -0,0 +1,128 @@
|
||||
# Test code for the vmware_dvswitch_uplink_pg module.
|
||||
# Copyright: (c) 2018, Christian Kotte <christian.kotte@gmx.de>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
- name: store the vcenter container ip
|
||||
set_fact:
|
||||
vcsim: "{{ lookup('env', 'vcenter_host') }}"
|
||||
|
||||
- debug: var=vcsim
|
||||
|
||||
- name: Wait for Flask controller to come up online
|
||||
wait_for:
|
||||
host: "{{ vcsim }}"
|
||||
port: 5000
|
||||
state: started
|
||||
|
||||
- name: kill vcsim
|
||||
uri:
|
||||
url: http://{{ vcsim }}:5000/killall
|
||||
|
||||
- name: start vcsim
|
||||
uri:
|
||||
url: http://{{ vcsim }}:5000/spawn?cluster=2
|
||||
register: vcsim_instance
|
||||
|
||||
- name: Wait for vcsim server to come up online
|
||||
wait_for:
|
||||
host: "{{ vcsim }}"
|
||||
port: 443
|
||||
state: started
|
||||
|
||||
- name: get a list of Datacenter from vcsim
|
||||
uri:
|
||||
url: http://{{ vcsim }}:5000/govc_find?filter=DC
|
||||
register: datacenters
|
||||
|
||||
- debug: var=vcsim_instance
|
||||
- debug: var=datacenters
|
||||
|
||||
# Testcase 0001: Add Distributed vSwitch
|
||||
- name: add distributed vSwitch
|
||||
vmware_dvswitch:
|
||||
validate_certs: False
|
||||
hostname: "{{ vcsim }}"
|
||||
username: "{{ vcsim_instance['json']['username'] }}"
|
||||
password: "{{ vcsim_instance['json']['password'] }}"
|
||||
datacenter_name: "{{ item | basename }}"
|
||||
state: present
|
||||
switch_name: dvswitch_0001
|
||||
mtu: 9000
|
||||
uplink_quantity: 2
|
||||
discovery_proto: lldp
|
||||
discovery_operation: both
|
||||
register: dvs_result_0001
|
||||
with_items:
|
||||
- "{{ datacenters['json'] }}"
|
||||
|
||||
- name: ensure distributed vswitch is present
|
||||
assert:
|
||||
that:
|
||||
- "{{ dvs_result_0001.changed == true }}"
|
||||
|
||||
- name: get a list of distributed vswitch from vcsim after adding
|
||||
uri:
|
||||
url: http://{{ vcsim }}:5000/govc_find?filter=DVS
|
||||
register: new_dvs_0001
|
||||
|
||||
- debug:
|
||||
msg: "{{ item | basename }}"
|
||||
with_items: "{{ new_dvs_0001['json'] }}"
|
||||
|
||||
- set_fact: new_dvs_name="{% for dvs in new_dvs_0001['json'] %} {{ True if (dvs | basename) == 'dvswitch_0001' else False }}{% endfor %}"
|
||||
|
||||
- debug: var=new_dvs_name
|
||||
- assert:
|
||||
that:
|
||||
- "{{ 'True' in new_dvs_name }}"
|
||||
|
||||
- name: Configure Uplink portgroup in check mode
|
||||
vmware_dvswitch_uplink_pg:
|
||||
hostname: "{{ vcsim }}"
|
||||
username: "{{ vcsim_instance['json']['username'] }}"
|
||||
password: "{{ vcsim_instance['json']['password'] }}"
|
||||
switch: dvswitch_0001
|
||||
name: dvswitch_0001-DVUplinks
|
||||
advanced:
|
||||
port_config_reset_at_disconnect: False
|
||||
block_override: False
|
||||
vendor_config_override: False
|
||||
vlan_override: False
|
||||
netflow_override: False
|
||||
traffic_filter_override: False
|
||||
vlan_trunk_range: [ 2-3967, 4049-4092 ]
|
||||
netflow_enabled: True
|
||||
block_all_ports: False
|
||||
validate_certs: no
|
||||
register: uplink_pg_result_check_mode
|
||||
check_mode: yes
|
||||
|
||||
- name: ensure uplink portgroup was changed
|
||||
assert:
|
||||
that:
|
||||
- uplink_pg_result_check_mode.changed
|
||||
|
||||
- name: Configure Uplink portgroup
|
||||
vmware_dvswitch_uplink_pg:
|
||||
hostname: "{{ vcsim }}"
|
||||
username: "{{ vcsim_instance['json']['username'] }}"
|
||||
password: "{{ vcsim_instance['json']['password'] }}"
|
||||
switch: dvswitch_0001
|
||||
name: dvswitch_0001-DVUplinks
|
||||
advanced:
|
||||
port_config_reset_at_disconnect: False
|
||||
block_override: False
|
||||
vendor_config_override: False
|
||||
vlan_override: False
|
||||
netflow_override: False
|
||||
traffic_filter_override: False
|
||||
vlan_trunk_range: [ 2-3967, 4049-4092 ]
|
||||
netflow_enabled: True
|
||||
block_all_ports: False
|
||||
validate_certs: no
|
||||
register: uplink_pg_result
|
||||
|
||||
- name: ensure uplink portgroup was changed
|
||||
assert:
|
||||
that:
|
||||
- uplink_pg_result.changed
|
Loading…
Reference in New Issue