summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-01-26 23:17:29 +0000
committerTed Ross <tross@apache.org>2009-01-26 23:17:29 +0000
commitd40d874132bc5011a76bd883fdf9d2507a2f8149 (patch)
treec83d42ac2c118d3a4f066b10ed655322140704b3 /python
parent0f7d1da9baa6906d2481bc05063ae7f8840c6aee (diff)
downloadqpid-python-d40d874132bc5011a76bd883fdf9d2507a2f8149.tar.gz
Added qpid-cluster utility plus model changes to support it.
Fixed a segfault during cluster member shutdown. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@737935 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'python')
-rwxr-xr-xpython/commands/qpid-cluster180
1 files changed, 180 insertions, 0 deletions
diff --git a/python/commands/qpid-cluster b/python/commands/qpid-cluster
new file mode 100755
index 0000000000..f2028d944b
--- /dev/null
+++ b/python/commands/qpid-cluster
@@ -0,0 +1,180 @@
+#!/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.
+#
+
+import os
+import getopt
+import sys
+import locale
+from qmf.console import Session
+
+_host = "localhost"
+_stopId = None
+_stopAll = False
+_force = False
+
+def Usage ():
+ print "Usage: qpid-cluster [OPTIONS] [broker-addr]"
+ print
+ print " broker-addr is in the form: [username/password@] hostname | ip-address [:<port>]"
+ print " ex: localhost, 10.1.1.7:10000, broker-host:10000, guest/guest@localhost"
+ print
+ print "Options:"
+ print " -s [--stop] ID Stop one member of the cluster by its ID"
+ print " -k [--all-stop] Shut down the whole cluster"
+ print " -f [--force] Suppress the 'are-you-sure?' prompt"
+ print
+ sys.exit (1)
+
+class BrokerManager:
+ def __init__(self):
+ self.brokerName = None
+ self.qmf = None
+ self.broker = None
+
+ def SetBroker(self, brokerUrl):
+ self.url = brokerUrl
+ self.qmf = Session()
+ self.broker = self.qmf.addBroker(brokerUrl)
+ agents = self.qmf.getAgents()
+ for a in agents:
+ if a.getAgentBank() == 0:
+ self.brokerAgent = a
+
+ def Disconnect(self):
+ if self.broker:
+ self.qmf.delBroker(self.broker)
+
+ def overview(self):
+ packages = self.qmf.getPackages()
+ if "org.apache.qpid.cluster" not in packages:
+ print "Clustering is not installed on the broker."
+ sys.exit(0)
+
+ clusters = self.qmf.getObjects(_class="cluster", _agent=self.brokerAgent)
+ if len(clusters) == 0:
+ print "Clustering is installed but not enabled on the broker."
+ sys.exit(0)
+
+ cluster = clusters[0]
+ myUrl = cluster.publishedURL
+ memberList = cluster.members.split(";")
+ idList = cluster.memberIDs.split(";")
+
+ print " Cluster Name: %s" % cluster.clusterName
+ print "Cluster Status: %s" % cluster.status
+ print " Cluster Size: %d" % cluster.clusterSize
+ print " Members: ID=%s URL=%s" % (idList[0], memberList[0])
+ for idx in range(1,len(idList)):
+ print " : ID=%s URL=%s" % (idList[idx], memberList[idx])
+
+ def stopMember(self, id):
+ clusters = self.qmf.getObjects(_class="cluster", _agent=self.brokerAgent)
+ if len(clusters) == 0:
+ print "Clustering is installed but not enabled on the broker."
+ sys.exit(0)
+
+ cluster = clusters[0]
+ idList = cluster.memberIDs.split(";")
+ if id not in idList:
+ print "No member with matching ID found"
+ sys.exit(1)
+
+ if not _force:
+ prompt = "Warning: "
+ if len(idList) == 1:
+ prompt += "This command will shut down the last running cluster member."
+ else:
+ prompt += "This command will shut down a cluster member."
+ prompt += " Are you sure? [N]: "
+
+ confirm = raw_input(prompt)
+ if len(confirm) == 0 or confirm[0].upper() != 'Y':
+ print "Operation canceled"
+ sys.exit(1)
+
+ cluster.stopClusterNode(id)
+
+ def stopAll(self):
+ clusters = self.qmf.getObjects(_class="cluster", _agent=self.brokerAgent)
+ if len(clusters) == 0:
+ print "Clustering is installed but not enabled on the broker."
+ sys.exit(0)
+
+ if not _force:
+ prompt = "Warning: This command will shut down the entire cluster."
+ prompt += " Are you sure? [N]: "
+
+ confirm = raw_input(prompt)
+ if len(confirm) == 0 or confirm[0].upper() != 'Y':
+ print "Operation canceled"
+ sys.exit(1)
+
+ cluster = clusters[0]
+ cluster.stopFullCluster()
+
+##
+## Main Program
+##
+
+try:
+ longOpts = ("stop=", "all-stop", "force")
+ (optlist, encArgs) = getopt.gnu_getopt (sys.argv[1:], "s:kf", longOpts)
+except:
+ Usage ()
+
+try:
+ encoding = locale.getpreferredencoding()
+ cargs = [a.decode(encoding) for a in encArgs]
+except:
+ cargs = encArgs
+
+for opt in optlist:
+ if opt[0] == "-s" or opt[0] == "--stop":
+ _stopId = opt[1]
+ if opt[0] == "-k" or opt[0] == "--all-stop":
+ _stopAll = True
+ if opt[0] == "-f" or opt[0] == "--force":
+ _force = True
+
+nargs = len(cargs)
+bm = BrokerManager()
+
+if nargs == 1:
+ _host = cargs[0]
+
+try:
+ bm.SetBroker(_host)
+ if _stopId:
+ bm.stopMember(_stopId)
+ elif _stopAll:
+ bm.stopAll()
+ else:
+ bm.overview()
+except KeyboardInterrupt:
+ print
+except Exception,e:
+ if e.__repr__().find("connection aborted") > 0:
+ # we expect this when asking the connected broker to shut down
+ sys.exit(0)
+ print "Failed:", e.args
+ sys.exit(1)
+
+bm.Disconnect()