Пример #1
0
 def test_remove_namespace_if_exists(self):
     response = Response(None, None)
     self.assertEqual("", response._remove_namespace_if_exists("dev", ""))
     self.assertEqual("/", response._remove_namespace_if_exists("dev", "/"))
     self.assertEqual("/", response._remove_namespace_if_exists("dev", "/dev/"))
     self.assertEqual("", response._remove_namespace_if_exists("dev", "/dev"))
     self.assertEqual("/foo", response._remove_namespace_if_exists("dev", "/dev/foo"))
     self.assertEqual("/foo/dev", response._remove_namespace_if_exists("dev", "/dev/foo/dev"))
     self.assertEqual("/dev", response._remove_namespace_if_exists("dev", "/dev/dev"))
     self.assertEqual(None, response._remove_namespace_if_exists("dev", None))
Пример #2
0
    def test_multiapp_response_returns_multiple_marathonapp_instances(self, fixture):
        modified_app = fixture.copy()
        modified_app['id'] = '/xablau'

        apps = [fixture, modified_app]
        with application.test_request_context('/v2/apps/',
                                              method='GET', data=b'') as ctx:
            response = FlaskResponse(response=json.dumps({"apps": apps}),
                                     status=HTTPStatus.OK,
                                     headers={})
            response = Response(ctx.request, response)

        with patch.object(response, 'marathon_client') as client:
            original_apps = [MarathonApp.from_json(app) for app in apps]
            client.get_app.side_effect = original_apps
            apps = list(response.split())
            self.assertEqual([call("/foo"), call("/xablau")], client.get_app.call_args_list)

        self.assertEqual(
            apps,
            [
                (AsgardApp.from_json(fixture), original_apps[0]),
                (AsgardApp.from_json(modified_app), original_apps[1])
            ]
        )
Пример #3
0
    def test_split_groups_read_on_root_group(self, group_dev_namespace_fixture):
        with application.test_request_context('/v2/groups/', method='GET') as ctx:
            response = FlaskResponse(
                response=json.dumps(group_dev_namespace_fixture),
                status=HTTPStatus.OK,
                headers={}
            )
            with RequestsMock() as rsps:
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture)), status=200)
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/a',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture['groups'][0])), status=200)
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/group-b',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture['groups'][1])), status=200)
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/group-b/group-b0',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture['groups'][1]['groups'][0])), status=200)
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/group-c',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture['groups'][2])), status=200)

                ctx.request.user = self.user
                response = Response(ctx.request, response)
                groups_tuple = list(response.split())
                self.assertEqual(5, len(groups_tuple))
                expected_groups = [AsgardAppGroup(g) for g in AsgardAppGroup(MarathonGroup.from_json(group_dev_namespace_fixture)).iterate_groups()]
                # Compara com os groups originais
                self.assertEqual(expected_groups, [g[1] for g in groups_tuple])
Пример #4
0
    def test_it_recreates_a_get_response_for_multiple_apps(self, fixture):
        modified_app = deepcopy(fixture)
        modified_app["id"] = "/xablau"

        fixtures = [fixture, modified_app]
        expected_response = deepcopy(fixtures)
        with application.test_request_context("/v2/apps/",
                                              method="GET",
                                              data=b"") as ctx:
            response = FlaskResponse(
                response=json.dumps({"apps": fixtures}),
                status=HTTPStatus.OK,
                headers={},
            )
            response = Response(ctx.request, response)

        with patch.object(response, "marathon_client") as client:
            original_apps = [AsgardApp.from_json(app) for app in fixtures]
            client.get_app.side_effect = original_apps
            apps = list(response.split())

            joined_response = response.join(apps)

            self.assertIsInstance(joined_response, FlaskResponse)
            self.assertDictEqual(json.loads(joined_response.data),
                                 {"apps": expected_response})
