def sanitize_network_params(self):
        network_list = []
        valid_state = ['new', 'present', 'absent']
        if len(self.params['networks']) != 0:
            for network in self.params['networks']:
                if 'state' not in network or network['state'].lower() not in valid_state:
                    self.module.fail_json(msg="Network adapter state not specified or invalid: '%s', valid values: "
                                              "%s" % (network.get('state', ''), valid_state))
                # add new network adapter but no name specified
                if network['state'].lower() == 'new' and 'name' not in network and 'vlan' not in network:
                    self.module.fail_json(msg="Please specify at least network name or VLAN name for adding new network adapter.")
                if network['state'].lower() == 'new' and 'mac' in network:
                    self.module.fail_json(msg="networks.mac is used for vNIC reconfigure, but networks.state is set to 'new'.")
                if network['state'].lower() == 'present' and 'mac' not in network and 'label' not in network and 'device_type' not in network:
                    self.module.fail_json(msg="Should specify 'mac', 'label' or 'device_type' parameter to reconfigure network adapter")
                if 'connected' in network:
                    if not isinstance(network['connected'], bool):
                        self.module.fail_json(msg="networks.connected parameter should be boolean.")
                    if network['state'].lower() == 'new' and not network['connected']:
                        network['start_connected'] = False
                if 'start_connected' in network:
                    if not isinstance(network['start_connected'], bool):
                        self.module.fail_json(msg="networks.start_connected parameter should be boolean.")
                    if network['state'].lower() == 'new' and not network['start_connected']:
                        network['connected'] = False
                # specified network does not exist
                if 'name' in network and not self.network_exists_by_name(network['name']):
                    self.module.fail_json(msg="Network '%(name)s' does not exist." % network)
                elif 'vlan' in network:
                    objects = get_all_objs(self.content, [vim.dvs.DistributedVirtualPortgroup])
                    dvps = [x for x in objects if to_text(get_parent_datacenter(x).name) == to_text(self.params['datacenter'])]
                    for dvp in dvps:
                        if hasattr(dvp.config.defaultPortConfig, 'vlan') and \
                                isinstance(dvp.config.defaultPortConfig.vlan.vlanId, int) and \
                                str(dvp.config.defaultPortConfig.vlan.vlanId) == str(network['vlan']):
                            network['name'] = dvp.config.name
                            break
                        if 'dvswitch_name' in network and \
                                dvp.config.distributedVirtualSwitch.name == network['dvswitch_name'] and \
                                dvp.config.name == network['vlan']:
                            network['name'] = dvp.config.name
                            break
                        if dvp.config.name == network['vlan']:
                            network['name'] = dvp.config.name
                            break
                    else:
                        self.module.fail_json(msg="VLAN '%(vlan)s' does not exist." % network)

                if 'device_type' in network and network['device_type'] not in list(self.nic_device_type.keys()):
                    self.module.fail_json(msg="Device type specified '%s' is invalid. "
                                              "Valid types %s " % (network['device_type'], list(self.nic_device_type.keys())))

                if ('mac' in network and not is_mac(network['mac'])) or \
                        ('manual_mac' in network and not is_mac(network['manual_mac'])):
                    self.module.fail_json(msg="Device MAC address '%s' or manual set MAC address %s is invalid. "
                                              "Please provide correct MAC address." % (network['mac'], network['manual_mac']))

                network_list.append(network)

        return network_list
Ejemplo n.º 2
0
    def create_nic(self, device_type, device_label, device_infos):
        nic = vim.vm.device.VirtualDeviceSpec()
        nic_device = self.nic_device_type.get(device_type)
        nic.device = nic_device()
        nic.device.key = -randint(25000, 29999)
        nic.device.wakeOnLanEnabled = bool(
            device_infos.get('wake_on_lan', True))
        nic.device.deviceInfo = vim.Description()
        nic.device.deviceInfo.label = device_label
        nic.device.deviceInfo.summary = device_infos['name']
        nic.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo()
        nic.device.connectable.startConnected = bool(
            device_infos.get('start_connected', True))
        nic.device.connectable.allowGuestControl = bool(
            device_infos.get('allow_guest_control', True))
        nic.device.connectable.connected = bool(
            device_infos.get('connected', True))
        if device_type == 'sriov':
            pf_backing = device_infos.get('physical_function_backing', None)
            vf_backing = device_infos.get('virtual_function_backing', None)

            nic.device.allowGuestOSMtuChange = bool(
                device_infos.get('allow_gest_os_mtu_change', True))
            nic.device.sriovBacking = vim.vm.device.VirtualSriovEthernetCard.SriovBackingInfo(
            )
            if pf_backing is not None:
                nic.device.sriovBacking.physicalFunctionBacking = vim.vm.device.VirtualPCIPassthrough.DeviceBackingInfo(
                )
                nic.device.sriovBacking.physicalFunctionBacking.id = pf_backing
            if vf_backing is not None:
                nic.device.sriovBacking.virtualFunctionBacking = vim.vm.device.VirtualPCIPassthrough.DeviceBackingInfo(
                )
                nic.device.sriovBacking.virtualFunctionBacking.id = vf_backing
        if 'mac' in device_infos and is_mac(device_infos['mac']):
            nic.device.addressType = 'manual'
            nic.device.macAddress = device_infos['mac']
        else:
            nic.device.addressType = 'generated'

        return nic
