#  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": [
        {
            "name": "DevCloud0", 
            "enabled" : "True",
            "physical_networks": [
                {
                    "broadcastdomainrange": "Zone", 
                    "name": "test-network", 
                    "traffictypes": [
                        {
                            "typ": "Guest"
                        }, 
                        {
                            "typ": "Management"
                        } 
                    ], 
                    "providers": [
                        {
                            "broadcastdomainrange": "ZONE", 
                            "name": "VirtualRouter"
                        },
                        {
                            "broadcastdomainrange": "Pod",
                            "name": "SecurityGroupProvider"
                        }
                    ]
                }
            ],
            "dns2": "8.8.4.4",
            "dns1": "8.8.8.8",
            "securitygroupenabled": "true", 
            "localstorageenabled": "true",
            "networktype": "Basic", 
            "pods": [
                {
                    "endip": "192.168.56.220", 
                    "name": "test00", 
                    "startip": "192.168.56.200", 
                    "guestIpRanges": [
                        {
                            "startip": "192.168.56.100", 
                            "endip": "192.168.56.199", 
                            "netmask": "255.255.255.0", 
                            "gateway": "192.168.56.1"
                        }
                    ], 
                    "netmask": "255.255.255.0", 
                    "clusters": [
                        {
                            "clustername": "test000", 
                            "hypervisor": "XenServer", 
                            "hosts": [
                                {
                                    "username": "root", 
                                    "url": "http://192.168.56.10/", 
                                    "password": "password"
                                }
                            ], 
                            "clustertype": "CloudManaged"
                        }
                    ], 
                    "gateway": "192.168.56.1"
                }
            ], 
            "internaldns1": "192.168.56.1", 
            "secondaryStorages": [
                {
                    "url": "nfs://192.168.56.10/opt/storage/secondary",
                    "provider": "NFS",
                    "details": [ ]
                 }
            ]
         }
    ], 
    "logger": [
        {
            "name": "TestClient", 
            "file": "/tmp/testclient.log"
        }, 
        {
            "name": "TestCase", 
            "file": "/tmp/testcase.log"
        }
    ], 
    "mgtSvr": [
        {
            "mgtSvrIp": "127.0.0.1", 
            "port": 8096
        }
    ],
    "dbSvr": 
        {
	    "dbSvr": "127.0.0.1",
	    "port": 3306,
	    "user": "cloud",
	    "passwd": "cloud",
	    "db": "cloud"
        }
}
