#  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.
#
# This config is designed to run as an advanced network, with management server in devcloud
# It also requires an 'apt-get install dnsmasq' to run a resolver in devcloud for internal dns

{
    "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": [
                        {
                            "xen": "Pool-wide network associated with eth0", 
                            "typ": "Management"
                        }, 
                        {
                            "xen": "Pool-wide network associated with eth0", 
                            "typ": "Guest"
                        }
                    ],
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE", 
                            "name": "VirtualRouter"
                        }, 
                        {
                            "broadcastdomainrange": "ZONE", 
                            "name": "VpcVirtualRouter"
                        }
                    ]
                }, 
                {
                    "broadcastdomainrange": "Zone", 
                    "name": "eth1", 
                    "traffictypes": [
                        {
                            "xen": "Pool-wide network associated with eth1", 
                            "typ": "Public"
                        }
                    ], 
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE", 
                            "name": "VirtualRouter"
                        }
                    ]
                }
            ], 
            "ipranges": [
                {
                    "startip": "10.0.3.100", 
                    "endip": "10.0.3.199", 
                    "netmask": "255.255.255.0", 
                    "vlan": "untagged", 
                    "gateway": "10.0.3.2"
                }
            ], 
            "networktype": "Advanced", 
            "pods": [
                {
                    "endip": "192.168.56.249", 
                    "name": "testpod", 
                    "startip": "192.168.56.200", 
                    "netmask": "255.255.255.0", 
                    "clusters": [
                        {
                            "clustername": "testcluster", 
                            "hypervisor": "XenServer", 
                            "hosts": [
                                {
                                    "username": "root", 
                                    "url": "http://192.168.56.10/", 
                                    "password": "password"
                                }
                            ], 
                            "clustertype": "CloudManaged"
                        }
                    ], 
                    "gateway": "192.168.56.1"
                }
            ], 
            "internaldns1": "192.168.56.10", 
            "secondaryStorages": [
                {
                    "url": "nfs://192.168.56.10:/opt/storage/secondary"
                }
            ]
        }
    ], 
    "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": "192.168.56.10", 
            "port": 8096
        }
    ],
    "globalConfig": [
        {
            "name": "host",
            "value": "192.168.56.10"
        }
    ]
}