Пример #5
0
    def test_multiapp_response_returns_multiple_marathonapp_instances(
            self, fixture):
        modified_app = fixture.copy()
        modified_app["id"] = "/xablau"

        apps = [fixture, modified_app]
        with application.test_request_context("/v2/apps/",
                                              method="GET",
                                              data=b"") as ctx:
            response = FlaskResponse(
                response=json.dumps({"apps": apps}),
                status=HTTPStatus.OK,
                headers={},
            )
            response = Response(ctx.request, response)

        with patch.object(response, "marathon_client") as client:
            original_apps = [MarathonApp.from_json(app) for app in apps]
            client.get_app.side_effect = original_apps
            apps = list(response.split())

        self.assertEqual(
            apps,
            [
                (AsgardApp.from_json(fixture), original_apps[0]),
                (AsgardApp.from_json(modified_app), original_apps[1]),
            ],
        )
Пример #6
0
    def test_a_single_app_response_returns_a_single_marathonapp(self, fixture):
        with application.test_request_context('/v2/apps//foo',
                                              method='GET',
                                              data=b'') as ctx:
            flask_response = FlaskResponse(response=json.dumps(
                {"app": fixture}),
                                           status=HTTPStatus.OK,
                                           headers={})
            response = Response(ctx.request, flask_response)

            with patch.object(response, 'marathon_client') as client:
                client.get_app.return_value = SieveMarathonApp.from_json(
                    fixture)
                apps = list(response.split())
                self.assertEqual([call("/foo")], client.get_app.call_args_list)

            self.assertEqual(apps, [(SieveMarathonApp.from_json(fixture),
                                     client.get_app.return_value)])
Пример #7
0
    def test_split_queue_GET(self, queue_get_fixture):
        with application.test_request_context("/v2/queue",
                                              method="GET") as ctx:
            response = FlaskResponse(response=json.dumps(queue_get_fixture),
                                     status=HTTPStatus.OK)

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            queue_tuples = list(response.split())
            self.assertEqual(2, len(queue_tuples))
Пример #8
0
    def test_should_join_an_empty_list_into_an_empty_response_single_app(self, single_full_app_fixture):
        with application.test_request_context('/v2/apps//foo',
                                              method='GET', data=b'') as ctx:
            response = FlaskResponse(response=json.dumps({"app": single_full_app_fixture}),
                                     status=HTTPStatus.OK,
                                     headers={})
            response = Response(ctx.request, response)

            joined_response = response.join([])

            self.assertIsInstance(joined_response, FlaskResponse)
            self.assertDictEqual(json.loads(joined_response.data), {'app': {}})
Пример #9
0
    def test_join_tasks_POST_scale_false(self, tasks_get_fixture):
        with application.test_request_context("/v2/tasks/delete?scale=false",
                                              method="POST") as ctx:
            response = FlaskResponse(response=json.dumps(tasks_get_fixture),
                                     status=HTTPStatus.OK)

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())
            joined_response = response.join(tasks_tuple)

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual(3, len(joined_response_data["tasks"]))
Пример #10
0
 def test_a_response_for_restart_operation_with_appid_in_url_path_does_not_split_response(
         self, fixture):
     """
     Quando o response retorna um Deployment, não fazemos split.
     """
     with application.test_request_context("/v2/apps/xablau/restart",
                                           method="PUT",
                                           data=b'{"force": true}') as ctx:
         response = FlaskResponse(response=b"{}",
                                  status=HTTPStatus.OK,
                                  headers={})
         response = Response(ctx.request, response)
         apps = list(response.split())
         self.assertEqual(0, len(apps))
