Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 maintenance/flaky tests #2867

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
f7278f5
mv webserver_director_stop_service_timeout option into DirectorSettings
pcrespov Mar 2, 2022
110aab4
adds same settings to DirectorV2Settings (director plugin is deprecated)
pcrespov Mar 2, 2022
425add1
minor
pcrespov Mar 2, 2022
17cc85c
prunes director_v2_service_responses_mock
pcrespov Mar 2, 2022
f8f0f2e
pycln updates
pcrespov Mar 2, 2022
3f973f9
pycln rm --all
pcrespov Mar 2, 2022
01406c7
rename to stand-out vs stop_service (w/o S)
pcrespov Mar 2, 2022
0348e45
Revert "pycln rm --all"
pcrespov Mar 2, 2022
63e5e36
fixes save_state flag
pcrespov Mar 2, 2022
a6f9176
tmp
pcrespov Mar 2, 2022
1333f14
rename service by dynamic_service because now directorv2 handles many…
pcrespov Mar 2, 2022
5e449a4
missed rename
pcrespov Mar 2, 2022
0630551
merge two calls to port retrieves and updates directorv2 settings
pcrespov Mar 2, 2022
0eeb357
rm deprecated settings_common
pcrespov Mar 2, 2022
0eac8af
fixes patch after refactoring
pcrespov Mar 2, 2022
65849fa
fixes director_V2_service_responses_mok
pcrespov Mar 2, 2022
a364d1a
removed unused and wrong function
pcrespov Mar 2, 2022
9119283
undo pre-commit
pcrespov Mar 2, 2022
a6bc2e0
cleanup User typed dict
pcrespov Mar 2, 2022
70fcfbc
add user role comparison
pcrespov Mar 2, 2022
47f2d8c
checking is_user_guest
pcrespov Mar 2, 2022
ab6d4b6
minor rename
pcrespov Mar 2, 2022
36a77c5
replaced is_user_guest by comparison
pcrespov Mar 2, 2022
245195d
cleanup
pcrespov Mar 2, 2022
04edbf1
fixes CODEOWNERS syntax. NO commas
pcrespov Mar 2, 2022
f776d10
update PULL_REQUIRE_TEMPLATE
pcrespov Mar 2, 2022
13a17c0
rm is_guest_user and safe_*
pcrespov Mar 3, 2022
70ca709
Fixes remove_project_interactive_services
pcrespov Mar 3, 2022
21b311c
renamed and fix condition on role
pcrespov Mar 3, 2022
a45da84
split logs
pcrespov Mar 3, 2022
11da283
rename
pcrespov Mar 3, 2022
fdc065f
captures also if user does not exist
pcrespov Mar 3, 2022
d96a36f
tunes delete project
pcrespov Mar 3, 2022
a23adb8
@GitHK review: removed safe_*
pcrespov Mar 7, 2022
5597673
@GitHK review: doc
pcrespov Mar 7, 2022
689bdb8
split projects_api
pcrespov Mar 7, 2022
9034617
wip:
pcrespov Mar 7, 2022
2569346
clean projects api
pcrespov Mar 7, 2022
450a938
clean projects api
pcrespov Mar 8, 2022
86b5a00
avoid name collision with delete_project
pcrespov Mar 8, 2022
67398d5
refactoring delete project
pcrespov Mar 8, 2022
f0a02c3
added helper to create and fixed handler map
pcrespov Mar 8, 2022
ac84f53
reverted renamed handler
pcrespov Mar 8, 2022
d0c9656
fixing mocks
pcrespov Mar 8, 2022
e5090f8
adds tools for pyddeps
pcrespov Mar 8, 2022
d81d235
implements hidden flag
pcrespov Mar 8, 2022
86b693f
fixes handling client disconnects
pcrespov Mar 8, 2022
fb59af6
fixes mock patch namespace names
pcrespov Mar 8, 2022
b0d4b45
moves helpers to pytest_simcore.helpers
pcrespov Mar 8, 2022
316b1eb
checks delete access rights
pcrespov Mar 8, 2022
f5ef9a6
fixes pylint error
pcrespov Mar 8, 2022
d03cb81
fixes mock
pcrespov Mar 8, 2022
5fdff5b
fixing mocks
pcrespov Mar 9, 2022
3ea120b
split handlers
pcrespov Mar 9, 2022
f55ba6a
fix
pcrespov Mar 9, 2022
5d4e983
fixes case of zero lenght password
pcrespov Mar 9, 2022
6c9e508
added doc
pcrespov Mar 9, 2022
b853925
fixed mocks and imports
pcrespov Mar 9, 2022
6350c1b
Fixes aiohttp DeprecationWarning: Deprecated, use .can_read_body #2005
pcrespov Mar 9, 2022
525e091
restores pycln options
pcrespov Mar 9, 2022
72f5b26
cleanup
pcrespov Mar 9, 2022
950d75f
moved scicrunch utils
pcrespov Mar 9, 2022
ef2a91f
wip
pcrespov Mar 9, 2022
eaf4751
minor
pcrespov Mar 9, 2022
11b0a1b
organize api
pcrespov Mar 9, 2022
3527c26
handles errors and aggregate them in delete_project
pcrespov Mar 9, 2022
c9ddf9a
refine exceptions
pcrespov Mar 9, 2022
61aa015
drop lock condition on guest users
pcrespov Mar 9, 2022
a5971d1
cleanup and doc failing test
pcrespov Mar 9, 2022
d1e9f4b
fixes create_dynamic_service_mock
pcrespov Mar 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,33 @@


