Repository: ITISFoundation/osparc-simcore
Pull request #7331: 🐛 fixed issue with catalog and the icon field
Author: login: GitHK
Labels: name: t:maintenance
description: Some planned maintenance work
name: 🤖-automerge
description: marks PR as ready to be merged for Mergify
Created: 2025-03-10T10:36:38Z | Merged: 2025-03-10T17:26:58Z

<!-- Title Annotations:

  WIP: work in progress
  🐛    Fix a bug.
  ✨    Introduce new features.
  🎨    Enhance existing feature.
  ♻️    Refactor code.
  🚑️    Critical hotfix.
  ⚗️    Perform experiments.
  ⬆️    Upgrade dependencies.
  📝    Add or update documentation.
  🔨    Add or update development scripts.
  🔒️    Fix security issues.
  ⚠️    Changes in ops configuration etc. are required before deploying.
        [ Please add a link to the associated ops-issue or PR, such as in https://github.com/ITISFoundation/osparc-ops-environments or https://git.speag.com/oSparc/osparc-infra ]
  🗃️    Database table changed (relevant for devops).
  👽️    Public API changes (meaning: dev features are moved to being exposed in production)
  🚨    Do manual testing when deployed

or from https://gitmoji.dev/
-->

## What do these changes do?

<!-- Badge to openapi specs
[![ReDoc](https://img.shields.io/badge/OpenAPI-ReDoc-85ea2d?logo=openapiinitiative)](https://redocly.github.io/redoc/?url=HERE-URL-TO-RAW-FILE)
-->

Fixes the following issue

```
 log_msg=Skipping 'simcore/services/dynamic/s4l-ui:3.2.178' due to 1 validation error for ServiceMetaDataDBCreate
icon
  Input should be a valid string [type=string_type, input_value=HttpUrl('https://github.c...s/s4l/S4L.png?raw=true'), input_type=HttpUrl]
    For further information visit https://errors.pydantic.dev/2.10/v/string_type
```

The icon filed is an `HttpUrl` object and will not be saved in the DB as such. We need to convert it to a `str`.


## Related issue/s

<!-- Link pull request to an issue
  SEE https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue

- resolves ITISFoundation/osparc-issues#428
- fixes #26
-->


## How to test

<!-- Give REVIEWERS some hits or code snippets on how could this be tested -->

## Dev-ops checklist

- [x] No ENV changes or I properly updated ENV ([read the instruction](https://git.speag.com/oSparc/osparc-ops-deployment-configuration/-/blob/configs/README.md?ref_type=heads#how-to-update-env-variables))

<!-- Some checks that might help your code run stable on production, and help devops assess criticality.
Modified from https://oschvr.com/posts/what-id-like-as-sre/

- How can DevOps check the health of the service ?
- How can DevOps safely and gracefully restart the service ?
- How and why would this code fail ?
- What kind of metrics are you exposing ?
- Is there any documentation/design specification for the service ?
- How (e.g. through which loglines) can DevOps detect unexpected situations that require escalation to human ?
- What are the resource limitations (CPU, RAM) expected for this service ?
- Are all relevant variables documented and adjustable via environment variables (i.e. no hardcoded magic numbers) ?
-->


Linked issue #26: Pipeline creation
**User story**

As a **developer** I want to be able to create arbitrary pipelines out of computational services in the frontend. Mockup services can be used for finding compatible services but the metadata for input/output data structures need to be defined such that they can be used for the MVP.

**Definition of Done**

- [x] Services can interactively added to the pipeline
- [x] Only compatible services can be attached to each other
- [x] Define data structure needed for this (compatible with the pipeline that is being use in the comp. backend)
- [x] Multiple in- and outputs can exist (ports)
- [x] Settings can be defined by input
- [x] Branching
Linked issue comments: user: login: drniiken
created_at: 2018-05-02T17:30:43Z
body: * datastandards
* jason.ad
* decided for
author_association: MEMBER
user: login: sanderegg
created_at: 2018-06-06T11:49:33Z
body: all settings are inputs, with a default
- [ ] the link shall be deletable
- [ ] the settings is read-only when a node is connected
- [ ] all settings visible in the workbench view
author_association: MEMBER

Diff:
diff --git a/services/catalog/src/simcore_service_catalog/models/services_db.py b/services/catalog/src/simcore_service_catalog/models/services_db.py
index 5ddcbe239ef2..2ad800d2b44d 100644
--- a/services/catalog/src/simcore_service_catalog/models/services_db.py
+++ b/services/catalog/src/simcore_service_catalog/models/services_db.py
@@ -9,7 +9,14 @@
 from models_library.services_base import ServiceKeyVersion
 from models_library.services_types import ServiceKey, ServiceVersion
 from models_library.utils.common_validators import empty_str_to_none_pre_validator
-from pydantic import BaseModel, ConfigDict, Field, field_validator
+from pydantic import (
+    BaseModel,
+    BeforeValidator,
+    ConfigDict,
+    Field,
+    HttpUrl,
+    field_validator,
+)
 from pydantic.config import JsonDict
 from simcore_postgres_database.models.services_compatibility import CompatiblePolicyDict
 
@@ -83,6 +90,12 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
     )
 
 
+def _httpurl_to_str(value: HttpUrl | str | None) -> str | None:
+    if isinstance(value, HttpUrl):
+        return f"{value}"
+    return value
+
+
 class ServiceMetaDataDBCreate(BaseModel):
     # primary-keys
     key: ServiceKey
@@ -96,7 +109,7 @@ class ServiceMetaDataDBCreate(BaseModel):
     description: str
     description_ui: bool = False
     thumbnail: str | None = None
-    icon: str | None = None
+    icon: Annotated[str | None, BeforeValidator(_httpurl_to_str)] = None
     version_display: str | None = None
 
     # tagging
diff --git a/services/catalog/tests/unit/with_dbs/test_db_repositories.py b/services/catalog/tests/unit/with_dbs/test_db_repositories.py
index 67e53525e38b..cf52a79e72b9 100644
--- a/services/catalog/tests/unit/with_dbs/test_db_repositories.py
+++ b/services/catalog/tests/unit/with_dbs/test_db_repositories.py
@@ -10,7 +10,7 @@
 from models_library.users import UserID
 from packaging import version
 from packaging.version import Version
-from pydantic import EmailStr, TypeAdapter
+from pydantic import EmailStr, HttpUrl, TypeAdapter
 from simcore_service_catalog.db.repositories.services import ServicesRepository
 from simcore_service_catalog.models.services_db import (
     ServiceAccessRightsAtDB,
@@ -125,6 +125,31 @@ async def test_create_services(
     ) == service_db_create.model_dump(exclude_unset=True)
 
 
+@pytest.mark.parametrize(
+    "url_object",
+    [
+        "https://github.com/some/path/to/image.png?raw=true",
+        TypeAdapter(HttpUrl).validate_python(
+            "https://github.com/some/path/to/image.png?raw=true"
+        ),
+        "",
+        None,
+    ],
+)
+async def test_regression_service_meta_data_db_create(
+    create_fake_service_data: Callable, url_object: str | HttpUrl | None
+):
+    fake_service, *_ = create_fake_service_data(
+        "simcore/services/dynamic/jupyterlab",
+        "1.0.0",
+        team_access="x",
+        everyone_access="x",
+    )
+
+    fake_service["icon"] = url_object
+    assert ServiceMetaDataDBCreate.model_validate(fake_service)
+
+
 async def test_read_services(
     services_repo: ServicesRepository,
     user_groups_ids: list[int],
@@ -240,19 +265,19 @@ async def test_list_service_releases_version_filtered(
     assert latest
     assert latest.version == fake_catalog_with_jupyterlab.expected_latest
 
-    releases_1_1_x: list[
-        ServiceMetaDataDBGet
-    ] = await services_repo.list_service_releases(
-        "simcore/services/dynamic/jupyterlab", major=1, minor=1
+    releases_1_1_x: list[ServiceMetaDataDBGet] = (
+        await services_repo.list_service_releases(
+            "simcore/services/dynamic/jupyterlab", major=1, minor=1
+        )
     )
     assert [
         s.version for s in releases_1_1_x
     ] == fake_catalog_with_jupyterlab.expected_1_1_x
 
-    expected_0_x_x: list[
-        ServiceMetaDataDBGet
-    ] = await services_repo.list_service_releases(
-        "simcore/services/dynamic/jupyterlab", major=0
+    expected_0_x_x: list[ServiceMetaDataDBGet] = (
+        await services_repo.list_service_releases(
+            "simcore/services/dynamic/jupyterlab", major=0
+        )
     )
     assert [
         s.version for s in expected_0_x_x


Reviews:
user: login: pcrespov
body: thx! nice catch!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-10T10:41:57Z
user: login: giancarloromeo
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T10:46:46Z
user: login: sanderegg
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-10T15:41:04Z
user: login: GitHK
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T15:42:22Z

Review comments:
diff_hunk: @@ -83,6 +90,12 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
     )
 
 
+def _httpurl_to_str(value: HttpUrl | str | None) -> str | None:
+    if isinstance(value, HttpUrl):
+        return f"{value}"
+    return value
path: services/catalog/src/simcore_service_catalog/models/services_db.py
user: login: sanderegg
body: Q: if not none. you do not need the if case at all
created_at: 2025-03-10T15:40:50Z
author_association: MEMBER
diff_hunk: @@ -83,6 +90,12 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
     )
 
 
+def _httpurl_to_str(value: HttpUrl | str | None) -> str | None:
+    if isinstance(value, HttpUrl):
+        return f"{value}"
+    return value
path: services/catalog/src/simcore_service_catalog/models/services_db.py
user: login: GitHK
body: None is an accepted value. The issue is that HttpUrl is not accepted by the db.
created_at: 2025-03-10T15:42:22Z
author_association: CONTRIBUTOR

PR comments:
user: login: codecov[bot]
created_at: 2025-03-10T10:48:25Z
body: ## [Codecov](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 68.86%. Comparing base [(`30a4d87`)](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/commit/30a4d8781b0aff840f0f2354c31cf83c1d7217f7?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) to head [(`56723e0`)](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/commit/56723e08d36f3484d30cd6576d2ca3b9bcef1dd4?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation).
> Report is 1 commits behind head on master.

> :exclamation:  There is a different number of reports uploaded between BASE (30a4d87) and HEAD (56723e0). Click for more details.
> 
> <details><summary>HEAD has 30 uploads less than BASE</summary>
>
>| Flag | BASE (30a4d87) | HEAD (56723e0) |
>|------|------|------|
>|unittests|31|1|
></details>

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff             @@
##           master    #7331       +/-   ##
===========================================
- Coverage   87.41%   68.86%   -18.55%     
===========================================
  Files        1693      707      -986     
  Lines       65873    33217    -32656     
  Branches     1121      168      -953     
===========================================
- Hits        57580    22875    -34705     
- Misses       7973    10284     +2311     
+ Partials      320       58      -262     
```

| [Flag](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | Coverage Δ | |
|---|---|---|
| [integrationtests](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `65.38% <ø> (-0.01%)` | :arrow_down: |
| [unittests](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `92.12% <100.00%> (+5.55%)` | :arrow_up: |

| [Components](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=components&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | Coverage Δ | |
|---|---|---|
| [api](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_aws_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_dask_task_models_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_models_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_notifications_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_postgres_database](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_service_integration](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_service_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_settings_library](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [pkg_simcore_sdk](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `77.30% <ø> (-8.16%)` | :arrow_down: |
| [agent](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [api_server](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [autoscaling](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [catalog](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `92.12% <100.00%> (+0.01%)` | :arrow_up: |
| [clusters_keeper](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [dask_sidecar](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [datcore_adapter](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [director](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [director_v2](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `78.54% <ø> (-12.76%)` | :arrow_down: |
| [dynamic_scheduler](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [dynamic_sidecar](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `89.10% <ø> (-0.98%)` | :arrow_down: |
| [efs_guardian](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [invitations](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [osparc_gateway_server](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [payments](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [resource_usage_tracker](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [storage](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [webclient](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `∅ <ø> (∅)` | |
| [webserver](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation) | `59.38% <ø> (-26.44%)` | :arrow_down: |

------

[Continue to review full report in Codecov by Sentry](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331?dropdown=coverage&src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation). Last update [30a4d87...56723e0](https://app.codecov.io/gh/ITISFoundation/osparc-simcore/pull/7331?dropdown=coverage&src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=ITISFoundation).

</details>
<details><summary>🚀 New features to boost your workflow: </summary>

- 📦 [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE
user: login: GitHK
created_at: 2025-03-10T15:40:24Z
body: @mergifyio queue
author_association: CONTRIBUTOR
user: login: mergify[bot]
created_at: 2025-03-10T15:40:30Z
body: > queue

#### ✅ The pull request has been merged automatically

<details>

The pull request has been merged automatically at *615bd69ce1d06473d0da7415441a82156a005961*

</details>


<!---
DO NOT EDIT
-*- Mergify Payload -*-
{"command": "queue", "conclusion": "success", "action_is_running": true}
-*- Mergify Payload End -*-
-->
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-03-10T16:35:21Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ITISFoundation_osparc-simcore&pullRequest=7331) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ITISFoundation_osparc-simcore&pullRequest=7331&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ITISFoundation_osparc-simcore&pullRequest=7331&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ITISFoundation_osparc-simcore&pullRequest=7331&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ITISFoundation_osparc-simcore&pullRequest=7331&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ITISFoundation_osparc-simcore&pullRequest=7331&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ITISFoundation_osparc-simcore&pullRequest=7331)


author_association: NONE