Skip to content

Commit 01b08e6

Browse files
Merge branch 'master' into p-models-split-licensed-items-2-attempt-continuation
2 parents 436ad91 + dd342a3 commit 01b08e6

File tree

136 files changed

+2513
-908
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+2513
-908
lines changed

.env-devel

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ DIRECTOR_REGISTRY_CACHING=True
8383
DIRECTOR_SERVICES_CUSTOM_CONSTRAINTS=null
8484
DIRECTOR_TRACING=null
8585

86+
DOCKER_API_PROXY_HOST=docker-api-proxy
87+
DOCKER_API_PROXY_PASSWORD=null
88+
DOCKER_API_PROXY_PORT=8888
89+
DOCKER_API_PROXY_SECURE=False
90+
DOCKER_API_PROXY_USER=null
91+
8692
EFS_USER_ID=8006
8793
EFS_USER_NAME=efs
8894
EFS_GROUP_ID=8106

.github/mergify.yml

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,48 +22,3 @@ queue_rules:
2222
- check-success=unit-tests
2323
- check-success=integration-tests
2424
- check-success=system-tests
25-
26-
27-
pull_request_rules:
28-
- name: retry flaky tests (when PR is approved)
29-
conditions:
30-
- label=🤖-automerge
31-
- label!=🤖-do-not-merge
32-
- base=master
33-
34-
- -draft # PR is not in draft state
35-
- -conflict # No merge conflicts
36-
- "#approved-reviews-by>=2" # Requires 2 approving reviews
37-
- "#changes-requested-reviews-by=0" # No changes requested
38-
- "#review-threads-unresolved=0" # All review threads resolved
39-
40-
- or:
41-
- check-failure=system-test-environment-setup
42-
- check-failure=changes
43-
- check-failure=build-test-images
44-
- check-failure=build-test-images-frontend
45-
- check-failure=unit-tests
46-
- check-failure=integration-tests
47-
- check-failure=system-tests
48-
actions:
49-
comment:
50-
message: "Restarted CI due to failing tests"
51-
github_actions:
52-
workflow:
53-
dispatch:
54-
- workflow: ci-testing-deploy.yml
55-
56-
- name: Automatically add PR to queue if it meets conditions
57-
conditions:
58-
- "label=🤖-automerge"
59-
- "label!=🤖-do-not-merge"
60-
- "base=master"
61-
62-
- "-draft" # PR is not in draft state
63-
- "-conflict" # PR has no conflicts
64-
- "#approved-reviews-by>=2" # Requires 2 approvals
65-
- "#changes-requested-reviews-by=0" # No requested changes
66-
- "#review-threads-unresolved=0" # All review threads resolved
67-
actions:
68-
queue:
69-
name: default

.github/workflows/ci-testing-deploy.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ jobs:
7777
migration: ${{ steps.filter.outputs.migration }}
7878
payments: ${{ steps.filter.outputs.payments }}
7979
dynamic-scheduler: ${{ steps.filter.outputs.dynamic-scheduler }}
80+
docker-api-proxy: ${{ steps.filter.outputs.docker-api-proxy }}
8081
resource-usage-tracker: ${{ steps.filter.outputs.resource-usage-tracker }}
8182
static-webserver: ${{ steps.filter.outputs.static-webserver }}
8283
storage: ${{ steps.filter.outputs.storage }}
@@ -233,6 +234,9 @@ jobs:
233234
- 'services/docker-compose*'
234235
- 'scripts/mypy/*'
235236
- 'mypy.ini'
237+
docker-api-proxy:
238+
- 'packages/**'
239+
- 'services/docker-api-proxy/**'
236240
resource-usage-tracker:
237241
- 'packages/**'
238242
- 'services/resource-usage-tracker/**'
@@ -2190,6 +2194,71 @@ jobs:
21902194
with:
21912195
flags: integrationtests #optional
21922196

