blob: 94661cf6b9070b2ce00ef28f04e14578ffb842b8 [file] [log] [blame]
#!/usr/bin/env python
# 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.
#
# Verify managment objects are consistent in a cluster.
# Arguments: url of one broker in the cluster.
import qmf.console, sys, re
class Session(qmf.console.Session):
"""A qmf.console.Session that caches useful values"""
def __init__(self):
qmf.console.Session.__init__(self)
self.classes = None
def all_classes(self):
if self.classes is None:
self.classes = [c for p in self.getPackages() for c in self.getClasses(p)]
return self.classes
class Broker:
def __init__(self, url, qmf):
self.url = url
self.qmf = qmf
self.broker = self.qmf.addBroker(url)
self.broker._waitForStable()
self.objects = None
self.ignore_list = [ re.compile("org.apache.qpid.broker:system:") ]
def get_objects(self):
def ignore(name):
for m in self.ignore_list:
if m.match(name): return True
if self.objects is None:
obj_list = []
ignored=0
for c in self.qmf.all_classes():
for o in self.qmf.getObjects(_key=c, _broker=self.broker):
name=o.getObjectId().getObject()
if not ignore(name): obj_list.append(name)
else: ignored += 1
self.objects = set(obj_list)
if (len(obj_list) != len(self.objects)):
raise Exception("Duplicates in object list for %s"%(self.url))
print "%d objects on %s, ignored %d."%(len(self.objects), self.url, ignored)
return self.objects
def compare(self,other):
def compare1(x,y):
diff = x.get_objects() - y.get_objects()
if diff:
print "ERROR: found on %s but not %s"%(x, y)
for o in diff: print " %s"%(o)
return False
return True
so = compare1(self, other)
os = compare1(other, self)
return so and os
def __str__(self): return self.url
def get_cluster(self):
"""Given one Broker, return list of all brokers in its cluster"""
clusters = self.qmf.getObjects(_class="cluster")
if not clusters: raise ("%s is not a cluster member"%(self.url))
def first_address(url):
"""Python doesn't understand the brokers URL syntax. Extract a simple addres"""
return re.compile("amqp:tcp:([^,]*)").match(url).group(1)
return [Broker(first_address(url), self.qmf)
for url in clusters[0].members.split(";")]
def __del__(self): self.qmf.delBroker(self.broker)
def main(argv=None):
if argv is None: argv = sys.argv
qmf = Session()
brokers = Broker(argv[1], qmf).get_cluster()
print "%d members in cluster."%(len(brokers))
base = brokers.pop(0)
try:
for b in brokers:
if not base.compare(b): return 1
print "No differences."
return 0
finally:
del base
del brokers
if __name__ == "__main__": sys.exit(main())