| #!/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()) |