def get_all_objs(self, content, types, confine_to_datacenter=True):
        """ Wrapper around get_all_objs to set datacenter context """
        objects = get_all_objs(content, types)
        if confine_to_datacenter:
            if hasattr(objects, 'items'):
                # resource pools come back as a dictionary
                for k, v in tuple(objects.items()):
                    parent_dc = get_parent_datacenter(k)
                    if parent_dc.name != self.dc_name:
                        del objects[k]
            else:
                # everything else should be a list
                objects = [x for x in objects if get_parent_datacenter(x).name == self.dc_name]

        return objects
    def generate_http_access_url(self, file_path):
        # e.g., file_path is like this format: [datastore0] test_vm/test_vm-1.png
        # from file_path generate URL
        url_path = None
        if not file_path:
            return url_path

        path = "/folder/%s" % quote(file_path.split()[1])
        params = dict(dsName=file_path.split()[0].strip('[]'))
        if not self.is_vcenter():
            datacenter = 'ha-datacenter'
        else:
            datacenter = get_parent_datacenter(self.current_vm_obj).name.replace('&', '%26')
        params['dcPath'] = datacenter
        url_path = "https://%s%s?%s" % (self.params['hostname'], path, urlencode(params))

        return url_path
Ejemplo n.º 3
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
    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