def test_set_revision(self): """Test Status.set() if revision is passed in.""" # Make Sure initial revisions match expectations. status = self._create_status() # Set a new value, update with correct specified revision. status.set("status://int", 10, revision=1) self.assertEqual(status.revision(), 2) self.assertEqual(status.revision("status://int"), 2) # Update an existing value with correct specified revision. status.set("status://int", 20, revision=2) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision("status://int"), 3) # Set a new value, update with incorrect specified revision. # Should raise exception, and modify nothing. self.assertRaises(monitor.status.RevisionMismatch, status.set, "status://int", 30, revision=1) self.assertEqual(status.get("status://int"), 20) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision("status://int"), 3) # Set a new value, update with a future version. self.assertRaises(monitor.status.RevisionMismatch, status.set, "status://int", 30, revision=100) self.assertEqual(status.get("status://int"), 20) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision("status://int"), 3)
def test_web_adapter(self): status = self._create_status({}) json = {'type': 'web'} monitor.adapter.WebAdapter(status, 'status://foo', 'foo', json) monitor.adapter.WebAdapter(status, 'status://bar', 'bar', json) self.assertEqual(status.get('status://foo'), {}) self.assertEqual(status.get('status://bar'), {}) # Web Updatable Paths self.assertTrue( monitor.adapter.WebAdapter.web_updatable('status://foo')) self.assertTrue( monitor.adapter.WebAdapter.web_updatable('status://bar')) self.assertTrue( monitor.adapter.WebAdapter.web_updatable('status://foo/other')) # Not Web Updatable Paths self.assertFalse( monitor.adapter.WebAdapter.web_updatable('status://other')) self.assertFalse( monitor.adapter.WebAdapter.web_updatable('status://other/foo')) self.assertFalse( monitor.adapter.WebAdapter.web_updatable('status://fo'))
def test_handle_action_set(self): """Verify handle_action with JSON set action nodes.""" status, action_manager = self._setup_action_manager() action_set_value = { 'action': 'set', 'value': True, 'dest': 'status://target', } action_manager.handle_action(action_set_value) self.assertEqual(status.get('status://target'), True) action_set_complex = { 'action': 'set', 'value': {'foo': 'bar'}, 'dest': 'status://target', } action_manager.handle_action(action_set_complex) self.assertEqual(status.get('status://target'), {'foo': 'bar'}) action_set_src = { 'action': 'set', 'src': 'status://value', 'dest': 'status://target', } action_manager.handle_action(action_set_src) self.assertEqual(status.get('status://target'), 'status_value')
def test_handle_action_set(self): """Verify handle_action with JSON set action nodes.""" status, action_manager = self._setup_action_manager() action_set_value = { 'action': 'set', 'value': True, 'dest': 'status://target', } action_manager.handle_action(action_set_value) self.assertEqual(status.get('status://target'), True) action_set_complex = { 'action': 'set', 'value': { 'foo': 'bar' }, 'dest': 'status://target', } action_manager.handle_action(action_set_complex) self.assertEqual(status.get('status://target'), {'foo': 'bar'}) action_set_src = { 'action': 'set', 'src': 'status://value', 'dest': 'status://target', } action_manager.handle_action(action_set_src) self.assertEqual(status.get('status://target'), 'status_value')
def test_handle_action_increment(self): """Verify handle_action with JSON set action nodes.""" status, action_manager = self._setup_action_manager() action_set_value = { 'action': 'increment', 'dest': 'status://target', } action_manager.handle_action(action_set_value) self.assertEqual(status.get('status://target'), 1) action_manager.handle_action(action_set_value) self.assertEqual(status.get('status://target'), 2)
def setup(): log_handler, log_buffer = setupLogging() status = monitor.status.Status() # Create our global shared status. Sort of a hard coded file adapter. config_file = os.path.join(BASE_DIR, 'server.json') with open(config_file, 'r') as f: status.set('status://server', json.load(f)) # Setup the normal adapters. setupAdapters(status) # Create the manager for performing actions. action_manager = monitor.actions.ActionManager(status) # Instantiating the engine sets up the deferreds needed to keep it running. monitor.rules_engine.RulesEngine(status, action_manager) # Assemble the factory for our web server. # Serve the standard static web content, overlaid with our dynamic content root = File("./static") root.putChild("button", monitor.web_resources.Button(status)) root.putChild("log", monitor.web_resources.Log(log_handler, log_buffer)) root.putChild("restart", monitor.web_resources.Restart(status)) root.putChild("status", monitor.web_resources.Status(status)) reactor.listenTCP(status.get('status://server/port', 8080), Site(root))
def verify_result(value): self.assertEqual(mocked.mock_calls, [mock.call('target'), mock.call('target')]) self.assertEqual(status.get('status://adapter/host/target/up'), RESULT) self.assertEqual(value, [(True, RESULT), (True, RESULT)])
def test_creation(self): """Verify handle_action with status and http URL strings.""" status = self._create_status({}) # If we start with nothing, we should end up with nothing but a revision # of 1. self.assertEqual(status.revision(), 1) self.assertEqual(status.get(), {})
def test_web_adapter(self): status = self._create_status({}) json = {'type': 'web'} monitor.adapter.WebAdapter(status, 'status://foo', 'foo', json) monitor.adapter.WebAdapter(status, 'status://bar', 'bar', json) self.assertEqual(status.get('status://foo'), {}) self.assertEqual(status.get('status://bar'), {}) # Web Updatable Paths self.assertTrue(monitor.adapter.WebAdapter.web_updatable('status://foo')) self.assertTrue(monitor.adapter.WebAdapter.web_updatable('status://bar')) self.assertTrue(monitor.adapter.WebAdapter.web_updatable( 'status://foo/other')) # Not Web Updatable Paths self.assertFalse(monitor.adapter.WebAdapter.web_updatable('status://other')) self.assertFalse(monitor.adapter.WebAdapter.web_updatable( 'status://other/foo')) self.assertFalse(monitor.adapter.WebAdapter.web_updatable('status://fo'))
def test_set_revision(self): """Test Status.set() if revision is passed in.""" # Make Sure initial revisions match expectations. status = self._create_status() # Set a new value, update with correct specified revision. status.set('status://int', 10, revision=1) self.assertEqual(status.revision(), 2) self.assertEqual(status.revision('status://int'), 2) # Update an existing value with correct specified revision. status.set('status://int', 20, revision=2) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision('status://int'), 3) # Set a new value, update with incorrect specified revision. # Should raise exception, and modify nothing. self.assertRaises(monitor.status.RevisionMismatch, status.set, 'status://int', 30, revision=1) self.assertEqual(status.get('status://int'), 20) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision('status://int'), 3) # Set a new value, update with a future version. self.assertRaises(monitor.status.RevisionMismatch, status.set, 'status://int', 30, revision=100) self.assertEqual(status.get('status://int'), 20) self.assertEqual(status.revision(), 3) self.assertEqual(status.revision('status://int'), 3)
def setupAdapters(status): adapters = status.get('status://server/adapters') adapter_types = { 'file': monitor.adapter.FileAdapter, 'iogear': monitor.iogear_adapter.IOGearAdapter, 'snmp': monitor.snmp_adapter.SnmpAdapter, 'sonos': monitor.sonos_adapter.SonosAdapter, 'web': monitor.adapter.WebAdapter, } for name, settings in adapters.iteritems(): adapter_type = settings['type'] adapter_url = 'status://%s' % name assert adapter_type in adapter_types, ('Unknown adapter types %s' % adapter_type) adapter_class = adapter_types[settings['type']] # Instantiate the adapter. It'll setup whatever it needs persisted. adapter_class(status, adapter_url, name, settings)
def test_set(self): status = self._create_status() self.assertEqual(status.revision(), 1) self.assertEqual(status.get('status://int'), 2) self.assertEqual(status.get('status://list'), []) self.assertEqual(status.get('status://dict'), {'sub1': 3, 'sub2': 4}) # Revision didn't change with the gets. self.assertEqual(status.revision(), 1) # Set an integer status.set('status://int', 10) self.assertEqual(status.get('status://int'), 10) self.assertEqual(status.revision(), 2) # Set a complex structure, and ensure it is copied, not referenced. l = [] status.set('status://list2', l) self.assertEqual(status.get('status://list2'), []) l.append(1) self.assertEqual(status.get('status://list2'), []) self.assertEqual(status.revision(), 3) # Ensure that setting to an unchanged value does not increment revision. status.set('status://int', 10) self.assertEqual(status.get('status://int'), 10) self.assertEqual(status.revision(), 3) # Set a nested value. status.set('status://dict/sub1', 5) self.assertEqual(status.get('status://dict/sub1'), 5) self.assertEqual(status.revision(), 4) # Set a nested value with new intermediate paths. status.set('status://nest1/nest2/nest3', 'foo') self.assertEqual(status.get('status://nest1'), {'nest2': { 'nest3': 'foo' }}) self.assertEqual(status.revision(), 5) # Clear an existing value. status.set('status://dict/sub1', None) self.assertEqual(status.get('status://dict'), { 'sub1': None, 'sub2': 4 }) self.assertEqual(status.revision(), 6) # Clear a sub-tree status.set('status://nest1', None) self.assertEqual( status.get('status://'), { 'dict': { 'sub1': None, 'sub2': 4 }, 'int': 10, 'list': [], 'list2': [], 'nest1': None }) self.assertEqual(status.revision(), 7) # Clear a nonexitent value status.set('status://nonexistent', None) self.assertEqual( status.get('status://'), { 'dict': { 'sub1': None, 'sub2': 4 }, 'int': 10, 'list': [], 'list2': [], 'nest1': None }) self.assertEqual(status.revision(), 7)
def test_get(self): contents = { 'int': 2, 'string': 'foo', 'list': [5, 6, 7], 'dict': { 'sub1': 3, 'sub2': 4 }, } status = self._create_status(contents) self.assertEqual(status.get('status://'), contents) self.assertEqual(status.get('status://nonexistant'), None) self.assertEqual(status.get('status://nonexistant', 'default'), 'default') self.assertEqual(status.get('status://dict/nonexistant', 'default'), 'default') self.assertEqual(status.get('status://int'), 2) self.assertEqual(status.get('status://string'), 'foo') self.assertEqual(status.get('status://list'), [5, 6, 7]) self.assertEqual(status.get('status://dict'), {'sub1': 3, 'sub2': 4}) self.assertEqual(status.get('status://dict/sub1'), 3) self.assertRaises(monitor.status.BadUrl, status.get, 'status://string/foo') self.assertRaises(monitor.status.BadUrl, status.get, 'status://string/foo', None) self.assertRaises(monitor.status.BadUrl, status.get, 'status://list/1') # Ensure values copied out are copied, not referenced. l = status.get('status://list') l.append(1) self.assertEqual(status.get('status://list'), [5, 6, 7])
def verify_result(value): mocked.assert_called_once_with('target') self.assertEqual(status.get('status://adapter/host/target/up'), RESULT) self.assertEqual(value, [(True, RESULT)])
def verify_delayed_action(_): self.assertEqual(status.get('status://target'), 1)
def test_get(self): contents = {"int": 2, "string": "foo", "list": [5, 6, 7], "dict": {"sub1": 3, "sub2": 4}} status = self._create_status(contents) self.assertEqual(status.get("status://"), contents) self.assertEqual(status.get("status://nonexistant"), None) self.assertEqual(status.get("status://nonexistant", "default"), "default") self.assertEqual(status.get("status://dict/nonexistant", "default"), "default") self.assertEqual(status.get("status://int"), 2) self.assertEqual(status.get("status://string"), "foo") self.assertEqual(status.get("status://list"), [5, 6, 7]) self.assertEqual(status.get("status://dict"), {"sub1": 3, "sub2": 4}) self.assertEqual(status.get("status://dict/sub1"), 3) self.assertRaises(monitor.status.BadUrl, status.get, "status://string/foo") self.assertRaises(monitor.status.BadUrl, status.get, "status://string/foo", None) self.assertRaises(monitor.status.BadUrl, status.get, "status://list/1") # Ensure values copied out are copied, not referenced. l = status.get("status://list") l.append(1) self.assertEqual(status.get("status://list"), [5, 6, 7])
def test_set(self): status = self._create_status() self.assertEqual(status.revision(), 1) self.assertEqual(status.get("status://int"), 2) self.assertEqual(status.get("status://list"), []) self.assertEqual(status.get("status://dict"), {"sub1": 3, "sub2": 4}) # Revision didn't change with the gets. self.assertEqual(status.revision(), 1) # Set an integer status.set("status://int", 10) self.assertEqual(status.get("status://int"), 10) self.assertEqual(status.revision(), 2) # Set a complex structure, and ensure it is copied, not referenced. l = [] status.set("status://list2", l) self.assertEqual(status.get("status://list2"), []) l.append(1) self.assertEqual(status.get("status://list2"), []) self.assertEqual(status.revision(), 3) # Ensure that setting to an unchanged value does not increment revision. status.set("status://int", 10) self.assertEqual(status.get("status://int"), 10) self.assertEqual(status.revision(), 3) # Set a nested value. status.set("status://dict/sub1", 5) self.assertEqual(status.get("status://dict/sub1"), 5) self.assertEqual(status.revision(), 4) # Set a nested value with new intermediate paths. status.set("status://nest1/nest2/nest3", "foo") self.assertEqual(status.get("status://nest1"), {"nest2": {"nest3": "foo"}}) self.assertEqual(status.revision(), 5) # Clear an existing value. status.set("status://dict/sub1", None) self.assertEqual(status.get("status://dict"), {"sub1": None, "sub2": 4}) self.assertEqual(status.revision(), 6) # Clear a sub-tree status.set("status://nest1", None) self.assertEqual( status.get("status://"), {"dict": {"sub1": None, "sub2": 4}, "int": 10, "list": [], "list2": [], "nest1": None}, ) self.assertEqual(status.revision(), 7) # Clear a nonexitent value status.set("status://nonexistent", None) self.assertEqual( status.get("status://"), {"dict": {"sub1": None, "sub2": 4}, "int": 10, "list": [], "list2": [], "nest1": None}, ) self.assertEqual(status.revision(), 7)