2197+
2198+
integration-test-docker-api-proxy:
2199+
needs: [changes, build-test-images]
2200+
if: ${{ needs.changes.outputs.anything-py == 'true' || needs.changes.outputs.docker-api-proxy == 'true' || github.event_name == 'push'}}
2201+
timeout-minutes: 30 # if this timeout gets too small, then split the tests
2202+
name: "[int] docker-api-proxy"
2203+
runs-on: ${{ matrix.os }}
2204+
strategy:
2205+
matrix:
2206+
python: ["3.11"]
2207+
os: [ubuntu-22.04]
2208+
fail-fast: false
2209+
steps:
2210+
- uses: actions/checkout@v4
2211+
- name: setup docker buildx
2212+
id: buildx
2213+
uses: docker/setup-buildx-action@v3
2214+
with:
2215+
driver: docker-container
2216+
- name: setup python environment
2217+
uses: actions/setup-python@v5
2218+
with:
2219+
python-version: ${{ matrix.python }}
2220+
- name: expose github runtime for buildx
2221+
uses: crazy-max/ghaction-github-runtime@v3
2222+
# FIXME: Workaround for https://github.com/actions/download-artifact/issues/249
2223+
- name: download docker images with retry
2224+
uses: Wandalen/wretry.action@master
2225+
with:
2226+
action: actions/download-artifact@v4
2227+
with: |
2228+
name: docker-buildx-images-${{ runner.os }}-${{ github.sha }}-backend
2229+
path: /${{ runner.temp }}/build
2230+
attempt_limit: 5
2231+
attempt_delay: 1000
2232+
- name: load docker images
2233+
run: make load-images local-src=/${{ runner.temp }}/build
2234+
- name: install uv
2235+
uses: astral-sh/setup-uv@v5
2236+
with:
2237+
version: "0.5.x"
2238+
enable-cache: false
2239+
cache-dependency-glob: "**/docker-api-proxy/requirements/ci.txt"
2240+
- name: show system version
2241+
run: ./ci/helpers/show_system_versions.bash
2242+
- name: install
2243+
run: ./ci/github/integration-testing/docker-api-proxy.bash install
2244+
- name: test
2245+
run: ./ci/github/integration-testing/docker-api-proxy.bash test
2246+
- name: upload failed tests logs
2247+
if: ${{ failure() }}
2248+
uses: actions/upload-artifact@v4
2249+
with:
2250+
name: ${{ github.job }}_docker_logs
2251+
path: ./services/docker-api-proxy/test_failures
2252+
- name: cleanup
2253+
if: ${{ !cancelled() }}
2254+
run: ./ci/github/integration-testing/docker-api-proxy.bash clean_up
2255+
- uses: codecov/codecov-action@v5
2256+
if: ${{ !cancelled() }}
2257+
env:
2258+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
2259+
with:
2260+
flags: integrationtests #optional
2261+
21932262
integration-test-simcore-sdk:
21942263
needs: [changes, build-test-images]
21952264
if: ${{ needs.changes.outputs.anything-py == 'true' || needs.changes.outputs.simcore-sdk == 'true' || github.event_name == 'push' }}
@@ -2262,6 +2331,7 @@ jobs:
22622331
integration-test-director-v2-01,
22632332
integration-test-director-v2-02,
22642333
integration-test-dynamic-sidecar,
2334+
integration-test-docker-api-proxy,
22652335
integration-test-simcore-sdk,
22662336
integration-test-webserver-01,
22672337
integration-test-webserver-02,

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ SERVICES_NAMES_TO_BUILD := \
4747
payments \
4848
resource-usage-tracker \
4949
dynamic-scheduler \
50+
docker-api-proxy \
5051
service-integration \
5152
static-webserver \
5253
storage \

