# Copyright (C) 2018 NTT DATA
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

"""
Schema for V3 Volumes API.

"""
import copy

from cinder.api.validation import parameter_types


create = {
    'type': 'object',
    'properties': {
        'volume': {
            'type': 'object',
            'properties': {
                'name': {'type': ['string', 'null'],
                         'format': 'name_non_mandatory_remove_white_spaces'},
                'description': {
                    'type': ['string', 'null'],
                    'format': 'description_non_mandatory_remove_white_spaces'},
                'display_name': {
                    'type': ['string', 'null'],
                    'format': 'name_non_mandatory_remove_white_spaces'},
                'display_description': {
                    'type': ['string', 'null'],
                    'format':
                        'description_non_mandatory_remove_white_spaces'},
                # volume_type accepts 'id' as well as 'name' so do lazy schema
                # validation for it.
                'volume_type': parameter_types.name_allow_zero_min_length,
                'metadata': parameter_types.metadata_allows_null,
                'snapshot_id': parameter_types.optional_uuid,
                'source_volid': parameter_types.optional_uuid,
                'consistencygroup_id': parameter_types.optional_uuid,
                'size': parameter_types.volume_size_allows_null,
                'availability_zone': parameter_types.availability_zone,
                # The functionality to create a multiattach volume by the
                # multiattach parameter is removed.
                # We accept the parameter but raise a BadRequest stating the
                # "new way" of creating multiattach volumes i.e. with a
                # multiattach volume type so users using the "old way"
                # have ease of moving into the new functionality.
                'multiattach': parameter_types.optional_boolean,
                'image_id': {'type': ['string', 'null'], 'minLength': 0,
                             'maxLength': 255},
                'imageRef': {'type': ['string', 'null'], 'minLength': 0,
                             'maxLength': 255},
            },
            'additionalProperties': True,
        },
        'OS-SCH-HNT:scheduler_hints': {
            'type': ['object', 'null']
        },
    },
    'required': ['volume'],
    'additionalProperties': False,
}

create_volume_v313 = copy.deepcopy(create)
create_volume_v313['properties']['volume']['properties'][
    'group_id'] = {'type': ['string', 'null'], 'minLength': 0,
                   'maxLength': 255}

create_volume_v347 = copy.deepcopy(create_volume_v313)
create_volume_v347['properties']['volume']['properties'][
    'backup_id'] = parameter_types.optional_uuid

create_volume_v353 = copy.deepcopy(create_volume_v347)
create_volume_v353['properties']['volume']['additionalProperties'] = False

update = {
    'type': 'object',
    'properties': {
        'volume': {
            'type': 'object',
            'properties': {
                # The 'name' and 'description' are required to be compatible
                # with v2.
                'name': {
                    'type': ['string', 'null'],
                    'format': 'name_non_mandatory_remove_white_spaces'},
                'description': {
                    'type': ['string', 'null'],
                    'format':
                        'description_non_mandatory_remove_white_spaces'},
                'display_name': {
                    'type': ['string', 'null'],
                    'format': 'name_non_mandatory_remove_white_spaces'},
                'display_description': {
                    'type': ['string', 'null'],
                    'format':
                        'description_non_mandatory_remove_white_spaces'},
                'metadata': parameter_types.extra_specs,
            },
            'additionalProperties': False,
        },
    },
    'required': ['volume'],
    'additionalProperties': False,
}

update_v353 = copy.deepcopy(update)
update_v353['properties']['volume']['anyOf'] = [
    {'required': ['name']},
    {'required': ['description']},
    {'required': ['display_name']},
    {'required': ['display_description']},
    {'required': ['metadata']}]

# TODO: Restrict additional properties in a future API version
revert = {
    'type': 'object',
    'properties': {
        'revert': {
            'type': 'object',
            'properties': {
                'snapshot_id': {
                    'type': ['string', 'null']
                },
            },
            'additionalProperties': True,
        },
    },
    'required': ['revert'],
    'additionalProperties': False,
}
