示例#1
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={})
            with RequestsMock() as rsps:
                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)

                ctx.request.user = self.user
                response = Response(ctx.request, response)
                groups_tuple = list(response.split())
                self.assertEqual(2, len(groups_tuple))
                expected_groups = [
                    SieveAppGroup(g) for g in SieveAppGroup(
                        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])
示例#2
0
 def test_iterate_sub_groups_two_levels(self):
     """
     Grupos:
         + /
           + /foo
             + /bla
     """
     data = {
         "id":
         "/",
         "groups": [
             {
                 "id": "/foo",
                 "apps": [],
                 "groups": [
                     {
                         "id": "/foo/bar",
                         "apps": []
                     },
                 ]
             },
         ],
         "apps": []
     }
     group = SieveAppGroup(MarathonGroup.from_json(data))
     self.assertEqual(group.id, "/")
     expected_all_group_ids = ["/", "/foo", "/foo/bar"]
     returned_groups = list(group.iterate_groups())
     self.assertEqual(expected_all_group_ids,
                      [g.id for g in returned_groups])
示例#3
0
    def split(self) -> Apps:

        if self.is_read_request():
            response_content = json.loads(self.response.data)
            if self.is_list_apps_request():
                for app in response_content['apps']:
                    response_app = SieveMarathonApp.from_json(app)
                    app = self.marathon_client.get_app(self.object_id
                                                       or response_app.id)
                    yield response_app, app
                return
            elif self.is_group_request():
                response_group = SieveAppGroup(
                    MarathonGroup.from_json(response_content))
                for current_group in response_group.iterate_groups():
                    group_id = current_group.id
                    group_id_without_namespace = self._remove_namespace_if_exists(
                        self.request.user.current_account.namespace, group_id)
                    original_group = self._get_original_group(
                        self.request.user, group_id_without_namespace)
                    yield current_group, original_group
                return
            elif self.is_tasks_request():
                for task in response_content['tasks']:
                    response_task = MarathonTask.from_json(task)
                    yield response_task, response_task
                return
            elif self.is_deployment():
                content = response_content
                deployments = (MarathonDeployment.from_json(deploy)
                               for deploy in content)

                for deployment in deployments:
                    yield deployment, deployment
                return
            elif self.is_queue_request():
                queue_data = response_content
                queued_apps = (MarathonQueueItem.from_json(queue_item)
                               for queue_item in queue_data['queue'])
                for queued_app in queued_apps:
                    yield queued_app, queued_app
                return
            else:
                response_app = SieveMarathonApp.from_json(
                    response_content.get('app') or response_content)
                app = self.marathon_client.get_app(self.object_id)
                yield response_app, app
                return

        if self.is_write_request():
            response_content = json.loads(self.response.data)
            if 'tasks' in response_content:
                for task in response_content['tasks']:
                    response_task = MarathonTask.from_json(task)
                    yield response_task, response_task
                return
            return

        yield SieveMarathonApp(), self.marathon_client.get_app(self.app_id)
示例#4
0
 def _get_original_group(self, user, group_id):
     group_id_with_namespace = "/{}/{}".format(
         user.current_account.namespace, (group_id or "/").strip("/"))
     try:
         return SieveAppGroup(
             self.marathon_client.get_group(group_id_with_namespace))
     except NotFoundError as e:
         return SieveAppGroup(
             MarathonGroup.from_json({"id": group_id_with_namespace}))
示例#5
0
 def test_iterate_group_apps(self):
     data = {
         "id":
         "/",
         "groups": [
             {
                 "id":
                 "/foo",
                 "apps": [
                     {
                         "id": "/foo/app0"
                     },
                     {
                         "id": "/foo/app1"
                     },
                 ],
                 "groups": [
                     {
                         "id":
                         "/foo/bar",
                         "apps": [],
                         "groups": [{
                             "id":
                             "/foo/bar/baz",
                             "apps": [
                                 {
                                     "id": "/foo/bar/baz/app0"
                                 },
                                 {
                                     "id": "/foo/bar/baz/app1"
                                 },
                             ]
                         }]
                     },
                 ]
             },
         ],
         "apps": [{
             "id": "/app0"
         }, {
             "id": "/app1"
         }]
     }
     group = SieveAppGroup(MarathonGroup.from_json(data))
     self.assertEqual(group.id, "/")
     expected_all_apps_ids = [
         "/app0", "/app1", "/foo/app0", "/foo/app1", "/foo/bar/baz/app0",
         "/foo/bar/baz/app1"
     ]
     returned_apps = list(group.iterate_apps())
     self.assertEqual(expected_all_apps_ids, [g.id for g in returned_apps])
示例#6
0
 def test_from_json(self):
     data = {
         "id": "/",
         "apps": [],
         "groups": [],
     }
     group = SieveAppGroup.from_json(data)
     self.assertEqual("/", group.id)