Ejemplo n.º 3
0
    def create_nic(self, device_type, device_label, device_infos):
        nic = vim.vm.device.VirtualDeviceSpec()
        nic_device = self.nic_device_type.get(device_type)
        nic.device = nic_device()
        nic.device.key = -randint(25000, 29999)
        nic.device.wakeOnLanEnabled = bool(
            device_infos.get('wake_on_lan', True))
        nic.device.deviceInfo = vim.Description()
        nic.device.deviceInfo.label = device_label
        nic.device.deviceInfo.summary = device_infos['name']
        nic.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo()
        nic.device.connectable.startConnected = bool(
            device_infos.get('start_connected', True))
        nic.device.connectable.allowGuestControl = bool(
            device_infos.get('allow_guest_control', True))
        nic.device.connectable.connected = bool(
            device_infos.get('connected', True))
        if 'mac' in device_infos and is_mac(device_infos['mac']):
            nic.device.addressType = 'manual'
            nic.device.macAddress = device_infos['mac']
        else:
            nic.device.addressType = 'generated'

        return nic
def test_is_valid_mac_addr(xenserver, mac_addr, result):
    """Tests against examples of valid and invalid mac addresses."""
    assert is_mac(mac_addr) is result
Ejemplo n.º 5
0
 def is_valid_mac(self):
     return is_mac(self.mac.lower())
Ejemplo n.º 6
0
    def sanitize_network_params(self):
        network_list = []
        valid_state = ["new", "present", "absent"]
        if len(self.params["networks"]) != 0:
            for network in self.params["networks"]:
                if ("state" not in network
                        or network["state"].lower() not in valid_state):
                    self.module.fail_json(
                        msg=
                        "Network adapter state not specified or invalid: '%s', valid values: "
                        "%s" % (network.get("state", ""), valid_state))
                # add new network adapter but no name specified
                if (network["state"].lower() == "new" and "name" not in network
                        and "vlan" not in network):
                    self.module.fail_json(
                        msg=
                        "Please specify at least network name or VLAN name for adding new network adapter."
                    )
                if network["state"].lower() == "new" and "mac" in network:
                    self.module.fail_json(
                        msg=
                        "networks.mac is used for vNIC reconfigure, but networks.state is set to 'new'."
                    )
                if (network["state"].lower() == "present"
                        and "mac" not in network and "label" not in network
                        and "device_type" not in network):
                    self.module.fail_json(
                        msg=
                        "Should specify 'mac', 'label' or 'device_type' parameter to reconfigure network adapter"
                    )
                if "connected" in network:
                    if not isinstance(network["connected"], bool):
                        self.module.fail_json(
                            msg=
                            "networks.connected parameter should be boolean.")
                    if (network["state"].lower() == "new"
                            and not network["connected"]):
                        network["start_connected"] = False
                if "start_connected" in network:
                    if not isinstance(network["start_connected"], bool):
                        self.module.fail_json(
                            msg=
                            "networks.start_connected parameter should be boolean."
                        )
                    if (network["state"].lower() == "new"
                            and not network["start_connected"]):
                        network["connected"] = False
                # specified network does not exist
                if "name" in network and not self.network_exists_by_name(
                        network["name"]):
                    self.module.fail_json(
                        msg="Network '%(name)s' does not exist." % network)
                elif "vlan" in network:
                    objects = get_all_objs(
                        self.content, [vim.dvs.DistributedVirtualPortgroup])
                    dvps = [
                        x for x in objects
                        if to_text(get_parent_datacenter(x).name) == to_text(
                            self.params["datacenter"])
                    ]
                    for dvp in dvps:
                        if (hasattr(dvp.config.defaultPortConfig, "vlan")
                                and isinstance(
                                    dvp.config.defaultPortConfig.vlan.vlanId,
                                    int) and
                                str(dvp.config.defaultPortConfig.vlan.vlanId)
                                == str(network["vlan"])):
                            network["name"] = dvp.config.name
                            break
                        if ("dvswitch_name" in network
                                and dvp.config.distributedVirtualSwitch.name
                                == network["dvswitch_name"]
                                and dvp.config.name == network["vlan"]):
                            network["name"] = dvp.config.name
                            break
                        if dvp.config.name == network["vlan"]:
                            network["name"] = dvp.config.name
                            break
                    else:
                        self.module.fail_json(
                            msg="VLAN '%(vlan)s' does not exist." % network)

                if "device_type" in network and network[
                        "device_type"] not in list(
                            self.nic_device_type.keys()):
                    self.module.fail_json(
                        msg="Device type specified '%s' is invalid. "
                        "Valid types %s " % (
                            network["device_type"],
                            list(self.nic_device_type.keys()),
                        ))

                if ("mac" in network and not is_mac(network["mac"])) or (
                        "manual_mac" in network
                        and not is_mac(network["manual_mac"])):
                    self.module.fail_json(
                        msg=
                        "Device MAC address '%s' or manual set MAC address %s is invalid. "
                        "Please provide correct MAC address." %
                        (network["mac"], network["manual_mac"]))

                network_list.append(network)

        return network_list