def test_subscribe_snapshot(self): node = helper.make_dsenode_new_partition('testnode') test1 = FakeDataSource('test1') test2 = FakeDataSource('test2') node.register_service(test1) node.register_service(test2) test1.subscribe('test2', 'fake_table') helper.retry_check_function_return_value( lambda: hasattr(test1, 'last_msg'), True) self.assertEqual(test1.last_msg['data'], test2.state['fake_table'])
def test_replicated_pe_exec(self): """Test correct local leader behavior with 2 PEs requesting exec""" node1 = helper.make_dsenode_new_partition('testnode1') node2 = helper.make_dsenode_same_partition(node1, 'testnode2') dsd = FakeDataSource('dsd') # faster time-out for testing dsd.LEADER_TIMEOUT = 2 pe1 = Dse2Runtime('pe1') pe2 = Dse2Runtime('pe2') node1.register_service(pe1) node2.register_service(pe2) node1.register_service(dsd) assert dsd._running assert node1._running assert node2._running assert node1._control_bus._running # first exec request obeyed and leader set pe2.rpc('dsd', 'request_execute', {'action': 'fake_act', 'action_args': {'name': 'testnode2'}}) helper.retry_check_function_return_value( lambda: len(dsd.exec_history), 1) self.assertEqual(dsd._leader_node_id, 'testnode2') # second exec request from leader obeyed and leader remains pe2.rpc('dsd', 'request_execute', {'action': 'fake_act', 'action_args': {'name': 'testnode2'}}) helper.retry_check_function_return_value( lambda: len(dsd.exec_history), 2) self.assertEqual(dsd._leader_node_id, 'testnode2') # exec request from non-leader not obeyed pe1.rpc('dsd', 'request_execute', {'action': 'fake_act', 'action_args': {'name': 'testnode1'}}) self.assertRaises( helper.TestFailureException, helper.retry_check_function_return_value, lambda: len(dsd.exec_history), 3) # leader vacated after heartbeat stops node2.stop() node2.wait() helper.retry_check_function_return_value( lambda: dsd._leader_node_id, None) # next exec request obeyed and new leader set pe1.rpc('dsd', 'request_execute', {'action': 'fake_act', 'action_args': {'name': 'testnode1'}}) helper.retry_check_function_return_value( lambda: len(dsd.exec_history), 3) self.assertEqual(dsd._leader_node_id, 'testnode1')
def test_policy(self): node = helper.make_dsenode_new_partition('testnode') data = FakeDataSource('data') engine = Dse2Runtime('engine') node.register_service(data) node.register_service(engine) engine.create_policy('alpha') engine.create_policy('data') self.insert_rule(engine, 'p(x) :- data:fake_table(x)', 'alpha') data.state = {'fake_table': set([(1,), (2,)])} data.poll() helper.retry_check_db_equal( engine, 'p(x)', 'p(1) p(2)', target='alpha') self.assertFalse(hasattr(engine, "last_msg"))
def test_policy_data(self): """Test policy correctly processes initial data snapshot.""" node = helper.make_dsenode_new_partition('testnode') node.always_snapshot = False data = FakeDataSource('data') engine = Dse2Runtime('engine') node.register_service(data) node.register_service(engine) engine.create_policy('policy1') engine.create_policy('data') self.insert_rule(engine, 'p(x) :- data:fake_table(x)', 'policy1') data.state = {'fake_table': set([(1,), (2,)])} data.poll() helper.retry_check_db_equal( engine, 'p(x)', 'p(1) p(2)', target='policy1') self.assertFalse(hasattr(engine, "last_msg"))
def test_datasource_pub(self): node = helper.make_dsenode_new_partition('testnode') nova_client = mock.MagicMock() with mock.patch.object(novaclient.client.Client, '__init__', return_value=nova_client): nova = NovaDriver( name='nova', args=helper.datasource_openstack_args()) test = FakeDataSource('test') node.register_service(nova) node.register_service(test) test.subscribe('nova', 'p') helper.retry_check_function_return_value( lambda: hasattr(test, 'last_msg'), True) nova.publish('p', 42) helper.retry_check_function_return_value( lambda: test.last_msg['data'], 42) self.assertFalse(hasattr(nova, "last_msg"))
def test_intranode_partial_unsub(self): node = helper.make_dsenode_new_partition('testnode') test1 = FakeDataSource('test1') test2 = FakeDataSource('test2') node.register_service(test1) node.register_service(test2) test1.subscribe('test2', 'p') test1.subscribe('test2', 'q') test1.unsubscribe('test2', 'q') # unsub from q should not affect p helper.retry_check_function_return_value( lambda: hasattr(test1, 'last_msg'), True) test2.publish('p', 42) helper.retry_check_function_return_value( lambda: test1.last_msg['data'], 42) self.assertFalse(hasattr(test2, "last_msg"))
def test_datasource_poll(self): node = helper.make_dsenode_new_partition('testnode') pub = FakeDataSource('pub') sub = FakeDataSource('sub') node.register_service(pub) node.register_service(sub) sub.subscribe('pub', 'fake_table') pub.state = {'fake_table': set([(1, 2)])} pub.poll() helper.retry_check_function_return_value( lambda: sub.last_msg['data'], set(pub.state['fake_table'])) self.assertFalse(hasattr(pub, "last_msg"))
def test_internode_pubsub(self): node1 = helper.make_dsenode_new_partition('testnode1') test1 = FakeDataSource('test1') node1.register_service(test1) node2 = helper.make_dsenode_same_partition(node1, 'testnode2') test2 = FakeDataSource('test2') node2.register_service(test2) test1.subscribe('test2', 'p') helper.retry_check_function_return_value( lambda: hasattr(test1, 'last_msg'), True) test2.publish('p', 42) helper.retry_check_function_return_value( lambda: test1.last_msg['data'], 42) self.assertFalse(hasattr(test2, "last_msg"))
def test_intranode_pubsub2(self): # same as test_intranode_pubsub but with opposite ordering. # (Ordering does matter with internode_pubsub). node = helper.make_dsenode_new_partition('testnode') test1 = FakeDataSource('test1') test2 = FakeDataSource('test2') node.register_service(test1) node.register_service(test2) test2.subscribe('test1', 'p') helper.retry_check_function_return_value( lambda: hasattr(test2, 'last_msg'), True) test1.publish('p', 42) helper.retry_check_function_return_value( lambda: test2.last_msg['data'], 42) self.assertFalse(hasattr(test1, "last_msg"))