def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None):
    check_policy(context, 'create')
    if (snapshot is not None):
        if (snapshot['status'] != 'available'):
            msg = _('status must be available')
            raise exception.InvalidSnapshot(reason=msg)
        if (not size):
            size = snapshot['volume_size']
        snapshot_id = snapshot['id']
    else:
        snapshot_id = None

    def as_int(s):
        try:
            return int(s)
        except ValueError:
            return s
    size = as_int(size)
    if ((not isinstance(size, int)) or (size <= 0)):
        msg = (_("Volume size '%s' must be an integer and greater than 0") % size)
        raise exception.InvalidInput(reason=msg)
    if (quota.allowed_volumes(context, 1, size) < 1):
        pid = context.project_id
        LOG.warn((_('Quota exceeded for %(pid)s, tried to create %(size)sG volume') % locals()))
        raise exception.QuotaError(code='VolumeSizeTooLarge')
    if image_id:
        image_meta = self.image_service.show(context, image_id)
        image_size_in_gb = (int(image_meta['size']) / GB)
        if (image_size_in_gb > size):
            msg = _('Size of specified image is larger than volume size.')
            raise exception.InvalidInput(reason=msg)
    if (availability_zone is None):
        availability_zone = FLAGS.storage_availability_zone
    if (volume_type is None):
        volume_type_id = None
    else:
        volume_type_id = volume_type.get('id', None)
    options = {'size': size, 'user_id': context.user_id, 'project_id': context.project_id, 'snapshot_id': snapshot_id, 'availability_zone': availability_zone, 'status': 'creating', 'attach_status': 'detached', 'display_name': name, 'display_description': description, 'volume_type_id': volume_type_id, 'metadata': metadata}
    volume = self.db.volume_create(context, options)
    rpc.cast(context, FLAGS.scheduler_topic, {'method': 'create_volume', 'args': {'topic': FLAGS.volume_topic, 'volume_id': volume['id'], 'snapshot_id': volume['snapshot_id'], 'image_id': image_id}})
    return volume
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None):
    check_policy(context, 'create')
    if (snapshot is not None):
        if (snapshot['status'] != 'available'):
            msg = _('status must be available')
            raise exception.InvalidSnapshot(reason=msg)
        if (not size):
            size = snapshot['volume_size']
        snapshot_id = snapshot['id']
    else:
        snapshot_id = None

    def as_int(s):
        try:
            return int(s)
        except ValueError:
            return s
    size = as_int(size)
    if ((not isinstance(size, int)) or (size <= 0)):
        msg = (_("Volume size '%s' must be an integer and greater than 0") % size)
        raise exception.InvalidInput(reason=msg)
    if (quota.allowed_volumes(context, 1, size) < 1):
        pid = context.project_id
        LOG.warn((_('Quota exceeded for %(pid)s, tried to create %(size)sG volume') % locals()))
        raise exception.QuotaError(code='VolumeSizeTooLarge')
    if image_id:
        image_meta = self.image_service.show(context, image_id)
        image_size_in_gb = (int(image_meta['size']) / GB)
        if (image_size_in_gb > size):
            msg = _('Size of specified image is larger than volume size.')
            raise exception.InvalidInput(reason=msg)
    if (availability_zone is None):
        availability_zone = FLAGS.storage_availability_zone
    if (volume_type is None):
        volume_type_id = None
    else:
        volume_type_id = volume_type.get('id', None)
    options = {'size': size, 'user_id': context.user_id, 'project_id': context.project_id, 'snapshot_id': snapshot_id, 'availability_zone': availability_zone, 'status': 'creating', 'attach_status': 'detached', 'display_name': name, 'display_description': description, 'volume_type_id': volume_type_id, 'metadata': metadata}
    volume = self.db.volume_create(context, options)
    rpc.cast(context, FLAGS.scheduler_topic, {'method': 'create_volume', 'args': {'topic': FLAGS.volume_topic, 'volume_id': volume['id'], 'snapshot_id': volume['snapshot_id'], 'image_id': image_id}})
    return volume