api/specs/web-server/_catalog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def get_service_resources(
138138
@router.get(
139139
"/catalog/services/{service_key:path}/{service_version}/pricing-plan",
140140
response_model=Envelope[ServicePricingPlanGet],
141-
summary="Retrieve default pricing plan for provided service",
141+
description="Retrieve default pricing plan for provided service",
142142
tags=["pricing-plans"],
143143
)
144144
async def get_service_pricing_plan(

api/specs/web-server/_diagnostics.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ async def healthcheck_liveness_probe():
3636

3737
@router.get(
3838
"/config",
39-
summary="Front end runtime configuration",
39+
description="Front end runtime configuration",
4040
response_model=Envelope[dict[str, Any]],
4141
)
4242
async def get_config():
@@ -53,7 +53,7 @@ async def get_scheduled_maintenance():
5353

5454
@router.get(
5555
"/status",
56-
summary="checks status of self and connected services",
56+
description="checks status of self and connected services",
5757
response_model=Envelope[AppStatusCheck],
5858
response_description="Returns app status check",
5959
)

api/specs/web-server/_folders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ async def delete_folder(
105105
@router.post(
106106
"/folders/{folder_id}/workspaces/{workspace_id}:move",
107107
status_code=status.HTTP_204_NO_CONTENT,
108-
summary="Move folder to the workspace",
108+
description="Move folder to the workspace",
109109
tags=["workspaces"],
110110
)
111111
async def move_folder_to_workspace(

api/specs/web-server/_projects_crud.py renamed to api/specs/web-server/_projects.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from pydantic import BaseModel
3232
from simcore_service_webserver._meta import API_VTAG
3333
from simcore_service_webserver.projects._common.models import ProjectPathParams
34-
from simcore_service_webserver.projects._crud_handlers import ProjectCreateParams
34+
from simcore_service_webserver.projects._crud_handlers import ProjectCreateQueryParams
3535
from simcore_service_webserver.projects._crud_handlers_models import (
3636
ProjectActiveQueryParams,
3737
ProjectsListQueryParams,
@@ -67,12 +67,14 @@ class _ProjectCreateHeaderParams(BaseModel):
6767
@router.post(
6868
"/projects",
6969
response_model=Envelope[TaskGet],
70-
summary="Creates a new project or copies an existing one",
71-
status_code=status.HTTP_201_CREATED,
70+
description="Creates a new project or copies an existing one. "
71+
"NOTE: implemented as a long running task, "
72+
"i.e. requires polling `status_href` (HTTP_200_OK) to get status and `result_href` (HTTP_201_CREATED) to get created project",
73+
status_code=status.HTTP_202_ACCEPTED,
7274
)
7375
async def create_project(
7476
_h: Annotated[_ProjectCreateHeaderParams, Depends()],
75-
_path: Annotated[ProjectCreateParams, Depends()],
77+
_query: Annotated[ProjectCreateQueryParams, Depends()],
7678
_body: ProjectCreateNew | ProjectCopyOverride,
7779
):
7880
...

api/specs/web-server/_projects_comments.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
@router.post(
4141
"/projects/{project_uuid}/comments",
4242
response_model=Envelope[dict[Literal["comment_id"], CommentID]],
43-
summary="Create a new comment for a specific project. The request body should contain the comment contents and user information.",
43+
description="Create a new comment for a specific project. The request body should contain the comment contents and user information.",
4444
status_code=201,
4545
)
4646
async def create_project_comment(
@@ -57,7 +57,7 @@ async def create_project_comment(
5757
@router.get(
5858
"/projects/{project_uuid}/comments",
5959
response_model=Envelope[list[ProjectsCommentsAPI]],
60-
summary="Retrieve all comments for a specific project.",
60+
description="Retrieve all comments for a specific project.",
6161
)
6262
async def list_project_comments(
6363
project_uuid: ProjectID, limit: int = 20, offset: NonNegativeInt = 0
@@ -73,7 +73,7 @@ async def list_project_comments(
7373
@router.put(
7474
"/projects/{project_uuid}/comments/{comment_id}",
7575
response_model=Envelope[ProjectsCommentsAPI],
76-
summary="Update the contents of a specific comment for a project. The request body should contain the updated comment contents.",
76+
description="Update the contents of a specific comment for a project. The request body should contain the updated comment contents.",
7777
)
7878
async def update_project_comment(
7979
project_uuid: ProjectID,
@@ -90,7 +90,7 @@ async def update_project_comment(
9090

9191
@router.delete(
9292
"/projects/{project_uuid}/comments/{comment_id}",
93-
summary="Delete a specific comment associated with a project.",
93+
description="Delete a specific comment associated with a project.",
9494
status_code=204,
9595
)
9696
async def delete_project_comment(project_uuid: ProjectID, comment_id: CommentID):
@@ -105,7 +105,7 @@ async def delete_project_comment(project_uuid: ProjectID, comment_id: CommentID)
105105
@router.get(
106106
"/projects/{project_uuid}/comments/{comment_id}",
107107
response_model=Envelope[ProjectsCommentsAPI],
108-
summary="Retrieve a specific comment by its ID within a project.",
108+
description="Retrieve a specific comment by its ID within a project.",
109109
)
110110
async def get_project_comment(project_uuid: ProjectID, comment_id: CommentID):
111111
...

api/specs/web-server/_projects_folders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
@router.put(
2727
"/projects/{project_id}/folders/{folder_id}",
2828
status_code=status.HTTP_204_NO_CONTENT,
29-
summary="Move project to the folder",
29+
description="Move project to the folder",
3030
)
3131
async def replace_project_folder(
3232
_path: Annotated[_ProjectsFoldersPathParams, Depends()],

0 commit comments

Comments
 (0)