docs: def guest_create(self, userid, vcpus, memory, disk_list=None,
                       user_profile=CONF.zvm.user_profile,
                       max_cpu=CONF.zvm.user_default_max_cpu,
                       max_mem=CONF.zvm.user_default_max_memory,
                       ipl_from='', ipl_param='', ipl_loadparam=''):
          """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 and none.
                 'is_boot_disk': For root disk, this key must be set to indicate
                 the image that will be deployed on this disk.
                 '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: (str) the profile for the guest
          :param max_cpu: (int) the maximum number of virtual cpu this user can
                 define. The value should be a decimal value between 1 and 64.
          :param max_mem: (str) the maximum size of memory the user can define.
                 The value should be specified by 1-4 bits of number suffixed by
                 either M (Megabytes) or G (Gigabytes). And the number should be
                 an integer.
          :param ipl_from: (str) where to ipl the guest from, it can be given
                 by guest input param, e.g CMS.
          :param ipl_param: the param to use when IPL for as PARM
          :param ipl_loadparam: the param to use when IPL for as LOADPARM
          """
          userid = userid.upper()
          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.')
                      LOG.error(errmsg)
                      raise exception.SDKInvalidInputFormat(msg=errmsg)
                  # 'size' is required for each disk
                  if 'size' not in disk.keys():
                      errmsg = ('Invalid "disk_list" input, "size" is required '
                                'for each disk.')
                      LOG.error(errmsg)
                      raise exception.SDKInvalidInputFormat(msg=errmsg)
                  # 'disk_pool' format check
                  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")
                      LOG.error(errmsg)
                      raise exception.SDKInvalidInputFormat(msg=errmsg)
                  # 'format' value check
                  if ('format' in disk.keys()) and (disk['format'].lower() not in
                                                    ('ext2', 'ext3', 'ext4',
                                                     'xfs', 'none')):
                      errmsg = ("Invalid disk_pool input, supported 'format' "
                                "includes 'ext2', 'ext3', 'ext4', 'xfs', 'none'")
                      LOG.error(errmsg)
                      raise exception.SDKInvalidInputFormat(msg=errmsg)
  
          action = "create guest '%s'" % userid
          with zvmutils.log_and_reraise_sdkbase_error(action):
              return self._vmops.create_vm(userid, vcpus, memory, disk_list,
                                           user_profile, max_cpu, max_mem,
                                           ipl_from, ipl_param, ipl_loadparam)