blob: 5f219136b59f94fac944e58461cc6c3902461590 [file] [log] [blame]
##
## 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
##
"""
Qpid Dispatch Router management schema and config file parsing.
"""
import json
from pkgutil import get_data
from . import schema
from ..compat import JSON_LOAD_KWARGS
class QdSchema(schema.Schema):
"""
Qpid Dispatch Router management schema.
"""
CONFIGURATION_ENTITY = u"configurationEntity"
OPERATIONAL_ENTITY = u"operationalEntity"
def __init__(self):
"""Load schema."""
qd_schema = get_data('qpid_dispatch.management', 'qdrouter.json')
try:
super(QdSchema, self).__init__(**json.loads(qd_schema, **JSON_LOAD_KWARGS))
except Exception,e:
raise ValueError("Invalid schema qdrouter.json: %s" % e)
self.configuration_entity = self.entity_type(self.CONFIGURATION_ENTITY)
self.operational_entity = self.entity_type(self.OPERATIONAL_ENTITY)
def validate_full(self, entities, **kwargs):
"""
In addition to L{schema.Schema.validate}, check the following:
listeners and connectors can only have role=inter-router if the
router has mode=interior.
@param entities: List of attribute name:value maps.
@param kwargs: See L{schema.Schema.validate}
"""
entities = list(entities) # Need to traverse twice
super(QdSchema, self).validate_all(entities, **kwargs)
inter_router = not_interior = None
for e in entities:
if self.short_name(e.type) == "router" and e.mode != "interior":
not_interior = e.mode
if self.short_name(e.type) in ["listener", "connector"] and e.role == "inter-router":
inter_router = e
if not_interior and inter_router:
raise schema.ValidationError(
"role='inter-router' only allowed with router mode='interior' for %s." % inter_router)
def is_configuration(self, entity_type):
return entity_type and self.configuration_entity in entity_type.all_bases
def is_operational(self, entity_type):
return entity_type and self.operational_entity in entity_type.all_bases