-
Notifications
You must be signed in to change notification settings - Fork 2
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
eduid_user_cleaner skatteverket worker #314
Closed
Closed
Changes from all commits
Commits
Show all changes
62 commits
Select commit
Hold shift + click to select a range
53d6da9
Init commit.
masv3971 1eddece
Update hashes.
masv3971 6fae0d5
First.
masv3971 4ab0f89
Add first layout.
masv3971 97cf1dc
Merge
masv3971 fae6838
Skeleton worker structure.
masv3971 a9d0d23
Merge masv_amapi-client
masv3971 38e02f4
Merge branch 'masv_amapi-client' into masv-cleaner-worker
masv3971 6ab8095
Add navet stuff to worker.
masv3971 12cff53
user cleaner barebone.
masv3971 76cb98a
Merge from masv_amapi-client.
masv3971 91f82cd
Add delay and change quota.
masv3971 9dd0d10
Rename file.
masv3971 ce5b3be
Add stats.
masv3971 4392f41
Add init files.
masv3971 a72be83
Cleand away unused folder.
masv3971 503bef0
Add dry run and change log to debug.
masv3971 486159e
Merge branch 'masv_amapi-client' into masv-cleaner-worker
masv3971 e62b015
Add teleadress and some spelling.
masv3971 90b0ae7
Add health check.
masv3971 949032c
Add words to vscode.
masv3971 ec76bd5
Merge from masv_amapi-client.
masv3971 5cc7f84
Add comments and general sleep method for faster kills of the app.
masv3971 297531a
Add words to dictionary.
masv3971 393ed71
Better syntax.
masv3971 e878033
Add milliseconds sleep.
masv3971 4638578
Merge from main.
masv3971 fac9091
Merge branch 'main' into masv-cleaner-worker
masv3971 dce92b8
untangle files: cleaner related files.
masv3971 bbc85a9
Merge from main.
masv3971 38ac3a8
Add wait, meta and cache.
masv3971 e7a02ad
Merge from main.
masv3971 a1a790e
Change auth url due to change.
masv3971 942f3a9
Merge branch 'main' into masv-cleaner-worker
masv3971 86aef2c
Lost method replaced.
masv3971 c7fa42f
Correct comment.
masv3971 ace25ce
Remove test cases from app, since they should not be in app testing s…
masv3971 d7d29b0
Add test and add working fastapi client mock.
masv3971 2df3f6b
Rename queue_user to cache_user in order to bring ORDER.
masv3971 f8ab129
Use TUserDbDocument instead of dict.
masv3971 6f18a76
Add routes for amapi_client mock.
masv3971 3879339
Since almost nothing load in app, it's more efficient to test in skv.
masv3971 d21f3b6
Fix typing issue.
masv3971 87fbf30
Add queue test.
masv3971 9bc8af6
Change to __future__ annotations.
masv3971 6062809
Change to use isoformat instead of strfrime.
masv3971 3b0072a
Rename queue to cache due to legacy.
masv3971 1a75778
Remove mock from self, since it's not used globaly.
masv3971 f270aaa
Add stat collection for each completed task.
masv3971 35897db
Remove dubble fnutts around Queue type, not necessary.
masv3971 2bf2ec7
Remove trivial method and apply its logic directly.
masv3971 4ad0778
Optimize db query.
masv3971 521432c
Use _get_all_docs() istead of _coll.find({}].
masv3971 ac5a6cf
Use BaseDB drop method.
masv3971 a94bb52
Use BaseDB method instead of _coll.
masv3971 e8f0a07
Replace int (unix epoch) with datetime.
masv3971 4378c29
Remove unused dep.
masv3971 37b1a71
Merge branch 'main' into masv-cleaner-worker
helylle 67397b9
Merge branch 'main' into masv-cleaner-worker
helylle 44ffed6
move function to common utils
helylle 05b4e09
make reformat
helylle b36dbeb
make the worker startable
helylle File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,92 @@ | ||
from typing import Optional | ||
from typing import Mapping, Optional | ||
|
||
import respx | ||
from httpx import Request, Response | ||
|
||
from eduid.common.clients.gnap_client.testing import MockedSyncAuthAPIMixin | ||
from eduid.common.misc.timeutil import utc_now | ||
from eduid.common.models.amapi_user import ( | ||
UserUpdateEmailRequest, | ||
UserUpdateLanguageRequest, | ||
UserUpdateNameRequest, | ||
UserUpdatePhoneRequest, | ||
) | ||
from eduid.userdb.mail import MailAddressList | ||
from eduid.userdb.phone import PhoneNumberList | ||
from eduid.userdb.user import User | ||
from eduid.userdb.userdb import AmDB | ||
|
||
|
||
class MockedAMAPIMixin(MockedSyncAuthAPIMixin): | ||
def start_mock_amapi(self, access_token_value: Optional[str] = None): | ||
def start_mock_amapi(self, central_user_db: Optional[AmDB] = None, access_token_value: Optional[str] = None): | ||
self.start_mock_auth_api(access_token_value=access_token_value) | ||
self.central_user_db = central_user_db | ||
mocked_users = respx.mock(base_url="http://localhost/amapi", assert_all_called=False) | ||
|
||
self.mocked_users = respx.mock(base_url="http://localhost", assert_all_called=False) | ||
put_users_name_route = self.mocked_users.put( | ||
url="/users/hubba-bubba/name", | ||
name="put_users_name_request", | ||
mocked_users.put(url="/users/hubba-bubba/name", name="200_put_name").mock( | ||
side_effect=self._side_effect_update_name | ||
) | ||
put_users_name_route.pass_through() | ||
self.mocked_users.start() | ||
self.addCleanup(self.mocked_users.stop) # type: ignore | ||
mocked_users.put(url="/users/hubba-bubba/email", name="200_put_email").mock( | ||
side_effect=self._side_effect_update_email | ||
) | ||
mocked_users.put(url="/users/hubba-bubba/language", name="200_put_language").mock( | ||
side_effect=self._side_effect_update_language | ||
) | ||
|
||
mocked_users.start() | ||
self.addCleanup(mocked_users.stop) # type: ignore | ||
|
||
def _side_effect_update(self, func_name: str) -> User: | ||
if self.central_user_db is None: | ||
raise ValueError(f"side affect '{func_name}' was called but self.amdb is None") | ||
return self.central_user_db.get_user_by_eppn("hubba-bubba") | ||
|
||
def _side_effect_update_name(self, request: Request) -> Response: | ||
db_user = self._side_effect_update(func_name="_side_effect_update_name") | ||
assert self.central_user_db is not None | ||
mock_request = UserUpdateNameRequest.parse_raw(request.content) | ||
|
||
db_user.given_name = mock_request.given_name | ||
db_user.surname = mock_request.surname | ||
db_user.display_name = mock_request.display_name | ||
self.central_user_db.save(user=db_user) | ||
return Response(200, text='{"status": "true"}') | ||
|
||
def _side_effect_update_email(self, request: Request) -> Response: | ||
db_user = self._side_effect_update(func_name="_side_effect_update_email") | ||
assert self.central_user_db is not None | ||
mock_request = UserUpdateEmailRequest.parse_raw(request.content) | ||
|
||
mail_addresses = [mail.to_dict() for mail in mock_request.mail_addresses] | ||
db_user = self.central_user_db.get_user_by_eppn("hubba-bubba") | ||
self.central_user_db.unverify_mail_aliases(user_id=db_user.user_id, mail_aliases=mail_addresses) | ||
|
||
db_user.mail_addresses = MailAddressList(elements=mock_request.mail_addresses) | ||
self.central_user_db.save(user=db_user) | ||
return Response(200, text='{"status": "true"}') | ||
|
||
def _side_effect_update_language(self, request: Request) -> Response: | ||
db_user = self._side_effect_update(func_name="_side_effect_update_language") | ||
assert self.central_user_db is not None | ||
mock_request = UserUpdateLanguageRequest.parse_raw(request.content) | ||
|
||
db_user.language = mock_request.language | ||
self.central_user_db.save(user=db_user) | ||
return Response(200, text='{"status": "true"}') | ||
|
||
def _side_effect_update_phone(self, request: Request) -> Response: | ||
db_user = self._side_effect_update(func_name="_side_effect_update_phone") | ||
assert self.central_user_db is not None | ||
mock_request = UserUpdatePhoneRequest.parse_raw(request.content) | ||
|
||
phones = [phone.to_dict() for phone in mock_request.phone_numbers] | ||
self.central_user_db.unverify_phones(user_id=db_user.user_id, phones=phones) | ||
db_user.phone_numbers = PhoneNumberList(elements=mock_request.phone_numbers) | ||
return Response(200, text='{"status": "true"}') | ||
|
||
def _side_effect_update_terminate(self, request: Request) -> Response: | ||
db_user = self._side_effect_update(func_name="_side_effect_update_terminate") | ||
assert self.central_user_db is not None | ||
|
||
db_user.terminated = utc_now() | ||
return Response(200, text='{"status": "true"}') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from unittest import TestCase | ||
|
||
from eduid.userdb.testing import MongoTemporaryInstance | ||
from eduid.userdb.user_cleaner.cache import CacheUser | ||
from eduid.userdb.user_cleaner.cachedb import CacheDB | ||
|
||
|
||
class TestUserCleanerCache(TestCase): | ||
def setUp(self): | ||
self.tmp_db = MongoTemporaryInstance.get_instance() | ||
self.user_cleaner_meta_db = CacheDB(db_uri=self.tmp_db.uri, collection="skv_cache") | ||
|
||
def tearDown(self): | ||
self.user_cleaner_meta_db._drop_whole_collection() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
from __future__ import annotations | ||
|
||
from datetime import datetime | ||
from typing import Any, Mapping, Optional | ||
|
||
from pydantic import BaseModel, Field | ||
|
||
from eduid.common.misc.timeutil import utc_now | ||
from eduid.userdb.db import TUserDbDocument | ||
from eduid.userdb.user import User | ||
|
||
|
||
class CacheUser(BaseModel): | ||
eppn: str | ||
created_ts: datetime = Field(default_factory=utc_now) | ||
next_run_ts: Optional[datetime] = None | ||
|
||
def to_dict(self) -> TUserDbDocument: | ||
""" | ||
Convert Element to a dict in eduid format, that can be used to reconstruct the | ||
Element later. | ||
""" | ||
data = self.dict(exclude_none=True) | ||
|
||
return TUserDbDocument(data) | ||
|
||
@classmethod | ||
def from_dict(cls, data: Mapping[str, Any]) -> CacheUser: | ||
"""Convert a dict to a Element object.""" | ||
return cls(**data) | ||
|
||
def from_user(self, data: User) -> CacheUser: | ||
""" | ||
Convert a User object to a CacheUser object. | ||
""" | ||
cache_user = CacheUser( | ||
eppn=data.eppn, | ||
) | ||
return cache_user |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vet inte om mypy eller våra IDEer kommer att vara så imponerade av att vi sätter något på self här.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vscode brydde sig inte. Men tagit bort dom eftersom dom inte används utanför metoden.