/*
 *
 * 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.
 *
 */
{
  "name": "Broker",
  "modelVersion": "7.0",
  "authenticationproviders" : [ {
    "name" : "plain",
    "type" : "PlainPasswordFile",
    "path" : "${qpid.home_dir}${file.separator}etc${file.separator}passwd"
  } ],
  "keystores" : [ {
    "name" : "systestsKeyStore",
    "storeUrl" : "${qpid.home_dir}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_keystore.jks",
    "password" : "password",
    "keyStoreType": "pkcs12"
  } ],
  "truststores" : [ {
    "name" : "systestsTrustStore",
    "storeUrl" : "${qpid.home_dir}${file.separator}..${file.separator}test-profiles${file.separator}test_resources${file.separator}ssl${file.separator}java_broker_truststore.jks",
    "password" : "password",
    "trustStoreType": "pkcs12"
  } ],
  "ports" : [  {
    "name" : "amqp",
    "authenticationProvider" : "plain",
    "port" : "${test.port}",
    "protocols" : "${test.amqp_port_protocols}",
    "virtualhostaliases" : [ {
        "name" : "nameAlias",
        "type" : "nameAlias"
    }, {
        "name" : "defaultAlias",
        "type" : "defaultAlias"
    } ]
  }, {
    "name" : "http",
    "authenticationProvider" : "plain",
    "port" : "${test.hport}",
    "protocols" : [ "HTTP" ]
  }],
  "virtualhostnodes" : [ {
    "name" : "test",
    "type" : "${virtualhostnode.type}",
    "defaultVirtualHostNode" : "true",
    "storePath" : "${qpid.work_dir}${file.separator}test${file.separator}config",
    "context" : {
      "virtualhostBlueprint" : "${virtualhostnode.context.blueprint}"
    }
  } ]
}
