Esempio n. 1
0
    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)
Esempio n. 2
0
    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'))
Esempio n. 3
0
  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')
Esempio n. 4
0
    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')
Esempio n. 5
0
    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)
Esempio n. 6
0
  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)
Esempio n. 7
0
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))
Esempio n. 8
0
 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)])
Esempio n. 9
0
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))
Esempio n. 10
0
    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(), {})
Esempio n. 11
0
    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(), {})
Esempio n. 12
0
  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'))
Esempio n. 13
0
    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)
Esempio n. 14
0
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)
Esempio n. 15
0
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)
Esempio n. 16
0
    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)
Esempio n. 17
0
    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])
Esempio n. 18
0
 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)])
Esempio n. 19
0
 def verify_delayed_action(_):
     self.assertEqual(status.get('status://target'), 1)
Esempio n. 20
0
 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)])
Esempio n. 21
0
 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)])
Esempio n. 22
0
 def verify_delayed_action(_):
   self.assertEqual(status.get('status://target'), 1)
Esempio n. 23
0
    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])
Esempio n. 24
0
    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)