diff options
Diffstat (limited to 'qpid/cpp/bindings')
-rw-r--r-- | qpid/cpp/bindings/qmf/python/Makefile.am | 2 | ||||
-rw-r--r-- | qpid/cpp/bindings/qmf/python/qmf.py | 14 | ||||
-rw-r--r-- | qpid/cpp/bindings/qmf/ruby/qmf.rb | 295 | ||||
-rwxr-xr-x | qpid/cpp/bindings/qmf/tests/agent_ruby.rb | 7 | ||||
-rw-r--r-- | qpid/cpp/bindings/qmf/tests/python_agent.py | 4 | ||||
-rwxr-xr-x | qpid/cpp/bindings/qmf/tests/ruby_console.rb | 83 |
6 files changed, 328 insertions, 77 deletions
diff --git a/qpid/cpp/bindings/qmf/python/Makefile.am b/qpid/cpp/bindings/qmf/python/Makefile.am index f51d26bfad..55d9079fb7 100644 --- a/qpid/cpp/bindings/qmf/python/Makefile.am +++ b/qpid/cpp/bindings/qmf/python/Makefile.am @@ -29,7 +29,7 @@ EXTRA_DIST = python.i BUILT_SOURCES = $(generated_file_list) $(generated_file_list): $(srcdir)/python.i $(srcdir)/../qmfengine.i - swig -python -c++ -Wall -I/usr/include $(INCLUDES) $(QPID_CXXFLAGS) -I$(top_srcdir)/src/qmf -o qmfengine.cpp $(srcdir)/python.i + swig -c++ -python -Wall -I/usr/include $(INCLUDES) $(QPID_CXXFLAGS) -I$(top_srcdir)/src/qmf -o qmfengine.cpp $(srcdir)/python.i pylibdir = $(PYTHON_LIB) diff --git a/qpid/cpp/bindings/qmf/python/qmf.py b/qpid/cpp/bindings/qmf/python/qmf.py index 265f204852..4800b327f1 100644 --- a/qpid/cpp/bindings/qmf/python/qmf.py +++ b/qpid/cpp/bindings/qmf/python/qmf.py @@ -30,6 +30,8 @@ from qmfengine import (TYPE_ABSTIME, TYPE_ARRAY, TYPE_BOOL, TYPE_DELTATIME, TYPE_INT8, TYPE_LIST, TYPE_LSTR, TYPE_MAP, TYPE_OBJECT, TYPE_REF, TYPE_SSTR, TYPE_UINT16, TYPE_UINT32, TYPE_UINT64, TYPE_UINT8, TYPE_UUID) +from qmfengine import (O_EQ, O_NE, O_LT, O_LE, O_GT, O_GE, O_RE_MATCH, O_RE_NOMATCH, + E_NOT, E_AND, E_OR, E_XOR) ##============================================================================== @@ -404,11 +406,16 @@ class Arguments: class Query: - def __init__(self, i=None): + def __init__(self, i=None, package="", cls=None, oid=None): if i: self.impl = i else: - self.impl = qmfengine.Query() + if cls: + self.impl = qmfengine.Query(cls, package) + elif oid: + self.impl = qmfengine.Query(oid) + else: + raise "Argument error" def package_name(self): return self.impl.getPackage() @@ -419,9 +426,6 @@ class Query: return ObjectId(_objid) else: return None - OPER_AND = qmfengine.Query.OPER_AND - OPER_OR = qmfengine.Query.OPER_OR - ##============================================================================== diff --git a/qpid/cpp/bindings/qmf/ruby/qmf.rb b/qpid/cpp/bindings/qmf/ruby/qmf.rb index 21fbf6c157..16f1058f4a 100644 --- a/qpid/cpp/bindings/qmf/ruby/qmf.rb +++ b/qpid/cpp/bindings/qmf/ruby/qmf.rb @@ -67,6 +67,7 @@ module Qmf class ConnectionHandler def conn_event_connected(); end def conn_event_disconnected(error); end + def conn_event_visit(); end def sess_event_session_closed(context, error); end def sess_event_recv(context, message); end end @@ -82,6 +83,7 @@ module Qmf @sockEngine, @sock = Socket::socketpair(Socket::PF_UNIX, Socket::SOCK_STREAM, 0) @impl.setNotifyFd(@sockEngine.fileno) @new_conn_handlers = [] + @conn_handlers_to_delete = [] @conn_handlers = [] @thread = Thread.new do @@ -89,17 +91,30 @@ module Qmf end end + def kick + @sockEngine.write(".") + @sockEngine.flush + end + def add_conn_handler(handler) synchronize do @new_conn_handlers << handler end - @sockEngine.write("x") + kick + end + + def del_conn_handler(handler) + synchronize do + @conn_handlers_to_delete << handler + end + kick end def run() eventImpl = Qmfengine::ResilientConnectionEvent.new connected = nil new_handlers = nil + del_handlers = nil bt_count = 0 while :true @@ -107,7 +122,9 @@ module Qmf synchronize do new_handlers = @new_conn_handlers + del_handlers = @conn_handlers_to_delete @new_conn_handlers = [] + @conn_handlers_to_delete = [] end new_handlers.each do |nh| @@ -116,6 +133,11 @@ module Qmf end new_handlers = nil + del_handlers.each do |dh| + d = @conn_handlers.delete(dh) + end + del_handlers = nil + valid = @impl.getEvent(eventImpl) while valid begin @@ -141,6 +163,7 @@ module Qmf @impl.popEvent valid = @impl.getEvent(eventImpl) end + @conn_handlers.each { |h| h.conn_event_visit } end end end @@ -167,23 +190,20 @@ module Qmf class QmfObject attr_reader :impl, :object_class - def initialize(cls) - @object_class = cls - @impl = Qmfengine::Object.new(@object_class.impl) - end - - def destroy - @impl.destroy + def initialize(cls, kwargs={}) + if cls: + @object_class = cls + @impl = Qmfengine::Object.new(@object_class.impl) + elsif kwargs.include?(:impl) + @impl = Qmfengine::Object.new(kwargs[:impl]) + @object_class = SchemaObjectClass.new(nil, nil, :impl => @impl.getClass) + end end def object_id return ObjectId.new(@impl.getObjectId) end - def set_object_id(oid) - @impl.setObjectId(oid.impl) - end - def get_attr(name) val = value(name) case val.getType @@ -248,17 +268,31 @@ module Qmf def value(name) val = @impl.getValue(name.to_s) if val.nil? - raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getName}" + raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getClassKey.getPackageName}:#{@object_class.impl.getClassKey.getClassName}" end return val end end + class AgentObject < QmfObject + def initialize(cls, kwargs={}) + super(cls, kwargs) + end + + def destroy + @impl.destroy + end + + def set_object_id(oid) + @impl.setObjectId(oid.impl) + end + end + class ConsoleObject < QmfObject attr_reader :current_time, :create_time, :delete_time - def initialize(cls) - super(cls) + def initialize(cls, kwargs={}) + super(cls, kwargs) end def update() @@ -373,10 +407,30 @@ module Qmf end end + ##============================================================================== + ## QUERY + ##============================================================================== + class Query attr_reader :impl - def initialize(i) - @impl = i + def initialize(kwargs = {}) + if kwargs.include?(:impl) + @impl = kwargs[:impl] + else + package = '' + if kwargs.include?(:key) + @impl = Qmfengine::Query.new(kwargs[:key]) + elsif kwargs.include?(:object_id) + @impl = Qmfengine::Query.new(kwargs[:object_id]) + else + package = kwargs[:package] if kwargs.include?(:package) + if kwargs.include?(:class) + @impl = Qmfengine::Query.new(kwargs[:class], package) + else + raise ArgumentError, "Invalid arguments, use :key or :class[,:package]" + end + end + end end def package_name @@ -403,36 +457,60 @@ module Qmf class SchemaArgument attr_reader :impl def initialize(name, typecode, kwargs={}) - @impl = Qmfengine::SchemaArgument.new(name, typecode) - @impl.setDirection(kwargs[:dir]) if kwargs.include?(:dir) - @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) - @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + if kwargs.include?(:impl) + @impl = kwargs[:impl] + else + @impl = Qmfengine::SchemaArgument.new(name, typecode) + @impl.setDirection(kwargs[:dir]) if kwargs.include?(:dir) + @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) + @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + end + end + + def name + @impl.getName end end class SchemaMethod - attr_reader :impl + attr_reader :impl, :arguments def initialize(name, kwargs={}) - @impl = Qmfengine::SchemaMethod.new(name) - @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) @arguments = [] + if kwargs.include?(:impl) + @impl = kwargs[:impl] + arg_count = @impl.getArgumentCount + for i in 0...arg_count + @arguments << SchemaArgument.new(nil, nil, :impl => @impl.getArgument(i)) + end + else + @impl = Qmfengine::SchemaMethod.new(name) + @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + end end def add_argument(arg) @arguments << arg @impl.addArgument(arg.impl) end + + def name + @impl.getName + end end class SchemaProperty attr_reader :impl def initialize(name, typecode, kwargs={}) - @impl = Qmfengine::SchemaProperty.new(name, typecode) - @impl.setAccess(kwargs[:access]) if kwargs.include?(:access) - @impl.setIndex(kwargs[:index]) if kwargs.include?(:index) - @impl.setOptional(kwargs[:optional]) if kwargs.include?(:optional) - @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) - @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + if kwargs.include?(:impl) + @impl = kwargs[:impl] + else + @impl = Qmfengine::SchemaProperty.new(name, typecode) + @impl.setAccess(kwargs[:access]) if kwargs.include?(:access) + @impl.setIndex(kwargs[:index]) if kwargs.include?(:index) + @impl.setOptional(kwargs[:optional]) if kwargs.include?(:optional) + @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) + @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + end end def name @@ -443,9 +521,17 @@ module Qmf class SchemaStatistic attr_reader :impl def initialize(name, typecode, kwargs={}) - @impl = Qmfengine::SchemaStatistic.new(name, typecode) - @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) - @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + if kwargs.include?(:impl) + @impl = kwargs[:impl] + else + @impl = Qmfengine::SchemaStatistic.new(name, typecode) + @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit) + @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) + end + end + + def name + @impl.getName end end @@ -465,13 +551,25 @@ module Qmf end class SchemaObjectClass - attr_reader :impl - def initialize(package='', name='', kwargs={}) + attr_reader :impl, :properties, :statistics, :methods + def initialize(package, name, kwargs={}) @properties = [] @statistics = [] @methods = [] if kwargs.include?(:impl) @impl = kwargs[:impl] + + @impl.getPropertyCount.times do |i| + @properties << SchemaProperty.new(nil, nil, :impl => @impl.getProperty(i)) + end + + @impl.getStatisticCount.times do |i| + @statistics << SchemaStatistic.new(nil, nil, :impl => @impl.getStatistic(i)) + end + + @impl.getMethodCount.times do |i| + @methods << SchemaMethod.new(nil, :impl => @impl.getMethod(i)) + end else @impl = Qmfengine::SchemaObjectClass.new(package, name) end @@ -495,24 +593,17 @@ module Qmf def name @impl.getClassKey.getClassName end - - def properties - unless @properties - @properties = [] - @impl.getPropertyCount.times do |i| - @properties << @impl.getProperty(i) - end - end - return @properties - end end class SchemaEventClass - attr_reader :impl - def initialize(package='', name='', kwargs={}) + attr_reader :impl, :arguments + def initialize(package, name, kwargs={}) @arguments = [] if kwargs.include?(:impl) @impl = kwargs[:impl] + @impl.getArgumentCount.times do |i| + @arguments << SchemaArgument.new(nil, nil, :impl => @impl.getArgument(i)) + end else @impl = Qmfengine::SchemaEventClass.new(package, name) @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc) @@ -546,13 +637,18 @@ module Qmf end class Console + include MonitorMixin attr_reader :impl def initialize(handler = nil, kwargs={}) + super() @handler = handler @impl = Qmfengine::ConsoleEngine.new @event = Qmfengine::ConsoleEvent.new @broker_list = [] + @cv = new_cond + @sync_count = nil + @sync_result = nil end def add_connection(conn) @@ -562,6 +658,8 @@ module Qmf end def del_connection(broker) + broker.shutdown + @broker_list.delete(broker) end def get_packages() @@ -581,9 +679,9 @@ module Qmf class_kind = @impl.getClassKind(key) if class_kind == kind if kind == CLASS_OBJECT - clist << SchemaObjectClass.new('', '', :impl => @impl.getObjectClass(key)) + clist << SchemaObjectClass.new(nil, nil, :impl => @impl.getObjectClass(key)) elsif kind == CLASS_EVENT - clist << SchemaEventClass.new('', '', :impl => @impl.getEventClass(key)) + clist << SchemaEventClass.new(nil, nil, :impl => @impl.getEventClass(key)) end end end @@ -591,19 +689,70 @@ module Qmf return clist end - def get_schema(class_key) - end - def bind_package(package) + @impl.bindPackage(package) end def bind_class(kwargs = {}) + if kwargs.include?(:key) + @impl.bindClass(kwargs[:key]) + elsif kwargs.include?(:package) + package = kwargs[:package] + if kwargs.include?(:class) + @impl.bindClass(package, kwargs[:class]) + else + @impl.bindClass(package) + end + else + raise ArgumentError, "Invalid arguments, use :key or :package[,:class]" + end end def get_agents(broker = nil) + blist = [] + if broker + blist << broker + else + blist = @broker_list + end + + agents = [] + blist.each do |b| + count = b.impl.agentCount + for idx in 0...count + agents << AgentProxy.new(b.impl.getAgent(idx), b) + end + end + + return agents end def get_objects(query, kwargs = {}) + timeout = 30 + if kwargs.include?(:timeout) + timeout = kwargs[:timeout] + end + synchronize do + @sync_count = 1 + @sync_result = [] + broker = @broker_list[0] + broker.send_query(query.impl, nil) + unless @cv.wait(timeout) { @sync_count == 0 } + raise "Timed out waiting for response" + end + + return @sync_result + end + end + + def _get_result(list, context) + synchronize do + list.each do |item| + @sync_result << item + end + @sync_count -= 1 + @cv.signal + end end def start_sync(query) @@ -638,6 +787,19 @@ module Qmf end end + class AgentProxy + attr_reader :broker + + def initialize(impl, broker) + @impl = impl + @broker = broker + end + + def label + @impl.getLabel + end + end + class Broker < ConnectionHandler include MonitorMixin attr_reader :impl @@ -654,6 +816,13 @@ module Qmf @impl = Qmfengine::BrokerProxy.new(@console.impl) @console.impl.addConnection(@impl, self) @conn.add_conn_handler(self) + @operational = :true + end + + def shutdown() + @console.impl.delConnection(@impl) + @conn.del_conn_handler(self) + @operational = :false end def waitForStable(timeout = nil) @@ -671,6 +840,11 @@ module Qmf end end + def send_query(query, ctx) + @impl.sendQuery(query, ctx) + @conn.kick + end + def do_broker_events() count = 0 valid = @impl.getEvent(@event) @@ -694,6 +868,12 @@ module Qmf @stable = :true @cv.signal end + when Qmfengine::BrokerEvent::QUERY_COMPLETE + result = [] + for idx in 0...@event.queryResponse.getObjectCount + result << ConsoleObject.new(nil, :impl => @event.queryResponse.getObject(idx)) + end + @console._get_result(result, @event.context) end @impl.popEvent valid = @impl.getEvent(@event) @@ -732,12 +912,17 @@ module Qmf puts "Console Connection Lost" end + def conn_event_visit + do_events + end + def sess_event_session_closed(context, error) puts "Console Session Lost" @impl.sessionClosed() end def sess_event_recv(context, message) + puts "Unexpected RECV Event" if not @operational @impl.handleRcvMessage(message) do_events end @@ -798,7 +983,7 @@ module Qmf count += 1 case @event.kind when Qmfengine::AgentEvent::GET_QUERY - @handler.get_query(@event.sequence, Query.new(@event.query), @event.authUserId) + @handler.get_query(@event.sequence, Query.new(:impl => @event.query), @event.authUserId) when Qmfengine::AgentEvent::START_SYNC when Qmfengine::AgentEvent::END_SYNC when Qmfengine::AgentEvent::METHOD_CALL @@ -852,6 +1037,10 @@ module Qmf puts "Agent Connection Lost" end + def conn_event_visit + do_events + end + def sess_event_session_closed(context, error) puts "Agent Session Lost" end diff --git a/qpid/cpp/bindings/qmf/tests/agent_ruby.rb b/qpid/cpp/bindings/qmf/tests/agent_ruby.rb index 75de2b5fa1..67591319ee 100755 --- a/qpid/cpp/bindings/qmf/tests/agent_ruby.rb +++ b/qpid/cpp/bindings/qmf/tests/agent_ruby.rb @@ -72,8 +72,7 @@ end class App < Qmf::AgentHandler def get_query(context, query, userId) -# puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}" - #@parent.inc_attr("queryCount") +# puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}" if query.class_name == 'parent' @agent.query_response(context, @parent) elsif query.object_id == @parent_oid @@ -135,7 +134,7 @@ class App < Qmf::AgentHandler elsif name == "create_child" oid = @agent.alloc_object_id(2) args['child_ref'] = oid - @child = Qmf::QmfObject.new(@model.child_class) + @child = Qmf::AgentObject.new(@model.child_class) @child.set_attr("name", args.by_key("child_name")) @child.set_object_id(oid) @agent.method_response(context, 0, "OK", args) @@ -161,7 +160,7 @@ class App < Qmf::AgentHandler @agent.set_connection(@connection) - @parent = Qmf::QmfObject.new(@model.parent_class) + @parent = Qmf::AgentObject.new(@model.parent_class) @parent.set_attr("name", "Parent One") @parent.set_attr("state", "OPERATIONAL") diff --git a/qpid/cpp/bindings/qmf/tests/python_agent.py b/qpid/cpp/bindings/qmf/tests/python_agent.py index f6cb51cbf5..d4373d3bb8 100644 --- a/qpid/cpp/bindings/qmf/tests/python_agent.py +++ b/qpid/cpp/bindings/qmf/tests/python_agent.py @@ -72,7 +72,9 @@ class Model: class App(qmf.AgentHandler): def get_query(self, context, query, userId): - # puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}" + #print "Query: user=%s context=%d class=%s" % (userId, context, query.class_name()) + #if query.object_id(): + # print query.object_id().object_num_low() self._parent.inc_attr("queryCount") if query.class_name() == 'parent': self._agent.query_response(context, self._parent) diff --git a/qpid/cpp/bindings/qmf/tests/ruby_console.rb b/qpid/cpp/bindings/qmf/tests/ruby_console.rb index fb48c29566..c071829f09 100755 --- a/qpid/cpp/bindings/qmf/tests/ruby_console.rb +++ b/qpid/cpp/bindings/qmf/tests/ruby_console.rb @@ -24,33 +24,90 @@ require 'socket' class App < Qmf::ConsoleHandler - def main - @settings = Qmf::ConnectionSettings.new - @settings.set_attr("host", ARGV[0]) if ARGV.size > 0 - @settings.set_attr("port", ARGV[1].to_i) if ARGV.size > 1 - @connection = Qmf::Connection.new(@settings) - @qmf = Qmf::Console.new - - @broker = @qmf.add_connection(@connection) - @broker.waitForStable - - packages = @qmf.get_packages + def dump_schema + packages = @qmfc.get_packages puts "----- Packages -----" packages.each do |p| puts p puts " ----- Object Classes -----" - classes = @qmf.get_classes(p) + classes = @qmfc.get_classes(p) classes.each do |c| puts " #{c.name}" + + puts " ---- Properties ----" + props = c.properties + props.each do |prop| + puts " #{prop.name}" + end + + puts " ---- Statistics ----" + stats = c.statistics + stats.each do |stat| + puts " #{stat.name}" + end + + puts " ---- Methods ----" + methods = c.methods + methods.each do |method| + puts " #{method.name}" + puts " ---- Args ----" + args = method.arguments + args.each do |arg| + puts " #{arg.name}" + end + end end + puts " ----- Event Classes -----" - classes = @qmf.get_classes(p, Qmf::CLASS_EVENT) + classes = @qmfc.get_classes(p, Qmf::CLASS_EVENT) classes.each do |c| puts " #{c.name}" + puts " ---- Args ----" + args = c.arguments + args.each do |arg| + puts " #{arg.name}" + end end end puts "-----" + end + + def main + @settings = Qmf::ConnectionSettings.new + @settings.set_attr("host", ARGV[0]) if ARGV.size > 0 + @settings.set_attr("port", ARGV[1].to_i) if ARGV.size > 1 + @connection = Qmf::Connection.new(@settings) + @qmfc = Qmf::Console.new + + @broker = @qmfc.add_connection(@connection) + @broker.waitForStable + + dump_schema + + agents = @qmfc.get_agents() + puts "---- Agents ----" + agents.each do |a| + puts " => #{a.label}" + end + puts "----" + + for idx in 0...20 + blist = @qmfc.get_objects(Qmf::Query.new(:class => "broker")) + puts "---- Brokers ----" + blist.each do |b| + puts " ---- Broker ----" + puts " systemRef: #{b.get_attr('systemRef')}" + puts " port : #{b.get_attr('port')}" + puts " uptime : #{b.get_attr('uptime') / 1000000000}" + end + puts "----" + sleep(5) + end + sleep(5) + puts "Deleting connection..." + @qmfc.del_connection(@broker) + puts " done" sleep end end |