Пример #11
0
    def test_join_tasks_POST_scale_true(self, tasks_post_fixture):
        with application.test_request_context('/v2/tasks/delete?scale=true', method='POST') as ctx:
            response = FlaskResponse(
                response=json.dumps(tasks_post_fixture),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())
            joined_response = response.join(tasks_tuple)

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual("5ed4c0c5-9ff8-4a6f-a0cd-f57f59a34b43", joined_response_data['deploymentId'])
Пример #12
0
    def test_join_tasks_GET(self, tasks_single_namespace_fixture):
        with application.test_request_context('/v2/tasks/', method='GET') as ctx:
            response = FlaskResponse(
                response=json.dumps(tasks_single_namespace_fixture),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())
            joined_response = response.join(tasks_tuple)

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual(3, len(joined_response_data['tasks']))
Пример #13
0
    def test_split_staks_POST_scale_true(self, tasks_post_fixture):
        """
        No caso do POST com `?scale=true` o retorno é:
            - Deployment Id
        Isso significa que não faremos split do response
        """
        with application.test_request_context("/v2/tasks/delete?scale=true",
                                              method="POST") as ctx:
            response = FlaskResponse(response=json.dumps(tasks_post_fixture),
                                     status=HTTPStatus.OK)

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())
            self.assertEqual(0, len(tasks_tuple))
Пример #14
0
    def test_split_tasks_GET(self, tasks_get_fixture):
        """
        No cado de um GET, o retorno sempre é uma lista de apps.
        """
        with application.test_request_context('/v2/tasks/', method='GET') as ctx:
            response = FlaskResponse(
                response=json.dumps(tasks_get_fixture),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())

            self.assertEqual([MarathonTask.from_json(task) for task in tasks_get_fixture['tasks']],
                             [task[0] for task in tasks_tuple])
