#  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": "QuickCloud00", 
            "enabled" : "True",
            "details" : [
                    {"key" : "enable.secstorage.vm", "value": "False"},
                    {"key" : "enable.consoleproxy.vm", "value": "False"}
            ],
            "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", 
            "networkofferingname": "QuickCloudNoServices", 
            "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"
                }
            ]
        }
    ],
    "logger":
    {
            "LogFolderPath": "/tmp/"
    },
    "mgtSvr": [
        {
            "mgtSvrIp": "127.0.0.1", 
            "port": 8096
        }
    ],
    "dbSvr": 
        {
	    "dbSvr": "127.0.0.1",
	    "port": 3306,
	    "user": "cloud",
	    "passwd": "cloud",
	    "db": "cloud"
        }
}
