def test_direct_oids(self): # create console # find agents # synchronous query for each objects # verify objects and schemas are correct self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) for aname in ["agent1", "agent2"]: agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # first, find objects per schema query = QmfQuery.create_wildcard(QmfQuery.TARGET_SCHEMA_ID) sid_list = self.console.do_query(agent, query) self.assertTrue(sid_list and len(sid_list) == 1) for oid in ['100a name', '99another name']: query = QmfQuery.create_id_object(oid, sid_list[0]) obj_list = self.console.do_query(agent, query) self.assertTrue(isinstance(obj_list, type([])), "Unexpected return type") self.assertTrue(len(obj_list) == 1) obj = obj_list[0] self.assertTrue(isinstance(obj, QmfData)) self.assertTrue(obj.get_object_id() == oid) self.assertTrue(obj.get_schema_class_id() == sid_list[0]) schema_id = obj.get_schema_class_id() self.assertTrue(isinstance(schema_id, SchemaClassId)) self.assertTrue(obj.is_described()) # now find schema-less objects for oid in ['01545']: query = QmfQuery.create_id_object(oid) obj_list = self.console.do_query(agent, query) self.assertTrue(isinstance(obj_list, type([])), "Unexpected return type") self.assertTrue(len(obj_list) == 1) obj = obj_list[0] self.assertTrue(isinstance(obj, QmfData)) self.assertTrue(obj.get_object_id() == oid) self.assertFalse(obj.is_described()) self.console.destroy(10)
def test_async_cancel(self): # create console # find one agent # async subscribe to changes to any object in package1/class1 # cancel after first data indication self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) # query to match object "p1c1_key2" in schema package1/class1 sid = SchemaClassId.create("package1", "class1") query = QmfQuery.create_id_object("p1c1_key2", sid) agent_app = self.agents[0] aname = agent_app.agent.get_name() agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # setup subscription on agent rc = self.console.create_subscription(agent, query, "my-handle", _blocking=False) self.assertTrue(rc) r_count = 0 sp = None while self.notifier.wait_for_work(4): wi = self.console.get_next_workitem(timeout=0) while wi is not None: r_count += 1 if wi.get_type() == WorkItem.SUBSCRIBE_RESPONSE: self.assertTrue(wi.get_handle() == "my-handle") sp = wi.get_params() self.assertTrue( isinstance(sp, qmf2.console.SubscribeParams)) self.assertTrue(sp.succeeded()) self.assertTrue(sp.get_error() == None) else: self.assertTrue( wi.get_type() == WorkItem.SUBSCRIBE_INDICATION) # sp better be set up by now! self.assertTrue( isinstance(sp, qmf2.console.SubscribeParams)) reply = wi.get_params() self.assertTrue(isinstance(reply, type([]))) self.assertTrue(len(reply) == 1) self.assertTrue(isinstance(reply[0], QmfData)) self.assertTrue(reply[0].get_object_id() == "p1c1_key2") sid = reply[0].get_schema_class_id() self.assertTrue(isinstance(sid, SchemaClassId)) self.assertTrue(sid.get_package_name() == "package1") self.assertTrue(sid.get_class_name() == "class1") self.assertTrue(wi.get_handle() == "my-handle") # count1 is continuous, touching it will force a # publish on the interval self.assertTrue(sid is not None) test_obj = agent_app.agent.get_object("p1c1_key2", sid) self.assertTrue(test_obj is not None) test_obj.set_value("count1", r_count) if r_count == 3: self.console.cancel_subscription(sp.get_subscription_id()) self.console.release_workitem(wi) wi = self.console.get_next_workitem(timeout=0) # expect cancel after 3 replies self.assertTrue(r_count == 3) self.console.destroy(10)
def test_sync_refresh(self): # create console # find one agent # subscribe to changes to any object in package1/class1 # after 3 data indications, refresh # verify > 5 more data indications received self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) # query to match object "p1c1_key2" in schema package1/class1 sid = SchemaClassId.create("package1", "class1") query = QmfQuery.create_id_object("p1c1_key2", sid) agent_app = self.agents[0] aname = agent_app.agent.get_name() agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # setup subscription on agent sp = self.console.create_subscription(agent, query, "my-handle") self.assertTrue(isinstance(sp, qmf2.console.SubscribeParams)) self.assertTrue(sp.succeeded()) self.assertTrue(sp.get_error() == None) # refresh after three subscribe indications, count all # indications to verify refresh worked r_count = 0 while self.notifier.wait_for_work(4): wi = self.console.get_next_workitem(timeout=0) while wi is not None: r_count += 1 self.assertTrue(wi.get_type() == WorkItem.SUBSCRIBE_INDICATION) reply = wi.get_params() self.assertTrue(isinstance(reply, type([]))) self.assertTrue(len(reply) == 1) self.assertTrue(isinstance(reply[0], QmfData)) self.assertTrue(reply[0].get_object_id() == "p1c1_key2") sid = reply[0].get_schema_class_id() self.assertTrue(isinstance(sid, SchemaClassId)) self.assertTrue(sid.get_package_name() == "package1") self.assertTrue(sid.get_class_name() == "class1") self.assertTrue(wi.get_handle() == "my-handle") # count1 is continuous, touching it will force a # publish on the interval self.assertTrue(sid is not None) test_obj = agent_app.agent.get_object("p1c1_key2", sid) self.assertTrue(test_obj is not None) test_obj.set_value("count1", r_count) self.console.release_workitem(wi) if r_count == 3: rp = self.console.refresh_subscription( sp.get_subscription_id()) self.assertTrue(rp) wi = self.console.get_next_workitem(timeout=0) # expect 5 publish per subscription, more if refreshed self.assertTrue(r_count > 5) self.console.destroy(10)
def test_sync_by_obj_id_schema(self): # create console # find all agents # subscribe to changes to any object in package1/class1 # should succeed self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) subscriptions = [] index = 0 # query to match object "p2c1_key2" in schema package2/class1 sid = SchemaClassId.create("package2", "class1") query = QmfQuery.create_id_object("p2c1_key2", sid) for agent_app in self.agents: aname = agent_app.agent.get_name() agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # now subscribe to agent sp = self.console.create_subscription(agent, query, index) self.assertTrue(isinstance(sp, qmf2.console.SubscribeParams)) self.assertTrue(sp.succeeded()) self.assertTrue(sp.get_error() == None) subscriptions.append([sp, 0]) index += 1 # now wait for all subscriptions to expire (2x interval w/o # indications) r_count = 0 while self.notifier.wait_for_work(4): wi = self.console.get_next_workitem(timeout=0) while wi is not None: r_count += 1 self.assertTrue(wi.get_type() == WorkItem.SUBSCRIBE_INDICATION) reply = wi.get_params() self.assertTrue(isinstance(reply, type([]))) self.assertTrue(len(reply) == 1) self.assertTrue(isinstance(reply[0], QmfData)) self.assertTrue(reply[0].get_object_id() == "p2c1_key2") sid = reply[0].get_schema_class_id() self.assertTrue(isinstance(sid, SchemaClassId)) self.assertTrue(sid.get_package_name() == "package2") self.assertTrue(sid.get_class_name() == "class1") self.assertTrue(wi.get_handle() < len(subscriptions)) subscriptions[wi.get_handle()][1] += 1 self.console.release_workitem(wi) wi = self.console.get_next_workitem(timeout=0) # expect 1 publish per subscription self.assertTrue(r_count == 5) for ii in range(len(subscriptions)): self.assertTrue(subscriptions[ii][1] == 1) self.console.destroy(10)
def test_async_cancel(self): # create console # find one agent # async subscribe to changes to any object in package1/class1 # cancel after first data indication self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) # query to match object "p1c1_key2" in schema package1/class1 sid = SchemaClassId.create("package1", "class1") query = QmfQuery.create_id_object("p1c1_key2", sid) agent_app = self.agents[0] aname = agent_app.agent.get_name() agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # setup subscription on agent rc = self.console.create_subscription(agent, query, "my-handle", _blocking=False) self.assertTrue(rc) r_count = 0 sp = None while self.notifier.wait_for_work(4): wi = self.console.get_next_workitem(timeout=0) while wi is not None: r_count += 1 if wi.get_type() == WorkItem.SUBSCRIBE_RESPONSE: self.assertTrue(wi.get_handle() == "my-handle") sp = wi.get_params() self.assertTrue(isinstance(sp, qmf2.console.SubscribeParams)) self.assertTrue(sp.succeeded()) self.assertTrue(sp.get_error() == None) else: self.assertTrue(wi.get_type() == WorkItem.SUBSCRIBE_INDICATION) # sp better be set up by now! self.assertTrue(isinstance(sp, qmf2.console.SubscribeParams)) reply = wi.get_params() self.assertTrue(isinstance(reply, type([]))) self.assertTrue(len(reply) == 1) self.assertTrue(isinstance(reply[0], QmfData)) self.assertTrue(reply[0].get_object_id() == "p1c1_key2") sid = reply[0].get_schema_class_id() self.assertTrue(isinstance(sid, SchemaClassId)) self.assertTrue(sid.get_package_name() == "package1") self.assertTrue(sid.get_class_name() == "class1") self.assertTrue(wi.get_handle() == "my-handle") # count1 is continuous, touching it will force a # publish on the interval self.assertTrue(sid is not None) test_obj = agent_app.agent.get_object("p1c1_key2", sid) self.assertTrue(test_obj is not None) test_obj.set_value("count1", r_count) if r_count == 3: self.console.cancel_subscription(sp.get_subscription_id()) self.console.release_workitem(wi) wi = self.console.get_next_workitem(timeout=0) # expect cancel after 3 replies self.assertTrue(r_count == 3) self.console.destroy(10)
def test_sync_refresh(self): # create console # find one agent # subscribe to changes to any object in package1/class1 # after 3 data indications, refresh # verify > 5 more data indications received self.notifier = _testNotifier() self.console = qmf2.console.Console(notifier=self.notifier, agent_timeout=3) self.conn = qpid.messaging.Connection(self.broker) self.conn.open() self.console.add_connection(self.conn) # query to match object "p1c1_key2" in schema package1/class1 sid = SchemaClassId.create("package1", "class1") query = QmfQuery.create_id_object("p1c1_key2", sid) agent_app = self.agents[0] aname = agent_app.agent.get_name() agent = self.console.find_agent(aname, timeout=3) self.assertTrue(agent and agent.get_name() == aname) # setup subscription on agent sp = self.console.create_subscription(agent, query, "my-handle") self.assertTrue(isinstance(sp, qmf2.console.SubscribeParams)) self.assertTrue(sp.succeeded()) self.assertTrue(sp.get_error() == None) # refresh after three subscribe indications, count all # indications to verify refresh worked r_count = 0 while self.notifier.wait_for_work(4): wi = self.console.get_next_workitem(timeout=0) while wi is not None: r_count += 1 self.assertTrue(wi.get_type() == WorkItem.SUBSCRIBE_INDICATION) reply = wi.get_params() self.assertTrue(isinstance(reply, type([]))) self.assertTrue(len(reply) == 1) self.assertTrue(isinstance(reply[0], QmfData)) self.assertTrue(reply[0].get_object_id() == "p1c1_key2") sid = reply[0].get_schema_class_id() self.assertTrue(isinstance(sid, SchemaClassId)) self.assertTrue(sid.get_package_name() == "package1") self.assertTrue(sid.get_class_name() == "class1") self.assertTrue(wi.get_handle() == "my-handle") # count1 is continuous, touching it will force a # publish on the interval self.assertTrue(sid is not None) test_obj = agent_app.agent.get_object("p1c1_key2", sid) self.assertTrue(test_obj is not None) test_obj.set_value("count1", r_count) self.console.release_workitem(wi) if r_count == 3: rp = self.console.refresh_subscription(sp.get_subscription_id()) self.assertTrue(rp) wi = self.console.get_next_workitem(timeout=0) # expect 5 publish per subscription, more if refreshed self.assertTrue(r_count > 5) self.console.destroy(10)