#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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.
#


{
    "zones": [
        {
            "localstorageenabled": "true",
            "name": "testzone",
            "guestcidraddress": "10.1.1.0/24",
            "dns1": "8.8.8.8",
            "physical_networks": [
                {
                    "broadcastdomainrange": "Zone",
                    "vlan": "3900-4000",
                    "name": "eth0",
                    "traffictypes": [
                        {
                            "kvm": "cloudbr0",
                            "typ": "Management"
                        },
                        {
                            "kvm": "cloudbr0",
                            "typ": "Guest"
                        }
                    ],
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "VirtualRouter"
                        },
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "VpcVirtualRouter"
                        },
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "InternalLbVm"
                        }
                    ]
                },
                {
                    "broadcastdomainrange": "Zone",
                    "name": "eth1",
                    "traffictypes": [
                        {
                            "kvm": "cloudbr1",
                            "typ": "Public"
                        }
                    ],
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "VirtualRouter"
                        }
                    ]
                }
            ],
            "ipranges": [
                {
                    "startip": "192.168.100.100",
                    "endip": "192.168.100.199",
                    "netmask": "255.255.255.0",
                    "vlan": "untagged",
                    "gateway": "192.168.100.1"
                }
            ],
            "networktype": "Advanced",
            "pods": [
                {
                    "endip": "172.17.10.199",
                    "name": "testpod",
                    "startip": "172.17.10.100",
                    "netmask": "255.255.255.0",
                    "clusters": [
                        {
                            "clustername": "testcluster",
                            "hypervisor": "KVM",
                            "hosts": [
                                {
                                    "username": "root",
                                    "url": "http://172.17.10.10/",
                                    "password": "password"
                                }
                            ],
                            "clustertype": "CloudManaged"
                        }
                    ],
                    "gateway": "172.17.10.1"
                }
            ],
            "internaldns1": "8.8.4.4",
            "secondaryStorages": [
                {
                    "url": "nfs://172.17.10.10:/nfs/secondary",
                    "provider": "NFS"
                }
            ]
        }
    ],
    "dbSvr": {
        "dbSvr": "127.0.0.1",
        "passwd": "cloud",
        "db": "cloud",
        "port": 3306,
        "user": "cloud"
    },
    "logger": [
        {
            "name": "TestClient",
            "file": "/var/log/testclient.log"
        },
        {
            "name": "TestCase",
            "file": "/var/log/testcase.log"
        }
    ],
    "mgtSvr": [
        {
            "mgtSvrIp": "172.17.10.10",
            "port": 8096,
            "hypervisor": "kvm"
        }
    ]
}
