{
    "additionalProperties": false,
    "definitions": {
        "backendType": {
            "additionalProperties": false,
            "properties": {
                "healthMonitors": {
                    "items": {
                        "$ref": "#/definitions/healthMonitorType"
                    },
                    "type": "array"
                },
                "serviceName": {
                    "minLength": 1,
                    "type": "string"
                },
                "servicePort": {
                    "$ref": "#/definitions/portType"
                }
            },
            "required": [
                "serviceName",
                "servicePort"
            ],
            "type": "object"
        },
        "frontendIAppType": {
            "additionalProperties": false,
            "properties": {
                "iapp": {
                    "minLength": 1,
                    "type": "string"
                },
                "iappOptions": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^[a-zA-Z0-9_-]+$": {
                            "minLength": 1,
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "iappPoolMemberTable": {
                    "additionalProperties": false,
                    "properties": {
                        "columns": {
                            "items": {
                                "oneOf": [
                                    {
                                        "$ref": "#/definitions/iappAddressType"
                                    },
                                    {
                                        "$ref": "#/definitions/iappPortType"
                                    },
                                    {
                                        "$ref": "#/definitions/iappValueType"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        "name": {
                            "minLength": 1,
                            "type": "string"
                        }
                    },
                    "required": [
                        "name",
                        "columns"
                    ],
                    "type": "object"
                },
                "iappTables": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^[a-zA-Z0-9_-]+$": {
                            "$ref": "#/definitions/iappTableType"
                        }
                    },
                    "type": "object"
                },
                "iappVariables": {
                    "additionalProperties": false,
                    "patternProperties": {
                        "^[a-zA-Z0-9_-]+$": {
                            "minLength": 1,
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "partition": {
                    "minLength": 1,
                    "type": "string"
                }
            },
            "required": [
                "partition",
                "iapp",
                "iappOptions",
                "iappVariables",
                "iappPoolMemberTable"
            ],
            "type": "object"
        },
        "frontendVSType": {
            "additionalProperties": false,
            "properties": {
                "balance": {
                    "minLength": 1,
                    "type": "string"
                },
                "mode": {
                    "enum": [
                        "http",
                        "tcp",
                        "udp"
                    ],
                    "type": "string"
                },
                "partition": {
                    "minLength": 1,
                    "type": "string"
                },
                "sslProfile": {
                    "$ref": "#/definitions/sslProfileType"
                },
                "virtualAddress": {
                    "$ref": "#/definitions/virtualAddressType"
                }
            },
            "required": [
                "partition"
            ],
            "type": "object"
        },
        "healthMonitorType": {
            "additionalProperties": false,
            "properties": {
                "interval": {
                    "maximum": 86400,
                    "minimum": 1,
                    "type": "integer"
                },
                "protocol": {
                    "enum": [
                        "http",
                        "tcp",
                        "udp"
                    ],
                    "type": "string"
                },
                "recv": {
                    "minLength": 1,
                    "type": "string"
                },
                "send": {
                    "minLength": 1,
                    "type": "string"
                },
                "timeout": {
                    "maximum": 86400,
                    "minimum": 1,
                    "type": "integer"
                }
            },
            "required": [
                "protocol"
            ],
            "type": "object"
        },
        "iappAddressType": {
            "additionalProperties": false,
            "properties": {
                "kind": {
                    "enum": [
                        "IPAddress"
                    ],
                    "type": "string"
                },
                "name": {
                    "minLength": 1,
                    "type": "string"
                }
            },
            "required": [
                "name",
                "kind"
            ],
            "type": "object"
        },
        "iappPortType": {
            "additionalProperties": false,
            "properties": {
                "kind": {
                    "enum": [
                        "Port"
                    ],
                    "type": "string"
                },
                "name": {
                    "minLength": 1,
                    "type": "string"
                }
            },
            "required": [
                "name",
                "kind"
            ],
            "type": "object"
        },
        "iappTableType": {
            "additionalProperties": false,
            "properties": {
                "columns": {
                    "items": {
                        "minLength": 1,
                        "type": "string"
                    },
                    "minItems": 1,
                    "type": "array"
                },
                "rows": {
                    "items": {
                        "items": {
                            "type": "string"
                        },
                        "type": "array"
                    },
                    "type": "array"
                }
            },
            "required": [
                "columns",
                "rows"
            ],
            "type": "object"
        },
        "iappValueType": {
            "additionalProperties": false,
            "properties": {
                "name": {
                    "minLength": 1,
                    "type": "string"
                },
                "value": {
                    "minLength": 1,
                    "type": "string"
                }
            },
            "required": [
                "name",
                "value"
            ],
            "type": "object"
        },
        "portType": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer"
        },
        "sslProfileType": {
            "oneOf": [
                {
                    "properties": {
                        "f5ProfileNames": {
                            "items": {
                                "minLength": 1,
                                "type": "string"
                            },
                            "type": "array"
                        }
                    },
                    "required": [
                        "f5ProfileNames"
                    ]
                },
                {
                    "additionalProperties": false,
                    "properties": {
                        "f5ProfileName": {
                            "minLength": 1,
                            "type": "string"
                        }
                    }
                }
            ],
            "type": "object"
        },
        "virtualAddressType": {
            "additionalProperties": false,
            "properties": {
                "bindAddr": {
                    "anyOf": [
                        {
                            "format": "bigipv4"
                        },
                        {
                            "format": "bigipv6"
                        }
                    ]
                },
                "port": {
                    "$ref": "#/definitions/portType"
                }
            },
            "required": [
                "port"
            ],
            "type": "object"
        }
    },
    "properties": {
        "virtualServer": {
            "additionalProperties": false,
            "properties": {
                "backend": {
                    "$ref": "#/definitions/backendType"
                },
                "frontend": {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/frontendIAppType"
                        },
                        {
                            "$ref": "#/definitions/frontendVSType"
                        }
                    ]
                }
            },
            "required": [
                "backend",
                "frontend"
            ],
            "type": "object"
        }
    },
    "required": [
        "virtualServer"
    ],
    "type": "object"
}