# files and folders recursively
.codeclimate.yml @sanderegg, @pcrespov
.codeclimate.yml @sanderegg @pcrespov
.travis.yml @sanderegg
Makefile @pcrespov, @sanderegg
Makefile @pcrespov @sanderegg


# NOTE: '/' denotes the root of the repository
/api/ @sanderegg, @pcrespov
/ci/ @sanderegg, @pcrespov
/api/ @sanderegg @pcrespov
/ci/ @sanderegg @pcrespov
/docs/ @pcrespov
/packages/models-library/ @sanderegg, @pcrespov
/packages/pytest-simcore/ @pcrespov, @sanderegg
/packages/service-integration/ @pcrespov, @sanderegg, @KZzizzle
/packages/models-library/ @sanderegg @pcrespov
/packages/pytest-simcore/ @pcrespov @sanderegg
/packages/service-integration/ @pcrespov @sanderegg @KZzizzle
/packages/service-library/ @pcrespov
/packages/settings-library/ @pcrespov, @sanderegg
/packages/settings-library/ @pcrespov @sanderegg
/requirements/ @pcrespov
/scripts/demo/ @odeimaiz, @pcrespov
/scripts/demo/ @odeimaiz @pcrespov
/scripts/json-schema-to-openapi-schema @sanderegg
/scripts/template-projects/ @odeimaiz, @pcrespov
/scripts/template-projects/ @odeimaiz @pcrespov
/services/api-server/ @pcrespov
/services/catalog/ @pcrespov, @sanderegg
/services/director*/ @sanderegg, @pcrespov
/services/catalog/ @pcrespov @sanderegg
/services/director*/ @sanderegg @pcrespov
/services/dynamic-sidecar/ @GitHK
/services/migration/ @pcrespov
/services/storage/ @mguidon, @pcrespov
/services/storage/ @mguidon @pcrespov
/services/static-webserver @GitHK
/services/web/client/ @odeimaiz, @ignapas
/services/web/server/ @pcrespov, @sanderegg, @GitHK
/services/web/client/ @odeimaiz @ignapas
/services/web/server/ @pcrespov @sanderegg @GitHK
/tests/environment-setup/ @pcrespov
/tests/performance/ @pcrespov
/tests/public-api/ @pcrespov
Expand Down
8 changes: 5 additions & 3 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ Consider prefix your PR message with an emoticon
⚗️ experimental
⬆️ upgrades dependencies
📝 documentation
🗑️ deprecated
⚰️ remove dead code
🔥 remove code or files
or from https://gitmoji.dev/

and append (⚠️ devops) if changes in devops configuration required before deploying
Expand All @@ -25,16 +28,15 @@ and append (⚠️ devops) if changes in devops configuration required before de

<!-- Enumerate REVIEWERS other issues

e.g.

- ITISFoundation/osparc-issues#428
- #26 : node_ports should have retry policies when upload/download fails (FIXED)
- ITISFoundation/osparc-issues#304: (Part 2) Prep2Go: creating features to support complex S4L scripts (IMPLEMENTED)

-->


## How to test

- Covered by CI
<!-- Give REVIEWERS some hits or code snippets on how could this be tested -->


