Skip to content

Commit 0308ebb

Browse files
authored
Is/auto add to group (#1745)
1 parent 60c6035 commit 0308ebb

File tree

17 files changed

+197
-62
lines changed

17 files changed

+197
-62
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""add groups inclusion_rules column
2+
3+
Revision ID: 43766dcf0fc2
4+
Revises: 01073b43fc74
5+
Create Date: 2020-08-25 08:54:55.441452+00:00
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from sqlalchemy.dialects import postgresql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '43766dcf0fc2'
14+
down_revision = '01073b43fc74'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('groups', sa.Column('inclusion_rules', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False))
22+
# ### end Alembic commands ###
23+
24+
25+
def downgrade():
26+
# ### commands auto generated by Alembic - please adjust! ###
27+
op.drop_column('groups', 'inclusion_rules')
28+
# ### end Alembic commands ###

packages/postgres-database/src/simcore_postgres_database/models/groups.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class GroupType(enum.Enum):
3434
sa.Column("description", sa.String, nullable=False),
3535
sa.Column("type", sa.Enum(GroupType), nullable=False, server_default="STANDARD"),
3636
sa.Column("thumbnail", sa.String, nullable=True),
37+
sa.Column("inclusion_rules", JSONB, nullable=False, server_default=sa.text("'{}'::jsonb")),
3738
sa.Column("created", sa.DateTime(), nullable=False, server_default=func.now()),
3839
sa.Column(
3940
"modified",

packages/simcore-sdk/tests/integration/test_dbmanager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"postgres",
1414
]
1515

16-
ops_services = ["minio", "adminer"]
16+
ops_services = ["minio"]
1717

1818

1919
async def test_db_manager_read_config(

services/director/tests/fixtures/fake_services.py

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
import json
66
import logging
77
import random
8+
from io import BytesIO
89
from pathlib import Path
910

10-
import docker
1111
import pytest
1212
import requests
13+
from aiodocker.docker import Docker
14+
from aiodocker.exceptions import DockerError
1315

1416
_logger = logging.getLogger(__name__)
1517

18+
import asyncio
19+
1620

1721
@pytest.fixture(scope="function")
1822
def push_services(loop, docker_registry, tmpdir):
@@ -22,7 +26,7 @@ def push_services(loop, docker_registry, tmpdir):
2226
list_of_pushed_images_tags = []
2327
dependent_images = []
2428

25-
def build_push_images(
29+
async def build_push_images(
2630
number_of_computational_services,
2731
number_of_interactive_services,
2832
inter_dependent_services=False,
@@ -32,7 +36,7 @@ def build_push_images(
3236
try:
3337
dependent_image = None
3438
if inter_dependent_services:
35-
dependent_image = _build_push_image(
39+
dependent_image = await _build_push_image(
3640
tmp_dir,
3741
registry_url,
3842
"computational",
@@ -43,30 +47,36 @@ def build_push_images(
4347
)
4448
dependent_images.append(dependent_image)
4549

50+
images_to_build = []
51+
4652
for image_index in range(0, number_of_computational_services):
47-
image = _build_push_image(
48-
tmp_dir,
49-
registry_url,
50-
"computational",
51-
"test",
52-
version + str(image_index),
53-
dependent_image,
54-
bad_json_format=bad_json_format,
53+
images_to_build.append(
54+
_build_push_image(
55+
tmp_dir,
56+
registry_url,
57+
"computational",
58+
"test",
59+
version + str(image_index),
60+
dependent_image,
61+
bad_json_format=bad_json_format,
62+
)
5563
)
56-
list_of_pushed_images_tags.append(image)
5764

5865
for image_index in range(0, number_of_interactive_services):
59-
image = _build_push_image(
60-
tmp_dir,
61-
registry_url,
62-
"dynamic",
63-
"test",
64-
version + str(image_index),
65-
dependent_image,
66-
bad_json_format=bad_json_format,
66+
images_to_build.append(
67+
_build_push_image(
68+
tmp_dir,
69+
registry_url,
70+
"dynamic",
71+
"test",
72+
version + str(image_index),
73+
dependent_image,
74+
bad_json_format=bad_json_format,
75+
)
6776
)
68-
list_of_pushed_images_tags.append(image)
69-
except docker.errors.APIError:
77+
results = await asyncio.gather(*images_to_build)
78+
list_of_pushed_images_tags.extend(results)
79+
except DockerError:
7080
_logger.exception("Unexpected docker API error")
7181
raise
7282

@@ -78,17 +88,17 @@ def build_push_images(
7888
_clean_registry(registry_url, dependent_images)
7989

8090

81-
def _build_push_image(
91+
async def _build_push_image(
8292
docker_dir,
8393
registry_url,
8494
service_type,
8595
name,
8696
tag,
8797
dependent_image=None,
8898
*,
89-
bad_json_format=False
99+
bad_json_format=False,
90100
): # pylint: disable=R0913
91-
docker_client = docker.from_env()
101+
docker = Docker()
92102
# crate image
93103
service_description = _create_service_description(service_type, name, tag)
94104
docker_labels = _create_docker_labels(service_description, bad_json_format)
@@ -141,16 +151,15 @@ def _build_push_image(
141151
docker_labels["org.label-schema.vcs-ref"] = service_extras["vcs_ref"]
142152
docker_labels["org.label-schema.vcs-url"] = service_extras["vcs_url"]
143153

144-
image = _create_base_image(docker_dir, docker_labels)
145-
# tag image
146154
image_tag = registry_url + "/{key}:{version}".format(
147155
key=service_description["key"], version=tag
148156
)
149-
assert image.tag(image_tag) is True
157+
await _create_base_image(docker_labels, image_tag)
158+
150159
# push image to registry
151-
docker_client.images.push(image_tag)
160+
await docker.images.push(image_tag)
152161
# remove image from host
153-
docker_client.images.remove(image_tag)
162+
# docker.images.remove(image_tag)
154163
return {
155164
"service_description": service_description,
156165
"docker_labels": docker_labels,
@@ -181,16 +190,21 @@ def _clean_registry(registry_url, list_of_images):
181190
response = requests.delete(url, headers=request_headers)
182191

183192

184-
def _create_base_image(base_dir, labels):
185-
# create a basic dockerfile
186-
docker_file = base_dir / "Dockerfile"
187-
with docker_file.open("w") as file_pointer:
188-
file_pointer.write("FROM alpine\nCMD while true; do sleep 10; done\n")
189-
assert docker_file.exists() == True
193+
from aiodocker import utils
194+
195+
196+
async def _create_base_image(labels, tag):
197+
dockerfile = """
198+
FROM alpine
199+
CMD while true; do sleep 10; done
200+
"""
201+
f = BytesIO(dockerfile.encode("utf-8"))
202+
tar_obj = utils.mktar_from_dockerfile(f)
203+
190204
# build docker base image
191-
docker_client = docker.from_env()
192-
base_docker_image = docker_client.images.build(
193-
path=str(base_dir), rm=True, labels=labels
205+
docker = Docker()
206+
base_docker_image = await docker.images.build(
207+
fileobj=tar_obj, encoding="gzip", rm=True, labels=labels, tag=tag
194208
)
195209
return base_docker_image[0]
196210

services/director/tests/test_docker_utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,11 @@ async def test_swarm_has_manager_nodes(loop, docker_swarm):
5656

5757
async def test_swarm_has_worker_nodes(loop, docker_swarm):
5858
assert (await docker_utils.swarm_has_worker_nodes()) == False
59+
60+
61+
async def test_push_services(
62+
push_services, configure_registry_access, configure_schemas_location,
63+
):
64+
images = await push_services(
65+
number_of_computational_services=3, number_of_interactive_services=3
66+
)

services/director/tests/test_dummy_services.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
log = logging.getLogger(__name__)
1212

1313

14-
def test_services_conformity(configure_schemas_location, push_services):
14+
async def test_services_conformity(configure_schemas_location, push_services):
1515
from simcore_service_director import resources
1616

17-
services = push_services(1, 1)
17+
services = await push_services(1, 1)
1818
with resources.stream(resources.RESOURCE_NODE_SCHEMA) as file_pt:
1919
service_schema = json.load(file_pt)
2020
for service in services:

services/director/tests/test_handlers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ async def test_services_get(docker_registry, client, push_services, api_version_
7474
_check_services([], services)
7575

7676
# some services
77-
created_services = push_services(3, 2)
77+
created_services = await push_services(3, 2)
7878
web_response = await client.get(f"/{api_version_prefix}/services")
7979
assert web_response.status == 200
8080
assert web_response.content_type == "application/json"
@@ -129,7 +129,7 @@ async def test_services_by_key_version_get(
129129
)
130130
assert web_response.status == 404
131131

132-
created_services = push_services(3, 2)
132+
created_services = await push_services(3, 2)
133133
assert len(created_services) == 5
134134

135135
retrieved_services = []
@@ -171,7 +171,7 @@ async def test_services_extras_by_key_version_get(
171171
)
172172
assert web_response.status == 404
173173

174-
created_services = push_services(3, 2)
174+
created_services = await push_services(3, 2)
175175
assert len(created_services) == 5
176176

177177
for created_service in created_services:
@@ -225,7 +225,7 @@ async def _start_get_stop_services(
225225
data = await web_response.json()
226226
assert web_response.status == 404, data
227227

228-
created_services = push_services(0, 2)
228+
created_services = await push_services(0, 2)
229229
assert len(created_services) == 2
230230
for created_service in created_services:
231231
service_description = created_service["service_description"]
@@ -372,7 +372,7 @@ async def test_running_interactive_services_list_get(
372372
project_ids = ["first_project_id", "second_project_id", "third_project_id"]
373373
# prepare services
374374
NUM_SERVICES = 1
375-
created_services = push_services(0, NUM_SERVICES)
375+
created_services = await push_services(0, NUM_SERVICES)
376376
assert len(created_services) == NUM_SERVICES
377377
# start the services
378378
for user_id in user_ids:

services/director/tests/test_producer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async def run_services(
2727
started_services = []
2828

2929
async def push_start_services(number_comp, number_dyn, dependant=False):
30-
pushed_services = push_services(
30+
pushed_services = await push_services(
3131
number_comp, number_dyn, inter_dependent_services=dependant
3232
)
3333
assert len(pushed_services) == (number_comp + number_dyn)

services/director/tests/test_registry_cache_task.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async def test_registry_caching_task(loop, client, push_services):
4242
assert not list_of_services
4343
assert app[registry_cache_task.APP_REGISTRY_CACHE_DATA_KEY] != {}
4444
# create services in the registry
45-
pushed_services = push_services(
45+
pushed_services = await push_services(
4646
number_of_computational_services=1, number_of_interactive_services=1
4747
)
4848
# the services shall be updated
@@ -54,7 +54,7 @@ async def test_registry_caching_task(loop, client, push_services):
5454
)
5555
assert len(list_of_services) == 2
5656
# add more
57-
pushed_services = push_services(
57+
pushed_services = await push_services(
5858
number_of_computational_services=2,
5959
number_of_interactive_services=2,
6060
version="2.0.",

services/director/tests/test_registry_proxy.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ async def test_list_services_with_bad_json_formatting(
3838
push_services,
3939
):
4040
# some services
41-
created_services = push_services(
41+
created_services = await push_services(
4242
number_of_computational_services=3,
4343
number_of_interactive_services=2,
4444
bad_json_format=True,
@@ -65,7 +65,9 @@ async def test_list_computational_services(
6565
configure_registry_access,
6666
configure_schemas_location,
6767
):
68-
push_services(number_of_computational_services=6, number_of_interactive_services=3)
68+
await push_services(
69+
number_of_computational_services=6, number_of_interactive_services=3
70+
)
6971

7072
computational_services = await registry_proxy.list_services(
7173
aiohttp_mock_app, registry_proxy.ServiceType.COMPUTATIONAL
@@ -80,7 +82,9 @@ async def test_list_interactive_services(
8082
configure_registry_access,
8183
configure_schemas_location,
8284
):
83-
push_services(number_of_computational_services=5, number_of_interactive_services=4)
85+
await push_services(
86+
number_of_computational_services=5, number_of_interactive_services=4
87+
)
8488
interactive_services = await registry_proxy.list_services(
8589
aiohttp_mock_app, registry_proxy.ServiceType.DYNAMIC
8690
)
@@ -94,7 +98,7 @@ async def test_list_of_image_tags(
9498
configure_registry_access,
9599
configure_schemas_location,
96100
):
97-
images = push_services(
101+
images = await push_services(
98102
number_of_computational_services=5, number_of_interactive_services=3
99103
)
100104
image_number = {}
@@ -117,7 +121,7 @@ async def test_list_interactive_service_dependencies(
117121
configure_registry_access,
118122
configure_schemas_location,
119123
):
120-
images = push_services(
124+
images = await push_services(
121125
number_of_computational_services=2,
122126
number_of_interactive_services=2,
123127
inter_dependent_services=True,
@@ -147,7 +151,7 @@ async def test_get_image_labels(
147151
configure_registry_access,
148152
configure_schemas_location,
149153
):
150-
images = push_services(
154+
images = await push_services(
151155
number_of_computational_services=1, number_of_interactive_services=1
152156
)
153157
for image in images:
@@ -213,7 +217,7 @@ async def test_get_image_details(
213217
configure_registry_access,
214218
configure_schemas_location,
215219
):
216-
images = push_services(
220+
images = await push_services(
217221
number_of_computational_services=1, number_of_interactive_services=1
218222
)
219223
for image in images:
@@ -231,7 +235,7 @@ async def test_registry_caching(
231235
configure_registry_access,
232236
configure_schemas_location,
233237
):
234-
images = push_services(
238+
images = await push_services(
235239
number_of_computational_services=1, number_of_interactive_services=1
236240
)
237241
config.DIRECTOR_REGISTRY_CACHING = True
@@ -274,7 +278,7 @@ async def test_generate_service_extras(
274278
configure_registry_access,
275279
configure_schemas_location,
276280
):
277-
images = push_services(
281+
images = await push_services(
278282
number_of_computational_services=1, number_of_interactive_services=1
279283
)
280284

0 commit comments

Comments
 (0)