#  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 configuration is meant for running advanced networking, with management server on the laptop. 
# It requires that the user run a DNS resolver within devcloud via 'apt-get install dnsmasq'

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