#  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",
                    "provider": "NFS",
                    "details": [ ]
                }
            ]
        }
    ],
    "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
        }
    ]
}
