#  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": "DevCloud-Basic-01",
            "enabled": "True",
            "physical_networks": [
                {
                    "broadcastdomainrange": "Zone",
                    "name": "Devcloud-Network-01",
                    "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.22.220",
                    "name": "DevCloud-POD-01",
                    "startip": "192.168.22.200",
                    "guestIpRanges": [
                        {
                            "startip": "192.168.22.100",
                            "endip": "192.168.22.199",
                            "netmask": "255.255.255.0",
                            "gateway": "192.168.22.5"
                        }
                    ],
                    "netmask": "255.255.255.0",
                    "clusters": [
                        {
                            "clustername": "DevCloud-CLUSTER-01",
                            "hypervisor": "XenServer",
                            "hosts": [
                                {
                                    "username": "root",
                                    "url": "http://192.168.22.10/",
                                    "password": "password"
                                }
                            ],
                            "clustertype": "CloudManaged"
                        }
                    ],
                    "gateway": "192.168.22.5"
                }
            ],
            "internaldns1": "8.8.8.8",
            "secondaryStorages": [
                {
                    "url": "nfs://192.168.22.5/exports/secondary",
                    "provider": "NFS"
                }
            ]
        }
    ],
    "logger": {
        "LogFolderPath": "/tmp/"
    },
    "mgtSvr": [
        {
            "mgtSvrIp": "<%= @management_server_ip %>",
            "port": <%= @management_server_port %>
        }
    ],
    "dbSvr": {
        "dbSvr": "<%= @database_server_ip %>",
        "port": <%= @database_server_port %>,
        "user": "<%= @database_user %>",
        "passwd": "<%= @database_password %>",
        "db": "<%= @database %>"
    }
}