Expand Down
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ repos:
- id: check-merge-conflict
# NOTE: Keep order as pycln (remove unused imports), then isort (sort them) and black (final formatting)
- repo: https://github.com/hadialqattan/pycln
rev: v1.1.0
rev: v1.2.4
hooks:
- id: pycln
args: [--all]
args: [--expand-stars]
- repo: https://github.com/PyCQA/isort
rev: 5.6.4
hooks:
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,24 @@
- Users they have a role within the framework that provides
them different access levels to it
"""
import itertools
from enum import Enum
from functools import total_ordering

import sqlalchemy as sa
from sqlalchemy.sql import func

from .base import metadata

_USER_ROLE_TO_LEVEL = {
"ANONYMOUS": 0,
"GUEST": 10,
"USER": 20,
"TESTER": 30,
"ADMIN": 100,
}


@total_ordering
class UserRole(Enum):
"""SORTED enumeration of user roles

Expand All @@ -36,11 +45,14 @@ class UserRole(Enum):
TESTER = "TESTER"
ADMIN = "ADMIN"

@classmethod
def super_users(cls):
return list(itertools.takewhile(lambda e: e != cls.USER, cls))
@property
def privilege_level(self) -> int:
return _USER_ROLE_TO_LEVEL[self.name]

# TODO: add comparison https://portingguide.readthedocs.io/en/latest/comparisons.html
def __lt__(self, other) -> bool:
if self.__class__ is other.__class__:
return self.privilege_level < other.privilege_level
return NotImplemented


class UserStatus(Enum):
Expand Down
50 changes: 50 additions & 0 deletions packages/postgres-database/tests/test_users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from simcore_postgres_database.models.users import _USER_ROLE_TO_LEVEL, UserRole


def test_user_role_to_level_map_in_sync():
# If fails, then update _USER_ROLE_TO_LEVEL map
assert set(_USER_ROLE_TO_LEVEL.keys()) == set(UserRole.__members__.keys())


def test_user_role_comparison():

assert UserRole.ANONYMOUS < UserRole.ADMIN
assert UserRole.GUEST < UserRole.ADMIN
assert UserRole.USER < UserRole.ADMIN
assert UserRole.TESTER < UserRole.ADMIN
assert UserRole.ADMIN == UserRole.ADMIN

assert UserRole.ANONYMOUS < UserRole.TESTER
assert UserRole.GUEST < UserRole.TESTER
assert UserRole.USER < UserRole.TESTER
assert UserRole.TESTER == UserRole.TESTER
assert UserRole.ADMIN > UserRole.TESTER

assert UserRole.ANONYMOUS < UserRole.USER
assert UserRole.GUEST < UserRole.USER
assert UserRole.USER == UserRole.USER
assert UserRole.TESTER > UserRole.USER
assert UserRole.ADMIN > UserRole.USER

assert UserRole.ANONYMOUS < UserRole.GUEST
assert UserRole.GUEST == UserRole.GUEST
assert UserRole.USER > UserRole.GUEST
assert UserRole.TESTER > UserRole.GUEST
assert UserRole.ADMIN > UserRole.GUEST

assert UserRole.ANONYMOUS == UserRole.ANONYMOUS
assert UserRole.GUEST > UserRole.ANONYMOUS
assert UserRole.USER > UserRole.ANONYMOUS
assert UserRole.TESTER > UserRole.ANONYMOUS
assert UserRole.ADMIN > UserRole.ANONYMOUS

# < and >
assert UserRole.TESTER < UserRole.ADMIN
assert UserRole.ADMIN > UserRole.TESTER

# >=, == and <=
assert UserRole.TESTER <= UserRole.ADMIN
assert UserRole.ADMIN >= UserRole.TESTER

assert UserRole.ADMIN <= UserRole.ADMIN
assert UserRole.ADMIN == UserRole.ADMIN
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import re
from typing import Any, Dict
from typing import TypedDict

from aiohttp import web
from aiohttp.test_utils import TestClient
Expand All @@ -12,9 +12,22 @@

from .utils_assert import assert_status

# WARNING: UserDict is already in https://docs.python.org/3/library/collections.html#collections.UserDict
# TODO: move this to future simcore_service_webserver.users_models.py
AUserDict = Dict[str, Any]

# WARNING: DO NOT use UserDict is already in https://docs.python.org/3/library/collections.html#collections.UserDictclass UserRowDict(TypedDict):
# NOTE: this is modified dict version of packages/postgres-database/src/simcore_postgres_database/models/users.py for testing purposes
class _UserInfoDictRequired(TypedDict, total=True):
id: int
name: str
email: str
raw_password: str
status: UserStatus
role: UserRole


class UserInfoDict(_UserInfoDictRequired, total=False):
created_ip: int
password_hash: str


TEST_MARKS = re.compile(r"TEST (\w+):(.*)")

