'Create volume
:return: r[\'data\']'

def _execute_create_vol(self, volume, pool_name, reserve, protocol, is_gst_enabled):

    volume_size = (volume['size'] * units.Ki)
    reserve_size = (100 if reserve else 0)
    display_list = [getattr(volume, 'display_name', ''), getattr(volume, 'display_description', '')]
    description = ':'.join(filter(None, display_list))
    description = description[:254]
    pool_id = self.get_pool_id(pool_name)
    specs = self._get_volumetype_extraspecs(volume)
    extra_specs_map = self._get_extra_spec_values(specs)
    perf_policy_name = extra_specs_map[EXTRA_SPEC_PERF_POLICY]
    perf_policy_id = self.get_performance_policy_id(perf_policy_name)
    encrypt = extra_specs_map[EXTRA_SPEC_ENCRYPTION]
    multi_initiator = extra_specs_map[EXTRA_SPEC_MULTI_INITIATOR]
    folder_name = extra_specs_map[EXTRA_SPEC_FOLDER]
    iops_limit = extra_specs_map[EXTRA_SPEC_IOPS_LIMIT]
    dedupe = extra_specs_map[EXTRA_SPEC_DEDUPE]
    cipher = DEFAULT_CIPHER
    if (encrypt.lower() == 'yes'):
        cipher = AES_256_XTS_CIPHER
    if (is_gst_enabled is True):
        agent_type = AGENT_TYPE_OPENSTACK_GST
    else:
        agent_type = AGENT_TYPE_OPENSTACK
    LOG.debug('Creating    a    new    volume=%(vol)s    size=%(size)s    reserve=%(reserve)s    in    pool=%(pool)s    description=%(description)s    with    Extra    Specs    perfpol-name=%(perfpol-name)s    encryption=%(encryption)s    cipher=%(cipher)s    agent-type=%(agent-type)s    multi-initiator=%(multi-initiator)s', {'vol': volume['name'], 'size': volume_size, 'reserve': reserve_size, 'pool': pool_name, 'description': description, 'perfpol-name': perf_policy_name, 'encryption': encrypt, 'cipher': cipher, 'agent-type': agent_type, 'multi-initiator': multi_initiator})
    data = {'data': {'name': volume['name'], 'description': description, 'size': volume_size, 'reserve': reserve_size, 'warn_level': int(WARN_LEVEL), 'limit': 100, 'snap_limit': DEFAULT_SNAP_QUOTA, 'online': True, 'pool_id': pool_id, 'agent_type': agent_type, 'perfpolicy_id': perf_policy_id, 'encryption_cipher': cipher}}
    if (protocol == 'iSCSI'):
        data['data']['multi_initiator'] = multi_initiator
    if (dedupe.lower() == 'true'):
        data['data']['dedupe_enabled'] = True
    folder_id = None
    if (folder_name is not None):
        pool_info = self.get_pool_info(pool_id)
        if (('folder_list' in pool_info) and (pool_info['folder_list'] is not None)):
            for folder_list in pool_info['folder_list']:
                LOG.debug('folder_list    :    %s', folder_list)
                if (folder_list['fqn'] == ('/' + folder_name)):
                    LOG.debug('Folder    %(folder)s    present    in    pool    %(pool)s', {'folder': folder_name, 'pool': pool_name})
                    folder_id = self.get_folder_id(folder_name)
                    if (folder_id is not None):
                        data['data']['folder_id'] = folder_id
            if (folder_id is None):
                raise NimbleAPIException((_("Folder    '%(folder)s'    not    present    in    pool    '%(pool)s'") % {'folder': folder_name, 'pool': pool_name}))
        else:
            raise NimbleAPIException((_("Folder    '%(folder)s'    not    present    in    pool    '%(pool)s'") % {'folder': folder_name, 'pool': pool_name}))
    if (iops_limit is not None):
        if ((not iops_limit.isdigit()) or (int(iops_limit) < MIN_IOPS) or (int(iops_limit) > MAX_IOPS)):
            raise NimbleAPIException((_('%(err)s    [%(min)s,    %(max)s]') % {'err': IOPS_ERR_MSG, 'min': MIN_IOPS, 'max': MAX_IOPS}))
        data['data']['limit_iops'] = iops_limit
    LOG.debug('Volume    metadata    :%s', volume.metadata)
    for (key, value) in volume.metadata.items():
        LOG.debug('Key    %(key)s    Value    %(value)s', {'key': key, 'value': value})
        if ((key == EXTRA_SPEC_IOPS_LIMIT) and value.isdigit()):
            if ((type(value) == int) or (int(value) < MIN_IOPS) or (int(value) > MAX_IOPS)):
                raise NimbleAPIException((_('%(err)s    [%(min)s,    %(max)s]') % {'err': IOPS_ERR_MSG, 'min': MIN_IOPS, 'max': MAX_IOPS}))
            LOG.debug('IOPS    Limit    %s', value)
            data['data']['limit_iops'] = value
    LOG.debug('Data    :    %s', data)
    api = 'volumes'
    r = self.post(api, data)
    return r['data']
