Exemplo n.º 1
0
 def test__render_POST_body_must_be_valid_json(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = self.make_request(content=b'testing not json')
     output = resource.render_POST(request)
     self.assertEquals(
         b"Status payload is not valid JSON:\ntesting not json\n\n", output)
     self.assertEquals(400, request.responseCode)
Exemplo n.º 2
0
 def test__render_POST_empty_authorization(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = DummyRequest([])
     request.requestHeaders.addRawHeader(b'authorization', '')
     output = resource.render_POST(request)
     self.assertEquals(b'', output)
     self.assertEquals(401, request.responseCode)
Exemplo n.º 3
0
 def test__render_POST_validates_required_keys(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = self.make_request(content=json.dumps({}).encode('ascii'))
     output = resource.render_POST(request)
     self.assertEquals(
         b'Missing parameter(s) event_type, origin, name, description '
         b'in status message.', output)
     self.assertEquals(400, request.responseCode)
Exemplo n.º 4
0
 def test_render_POST_bad_authorization(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = DummyRequest([])
     request.requestHeaders.addRawHeader(b"authorization",
                                         factory.make_name("auth"))
     output = resource.render_POST(request)
     self.assertEqual(b"", output)
     self.assertEqual(401, request.responseCode)
Exemplo n.º 5
0
 def test__render_POST_body_must_be_ascii(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = self.make_request(content=b'\xe9')
     output = resource.render_POST(request)
     self.assertEquals(
         b"Status payload must be ASCII-only: 'ascii' codec can't "
         b"decode byte 0xe9 in position 0: ordinal not in range(128)",
         output)
     self.assertEquals(400, request.responseCode)
Exemplo n.º 6
0
 def test__init__(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     self.assertIs(sentinel.status_worker, resource.worker)
     self.assertTrue(resource.isLeaf)
     self.assertEquals([b'POST'], resource.allowedMethods)
     self.assertEquals(['event_type', 'origin', 'name', 'description'],
                       resource.requiredMessageKeys)
Exemplo n.º 7
0
    def installApplication(self, application):
        """Install the WSGI application into the Twisted site.

        It's installed as a child with path "MAAS". This matches the default
        front-end configuration (i.e. Apache) so that there's no need to force
        script names.
        """
        # Setup resources to process paths that twisted handles.
        metadata = Resource()
        metadata.putChild(b'status', StatusHandlerResource(self.status_worker))

        maas = Resource()
        maas.putChild(b'metadata', metadata)
        maas.putChild(b'static', File(settings.STATIC_ROOT))
        maas.putChild(
            b'ws',
            WebSocketsResource(lookupProtocolForFactory(self.websocket)))

        root = Resource()
        root.putChild(b'', Redirect(b"MAAS/"))
        root.putChild(b'MAAS', maas)

        # Setup the resources to process paths that django handles.
        underlay_maas = ResourceOverlay(
            WSGIResource(reactor, self.threadpool, application))
        underlay_root = Resource()
        underlay_root.putChild(b'MAAS', underlay_maas)
        underlay_site = Site(underlay_root,
                             logFormatter=reducedWebLogFormatter)
        underlay_site.requestFactory = CleanPathRequest

        # Setup the main resource as the twisted handler and the underlay
        # resource as the django handler.
        self.site.resource = root
        self.site.underlay = underlay_site
Exemplo n.º 8
0
    def installApplication(self, application):
        """Install the WSGI application into the Twisted site.

        It's installed as a child with path "MAAS". This matches the default
        front-end configuration (i.e. Apache) so that there's no need to force
        script names.
        """
        # Setup resources to process paths that twisted handles.
        metadata = Resource()
        metadata.putChild(b"status", StatusHandlerResource(self.status_worker))

        maas = Resource()
        maas.putChild(b"metadata", metadata)
        maas.putChild(
            b"ws", WebSocketsResource(lookupProtocolForFactory(self.websocket))
        )

        # /MAAS/r/{path} and /MAAS/l/{path} are all resolved by the new MAAS UI
        # react app, and legacy angularjs app respectively.
        # If any paths do not match then its routed to index.html in the new
        # UI code as it uses HTML 5 routing.
        maas.putChild(b"r", DefaultFallbackFile(settings.STATIC_ROOT))

        maas.putChild(b"l", DefaultFallbackFile(settings.STATIC_ROOT))

        # Redirect /MAAS to react app
        maas.putChild(b"", Redirect(b"/MAAS/r/"))

        # Setup static resources
        maas.putChild(
            b"assets",
            NoListingFile(os.path.join(settings.STATIC_ROOT, "assets")),
        )

        # Setup static docs
        maas.putChild(
            b"docs",
            DocsFallbackFile(os.path.join(settings.STATIC_ROOT, "docs")),
        )

        root = Resource()
        root.putChild(b"", Redirect(b"MAAS/"))
        root.putChild(b"MAAS", maas)

        # Setup the resources to process paths that django handles.
        underlay_maas = ResourceOverlay(
            WSGIResource(reactor, self.threadpool, application)
        )
        underlay_root = Resource()
        underlay_root.putChild(b"MAAS", underlay_maas)
        underlay_site = Site(
            underlay_root, logFormatter=reducedWebLogFormatter
        )
        underlay_site.requestFactory = CleanPathRequest

        # Setup the main resource as the twisted handler and the underlay
        # resource as the django handler.
        self.site.resource = root
        self.site.underlay = underlay_site
Exemplo n.º 9
0
 def test_init__(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     self.assertIs(sentinel.status_worker, resource.worker)
     self.assertTrue(resource.isLeaf)
     self.assertEqual([b"POST"], resource.allowedMethods)
     self.assertEqual(
         ["event_type", "origin", "name", "description"],
         resource.requiredMessageKeys,
     )
Exemplo n.º 10
0
 def test__render_POST_queue_messages(self):
     status_worker = Mock()
     status_worker.queueMessage = Mock()
     status_worker.queueMessage.return_value = succeed(None)
     resource = StatusHandlerResource(status_worker)
     message = {
         'event_type': (
             factory.make_name('type') + '/' +
             factory.make_name('sub_type')),
         'origin': factory.make_name('origin'),
         'name': factory.make_name('name'),
         'description': factory.make_name('description'),
     }
     token = factory.make_name('token')
     request = self.make_request(
         content=json.dumps(message).encode('ascii'), token=token)
     output = resource.render_POST(request)
     self.assertEquals(NOT_DONE_YET, output)
     self.assertEquals(204, request.responseCode)
     self.assertThat(
         status_worker.queueMessage, MockCalledOnceWith(token, message))
Exemplo n.º 11
0
 def test_render_POST_queue_messages(self):
     status_worker = Mock()
     status_worker.queueMessage = Mock()
     status_worker.queueMessage.return_value = succeed(None)
     resource = StatusHandlerResource(status_worker)
     message = {
         "event_type":
         (factory.make_name("type") + "/" + factory.make_name("sub_type")),
         "origin":
         factory.make_name("origin"),
         "name":
         factory.make_name("name"),
         "description":
         factory.make_name("description"),
     }
     token = factory.make_name("token")
     request = self.make_request(
         content=json.dumps(message).encode("ascii"), token=token)
     output = resource.render_POST(request)
     self.assertEqual(NOT_DONE_YET, output)
     self.assertEqual(204, request.responseCode)
     self.assertThat(status_worker.queueMessage,
                     MockCalledOnceWith(token, message))
Exemplo n.º 12
0
 def test__render_POST_missing_authorization(self):
     resource = StatusHandlerResource(sentinel.status_worker)
     request = DummyRequest([])
     output = resource.render_POST(request)
     self.assertEquals(b'', output)
     self.assertEquals(401, request.responseCode)