Пример #15
0
    def test_join_tasks_empty_list_GET(self):
        """
        Se o request for GET e a lista de tasks for vazia, significa que todas as tasks
        foram removidas do response, isso significa que temos que retornar um response vazio.
        """
        with application.test_request_context('/v2/tasks/', method='GET') as ctx:
            response = FlaskResponse(
                response=json.dumps({"tasks": [{"id":"some-filtered-task"}]}),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            joined_response = response.join([])

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual(0, len(joined_response_data['tasks']))
Пример #16
0
    def test_it_recreates_a_get_response_for_a_single_app(self, fixture):
        self.maxDiff = None
        with application.test_request_context('/v2/apps//foo',
                                              method='GET', data=b'') as ctx:
            response = FlaskResponse(response=json.dumps({"app": fixture}),
                                     status=HTTPStatus.OK,
                                     headers={})
            response = Response(ctx.request, response)

        with patch.object(response, 'marathon_client') as client:
            client.get_app.return_value = AsgardApp.from_json(deepcopy(fixture))
            apps = list(response.split())

            joined_response = response.join(apps)

            self.assertIsInstance(joined_response, FlaskResponse)
            self.assertDictEqual(json.loads(joined_response.data), {'app': fixture})
Пример #17
0
    def test_split_staks_POST_scale_false(self, tasks_get_fixture):
        """
        No caso do POST com `?scale=false` o retorno é:
            - Lista de apps que foram killed
        Por isso usamos a fixture de tasks/get.json aqui
        """
        with application.test_request_context('/v2/tasks/delete?scale=false', method='POST') as ctx:
            response = FlaskResponse(
                response=json.dumps(tasks_get_fixture),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            tasks_tuple = list(response.split())

            self.assertEqual([MarathonTask.from_json(task) for task in tasks_get_fixture['tasks']],
                             [task[0] for task in tasks_tuple])
Пример #18
0
    def test_should_join_an_empty_list_into_an_empty_response_multi_app(self, single_full_app_fixture):
        modified_app = deepcopy(single_full_app_fixture)
        modified_app['id'] = '/other-app'

        fixtures = [single_full_app_fixture, modified_app]
        expected_response = deepcopy(fixtures)
        with application.test_request_context('/v2/apps/',
                                              method='GET', data=b'') as ctx:
            response = FlaskResponse(response=json.dumps({"apps": fixtures}),
                                     status=HTTPStatus.OK,
                                     headers={})
            response = Response(ctx.request, response)

            joined_response = response.join([])

            self.assertIsInstance(joined_response, FlaskResponse)
            self.assertDictEqual(json.loads(joined_response.data),
                                 {'apps': []})
Пример #19
0
    def test_join_a_uknown_response(self):
        """
        Como o repsonse roda para qualquer requiest que retornou 200 no upstream,
        muitas vezes pode passar por ele um request que ele "não trata", ou seja,
        que ele não tem nada o que fazer.
        Esse teste certifica que o join() não quebra em casos como esse
        """
        with application.test_request_context('/v2/apps/myapp/restart', method='POST') as ctx:
            response = FlaskResponse(
                response=json.dumps({"deploymentId": "myId"}),
                status=HTTPStatus.OK
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            joined_response = response.join([])

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual("myId", joined_response_data['deploymentId'])
Пример #20
0
 def test_split_groups_read_on_specific_group(self,
                                              group_dev_namespace_fixture):
     with application.test_request_context("/v2/groups/group-b",
                                           method="GET") as ctx:
         response = FlaskResponse(
             response=json.dumps(group_dev_namespace_fixture["groups"][1]),
             status=HTTPStatus.OK,
             headers={},
         )
         ctx.request.user = self.user
         response = Response(ctx.request, response)
         groups_tuple = list(response.split())
         self.assertEqual(2, len(groups_tuple))
         expected_groups = [
             AsgardAppGroup(g) for g in AsgardAppGroup(
                 MarathonGroup.from_json(
                     group_dev_namespace_fixture["groups"]
                     [1])).iterate_groups()
         ]
         # Compara com os groups originais
         self.assertEqual(expected_groups, [g[1] for g in groups_tuple])
Пример #21
0
    def test_join_groups(self, group_dev_namespace_fixture):
        with application.test_request_context("/v2/groups/",
                                              method="GET") as ctx:
            response = FlaskResponse(
                response=json.dumps(group_dev_namespace_fixture),
                status=HTTPStatus.OK,
                headers={},
            )

            ctx.request.user = self.user
            response = Response(ctx.request, response)
            groups_tuple = list(response.split())
            joined_response = response.join(groups_tuple)

            joined_response_data = json.loads(joined_response.data)
            self.assertEqual("/dev", joined_response_data["id"])
            self.assertEqual("/dev/group-b",
                             joined_response_data["groups"][0]["id"])
            self.assertEqual([], joined_response_data["dependencies"]
                             )  # Groups should be reendered in full
            self.assertEqual(1, len(joined_response_data["groups"][0]["apps"]))
            self.assertEqual(
                [], joined_response_data["groups"][0]["apps"][0]
                ["constraints"])  # Apps should also be renderen in full
Пример #22
0
    def test_join_groups(self, group_dev_namespace_fixture):
        with application.test_request_context('/v2/groups/', method='GET') as ctx:
            response = FlaskResponse(
                response=json.dumps(group_dev_namespace_fixture),
                status=HTTPStatus.OK,
                headers={}
            )
            with RequestsMock() as rsps:
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture)), status=200)
                rsps.add(method='GET', url=conf.MARATHON_ADDRESSES[0] + '/v2/groups//dev/group-b',
                         body=json.dumps(deepcopy(group_dev_namespace_fixture['groups'][0])), status=200)

                ctx.request.user = self.user
                response = Response(ctx.request, response)
                groups_tuple = list(response.split())
                joined_response = response.join(groups_tuple)

                joined_response_data = json.loads(joined_response.data)
                self.assertEqual("/dev", joined_response_data['id'])
                self.assertEqual("/dev/group-b", joined_response_data['groups'][0]['id'])
                self.assertEqual([], joined_response_data['dependencies']) # Groups should be reendered in full
                self.assertEqual(1, len(joined_response_data['groups'][0]['apps']))
                self.assertEqual([], joined_response_data['groups'][0]['apps'][0]['constraints']) # Apps should also be renderen in full