{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "properties": {
        "type": {
            "type": "string",
            "description": "The service type (should always be 'ecs')",
            "pattern": "^ecs$",
            "errorMessage": "Must be 'ecs'"
        },
        "containers": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "errorMessage": "Must be a string"
                    },
                    "image_name": {
                        "type": "string",
                        "errorMessage": "Must be a sting"
                    },
                    "port_mappings": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "errorMessage": "Must be a list of integers"
                    },
                    "max_mb": {
                        "type": "integer",
                        "errorMessage": "Must be an integer in the 'containers' section"
                    },
                    "cpu_units": {
                        "type": "integer",
                        "errorMessage": "Must be an integer in the 'containers' section"
                    },
                    "links": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "errorMessage": "Must be a list of strings"
                    },
                    "routing": {
                        "type": "object",
                        "properties": {
                            "base_path": {
                                "type": "string",
                                "errorMessage": "Must be a string"
                            },
                            "health_check_path": {
                                "type": "string",
                                "errorMessage": "Must be a string"
                            }
                        },
                        "required": [
                            "base_path"
                        ],
                        "additionalProperties": false,
                        "errorMessage": {
                            "required": {
                                "base_path": "The 'base_path' parameter is required"
                            },
                            "additionalProperties": "Invalid/Unknown property specified"
                        }
                    },
                    "environment_variables": {
                        "type": "object",
                        "patternProperties": {
                            "^.*$": {
                                "anyOf": [
                                    {"type": "string"},
                                    {"type": "number"},
                                    {"type": "boolean"}
                                ]
                            }
                        },
                        "errorMessage": "Must contain 1 or more simple key/value pairs where the values are strings or numbers",
                        "additionalProperties": false
                    }
                },
                "required": [
                    "name"
                ],
                "additionalProperties": false,
                "errorMessage": {
                    "required": {
                        "name": "The 'name' parameter is required in each container"
                    },
                    "additionalProperties": "Invalid/Unknown property specified"
                }
            }
        },
        "auto_scaling": {
            "type": "object",
            "properties": {
                "min_tasks": {
                    "type": "integer",
                    "errorMessage": "Must be a integer"
                },
                "max_tasks": {
                    "type": "integer",
                    "errorMessage": "Must be a integer"
                },
                "scaling_policies": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "type": {
                                "type": "string",
                                "description": "The 'type' field must be either 'up' or 'down'",
                                "pattern": "^up|down$",
                                "errorMessage": "Must be 'up' or 'down'"
                            },
                            "adjustment": {
                                "type": "object",
                                "properties": {
                                    "type": {
                                        "type": "string",
                                        "errorMessage": "Must be a string"
                                    },
                                    "value": {
                                        "type": "number",
                                        "errorMessage": "Must be a number"
                                    },
                                    "cooldown": {
                                        "type": "number",
                                        "errorMessage": "Must be a number"
                                    }
                                },
                                "required": [
                                    "value"
                                ],
                                "additionalProperties": false,
                                "errorMessage": {
                                    "required": {
                                        "value": "The 'value' field is required"
                                    },
                                    "additionalProperties": "Invalid/Unknown property specified"
                                }
                            },
                            "alarm": {
                                "type": "object",
                                "properties": {
                                    "namespace": {
                                        "type": "string",
                                        "errorMessage": "Must be a string"
                                    },
                                    "dimensions": {
                                        "type": "object",
                                        "patternProperties": {
                                            "^.*$": {
                                                "anyOf": [
                                                    {"type": "string"},
                                                    {"type": "number"}
                                                ]
                                            }
                                        },
                                        "errorMessage": "Must contain 1 or more simple key/value pairs where the values are strings or numbers",
                                        "additionalProperties": false
                                    },
                                    "metric_name": {
                                        "type": "string",
                                        "errorMessage": "Must be a string"
                                    },
                                    "comparison_operator": {
                                        "type": "string",
                                        "errorMessage": "Must be a string"
                                    },
                                    "threshold": {
                                        "type": "number",
                                        "errorMessage": "Must be a number"
                                    },
                                    "period": {
                                        "type": "number",
                                        "errorMessage": "Must be a number"
                                    },
                                    "evaluation_periods": {
                                        "type": "number",
                                        "errorMessage": "Must be a number"
                                    }
                                },
                                "required": [
                                    "metric_name",
                                    "comparison_operator",
                                    "threshold"
                                ],
                                "additionalProperties": false,
                                "errorMessage": {
                                    "required": {
                                        "metric_name": "The 'metric_name' field is required",
                                        "comparison_operator": "The 'comparison_operator' field is required",
                                        "threshold": "The 'threshold' field is required"
                                    },
                                    "additionalProperties": "Invalid/Unknown property specified"
                                }
                            }
                        },
                        "required": [
                            "type",
                            "adjustment",
                            "alarm"
                        ],
                        "additionalProperties": false,
                        "errorMessage": {
                            "required": {
                                "type": "The 'type' field is required",
                                "adjustment": "The 'adjustment' field is required",
                                "alarm": "The 'alarm' field is required"
                            },
                            "additionalProperties": "Invalid/Unknown property specified"
                        }
                    }
                }
            },
            "required": [
                "min_tasks",
                "max_tasks"
            ],
            "additionalProperties": false,
            "errorMessage": {
                "required": {
                    "min_tasks": "The 'min_tasks' field is required",
                    "max_tasks": "The 'max_tasks' field is required"
                },
                "additionalProperties": "Invalid/Unknown property specified"
            }
        },
        "cluster": {
            "type": "object",
            "properties": {
                "key_name": {
                    "type": "string",
                    "errorMessage": "Must be a string"
                },
                "instance_type": {
                    "type": "string",
                    "errorMessage": "Must be a string"
                }
            },
            "additionalProperties": false,
            "errorMessage": {
                "additionalProperties": "Invalid/Unknown property specified"
            }
        },
        "load_balancer": {
            "type": "object",
            "properties": {
                "type": {
                    "type": "string",
                    "description": "The accepted values are 'http' and 'https'",
                    "pattern": "^http|https$",
                    "errorMessage": "Must be 'http' or 'https'"
                },
                "timeout": {
                    "type": "integer",
                    "errorMessage": "Must be an integer"
                },
                "https_certificate": {
                    "type": "string",
                    "errorMessage": "Must be a string"
                },
                "dns_names": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "errorMessage": "Must be an array of strings"
                },
                "health_check_grace_period": {
                    "type": "integer",
                    "errorMessage": "Must be an integer"
                }
            },
            "required": [
                "type"
            ],
            "additionalProperties": false,
            "errorMessage": {
                "required": {
                    "type": "The 'type' field is required"
                },
                "additionalProperties": "Invalid/Unknown property specified"
            }
        },
        "logging": {
            "type": "string",
            "description": "The 'logging' field can be either 'enabled' or 'disabled'",
            "pattern": "^enabled|disabled$",
            "errorMessage": "Must be either 'enabled' or 'disabled'"
        },
        "log_retention_in_days": {
            "type": "number",
            "errorMessage": "Must be a number"
        },
        "tags": {
            "type": "object",
            "description": "An arbitrary list of key/value pairs to be added as tags to the service",
            "patternProperties": {
                "^.*$": {
                    "anyOf": [
                        {"type": "string"},
                        {"type": "number"}
                    ]
                }
            },
            "errorMessage": "Must contain 1 or more simple key/value pairs where the values are strings or numbers",
            "additionalProperties": false
        },
        "dependencies": {
            "type": "array",
            "items": {
                "type": "string",
                "errorMessage": "Each must be a string"
            },
            "errorMessage": "Must be a string"
        }
    },
    "required": [
        "type",
        "containers",
        "auto_scaling"
    ],
    "additionalProperties": false,
    "errorMessage": {
        "required": {
            "type": "The 'type' field is required",
            "containers": "The 'containers' field is required",
            "auto_scaling": "The 'auto_scaling' field is required"
        },
        "additionalProperties": "Invalid/Unknown property specified"
    }
}