+
+ # restore factory state for other tests
+ from nepi.execution.resource import populate_factory
+ ResourceFactory._resource_types = dict()
+ populate_factory()
+
+class ResourceManagerTestCase(unittest.TestCase):
+ def test_register_condition(self):
+ ec = ExperimentController()
+ rm = ResourceManager(ec, 15)
+
+ group = [1,3,5,7]
+ rm.register_condition(ResourceAction.START, group,
+ ResourceState.STARTED)
+
+ group = [10,8]
+ rm.register_condition(ResourceAction.START,
+ group, ResourceState.STARTED, time = "10s")
+
+ waiting_for = []
+ conditions = rm.conditions.get(ResourceAction.START)
+ for (group, state, time) in conditions:
+ waiting_for.extend(group)
+
+ self.assertEquals(waiting_for, [1, 3, 5, 7, 10, 8])
+
+ group = [1, 2, 3, 4, 6]
+ rm.unregister_condition(group)
+
+ waiting_for = []
+ conditions = rm.conditions.get(ResourceAction.START)
+ for (group, state, time) in conditions:
+ waiting_for.extend(group)
+
+ self.assertEquals(waiting_for, [5, 7, 10, 8])
+
+ def test_deploy_in_order(self):
+ """
+ Test scenario: 2 applications running one on 1 node each.
+ Nodes are connected to Interfaces which are connected
+ through a channel between them.
+
+ - Application needs to wait until Node is ready to be ready
+ - Node needs to wait until Interface is ready to be ready
+ - Interface needs to wait until Node is provisioned to be ready
+ - Interface needs to wait until Channel is ready to be ready
+ - The channel doesn't wait for any other resource to be ready
+
+ """
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(Application)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+ ResourceFactory.register_type(Channel)
+
+ ec = ExperimentController()
+
+ app1 = ec.register_resource("Application")
+ app2 = ec.register_resource("Application")
+ node1 = ec.register_resource("Node")
+ node2 = ec.register_resource("Node")
+ iface1 = ec.register_resource("Interface")
+ iface2 = ec.register_resource("Interface")
+ chan = ec.register_resource("Channel")
+
+ ec.register_connection(app1, node1)
+ ec.register_connection(app2, node2)
+ ec.register_connection(iface1, node1)
+ ec.register_connection(iface2, node2)
+ ec.register_connection(iface1, chan)
+ ec.register_connection(iface2, chan)
+
+ ec.deploy()
+
+ guids = [app1, app2]
+ ec.wait_finished(guids)
+
+ ec.shutdown()
+
+ rmapp1 = ec.get_resource(app1)
+ rmapp2 = ec.get_resource(app2)
+ rmnode1 = ec.get_resource(node1)
+ rmnode2 = ec.get_resource(node2)
+ rmiface1 = ec.get_resource(iface1)
+ rmiface2 = ec.get_resource(iface2)
+ rmchan = ec.get_resource(chan)
+
+ ## Validate deploy order
+ # - Application needs to wait until Node is ready to be ready
+ self.assertTrue(rmnode1.ready_time < rmapp1.ready_time)
+ self.assertTrue(rmnode2.ready_time < rmapp2.ready_time)
+
+ # - Node needs to wait until Interface is ready to be ready
+ self.assertTrue(rmnode1.ready_time > rmiface1.ready_time)
+ self.assertTrue(rmnode2.ready_time > rmiface2.ready_time)
+
+ # - Interface needs to wait until Node is provisioned to be ready
+ self.assertTrue(rmnode1.provision_time < rmiface1.ready_time)
+ self.assertTrue(rmnode2.provision_time < rmiface2.ready_time)
+
+ # - Interface needs to wait until Channel is ready to be ready
+ self.assertTrue(rmchan.ready_time < rmiface1.ready_time)
+ self.assertTrue(rmchan.ready_time < rmiface2.ready_time)
+
+ def test_concurrency(self):
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(Application)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+ ResourceFactory.register_type(Channel)
+
+ ec = ExperimentController()
+
+ node = ec.register_resource("Node")
+
+ apps = list()
+ for i in xrange(1000):
+ app = ec.register_resource("Application")
+ ec.register_connection(app, node)
+ apps.append(app)
+
+ ec.deploy()
+
+ ec.wait_finished(apps)
+
+ self.assertTrue(ec.state(node) == ResourceState.STARTED)
+ self.assertTrue(
+ all([ec.state(guid) == ResourceState.STOPPED \
+ for guid in apps])
+ )
+
+ ec.shutdown()
+
+ def test_exception(self):
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(ErrorApplication)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+
+ ec = ExperimentController()
+
+ node = ec.register_resource("Node")
+
+ app = ec.register_resource("ErrorApplication")
+ ec.register_connection(app, node)
+
+ ec.deploy()
+
+ ec.wait_finished(app)
+
+ ec.shutdown()
+
+ self.assertEquals(ec._fm._failure_level, FailureLevel.RM_FAILURE)
+
+ def test_critical(self):
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(ErrorApplication)
+ ResourceFactory.register_type(Application)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+
+ ec = ExperimentController()
+
+ node = ec.register_resource("Node")
+
+ apps = list()
+
+ eapp = ec.register_resource("ErrorApplication")
+ ec.set(eapp, "critical", False)
+ ec.register_connection(eapp, node)
+ apps.append(eapp)
+
+ for i in xrange(10):
+ app = ec.register_resource("Application")
+ ec.register_connection(app, node)
+ apps.append(app)
+
+ ec.deploy()
+
+ ec.wait_finished(apps)
+
+ state = ec.state(eapp)
+ self.assertEquals(state, ResourceState.FAILED)
+
+ apps.remove(eapp)
+
+ for app in apps:
+ state = ec.state(app)
+ self.assertEquals(state, ResourceState.STOPPED)
+
+ ec.shutdown()
+
+ self.assertEquals(ec._fm._failure_level, FailureLevel.OK)
+
+ def test_start_with_condition(self):
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(Application)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+
+ ec = ExperimentController()
+
+ node = ec.register_resource("Node")
+
+ app1 = ec.register_resource("Application")
+ ec.register_connection(app1, node)
+
+ app2 = ec.register_resource("Application")
+ ec.register_connection(app2, node)
+
+ ec.register_condition(app2, ResourceAction.START, app1,
+ ResourceState.STARTED, time = "5s")
+
+ ec.deploy()
+
+ ec.wait_finished([app1, app2])
+
+ rmapp1 = ec.get_resource(app1)
+ rmapp2 = ec.get_resource(app2)
+
+ self.assertTrue(rmapp2.start_time > rmapp1.start_time)
+
+ ec.shutdown()
+
+ def test_stop_with_condition(self):
+ from nepi.execution.resource import ResourceFactory
+
+ ResourceFactory.register_type(Application)
+ ResourceFactory.register_type(Node)
+ ResourceFactory.register_type(Interface)
+
+ ec = ExperimentController()
+
+ node = ec.register_resource("Node")
+
+ app1 = ec.register_resource("Application")
+ ec.register_connection(app1, node)
+
+ app2 = ec.register_resource("Application")
+ ec.register_connection(app2, node)
+
+ ec.register_condition(app2, ResourceAction.START, app1,
+ ResourceState.STOPPED)
+
+ ec.deploy()
+
+ ec.wait_finished([app1, app2])
+
+ rmapp1 = ec.get_resource(app1)
+ rmapp2 = ec.get_resource(app2)
+
+ self.assertTrue(rmapp2.start_time > rmapp1.stop_time)
+
+ ec.shutdown()
+
+ def ztest_set_with_condition(self):
+ # TODO!!!
+ pass
+