#  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"
        }
    ]
}
