mirror of https://github.com/ansible/ansible.git
VMware: new module vmware_guest_serial_port (#63126)
The ask was to add an option in the vmware_guest itself. Upon inspection, a serial port can be created in multiple ways and so can be a module in itself. Therefore, created a new module called vmware_serial_port. Fixes: #54956pull/64783/head
parent
9b0cdad4d4
commit
e9feea2270
@ -0,0 +1,468 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright: (c) 2019, Anusha Hegde <anushah@vmware.com>
|
||||
# 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_guest_serial_port
|
||||
|
||||
short_description: Manage serial ports on an existing VM
|
||||
|
||||
version_added: "2.10"
|
||||
|
||||
description:
|
||||
- "This module can be used to manage serial ports on an existing VM"
|
||||
|
||||
options:
|
||||
name:
|
||||
description:
|
||||
- Name of the virtual machine.
|
||||
- This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
|
||||
type: str
|
||||
uuid:
|
||||
description:
|
||||
- UUID of the instance to manage the serial ports, this is VMware's unique identifier.
|
||||
- This is a required parameter, if parameter C(name) or C(moid) is not supplied.
|
||||
type: str
|
||||
moid:
|
||||
description:
|
||||
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
|
||||
- This is required if C(name) or C(uuid) is not supplied.
|
||||
type: str
|
||||
use_instance_uuid:
|
||||
description:
|
||||
- Whether to use the VMware instance UUID rather than the BIOS UUID.
|
||||
default: no
|
||||
type: bool
|
||||
backings:
|
||||
type: list
|
||||
description:
|
||||
- A list of backings for serial ports.
|
||||
- 'C(backing_type) (str): is required to add or reconfigure or remove an existing serial port.'
|
||||
- 'Valid attributes are:'
|
||||
- ' - C(backing_type) (str): Backing type is required for the serial ports to be added or reconfigured or removed.'
|
||||
- ' - C(state) (str): is required to identify whether we are adding, modifying or removing the serial port.
|
||||
- choices:
|
||||
- C(present): modify an existing serial port. C(backing_type) is required to determine the port.
|
||||
The first matching C(backing_type) and either of C(service_uri) or C(pipe_name) or C(device_name) or C(file_path) will be modified.
|
||||
If there is only one device with a backing type, the secondary details are not needed.
|
||||
We will match the last such device with the given backing type.
|
||||
- C(absent): remove an existing serial port. C(backing_type) is required to determine the port.
|
||||
The first matching C(backing_type) and either of C(service_uri) or C(pipe_name) or C(device_name) or C(file_path) will be removed.
|
||||
If there is only one device with a backing type, the secondary details are not needed.
|
||||
We will match the last such device with the given backing type.'
|
||||
- ' - C(yield_on_poll) (bool): Enables CPU yield behavior. Default value is true.'
|
||||
- ' - C(direction) (str): Required when I(backing_type=network).
|
||||
The direction of the connection.
|
||||
- choices:
|
||||
- client
|
||||
- server'
|
||||
- ' - C(service_uri) (str): Required when I(backing_type=network).
|
||||
Identifies the local host or a system on the network, depending on the value of I(direction).
|
||||
If you use the virtual machine as a server, the URI identifies the host on which the virtual machine runs.
|
||||
In this case, the host name part of the URI should be empty, or it should specify the address of the local host.
|
||||
If you use the virtual machine as a client, the URI identifies the remote system on the network.'
|
||||
- ' - C(endpoint) (str): Required when I(backing_type=pipe).
|
||||
When you use serial port pipe backing to connect a virtual machine to another process, you must define the endpoints.'
|
||||
- ' - C(no_rx_loss) (bool): Required when I(backing_type=pipe).
|
||||
Enables optimized data transfer over the pipe.
|
||||
- choices:
|
||||
- client
|
||||
- server'
|
||||
- ' - C(pipe_name) (str): Required when I(backing_type=pipe).'
|
||||
- ' - C(device_name) (str): Required when I(backing_type=device).'
|
||||
- ' - C(file_path) (str): Required when I(backing_type=file).
|
||||
File path for the host file used in this backing. Fully qualified path is required, like <datastore_name>/<file_name>'
|
||||
|
||||
extends_documentation_fragment:
|
||||
- vmware.documentation
|
||||
|
||||
author:
|
||||
- Anusha Hegde (@anusha94)
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
# Create serial ports
|
||||
- name: Create multiple serial ports with Backing type - network, pipe, device and file
|
||||
vmware_guest_serial_port:
|
||||
hostname: "{{ vcenter_hostname }}"
|
||||
username: "{{ vcenter_username }}"
|
||||
password: "{{ vcenter_password }}"
|
||||
validate_certs: no
|
||||
name: "test_vm1"
|
||||
backings:
|
||||
- type: 'network'
|
||||
direction: 'client'
|
||||
service_uri: 'tcp://6000'
|
||||
yield_on_poll: True
|
||||
- type: 'pipe'
|
||||
pipe_name: 'serial_pipe'
|
||||
endpoint: 'client'
|
||||
- type: 'device'
|
||||
device_name: '/dev/char/serial/uart0'
|
||||
- type: 'file'
|
||||
file_path: '[datastore1]/file1'
|
||||
yield_on_poll: True
|
||||
register: create_multiple_ports
|
||||
|
||||
# Modify existing serial port
|
||||
- name: Modify Network backing type
|
||||
vmware_guest_serial_port:
|
||||
hostname: '{{ vcenter_hostname }}'
|
||||
username: '{{ vcenter_username }}'
|
||||
password: '{{ vcenter_password }}'
|
||||
name: '{{ name }}'
|
||||
backings:
|
||||
- type: 'network'
|
||||
state: 'present'
|
||||
direction: 'server'
|
||||
service_uri: 'tcp://6000'
|
||||
delegate_to: localhost
|
||||
|
||||
# Remove serial port
|
||||
- name: Remove pipe backing type
|
||||
vmware_guest_serial_port:
|
||||
hostname: '{{ vcenter_hostname }}'
|
||||
username: '{{ vcenter_username }}'
|
||||
password: '{{ vcenter_password }}'
|
||||
name: '{{ name }}'
|
||||
backings:
|
||||
- type: 'pipe'
|
||||
state: 'absent'
|
||||
delegate_to: localhost
|
||||
|
||||
'''
|
||||
|
||||
RETURN = r'''
|
||||
serial_port_data:
|
||||
description: metadata about the virtual machine's serial ports after managing them
|
||||
returned: always
|
||||
type: dict
|
||||
sample: [
|
||||
{
|
||||
"backing_type": "network",
|
||||
"direction": "client",
|
||||
"service_uri": "tcp://6000"
|
||||
},
|
||||
{
|
||||
"backing_type": "pipe",
|
||||
"direction": "server",
|
||||
"pipe_name": "serial pipe"
|
||||
},
|
||||
]
|
||||
'''
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, wait_for_task
|
||||
from ansible.module_utils._text import to_native
|
||||
try:
|
||||
from pyVmomi import vim
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
class PyVmomiHelper(PyVmomi):
|
||||
""" This class is a helper to create easily VMware Spec for PyVmomiHelper """
|
||||
|
||||
def __init__(self, module):
|
||||
super(PyVmomiHelper, self).__init__(module)
|
||||
self.change_applied = False # a change was applied meaning at least one task succeeded
|
||||
self.config_spec = vim.vm.ConfigSpec()
|
||||
self.config_spec.deviceChange = []
|
||||
self.serial_ports = []
|
||||
|
||||
def check_vm_state(self, vm_obj):
|
||||
"""
|
||||
To add serial port, the VM must be in powered off state
|
||||
|
||||
Input:
|
||||
- vm: Virtual Machine
|
||||
|
||||
Output:
|
||||
- True if vm is in poweredOff state
|
||||
- module fails otherwise
|
||||
"""
|
||||
if vm_obj.runtime.powerState == vim.VirtualMachinePowerState.poweredOff:
|
||||
return True
|
||||
else:
|
||||
self.module.fail_json(msg="A serial device cannot be added to a VM in the current state(" + vm_obj.runtime.powerState + ")."
|
||||
+ "Please use the vmware_guest_powerstate module to power off the VM")
|
||||
|
||||
def get_serial_port_config_spec(self, vm_obj):
|
||||
"""
|
||||
Variables changed:
|
||||
- self.config_spec
|
||||
- self.change_applied
|
||||
"""
|
||||
# create serial config spec for adding, editing, removing
|
||||
for backing in self.params.get('backings'):
|
||||
backing_keys = backing.keys()
|
||||
serial_port = get_serial_port(vm_obj, backing)
|
||||
if serial_port is None and 'state' not in backing_keys:
|
||||
# if serial port is None and state is not mentioned
|
||||
# create a new serial port
|
||||
serial_port_spec = self.create_serial_port(backing)
|
||||
serial_port_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
|
||||
self.serial_ports.append(serial_port_spec)
|
||||
self.change_applied = True
|
||||
else:
|
||||
if serial_port is not None and 'state' in backing_keys:
|
||||
serial_spec = vim.vm.device.VirtualDeviceSpec()
|
||||
serial_spec.device = serial_port
|
||||
if backing['state'].lower() == 'present':
|
||||
# modify existing serial port
|
||||
serial_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.edit
|
||||
serial_spec.device.backing = self.get_backing_info(serial_port, backing, backing['type'])
|
||||
self.change_applied = True
|
||||
self.config_spec.deviceChange.append(serial_spec)
|
||||
elif backing['state'].lower() == 'absent':
|
||||
# remove serial port
|
||||
serial_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.remove
|
||||
self.change_applied = True
|
||||
self.config_spec.deviceChange.append(serial_spec)
|
||||
else:
|
||||
self.module.fail_json(msg='Unable to find the specified serial port: %s' % backing)
|
||||
|
||||
def reconfigure_vm_serial_port(self, vm_obj):
|
||||
"""
|
||||
Reconfigure vm with new or modified serial port config spec
|
||||
"""
|
||||
self.get_serial_port_config_spec(vm_obj)
|
||||
try:
|
||||
# configure create tasks first
|
||||
if self.serial_ports:
|
||||
for serial_port in self.serial_ports:
|
||||
# each type of serial port is of config_spec.device = vim.vm.device.VirtualSerialPort() object type
|
||||
# because serial ports differ in the backing types and config_spec.device has to be unique,
|
||||
# we are creating a new spec for every create port configuration
|
||||
spec = vim.vm.ConfigSpec()
|
||||
spec.deviceChange.append(serial_port)
|
||||
task = vm_obj.ReconfigVM_Task(spec=spec)
|
||||
wait_for_task(task)
|
||||
task = vm_obj.ReconfigVM_Task(spec=self.config_spec)
|
||||
wait_for_task(task)
|
||||
except vim.fault.InvalidDatastorePath as e:
|
||||
self.module.fail_json(msg="Failed to configure serial port on given virtual machine due to invalid path: %s" % to_native(e.msg))
|
||||
except vim.fault.RestrictedVersion as e:
|
||||
self.module.fail_json(msg="Failed to reconfigure virtual machine due to product versioning restrictions: %s" % to_native(e.msg))
|
||||
if task.info.state == 'error':
|
||||
results = {'changed': self.change_applied, 'failed': True, 'msg': task.info.error.msg}
|
||||
else:
|
||||
serial_port_info = get_serial_port_info(vm_obj)
|
||||
results = {'changed': self.change_applied, 'failed': False, 'serial_port_info': serial_port_info}
|
||||
|
||||
return results
|
||||
|
||||
def set_network_backing(self, serial_port, backing_info):
|
||||
"""
|
||||
Set the networking backing params
|
||||
"""
|
||||
required_params = ['service_uri', 'direction']
|
||||
if set(required_params).issubset(backing_info.keys()):
|
||||
backing = serial_port.URIBackingInfo()
|
||||
backing.serviceURI = backing_info['service_uri']
|
||||
backing.direction = backing_info['direction']
|
||||
else:
|
||||
self.module.fail_json(msg="Failed to create a new serial port of network backing type due to insufficient parameters."
|
||||
+ "The required parameters are service_uri and direction")
|
||||
return backing
|
||||
|
||||
def set_pipe_backing(self, serial_port, backing_info):
|
||||
"""
|
||||
Set the pipe backing params
|
||||
"""
|
||||
required_params = ['pipe_name', 'endpoint']
|
||||
if set(required_params).issubset(backing_info.keys()):
|
||||
backing = serial_port.PipeBackingInfo()
|
||||
backing.pipeName = backing_info['pipe_name']
|
||||
backing.endpoint = backing_info['endpoint']
|
||||
else:
|
||||
self.module.fail_json(msg="Failed to create a new serial port of pipe backing type due to insufficient parameters."
|
||||
+ "The required parameters are pipe_name and endpoint")
|
||||
|
||||
# since no_rx_loss is an optional argument, so check if the key is present
|
||||
if 'no_rx_loss' in backing_info.keys() and backing_info['no_rx_loss']:
|
||||
backing.noRxLoss = backing_info['no_rx_loss']
|
||||
return backing
|
||||
|
||||
def set_device_backing(self, serial_port, backing_info):
|
||||
"""
|
||||
Set the device backing params
|
||||
"""
|
||||
required_params = ['device_name']
|
||||
if set(required_params).issubset(backing_info.keys()):
|
||||
backing = serial_port.DeviceBackingInfo()
|
||||
backing.deviceName = backing_info['device_name']
|
||||
else:
|
||||
self.module.fail_json(msg="Failed to create a new serial port of device backing type due to insufficient parameters."
|
||||
+ "The required parameters are device_name")
|
||||
return backing
|
||||
|
||||
def set_file_backing(self, serial_port, backing_info):
|
||||
"""
|
||||
Set the file backing params
|
||||
"""
|
||||
required_params = ['file_path']
|
||||
if set(required_params).issubset(backing_info.keys()):
|
||||
backing = serial_port.FileBackingInfo()
|
||||
backing.fileName = backing_info['file_path']
|
||||
else:
|
||||
self.module.fail_json(msg="Failed to create a new serial port of file backing type due to insufficient parameters."
|
||||
+ "The required parameters are file_path")
|
||||
return backing
|
||||
|
||||
def get_backing_info(self, serial_port, backing, backing_type):
|
||||
"""
|
||||
Returns the call to the appropriate backing function based on the backing type
|
||||
"""
|
||||
switcher = {
|
||||
"network": self.set_network_backing,
|
||||
"pipe": self.set_pipe_backing,
|
||||
"device": self.set_device_backing,
|
||||
"file": self.set_file_backing
|
||||
}
|
||||
backing_func = switcher.get(backing_type, "Invalid Backing Info")
|
||||
return backing_func(serial_port, backing)
|
||||
|
||||
def create_serial_port(self, backing):
|
||||
"""
|
||||
Create a new serial port
|
||||
"""
|
||||
serial_spec = vim.vm.device.VirtualDeviceSpec()
|
||||
serial_port = vim.vm.device.VirtualSerialPort()
|
||||
serial_port.yieldOnPoll = backing['yield_on_poll'] if 'yield_on_poll' in backing.keys() else True
|
||||
serial_port.backing = self.get_backing_info(serial_port, backing, backing['type'])
|
||||
serial_spec.device = serial_port
|
||||
return serial_spec
|
||||
|
||||
|
||||
def get_serial_port(vm_obj, backing):
|
||||
"""
|
||||
Return the serial port of specified backing type
|
||||
"""
|
||||
serial_port = None
|
||||
backing_type_mapping = {
|
||||
'network': vim.vm.device.VirtualSerialPort.URIBackingInfo,
|
||||
'pipe': vim.vm.device.VirtualSerialPort.PipeBackingInfo,
|
||||
'device': vim.vm.device.VirtualSerialPort.DeviceBackingInfo,
|
||||
'file': vim.vm.device.VirtualSerialPort.FileBackingInfo
|
||||
}
|
||||
valid_params = backing.keys()
|
||||
for device in vm_obj.config.hardware.device:
|
||||
if isinstance(device, vim.vm.device.VirtualSerialPort):
|
||||
if isinstance(device.backing, backing_type_mapping[backing['type']]):
|
||||
if 'service_uri' in valid_params:
|
||||
# network backing type
|
||||
if device.backing.serviceURI == backing['service_uri']:
|
||||
serial_port = device
|
||||
break
|
||||
elif 'pipe_name' in valid_params:
|
||||
# named pipe backing type
|
||||
if device.backing.pipeName == backing['pipe_name']:
|
||||
serial_port = device
|
||||
break
|
||||
elif 'device_name' in valid_params:
|
||||
# physical serial device backing type
|
||||
if device.backing.deviceName == backing['device_name']:
|
||||
serial_port = device
|
||||
break
|
||||
elif 'file_path' in valid_params:
|
||||
# file backing type
|
||||
if device.backing.fileName == backing['file_path']:
|
||||
serial_port = device
|
||||
break
|
||||
# if there is a backing of only one type, user need not provide secondary details like service_uri, pipe_name, device_name or file_path
|
||||
# we will match the serial port with backing type only
|
||||
# in this case, the last matching serial port will be returned
|
||||
serial_port = device
|
||||
return serial_port
|
||||
|
||||
|
||||
def get_serial_port_info(vm_obj):
|
||||
"""
|
||||
Get the serial port info
|
||||
"""
|
||||
serial_port_info = []
|
||||
if vm_obj is None:
|
||||
return serial_port_info
|
||||
for port in vm_obj.config.hardware.device:
|
||||
backing = dict()
|
||||
if isinstance(port, vim.vm.device.VirtualSerialPort):
|
||||
if isinstance(port.backing, vim.vm.device.VirtualSerialPort.URIBackingInfo):
|
||||
backing['backing_type'] = 'network'
|
||||
backing['direction'] = port.backing.direction
|
||||
backing['service_uri'] = port.backing.serviceURI
|
||||
elif isinstance(port.backing, vim.vm.device.VirtualSerialPort.PipeBackingInfo):
|
||||
backing['backing_type'] = 'pipe'
|
||||
backing['pipe_name'] = port.backing.pipeName
|
||||
backing['endpoint'] = port.backing.endpoint
|
||||
backing['no_rx_loss'] = port.backing.noRxLoss
|
||||
elif isinstance(port.backing, vim.vm.device.VirtualSerialPort.DeviceBackingInfo):
|
||||
backing['backing_type'] = 'device'
|
||||
backing['device_name'] = port.backing.deviceName
|
||||
elif isinstance(port.backing, vim.vm.device.VirtualSerialPort.FileBackingInfo):
|
||||
backing['backing_type'] = 'file'
|
||||
backing['file_path'] = port.backing.fileName
|
||||
else:
|
||||
continue
|
||||
serial_port_info.append(backing)
|
||||
return serial_port_info
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main method
|
||||
"""
|
||||
argument_spec = vmware_argument_spec()
|
||||
argument_spec.update(
|
||||
name=dict(type='str'),
|
||||
uuid=dict(type='str'),
|
||||
moid=dict(type='str'),
|
||||
use_instance_uuid=dict(type='bool', default=False),
|
||||
backings=dict(type='list', default=[])
|
||||
)
|
||||
|
||||
module = AnsibleModule(
|
||||
argument_spec=argument_spec,
|
||||
required_one_of=[
|
||||
['name', 'uuid', 'moid']
|
||||
],
|
||||
mutually_exclusive=[
|
||||
['name', 'uuid', 'moid']
|
||||
],
|
||||
)
|
||||
result = {'failed': False, 'changed': False}
|
||||
|
||||
pyv = PyVmomiHelper(module)
|
||||
# Check if the VM exists before continuing
|
||||
vm_obj = pyv.get_vm()
|
||||
|
||||
if vm_obj:
|
||||
proceed = pyv.check_vm_state(vm_obj)
|
||||
if proceed:
|
||||
result = pyv.reconfigure_vm_serial_port(vm_obj)
|
||||
|
||||
else:
|
||||
# We are unable to find the virtual machine user specified
|
||||
# Bail out
|
||||
vm_id = (module.params.get('name') or module.params.get('uuid') or module.params.get('vm_id'))
|
||||
module.fail_json(msg="Unable to manage serial ports for non-existing"
|
||||
" virtual machine '%s'." % vm_id)
|
||||
|
||||
if result['failed']:
|
||||
module.fail_json(**result)
|
||||
else:
|
||||
module.exit_json(**result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,3 @@
|
||||
cloud/vcenter
|
||||
shippable/vcenter/group1
|
||||
needs/target/prepare_vmware_tests
|
@ -0,0 +1,103 @@
|
||||
# Test code for the vmware_guest_serial_port Operations.
|
||||
# Copyright: (c) 2019, Anusha Hegde <anushah@vmware.com>
|
||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
|
||||
- import_role:
|
||||
name: prepare_vmware_tests
|
||||
vars:
|
||||
setup_attach_host: true
|
||||
setup_datastore: true
|
||||
|
||||
- name: Create VM
|
||||
vmware_guest:
|
||||
validate_certs: False
|
||||
hostname: "{{ vcenter_hostname }}"
|
||||
username: "{{ vcenter_username }}"
|
||||
password: "{{ vcenter_password }}"
|
||||
name: test_vm1
|
||||
guest_id: centos64Guest
|
||||
datacenter: "{{ dc1 }}"
|
||||
folder: "{{ f0 }}"
|
||||
hardware:
|
||||
num_cpus: 1
|
||||
memory_mb: 512
|
||||
disk:
|
||||
- size: 1gb
|
||||
type: thin
|
||||
autoselect_datastore: True
|
||||
state: present
|
||||
register: create_vm_for_test
|
||||
|
||||
- name: assert that changes were made
|
||||
assert:
|
||||
that:
|
||||
- create_vm_for_test is changed
|
||||
|
||||
- name: Create multiple serial ports with Backing type - network, pipe, device and file
|
||||
vmware_guest_serial_port:
|
||||
hostname: "{{ vcenter_hostname }}"
|
||||
username: "{{ vcenter_username }}"
|
||||
password: "{{ vcenter_password }}"
|
||||
validate_certs: no
|
||||
name: "test_vm1"
|
||||
backings:
|
||||
- type: 'network'
|
||||
direction: 'client'
|
||||
service_uri: 'tcp://6000'
|
||||
yield_on_poll: True
|
||||
- type: 'pipe'
|
||||
pipe_name: 'serial_pipe'
|
||||
endpoint: 'client'
|
||||
- type: 'device'
|
||||
device_name: '/dev/char/serial/uart0'
|
||||
- type: 'file'
|
||||
file_path: '[{{ ds2 }}]/file1'
|
||||
yield_on_poll: True
|
||||
register: create_multiple_ports
|
||||
|
||||
- debug: var=create_multiple_ports
|
||||
|
||||
- name: assert that changes were made
|
||||
assert:
|
||||
that:
|
||||
- create_multiple_ports is changed
|
||||
|
||||
- name: Modify existing serial port with Backing type - network
|
||||
vmware_guest_serial_port:
|
||||
hostname: "{{ vcenter_hostname }}"
|
||||
username: "{{ vcenter_username }}"
|
||||
password: "{{ vcenter_password }}"
|
||||
validate_certs: no
|
||||
name: 'test_vm1'
|
||||
backings:
|
||||
- type: 'network'
|
||||
state: 'present'
|
||||
direction: 'server'
|
||||
service_uri: 'tcp://6000'
|
||||
register: modify_network_port
|
||||
|
||||
- debug: var=modify_network_port
|
||||
|
||||
- name: assert that changes were made
|
||||
assert:
|
||||
that:
|
||||
- modify_network_port is changed
|
||||
|
||||
- name: Remove serial port with Backing type - pipe
|
||||
vmware_guest_serial_port:
|
||||
hostname: "{{ vcenter_hostname }}"
|
||||
username: "{{ vcenter_username }}"
|
||||
password: "{{ vcenter_password }}"
|
||||
validate_certs: no
|
||||
name: 'test_vm1'
|
||||
backings:
|
||||
- type: 'pipe'
|
||||
state: 'absent'
|
||||
register: remove_pipe_port
|
||||
|
||||
- debug: var=remove_pipe_port
|
||||
|
||||
- name: assert that changes were made
|
||||
assert:
|
||||
that:
|
||||
- remove_pipe_port is changed
|
Loading…
Reference in New Issue