Expand All @@ -37,7 +50,7 @@ def parse_link(text):
return URL(link).path


async def create_user(db: AsyncpgStorage, data=None) -> AUserDict:
async def create_user(db: AsyncpgStorage, data=None) -> UserInfoDict:
data = data or {}
password = get_random_string(10)
params = {
Expand All @@ -56,7 +69,7 @@ async def create_user(db: AsyncpgStorage, data=None) -> AUserDict:

async def log_client_in(
client: TestClient, user_data=None, *, enable_check=True
) -> AUserDict:
) -> UserInfoDict:
# creates user directly in db
db: AsyncpgStorage = get_plugin_storage(client.app)
cfg: LoginOptions = get_plugin_options(client.app)
Expand Down Expand Up @@ -99,7 +112,7 @@ def __init__(self, client, params=None, *, check_if_succeeds=True):
self.client = client
self.enable_check = check_if_succeeds

async def __aenter__(self) -> AUserDict:
async def __aenter__(self) -> UserInfoDict:
self.user = await log_client_in(
self.client, self.params, enable_check=self.enable_check
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class ExpectedResponse(NamedTuple):
]

def __str__(self) -> str:
# pylint: disable=no-member
items = ",".join(f"{k}={v.__name__}" for k, v in self._asdict().items())
return f"{self.__class__.__name__}({items})"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

import pytest
from aiohttp import web
from aioresponses import aioresponses as AioResponsesMock
from aioresponses.core import CallbackResult
from models_library.api_schemas_storage import FileMetaData
from models_library.projects_state import RunningState
from pytest_simcore.aioresponses_mocker import AioResponsesMock
from yarl import URL

pytest_plugins = [
Expand Down Expand Up @@ -130,7 +130,7 @@ def get_computation_cb(url, **kwargs) -> CallbackResult:


@pytest.fixture
async def director_v2_service_mock(
async def director_v2_service_responses_mock(
aioresponses_mocker: AioResponsesMock,
) -> AioResponsesMock:
"""mocks responses of director-v2"""
Expand Down
14 changes: 7 additions & 7 deletions packages/service-library/src/servicelib/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,17 +61,17 @@ def search_osparc_repo_dir(start: Union[str, Path], max_iterations=8) -> Optiona


# FUTURES
def log_exception_callback(fut: asyncio.Future):
try:
fut.result()
except Exception: # pylint: disable=broad-except
logger.exception("Error occured while running task!")


def fire_and_forget_task(
obj: Union[Coroutine, asyncio.Future, Awaitable]
) -> asyncio.Future:
future = asyncio.ensure_future(obj)

def log_exception_callback(fut: asyncio.Future):
try:
fut.result()
except Exception: # pylint: disable=broad-except
logger.exception("Error occured while running task!")

future.add_done_callback(log_exception_callback)
return future

Expand Down
7 changes: 4 additions & 3 deletions packages/settings-library/src/settings_library/email.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Optional
from pydantic import root_validator

from pydantic import root_validator
from pydantic.fields import Field
from pydantic.types import SecretStr

Expand All @@ -11,14 +11,15 @@
class SMTPSettings(BaseCustomSettings):
"""Simple Mail Transfer Protocol"""

# TODO: NameEmail or EmailStr
SMTP_SENDER: str = "@".join(["O2SPARC support <support", "osparc.io>"])

SMTP_HOST: str
SMTP_PORT: PortInt

SMTP_TLS_ENABLED: bool = Field(False, description="Enables Secure Mode")
SMTP_USERNAME: Optional[str]
SMTP_PASSWORD: Optional[SecretStr]
SMTP_USERNAME: Optional[str] = Field(None, min_length=1)
SMTP_PASSWORD: Optional[SecretStr] = Field(None, min_length=1)

@root_validator
@classmethod
Expand Down
9 changes: 8 additions & 1 deletion packages/settings-library/tests/test_email.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, Dict
from pydantic import ValidationError

import pytest
from pydantic import ValidationError
from settings_library.email import SMTPSettings


Expand Down Expand Up @@ -53,6 +53,13 @@ def test_smtp_configuration_ok(cfg: Dict[str, Any]):
"SMTP_TLS_ENABLED": True,
"SMTP_USERNAME": "test",
},
{
"SMTP_HOST": "test",
"SMTP_PORT": 113,
"SMTP_USERNAME": "",
"SMTP_PASSWORD": "test",
"SMTP_TLS_ENABLED": True,
},
],
)
def test_smtp_configuration_fails(cfg: Dict[str, Any]):
Expand Down
Loading