示例#7
0
 def test_iterate_sub_groups_one_level(self):
     data = {
         "id": "/",
         "groups": [
             {
                 "id": "/foo",
                 "apps": []
             },
             {
                 "id": "/bla",
                 "apps": []
             },
         ],
         "apps": []
     }
     group = SieveAppGroup(MarathonGroup.from_json(data))
     self.assertEqual(group.id, "/")
     all_group_ids = ["/", "/foo", "/bla"]
     self.assertEqual(all_group_ids, [g.id for g in group.iterate_groups()])
示例#8
0
    def test_modify_some_apps(self):
        data = {
            "id": "/",
            "apps": [
                {
                    "id": "/foo"
                },
                {
                    "id": "/bla"
                },
            ],
        }
        group = SieveAppGroup(MarathonGroup.from_json(data))
        apps = list(group.iterate_apps())
        apps[0].id = "/foo0"
        apps[1].id = "/bla0"

        apps_modified = list(group.iterate_apps())
        self.assertEqual(["/foo0", "/bla0"], [app.id for app in apps_modified])
示例#9
0
 def test_iterate_subgroups_three_levels_with_siblings(self):
     """
     Grupos:
         + /
           + /foo
             + /bar
               + /foo/bar/baz
           + /foo2
     """
     data = {
         "id":
         "/",
         "groups": [
             {
                 "id":
                 "/foo",
                 "apps": [],
                 "groups": [
                     {
                         "id": "/foo/bar",
                         "apps": [],
                         "groups": [{
                             "id": "/foo/bar/baz"
                         }]
                     },
                 ]
             },
             {
                 "id": "/foo2",
                 "apps": [],
                 "groups": [],
             },
         ],
         "apps": []
     }
     group = SieveAppGroup(MarathonGroup.from_json(data))
     self.assertEqual(group.id, "/")
     expected_all_group_ids = [
         "/", "/foo", "/foo/bar", "/foo/bar/baz", "/foo2"
     ]
     returned_groups = list(group.iterate_groups())
     self.assertEqual(expected_all_group_ids,
                      [g.id for g in returned_groups])
示例#10
0
    def test_get_original_group_not_found(self):
        """
        Tenta buscar um grupo que não existe.
        """
        with application.test_request_context('/v2/groups//not-found',
                                              method='GET') as ctx:
            with RequestsMock() as rsps:
                rsps.add(method='GET',
                         url=conf.MARATHON_ADDRESSES[0] +
                         '/v2/groups//dev/not-found',
                         status=404)
                ctx.request.user = self.user
                request = Request(ctx.request)

                group = request._get_original_group(self.user, "/not-found")
                self.assertEqual(
                    SieveAppGroup(
                        MarathonGroup.from_json({"id": "/dev/not-found"})),
                    group)
示例#11
0
    def test_get_original_group_migrated(self):
        found_group = {
            "id": "/dev/foo",
            "apps": [],
            "groups": [],
        }
        with application.test_request_context('/v2/groups//foo',
                                              method='GET') as ctx:
            with RequestsMock() as rsps:
                rsps.add(method='GET',
                         url=conf.MARATHON_ADDRESSES[0] +
                         '/v2/groups//dev/foo',
                         body=json.dumps(found_group),
                         status=200)
                ctx.request.user = self.user
                request = Request(ctx.request)

                group = request._get_original_group(self.user, "/foo")
                self.assertTrue(isinstance(group, SieveAppGroup))
                self.assertEqual(SieveAppGroup.from_json(found_group), group)
示例#12
0
#!/usr/bin/env python

# Script que percorre todas as apps e groups de um json (de Grupo) removendo:
# app.version
# app.fetch
# group.version

import sys
import json

from hollowman.marathon.group import SieveAppGroup
from marathon.models.group import MarathonGroup
from marathon.util import MarathonJsonEncoder

data = open(sys.argv[1]).read()
_g = SieveAppGroup(MarathonGroup.from_json(json.loads(data)))

for group in _g.iterate_groups():
    del group.version
    for app in group.apps:
        del app.version
        del app.fetch

data_output = json.dumps(_g._marathon_group, cls=MarathonJsonEncoder)
print(data_output)
import sys
import json


def _patch_docker_params(params):
    for p in params:
        for k, v in p.items():
            if "=" in v:
                idx_ = v.index("=")
                parts = v.split("=")
                v = parts[0] + "=" + "/sieve" + parts[1]
                p[k] = v


_group = SieveAppGroup(MarathonGroup.from_json(json.loads(sys.stdin.read())))

for group in _group.iterate_groups():
    group.id = "/sieve{}".format(group.id)
    del group.version
    print(group.id, file=sys.stderr)
    for app in group.apps:
        app.id = "/sieve{}".format(app.id)
        app.fetch = []
        del app.version
        _patch_docker_params([
            p for p in app.container.docker.parameters
            if p['value'].startswith("hollowman.appname")
        ])
        print(" >", app.id, app.container.docker.parameters, file=sys.stderr)
示例#14
0
 def test_iterate_empty_group(self):
     group = SieveAppGroup()
     apps = list(group.iterate_apps())
     self.assertEqual(0, len(apps))
示例#15
0
 def test_eq(self):
     root_a = SieveAppGroup.from_json({"id": "/"})
     root_b = SieveAppGroup.from_json({"id": "/"})
     self.assertEqual(root_a, root_b)