def guest_create_nic(self, userid, vdev=None, nic_id=None, mac_addr=None, ip_addr=None, active=False): """ Create the nic for the vm, add NICDEF record into the user direct. :param str userid: the user id of the vm :param str vdev: nic device number, 1- to 4- hexadecimal digits :param str nic_id: nic identifier :param str mac_addr: mac address, it is only be used when changing the guest's user direct. Format should be xx:xx:xx:xx:xx:xx, and x is a hexadecimal digit :param str ip_addr: the management IP address of the guest, it should be the value between 0.0.0.0-255.255.255.255 :param bool active: whether add a nic on active guest system :returns: nic device number, 1- to 4- hexadecimal digits :rtype: str :raises ZVMInvalidInput if: - Input parameter is invalid, refer to the error message for detail - Invalid mac address or IP address format is provided - The specified virtual device number has already been used :raises ZVMNetworkError if: - The virtual device number is out of the range - All kinds of xCAT call failure - Smcli call failure, refer to the error message for detail """ if mac_addr is not None: if not zvmutils.valid_mac_addr(mac_addr): raise exception.ZVMInvalidInput( msg=("Invalid mac address, format should be " "xx:xx:xx:xx:xx:xx, and x is a hexadecimal digit")) if ip_addr is not None: if not zvmutils.valid_IP(ip_addr): raise exception.ZVMInvalidInput( msg=("Invalid management IP address, it should be the " "value between 0.0.0.0 and 255.255.255.255")) return self._networkops.create_nic(userid, vdev=vdev, nic_id=nic_id, mac_addr=mac_addr, ip_addr=ip_addr, active=active)
def test_guest_create_nic_raise(self, mock_create, mock_userid): body_str = '{"nic": {"vdev": "1234"}}' self.req.body = body_str mock_userid.return_value = FAKE_USERID mock_create.side_effect = exception.ZVMInvalidInput(msg='dummy') self.assertRaises(webob.exc.HTTPBadRequest, guest.guest_create_nic, self.req)
def host_diskpool_get_info(self, disk_pool=CONF.zvm.disk_pool): """ Retrieve diskpool information. :param str disk_pool: the disk pool info. It use ':' to separate disk pool type and name, eg "ECKD:eckdpool" or "FBA:fbapool" :returns: Dictionary describing diskpool usage info """ if ':' not in disk_pool: LOG.error('Invalid input parameter disk_pool, expect ":" in' 'disk_pool, eg. ECKD:eckdpool') raise exception.ZVMInvalidInput('disk_pool') diskpool_type = disk_pool.split(':')[0].upper() diskpool_name = disk_pool.split(':')[1] if diskpool_type not in ('ECKD', 'FBA'): LOG.error('Invalid disk pool type found in disk_pool, expect' 'disk_pool like ECKD:eckdpool or FBA:fbapool') raise exception.ZVMInvalidInput('disk_pool') return self._hostops.diskpool_get_info(diskpool_name)
def guest_stop(self, userid, timeout=0, retry_interval=10): """Power off a virtual machine. :param str userid: the id of the virtual machine to be power off :param int timeout: time to wait for GuestOS to shutdown :param int retry_interval: How often to signal guest while waiting for it to shutdown :returns: None """ if retry_interval < 0: LOG.error('Invalid input parameter - retry_interval, ' 'expect an integer > 0') raise exception.ZVMInvalidInput('retry_interval') self._vmops.guest_stop(userid, timeout, retry_interval)
def create_nic(self, userid, vdev=None, nic_id=None, mac_addr=None, ip_addr=None, active=False): ports_info = self._NetDbOperator.switch_select_table() vdev_info = [] for p in ports_info: if p[0] == userid: vdev_info.append(p[1]) if len(vdev_info) == 0: # no nic defined for the guest if vdev is None: nic_vdev = CONF.zvm.default_nic_vdev else: nic_vdev = vdev else: if vdev is None: used_vdev = max(vdev_info) nic_vdev = str(hex(int(used_vdev, 16) + 3))[2:] else: if self._is_vdev_valid(vdev, vdev_info): nic_vdev = vdev else: raise exception.ZVMInvalidInput( msg=("The specified virtual device number %s " "has already been used" % vdev)) if len(nic_vdev) > 4: raise exception.ZVMNetworkError( msg=("Virtual device number %s is not valid" % nic_vdev)) LOG.debug( 'Nic attributes: vdev is %(vdev)s, ' 'ID is %(id)s, address is %(address)s', { 'vdev': nic_vdev, 'id': nic_id or 'not specified', 'address': mac_addr or 'not specified' }) self._create_nic(userid, nic_vdev, nic_id=nic_id, mac_addr=mac_addr, active=active) return nic_vdev
def add_vswitch(self, name, rdev=None, controller='*', connection='CONNECT', network_type='IP', router="NONROUTER", vid='UNAWARE', port_type='ACCESS', gvrp='GVRP', queue_mem=8, native_vid=1, persist=True): smut_userid = zvmutils.get_smut_userid() rd = ' '.join(("SMAPI %s API Virtual_Network_Vswitch_Create_Extended" % smut_userid, "--operands", '-k switch_name=%s' % name)) if rdev is not None: rd += " -k real_device_address" +\ "=\'%s\'" % rdev.replace(',', ' ') if controller != '*': rd += " -k controller_name=%s" % controller rd = ' '.join( (rd, "-k connection_value=%s" % connection, "-k queue_memory_limit=%s" % queue_mem, "-k transport_type=%s" % network_type, "-k vlan_id=%s" % vid, "-k persist=%s" % (persist and 'YES' or 'NO'))) # Only if vswitch is vlan awared, port_type, gvrp and native_vid are # allowed to specified if isinstance(vid, int) or vid.upper() != 'UNAWARE': if ((native_vid is not None) and ((native_vid < 1) or (native_vid > 4094))): raise exception.ZVMInvalidInput( msg=("Failed to create vswitch %s: %s") % (name, 'valid native VLAN id should be 1-4094 or None')) rd = ' '.join( (rd, "-k port_type=%s" % port_type, "-k gvrp_value=%s" % gvrp, "-k native_vlanid=%s" % native_vid)) if router is not None: rd += " -k routing_value=%s" % router with zvmutils.expect_request_failed_and_reraise( exception.ZVMNetworkError): self._request(rd)
def get_definition_info(self, userid, **kwargs): check_command = ["nic_coupled"] direct_info = self._zvmclient.get_user_direct(userid) info = {} info['user_direct'] = direct_info for k, v in kwargs.items(): if k in check_command: if (k == 'nic_coupled'): info['nic_coupled'] = False nstr = "NICDEF %s TYPE QDIO LAN SYSTEM" % v for inf in direct_info: if nstr in inf: info['nic_coupled'] = True break else: raise exception.ZVMInvalidInput( msg=("invalid check option for user direct: %s") % k) return info
def wrap_func(*args, **kwargs): if args[0]._skip_input_check: # skip input check return function(*args, **kwargs) # drop class object self inputs = args[1:] if (len(inputs) > len(types)): msg = ("Too many parameters provided: %(specified)d specified," "%(expected)d expected." % {'specified': len(inputs), 'expected': len(types)}) LOG.info(msg) raise exception.ZVMInvalidInput(msg=msg) argtypes = tuple(map(type, inputs)) match_types = types[0:len(argtypes)] invalid_type = False invalid_userid_idx = -1 for idx in range(len(argtypes)): _mtypes = match_types[idx] if not isinstance(_mtypes, tuple): _mtypes = (_mtypes,) argtype = argtypes[idx] if constants._TUSERID in _mtypes: userid_type = True for _tmtype in _mtypes: if ((argtype == _tmtype) and (_tmtype != constants._TUSERID)): userid_type = False if (userid_type and (not valid_userid(inputs[idx]))): invalid_userid_idx = idx break elif argtype not in _mtypes: invalid_type = True break if invalid_userid_idx != -1: msg = ("Invalid string value found at the #%d parameter, " "length should be less or equal to 8 and should not be " "null or contain spaces." % (invalid_userid_idx + 1)) LOG.info(msg) raise exception.ZVMInvalidInput(msg=msg) if invalid_type: msg = ("Invalid input types: %(argtypes)s; " "Expected types: %(types)s" % {'argtypes': str(argtypes), 'types': str(types)}) LOG.info(msg) raise exception.ZVMInvalidInput(msg=msg) valid_keys = validkeys.get('valid_keys') if valid_keys: for k in kwargs.keys(): if k not in valid_keys: msg = ("Invalid keyword: %(key)s; " "Expected keywords are: %(keys)s" % {'key': k, 'keys': str(valid_keys)}) LOG.info(msg) raise exception.ZVMInvalidInput(msg=msg) return function(*args, **kwargs)
def vswitch_set(self, vswitch_name, **kwargs): """Change the configuration of an existing virtual switch :param str vswitch_name: the name of the virtual switch :param dict kwargs: - grant_userid=<value>: A userid to be added to the access list - user_vlan_id=<value>: user VLAN ID. Support following ways: 1. As single values between 1 and 4094. A maximum of four values may be specified, separated by blanks. Example: 1010 2020 3030 4040 2. As a range of two numbers, separated by a dash (-). A maximum of two ranges may be specified. Example: 10-12 20-22 - revoke_userid=<value>: A userid to be removed from the access list - real_device_address=<value>: The real device address or the real device address and OSA Express port number of a QDIO OSA Express device to be used to create the switch to the virtual adapter. If using a real device and an OSA Express port number, specify the real device number followed by a period(.), the letter 'P' (or 'p'), followed by the port number as a hexadecimal number. A maximum of three device addresses, all 1-7 characters in length, may be specified, delimited by blanks. 'None' may also be specified - port_name=<value>: The name used to identify the OSA Expanded adapter. A maximum of three port names, all 1-8 characters in length, may be specified, delimited by blanks. - controller_name=<value>: One of the following: 1. The userid controlling the real device. A maximum of eight userids, all 1-8 characters in length, may be specified, delimited by blanks. 2. '*': Specifies that any available controller may be used - connection_value=<value>: One of the following values: CONnect: Activate the real device connection. DISCONnect: Do not activate the real device connection. - queue_memory_limit=<value>: A number between 1 and 8 specifying the QDIO buffer size in megabytes. - routing_value=<value>: Specifies whether the OSA-Express QDIO device will act as a router to the virtual switch, as follows: NONrouter: The OSA-Express device identified in real_device_address= will not act as a router to the vswitch PRIrouter: The OSA-Express device identified in real_device_address= will act as a primary router to the vswitch - port_type=<value>: Specifies the port type, ACCESS or TRUNK - persist=<value>: one of the following values: NO: The vswitch is updated on the active system, but is not updated in the permanent configuration for the system. YES: The vswitch is updated on the active system and also in the permanent configuration for the system. If not specified, the default is NO. - gvrp_value=<value>: GVRP or NOGVRP - mac_id=<value>: A unique identifier (up to six hexadecimal digits) used as part of the vswitch MAC address - uplink=<value>: One of the following: NO: The port being enabled is not the vswitch's UPLINK port. YES: The port being enabled is the vswitch's UPLINK port. - nic_userid=<value>: One of the following: 1. The userid of the port to/from which the UPLINK port will be connected or disconnected. If a userid is specified, then nic_vdev= must also be specified 2. '*': Disconnect the currently connected guest port to/from the special virtual switch UPLINK port. (This is equivalent to specifying NIC NONE on CP SET VSWITCH). - nic_vdev=<value>: The virtual device to/from which the the UPLINK port will be connected/disconnected. If this value is specified, nic_userid= must also be specified, with a userid. - lacp=<value>: One of the following values: ACTIVE: Indicates that the virtual switch will initiate negotiations with the physical switch via the link aggregation control protocol (LACP) and will respond to LACP packets sent by the physical switch. INACTIVE: Indicates that aggregation is to be performed, but without LACP. - Interval=<value>: The interval to be used by the control program (CP) when doing load balancing of conversations across multiple links in the group. This can be any of the following values: 1 - 9990: Indicates the number of seconds between load balancing operations across the link aggregation group. OFF: Indicates that no load balancing is done. - group_rdev=<value>: The real device address or the real device address and OSA Express port number of a QDIO OSA Express devcie to be affected within the link aggregation group associated with this vswitch. If using a real device and an OSA Express port number, specify the real device number followed by a period (.), the letter 'P' (or 'p'), followed by the port number as a hexadecimal number. A maximum of eight device addresses all 1-7 characters in length, may be specified, delimited by blanks. Note: If a real device address is specified, this device will be added to the link aggregation group associated with this vswitch. (The link aggregation group will be created if it does not already exist.) - iptimeout=<value>: A number between 1 and 240 specifying the length of time in minutes that a remote IP address table entry remains in the IP address table for the virtual switch. - port_isolation=<value>: ON or OFF - promiscuous=<value>: One of the following: NO: The userid or port on the grant is not authorized to use the vswitch in promiscuous mode YES: The userid or port on the grant is authorized to use the vswitch in promiscuous mode. - MAC_protect=<value>: ON, OFF or UNSPECified - VLAN_counters=<value>: ON or OFF :raises ZVMInvalidInput if: - Input parameter is invalid, refer to the error message for detail - Invalid keyword in the input dictionary :raises ZVMNetworkError if: - All kinds of xCAT call failure - Smcli call failure, refer to the error message for detail """ for k in kwargs.keys(): if k not in constants.SET_VSWITCH_KEYWORDS: raise exception.ZVMInvalidInput( msg=("switch %s changes failed, invalid keyword %s") % (vswitch_name, k)) self._networkops.set_vswitch(vswitch_name, **kwargs)
def vswitch_create(self, name, rdev=None, controller='*', connection='CONNECT', network_type='IP', router="NONROUTER", vid='UNAWARE', port_type='ACCESS', gvrp='GVRP', queue_mem=8, native_vid=1, persist=True): """ Create vswitch. :param str name: the vswitch name :param str rdev: the real device number, a maximum of three devices, all 1-4 characters in length, delimited by blanks. 'NONE' may also be specified :param str controller: the vswitch's controller, it could be the userid controlling the real device, or '*' to specifies that any available controller may be used :param str connection: - CONnect: Activate the real device connection. - DISCONnect: Do not activate the real device connection. - NOUPLINK: The vswitch will never have connectivity through the UPLINK port :param str network_type: Specifies the transport mechanism to be used for the vswitch, as follows: IP, ETHERNET :param str router: - NONrouter: The OSA-Express device identified in real_device_address= will not act as a router to the vswitch - PRIrouter: The OSA-Express device identified in real_device_address= will act as a primary router to the vswitch - Note: If the network_type is ETHERNET, this value must be unspecified, otherwise, if this value is unspecified, default is NONROUTER :param str/int vid: the VLAN ID. This can be any of the following values: UNAWARE, AWARE or 1-4094 :param str port_type: - ACCESS: The default porttype attribute for guests authorized for the virtual switch. The guest is unaware of VLAN IDs and sends and receives only untagged traffic - TRUNK: The default porttype attribute for guests authorized for the virtual switch. The guest is VLAN aware and sends and receives tagged traffic for those VLANs to which the guest is authorized. If the guest is also authorized to the natvid, untagged traffic sent or received by the guest is associated with the native VLAN ID (natvid) of the virtual switch. :param str gvrp: - GVRP: Indicates that the VLAN IDs in use on the virtual switch should be registered with GVRP-aware switches on the LAN. This provides dynamic VLAN registration and VLAN registration removal for networking switches. This eliminates the need to manually configure the individual port VLAN assignments. - NOGVRP: Do not register VLAN IDs with GVRP-aware switches on the LAN. When NOGVRP is specified VLAN port assignments must be configured manually :param int queue_mem: A number between 1 and 8, specifying the QDIO buffer size in megabytes. :param int native_vid: the native vlan id, 1-4094 or None :param bool persist: whether create the vswitch in the permanent configuration for the system :raises ZVMInvalidInput if: - Input parameter is invalid, refer to the error message for detail - The value of queue_mem or native_vid is out of the range :raises ZVMNetworkError if: - All kinds of xCAT call failure - Smcli call failure, refer to the error message for detail """ if ((queue_mem < 1) or (queue_mem > 8)): raise exception.ZVMInvalidInput( msg=("Failed to create vswitch %s: %s") % (name, 'valid query memory value should be 1-8')) if network_type.upper() == 'ETHERNET': router = None self._networkops.add_vswitch(name, rdev=rdev, controller=controller, connection=connection, network_type=network_type, router=router, vid=vid, port_type=port_type, gvrp=gvrp, queue_mem=queue_mem, native_vid=native_vid, persist=persist)
def guest_create(self, userid, vcpus, memory, disk_list=[], user_profile=CONF.zvm.user_profile): """create a vm in z/VM :param userid: (str) the userid of the vm to be created :param vcpus: (int) amount of vcpus :param memory: (int) size of memory in MB :param disk_list: (dict) a list of disks info for the guest. It has one dictionary that contain some of the below keys for each disk, the root disk should be the first element in the list, the format is: {'size': str, 'format': str, 'is_boot_disk': bool, 'disk_pool': str} In which, 'size': case insensitive, the unit can be in Megabytes (M), Gigabytes (G), or number of cylinders/blocks, eg 512M, 1g or just 2000. 'format': can be ext2, ext3, ext4, xfs. 'is_boot_disk': only root disk need to set this key. 'disk_pool': optional, if not specified, the disk will be created by using the value from configure file,the format is ECKD:eckdpoolname or FBA:fbapoolname. For example: [{'size': '1g', 'is_boot_disk': True, 'disk_pool': 'ECKD:eckdpool1'}, {'size': '200000', 'disk_pool': 'FBA:fbapool1', 'format': 'ext3'}] In this case it will create one disk 0100(in case the vdev for root disk is 0100) with size 1g from ECKD disk pool eckdpool1 for guest , then set IPL 0100 in guest's user directory, and it will create 0101 with 200000 blocks from FBA disk pool fbapool1, and formated with ext3. :param user_profile: the profile for the guest :raises ZVMInvalidInput if: - Input parameters are not proper :raises ZVMCreateVMFailed if: - All kinds of xCAT call failure - Smcli call failure, refer to the error message for detail """ if disk_list: for disk in disk_list: if not isinstance(disk, dict): errmsg = ('Invalid "disk_list" input, it should be a ' 'dictionary. Details could be found in doc.') raise exception.ZVMInvalidInput(msg=errmsg) if 'size' not in disk.keys(): errmsg = ('Invalid "disk_list" input, "size" is required ' 'for each disk.') raise exception.ZVMInvalidInput(msg=errmsg) disk_pool = disk.get('disk_pool') or CONF.zvm.disk_pool if ':' not in disk_pool or (disk_pool.split(':')[0].upper() not in ['ECKD', 'FBA']): errmsg = ("Invalid disk_pool input, it should be in format" " ECKD:eckdpoolname or FBA:fbapoolname") raise exception.ZVMInvalidInput(msg=errmsg) self._vmops.create_vm(userid, vcpus, memory, disk_list, user_profile)