#  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 security groups, 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",
            "dns1": "8.8.8.8", 
            "physical_networks": [
                {
                    "broadcastdomainrange": "Zone",
                    "name": "shared",
                    "traffictypes": [
                        {
                            "typ": "Management"
                        },
                        {
                            "typ": "Guest"
                        }
                    ],
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "VirtualRouter"
                        },
                        {
                            "broadcastdomainrange": "ZONE",
                            "name": "SecurityGroupProvider"
                        }
                    ], 
                    "isolationmethods": [
                        "VLAN"
                    ]
                }
            ], 
            "securitygroupenabled": "true", 
            "ipranges": [
                {
                    "startip": "10.0.3.100",
                    "endip": "10.0.3.199",
                    "netmask": "255.255.255.0",
                    "vlan": "1003",
                    "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": "localhost", 
        "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": "127.0.0.1", 
            "port": 8096
        }
    ]
}
