# Copyright 2015 OpenStack Foundation
# 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.

_doc_url = "https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html"  # noqa
# NOTE(flaper87): Keep a copy of the current default schema so that
# we can react on cases where there's no connection to an OpenStack
# deployment. See #1481729
_BASE_SCHEMA = {
    "additionalProperties": {
        "type": "string"
    },
    "name": "image",
    "links": [{
        "href": "{self}",
        "rel": "self"
    }, {
        "href": "{file}",
        "rel": "enclosure"
    }, {
        "href": "{schema}",
        "rel": "describedby"
    }],
    "properties": {
        "container_format": {
            "enum": [None, "ami", "ari", "aki", "bare", "ovf", "ova",
                     "docker"],
            "type": ["null", "string"],
            "description": "Format of the container"
        },
        "min_ram": {
            "type": "integer",
            "description": "Amount of ram (in MB) required to boot image."
        },
        "ramdisk_id": {
            "pattern": ("^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}"
                        "-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}"
                        "-([0-9a-fA-F]){12}$"),
            "type": ["null", "string"],
            "description": ("ID of image stored in Glance that should be "
                            "used as the ramdisk when booting an AMI-style "
                            "image."),
            "is_base": False
        },
        "locations": {
            "items": {
                "required": ["url", "metadata"],
                "type": "object",
                "properties": {
                    "url": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "metadata": {
                        "type": "object"
                    }
                }
            },
            "type": "array",
            "description": ("A set of URLs to access the image "
                            "file kept in external store")
        },
        "file": {
            "readOnly": True,
            "type": "string",
            "description": "An image file url"
        },
        "owner": {
            "type": ["null", "string"],
            "description": "Owner of the image",
            "maxLength": 255
        },
        "id": {
            "pattern": ("^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}"
                        "-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}"
                        "-([0-9a-fA-F]){12}$"),
            "type": "string",
            "description": "An identifier for the image"
        },
        "size": {
            "readOnly": True,
            "type": ["null", "integer"],
            "description": "Size of image file in bytes"
        },
        "os_distro": {
            "type": "string",
            "description": ("Common name of operating system distribution "
                            "as specified in %s" % _doc_url),
            "is_base": False
        },
        "self": {
            "readOnly": True,
            "type": "string",
            "description": "An image self url"
        },
        "disk_format": {
            "enum": [None, "ami", "ari", "aki", "vhd", "vhdx", "vmdk", "raw",
                     "qcow2", "vdi", "iso", "ploop"],
            "type": ["null", "string"],
            "description": "Format of the disk"
        },
        "os_version": {
            "type": "string",
            "description": "Operating system version as specified by the"
                           " distributor",
            "is_base": False
        },
        "direct_url": {
            "readOnly": True,
            "type": "string",
            "description": "URL to access the image file kept in external"
                           " store"
        },
        "schema": {
            "readOnly": True,
            "type": "string",
            "description": "An image schema url"
        },
        "status": {
            "readOnly": True,
            "enum": ["queued", "saving", "active", "killed",
                     "deleted", "uploading", "importing",
                     "pending_delete", "deactivated"],
            "type": "string",
            "description": "Status of the image"
        },
        "tags": {
            "items": {
                "type": "string",
                "maxLength": 255
            },
            "type": "array",
            "description": "List of strings related to the image"
        },
        "kernel_id": {
            "pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F])"
                       "{4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
            "type": ["null", "string"],
            "description": "ID of image stored in Glance that should be "
                           "used as the kernel when booting an "
                           "AMI-style image.",
            "is_base": False
        },
        "visibility": {
            "enum": ["public", "private", "community", "shared"],
            "type": "string",
            "description": "Scope of image accessibility"
        },
        "updated_at": {
            "readOnly": True,
            "type": "string",
            "description": "Date and time of the last image modification"
        },
        "min_disk": {
            "type": "integer",
            "description": "Amount of disk space (in GB) required to boot "
                           "image."
        },
        "virtual_size": {
            "readOnly": True,
            "type": ["null", "integer"],
            "description": "Virtual size of image in bytes"
        },
        "instance_uuid": {
            "type": "string",
            "description": "Metadata which can be used to record which "
                           "instance this image is associated with. "
                           "(Informational only, does not create an "
                           "instance snapshot.)",
            "is_base": False
        },
        "name": {
            "type": ["null", "string"],
            "description": "Descriptive name for the image",
            "maxLength": 255
        },
        "checksum": {
            "readOnly": True,
            "type": ["null", "string"],
            "description": "md5 hash of image contents.",
            "maxLength": 32
        },
        "os_hash_algo": {
            "readOnly": True,
            "type": ["null", "string"],
            "description": "Algorithm to calculate os_hash_value",
            "maxLength": 32
        },
        "os_hash_value": {
            "readOnly": True,
            "type": ["null", "string"],
            "description": "Hexdigest of the image contents using the "
                           "algorithm specified by the os_hash_algo",
            "maxLength": 32
        },
        "created_at": {
            "readOnly": True,
            "type": "string",
            "description": "Date and time of image registration"
        },
        "protected": {
            "type": "boolean",
            "description": "If true, image will not be deletable."
        },
        "os_hidden": {
            "type": "boolean",
            "description": "If true, image will not appear in default "
                           "image list response."
        },
        "architecture": {
            "type": "string",
            "description": ("Operating system architecture as specified "
                            "in %s" % _doc_url),
            "is_base": False
        }
    }
}