From 9de7f8148d38b744cddf4602767b59da470f3575 Mon Sep 17 00:00:00 2001 From: sidorov-as Date: Mon, 29 Aug 2022 13:47:39 +0300 Subject: [PATCH 1/3] EENG-25: add flag SVG badges 1. Add new API endpoint which returns an SVG image with actual flag information. 2. Add "copy badge" button to Flag detail page for copying an image with a link in Markdown format. --- .dockerignore | 3 +- .gitignore | 2 + .mdlrc | 1 + .mdlrc.rb | 3 + README.md | 43 ++++++++- docs/assets/img/admin-flag-editing-page.png | Bin 0 -> 162987 bytes its_on/admin/views/switches.py | 10 +- its_on/constants.py | 10 ++ its_on/routes.py | 9 +- its_on/static/img/active-flag-badge.svg | 23 +++++ its_on/static/img/deleted-flag-badge.svg | 23 +++++ its_on/static/img/favicon.ico | Bin 0 -> 4286 bytes its_on/static/img/inactive-flag-badge.svg | 23 +++++ its_on/static/img/unknown-flag-badge.svg | 23 +++++ its_on/templates/base.html | 35 +++++-- its_on/templates/switches/detail.html | 101 ++++++++++++++++---- its_on/templates/users/login.html | 1 + its_on/utils.py | 50 ++++++++++ its_on/views.py | 41 +++++++- requirements.txt | 1 + settings.yaml | 7 ++ tests/conftest.py | 43 ++++++++- tests/test_admin.py | 37 ++++++- tests/test_api_switch.py | 22 ++++- tests/test_utils.py | 86 +++++++++++++++++ 25 files changed, 553 insertions(+), 44 deletions(-) create mode 100644 .mdlrc create mode 100644 .mdlrc.rb create mode 100644 docs/assets/img/admin-flag-editing-page.png create mode 100644 its_on/constants.py create mode 100644 its_on/static/img/active-flag-badge.svg create mode 100644 its_on/static/img/deleted-flag-badge.svg create mode 100644 its_on/static/img/favicon.ico create mode 100644 its_on/static/img/inactive-flag-badge.svg create mode 100644 its_on/static/img/unknown-flag-badge.svg create mode 100644 tests/test_utils.py diff --git a/.dockerignore b/.dockerignore index 3715b0d..2cb20bd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,9 +4,10 @@ __pycache__/ .gitlab-ci.yml .coverage.* coverage.xml +docs/ .*cache/ .python-version .rozental.sqlite .coverage .git/ -Dockerfile \ No newline at end of file +Dockerfile diff --git a/.gitignore b/.gitignore index 5a33731..3931c34 100644 --- a/.gitignore +++ b/.gitignore @@ -185,3 +185,5 @@ yum-root-* .rozental.sqlite .tm_properties + +docker-compose.override.yml diff --git a/.mdlrc b/.mdlrc new file mode 100644 index 0000000..bb722c1 --- /dev/null +++ b/.mdlrc @@ -0,0 +1 @@ +style '.mdlrc.rb' diff --git a/.mdlrc.rb b/.mdlrc.rb new file mode 100644 index 0000000..aaf06ab --- /dev/null +++ b/.mdlrc.rb @@ -0,0 +1,3 @@ +all +rule 'MD013', :line_length => 120 +exclude_rule 'MD033' diff --git a/README.md b/README.md index e77a7c2..cbbab9c 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,12 @@ Flag/feature toggle service, written in aiohttp. ### Basic -| Method | Endpoint | Description | -| ------- | ---------------------------| ----------------------------------- | -| `GET` | `/api/docs` | Api documentation | -| `GET` | `/api/v1/switch` | List of flags for the group. | +| Method | Endpoint | Description | +| ------- |----------------------------------|-----------------------------------------| +| `GET` | `/api/docs` | Api documentation | +| `GET` | `/api/v1/switch` | List of flags for the group. | +| `GET` | `/api/v1/switches/{id}/svg-badge` | SVG badge with actual flag information | +| `GET` | `/api/v1/switches_full_info` | List of all active flags with full info. | ### Admin @@ -31,6 +33,37 @@ Flag/feature toggle service, written in aiohttp. } ``` +## SVG badges + +SVG badges can be useful for showing actual feature flag states. + +Open `Flag detail` page, find `SVG badge` section and copy badge. + +
+ Screenshot + + ![admin-flag-editing-page](docs/assets/img/admin-flag-editing-page.png) + +
+ +You will get an image with a link in Markdown format: + +```markdown +[![flag-name](link-to-svg-badge)](link-to-flag-editing-page) +``` + +Then paste text in a text editor with Markdown support (task tracker, Slack, Mattermost etc.). +Actual flag state will be displayed as follows: + +| State | Badge | +|---------------|-------------------------------------------------------------------| +| Active flag | ![active-flag-badge](its_on/static/img/active-flag-badge.svg) | +| Inactive flag | ![inactive-flag-badge](its_on/static/img/inactive-flag-badge.svg) | +| Deleted flag | ![deleted-flag-badge](its_on/static/img/deleted-flag-badge.svg) | +| Unknown flag | ![unknown-flag-badge](its_on/static/img/unknown-flag-badge.svg) | + +See [settings.yaml](settings.yaml) for additional settings. + ## Installation ### Prerequisites @@ -75,7 +108,7 @@ and you are good to go! Example `docker-compose.yml` file: -``` +```yaml version: '3' services: cache: diff --git a/docs/assets/img/admin-flag-editing-page.png b/docs/assets/img/admin-flag-editing-page.png new file mode 100644 index 0000000000000000000000000000000000000000..da891864e9b72c695063cd8493c8e6b30f434842 GIT binary patch literal 162987 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 Dict[str, Any]: switch = switch if switch else await self.get_object(self.request) switch_history = await get_switch_history(self.request, switch) + + svg_badge = get_switch_badge_svg(self.request.host, switch) + markdown_badge = get_switch_markdown_badge(self.request, switch) + context_data = { 'object': switch, + 'svg_badge': svg_badge, + 'markdown_badge': markdown_badge, 'switch_history': switch_history, 'errors': errors, 'updated': updated, diff --git a/its_on/constants.py b/its_on/constants.py new file mode 100644 index 0000000..2695a64 --- /dev/null +++ b/its_on/constants.py @@ -0,0 +1,10 @@ +from dynaconf import settings + +SVG_BADGE_SETTINGS = settings.FLAG_SVG_BADGE + +SVG_BADGE_BACKGROUND_COLOR = SVG_BADGE_SETTINGS.BACKGROUND_COLOR + +SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX = SVG_BADGE_SETTINGS.PREFIX.IS_ACTIVE +SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX = SVG_BADGE_SETTINGS.PREFIX.IS_INACTIVE +SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX = SVG_BADGE_SETTINGS.PREFIX.IS_HIDDEN +SWITCH_NOT_FOUND_SVG_BADGE_PREFIX = SVG_BADGE_SETTINGS.PREFIX.NOT_FOUND diff --git a/its_on/routes.py b/its_on/routes.py index 0ca37e0..1acf592 100644 --- a/its_on/routes.py +++ b/its_on/routes.py @@ -6,7 +6,7 @@ from dynaconf import settings from auth.views import LoginView, LogoutView -from its_on.views import SwitchFullListView, SwitchListView +from its_on.views import SwitchFullListView, SwitchListView, SwitchSvgBadgeView from its_on.admin.views.switches import ( SwitchAddAdminView, SwitchDeleteAdminView, @@ -34,6 +34,13 @@ def setup_routes(app: Application, base_dir: Path, cors_config: CorsConfig) -> N get_switch_view = app.router.add_view('/api/v1/switch', SwitchListView) cors_config.add(get_switch_view) + get_switch_svg_badge_view = app.router.add_view( + '/api/v1/switches/{id}/svg-badge', + SwitchSvgBadgeView, + name='switch_svg_badge', + ) + cors_config.add(get_switch_svg_badge_view) + if settings.ENABLE_SWITCHES_FULL_INFO_ENDPOINT: get_switch_full_view = app.router.add_view('/api/v1/switches_full_info', SwitchFullListView) cors_config.add(get_switch_full_view) diff --git a/its_on/static/img/active-flag-badge.svg b/its_on/static/img/active-flag-badge.svg new file mode 100644 index 0000000..f7e6bda --- /dev/null +++ b/its_on/static/img/active-flag-badge.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + ✅ {host} + ✅ {host} + + + feature-flag-title + feature-flag-title + + diff --git a/its_on/static/img/deleted-flag-badge.svg b/its_on/static/img/deleted-flag-badge.svg new file mode 100644 index 0000000..d5f7683 --- /dev/null +++ b/its_on/static/img/deleted-flag-badge.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + ⚠️ {host} + ⚠️ {host} + + + feature-flag-title (deleted) + feature-flag-title (deleted) + + diff --git a/its_on/static/img/favicon.ico b/its_on/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..11bf6f3aa909c51739d0214e90f0d8b5bce11156 GIT binary patch literal 4286 zcmb`LTZola6vy{Db0#86deC~6A}WXyih`a_4@TufAPA8(-tX6RG!@0sqy!Nk)EQ7j z(J^O`L{Ri4RALemG#W+3hroNygJ>g-I+xY|w=duM&Y2l6(I@{|Yp-wZ^LPy;t832!`svO-<$&EU?0&Mdl_>^m<9-;+#3= zCQY)!{Q35#Fjv?u`_IDfLZ@(AwgW<=^!GHse(~ZEOEzK@1Rs0eJgX*+Bl$T2jwDNS z=b96qk?jlNq;Owx3`qA#dQSF9|4o=LpAiDQb&^GNp|EV(;2f}XU%vR2qW+O&rvT@G zfb7o!8^~<FSH5dPYhx`j&Hd8%6{rFHi z^-B9J&CB+aYG-=39t-^9I1$?r-mgXVhT)y0F+cvYkd(B!~tATC*ezW#=vwi!_ zHf}VVH7n$ia>&I?>st`HS^K`o@9*KuJl2eU{J7b@d*-i!0W*-Uq$BU#F}r&=+_`zv zY}2Mtvy?-Ajf#6lp#LL<8}VM&d+kx5!^MjsUVpz?9({db+}mq*?3mf=)sk}tJ3^>xd^OC!}cA4qhVERV*S`lmZY_o<2v!h2t zj%(Kj8+FLnKzgJ6zscM1VLo&2-xqq4*cyh(>& z-!a?1J@m1$F+5N4e&Xl+&>ZXHpZzp%>(;eNUc+l+7A+z)6gGXm)SPSp6+BIt2BfKSU-v7fKUB;owfXa;;(s5xOJl}_bMUxv{tQ}D&B*E7$jfPz3U-xJawRdZ?vXWDCw*Nz{btvl^E&z*h@$|uV~dfE@Ki2p~8Yx_X#p-`2V=5`1? z+pN|9meo9ZT*XZe6DF9i1N%|WJGt;&7U_-jcZC+=s!+utpKQ!Mp-bSKK31}zZvZ_e zmR}!I&vIJ!AQ}CVFTV}yQhy|0(6}t0B?9kEey6nyJA{?Or?QO{d~YTBz3G2n=y~^h zt(Nega`BzNoNMWHZrmQ{MwOj=PXA3%l3tQt6belN?n$rcUnpyyP~78Oy<$H5iS$ + + + + + + + + + + + + + + + ❌ {host} + ❌ {host} + + + feature-flag-title + feature-flag-title + + diff --git a/its_on/static/img/unknown-flag-badge.svg b/its_on/static/img/unknown-flag-badge.svg new file mode 100644 index 0000000..1fb57e8 --- /dev/null +++ b/its_on/static/img/unknown-flag-badge.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + ⛔ {host} + ⛔ {host} + + + not found + not found + + diff --git a/its_on/templates/base.html b/its_on/templates/base.html index df767a6..b476f7a 100644 --- a/its_on/templates/base.html +++ b/its_on/templates/base.html @@ -1,17 +1,27 @@ - ITS ON Admin - - - - - - - - + {% block title %} + ITS ON Admin + {% endblock %} + {% block head_meta %} + + + + {% endblock %} + {% block head_css %} + + + + {% endblock %} + {% block head_js %} + + + + {% endblock %} +{% block page_body %}
@@ -24,10 +34,15 @@

ITS ON Admin

-
+ +
{% block content %}{% endblock %}
+{% endblock %} + +{% block tail_js %} +{% endblock %} diff --git a/its_on/templates/switches/detail.html b/its_on/templates/switches/detail.html index a3afff0..f4fbe7c 100644 --- a/its_on/templates/switches/detail.html +++ b/its_on/templates/switches/detail.html @@ -1,5 +1,22 @@ {% extends "base.html" %} +{% block head_css %} + {{ super() }} + +{% endblock %} + {% block content %}
@@ -31,6 +48,24 @@

Flag editing

{% else %} - {% endif %} + +
+ +
+ +
+ {{ svg_badge | safe }} + + +
+ + +

@@ -81,26 +116,26 @@

- - - - + + + + - {% for switch in switch_history %} - - - - - {% endfor %} + {% for switch in switch_history %} + + + + + {% endfor %}
Changed atValue
Changed atValue
- {{ switch.changed_at.strftime('%d-%m-%Y %H:%M:%S') }} - - {% if switch.new_value == '1' %} - - {% else %} - - {% endif %} -
+ {{ switch.changed_at.strftime('%d-%m-%Y %H:%M:%S') }} + + {% if switch.new_value == '1' %} + + {% else %} + + {% endif %} +
@@ -113,3 +148,33 @@

{% endblock %} + +{% block tail_js %} + {{ super() }} + +{% endblock %} diff --git a/its_on/templates/users/login.html b/its_on/templates/users/login.html index a44f6e7..22f55cc 100644 --- a/its_on/templates/users/login.html +++ b/its_on/templates/users/login.html @@ -4,6 +4,7 @@ + diff --git a/its_on/utils.py b/its_on/utils.py index d78d316..72b5870 100644 --- a/its_on/utils.py +++ b/its_on/utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import datetime import json from typing import Any, Optional, Dict @@ -6,6 +8,16 @@ from aiocache import Cache from aiocache.serializers import JsonSerializer from aiohttp import web +from aiopg.sa.result import RowProxy +from anybadge import Badge + +from its_on.constants import ( + SVG_BADGE_BACKGROUND_COLOR, + SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX, + SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX, + SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX, + SWITCH_NOT_FOUND_SVG_BADGE_PREFIX, +) def setup_cache(app: web.Application) -> None: @@ -26,6 +38,44 @@ def reverse( return str(request.url.join(path_url)) +def get_switch_badge_svg(hostname: str, switch: RowProxy | None = None) -> str: + if switch is not None: + value = switch.name + + if switch.is_hidden: + prefix = SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX + value = value + ' (deleted)' + elif switch.is_active: + prefix = SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX + else: + prefix = SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX + else: + prefix = SWITCH_NOT_FOUND_SVG_BADGE_PREFIX + value = 'not found' + + badge = Badge( + label=f'{prefix} {hostname}', value=value, + default_color=SVG_BADGE_BACKGROUND_COLOR, + ) + + return badge.badge_svg_text + + +def get_switch_markdown_badge(request: web.Request, switch: RowProxy) -> str: + flag_url = reverse( + request=request, + router_name='switch_detail', + params={'id': str(switch.id)}, + ) + svg_badge_url = reverse( + request=request, + router_name='switch_svg_badge', + params={'id': str(switch.id)}, + ) + + return f'[![{switch.name}]({svg_badge_url})]({flag_url})' + + class AwareDateTime(sa.TypeDecorator): """Results returned as local datetimes with timezone.""" diff --git a/its_on/views.py b/its_on/views.py index 7744469..e210208 100644 --- a/its_on/views.py +++ b/its_on/views.py @@ -1,5 +1,6 @@ import functools import json +import textwrap from typing import Dict, List, Optional from aiocache import cached @@ -9,6 +10,8 @@ from dynaconf import settings from sqlalchemy.sql import Select, false +from its_on.admin.mixins import GetObjectMixin +from its_on.utils import get_switch_badge_svg from its_on.cache import switch_list_cache_key_builder from its_on.models import switches from its_on.schemes import ( @@ -23,7 +26,7 @@ class SwitchListView(CorsViewMixin, web.View): description='Returns a list of active flags for the passed group.', ) @request_schema(SwitchListRequestSchema(), locations=['query']) - @response_schema(SwitchListResponseSchema(), 200) + @response_schema(SwitchListResponseSchema(), code=200, description='Successful operation') async def get(self) -> web.Response: data = await self.get_response_data() return web.json_response(data) @@ -77,7 +80,7 @@ class SwitchFullListView(CorsViewMixin, web.View): summary='List of all active flags with full info.', description='Returns a list of all active flags with all necessary info for recreation.', ) - @response_schema(SwitchFullListResponseSchema(), 200) + @response_schema(SwitchFullListResponseSchema(), code=200, description='Successful operation') async def get(self) -> web.Response: data = await self.get_response_data() return web.json_response(data, dumps=functools.partial(json.dumps, cls=DateTimeJSONEncoder)) @@ -115,3 +118,37 @@ async def load_objects(self) -> List: def get_queryset(self) -> Select: return switches.select() + + +class SwitchSvgBadgeView(CorsViewMixin, GetObjectMixin, web.View): + model = switches + + @docs( + summary='SVG badge with actual flag information.', + description=textwrap.dedent( + """ + Returns an SVG image with actual flag information: + + | State | Badge | + |-----|-----| + | Active flag | | + | Inactive flag | | + | Deleted flag | | + | Unknown flag | | + + `{host}` here means a host name of the request. + """, + ), + produces=['image/svg+xml'], + responses={ + 200: { + 'description': 'Successful operation', + }, + }, + ) + async def get(self) -> web.Response: + switch = await self.get_object(self.request) + + svg_badge = get_switch_badge_svg(self.request.host, switch) + + return web.Response(body=svg_badge, content_type='image/svg+xml') diff --git a/requirements.txt b/requirements.txt index 151de55..6da6580 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,7 @@ aiohttp-session==2.8.0 aiodns==2.0.0 aiopg==1.0.0 aioredis==1.3.1 +anybadge==1.11.1 sqlalchemy==1.3.16 alembic==1.4.2 aiocache[redis]==0.11.1 diff --git a/settings.yaml b/settings.yaml index e1478dd..a50638c 100644 --- a/settings.yaml +++ b/settings.yaml @@ -13,6 +13,13 @@ default: enable_switches_full_info_endpoint: false sync_from_its_on_url: '@none' flag_ttl_days: 14 + flag_svg_badge: + background_color: '#ff6c6c' + prefix: + is_active: '✅' + is_inactive: '❌' + is_hidden: '⚠️' + not_found: '⛔' development: environment: Dev diff --git a/tests/conftest.py b/tests/conftest.py index a06066c..0b3b487 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,6 +4,8 @@ import pytest import factory.fuzzy +from anybadge import Badge +from anybadge.config import MASK_ID_PREFIX from dynaconf import settings from sqlalchemy.orm import Session @@ -228,7 +230,7 @@ def switch_data_factory_with_ttl(request, switch_data_factory): @pytest.fixture() -async def switch_factory(setup_tables: Callable) -> Callable: +async def switches_factory(setup_tables: Callable) -> Callable: engine = get_engine(settings.DATABASE.DSN) session = Session(engine) @@ -250,3 +252,42 @@ async def _with_params(batch_size: int = 1) -> list: return session.query(switches).all() return _with_params + + +@pytest.fixture() +async def switch_factory(loop, setup_tables: Callable) -> Callable: + engine = get_engine(settings.DATABASE.DSN) + + async def _with_params(**kwargs) -> list: + switch_params = { + 'name': factory.fuzzy.FuzzyText(length=10).fuzz(), + 'is_active': factory.fuzzy.FuzzyChoice([True, False]).fuzz(), + 'is_hidden': factory.fuzzy.FuzzyChoice([True, False]).fuzz(), + 'groups': ( + factory.fuzzy.FuzzyText(length=5).fuzz(), factory.fuzzy.FuzzyText(length=5).fuzz(), + ), + 'version': factory.fuzzy.FuzzyInteger(low=0, high=100).fuzz(), + 'jira_ticket': factory.fuzzy.FuzzyText(length=10).fuzz(), + 'ttl': factory.fuzzy.FuzzyInteger(low=0, high=100).fuzz(), + **kwargs, + } + + with engine.connect() as conn: + conn.execute(switches.insert(), switch_params) + query = switches.select(switches.c.name == switch_params['name']) + return conn.execute(query).fetchone() + + return _with_params + + +@pytest.fixture() +def badge_mask_id_patch(mocker): + # anybadge increments mask_id for each badge to prevent + # SVG duplicates + # set it to 1 just to compare two SVG images without regard to anybadge internal details. + + return mocker.patch.object( + Badge, + '_get_next_mask_str', + return_value=f'{MASK_ID_PREFIX}_1', + ) diff --git a/tests/test_admin.py b/tests/test_admin.py index c1f819c..ab92882 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -1,16 +1,18 @@ import datetime import pytest +from aiohttp.test_utils import make_mocked_request from aiohttp.web_exceptions import HTTPOk from freezegun import freeze_time from sqlalchemy import desc from auth.models import users from its_on.models import switch_history, switches +from its_on.utils import get_switch_badge_svg, get_switch_markdown_badge @pytest.mark.usefixtures('setup_tables_and_data') -async def test_switches_list_without_auhtorize(client): +async def test_switches_list_without_authorization(client): response = await client.get('/zbs/switches') assert response.status == 401 @@ -189,7 +191,7 @@ async def test_resurrect_switch(client, login, switch): assert 'switch3' in content.decode('utf-8') -async def test_switches_copy_without_auhtorize(setup_tables_and_data, client): +async def test_switches_copy_without_authorization(setup_tables_and_data, client): response = await client.post('/zbs/switches/copy') assert response.status == 401 @@ -207,7 +209,8 @@ async def test_switches_copy_without_auhtorize(setup_tables_and_data, client): ], ) @freeze_time(datetime.datetime(2020, 10, 15, tzinfo=datetime.timezone.utc)) -@pytest.mark.usefixtures('setup_tables_and_data', 'login', 'get_switches_data_mocked_existing_switch') +@pytest.mark.usefixtures('setup_tables_and_data', 'login', + 'get_switches_data_mocked_existing_switch') async def test_switches_copy_existing_switch_foo( client, db_conn_acquirer, @@ -258,3 +261,31 @@ async def test_switch_strip_spaces( created_switch = await result.first() assert created_switch.name == 'switch' + + +@pytest.mark.usefixtures('setup_tables_and_data', 'login', 'badge_mask_id_patch') +async def test_switch_detail_svg_badge(client, switch): + svg_badge_url = str(client.make_url(f'/api/v1/switches/{switch.id}/svg-badge')) + expected_svg_badge = get_switch_badge_svg( + hostname=f'{client.host}:{client.port}', + switch=switch, + ) + expected_markdown_badge = get_switch_markdown_badge( + request=make_mocked_request( + method='GET', + path=svg_badge_url, + app=client.app, + ), + switch=switch, + ) + + response = await client.get('/zbs/switches/1') + content = await response.content.read() + content = content.decode('utf-8') + + assert switch.name in content + assert 'block-svg-badge' in content + assert 'copy-md-badge-btn' in content + assert 'md-badge' in content + assert expected_svg_badge in content + assert expected_markdown_badge in content diff --git a/tests/test_api_switch.py b/tests/test_api_switch.py index 0ebe24f..5b49d99 100644 --- a/tests/test_api_switch.py +++ b/tests/test_api_switch.py @@ -1,5 +1,7 @@ import pytest +from its_on.utils import get_switch_badge_svg + async def test_switch(setup_tables_and_data, client): response = await client.get('/api/v1/switch?group=group1') @@ -76,10 +78,26 @@ async def test_switch_filter_by_version(version, expected_result, setup_tables_a async def test_switches_full_info( - switch_factory, client, asserted_switch_full_info_data, + switches_factory, client, asserted_switch_full_info_data, ): - all_switches = await switch_factory(batch_size=5) + all_switches = await switches_factory(batch_size=5) response = await client.get('/api/v1/switches_full_info') assert response.status == 200 assert await response.json() == asserted_switch_full_info_data(all_switches) + + +@pytest.mark.usefixtures('badge_mask_id_patch') +async def test_switch_svg_badge_view( + switch_factory, client, asserted_switch_full_info_data, +): + switch = await switch_factory() + expected_badge_svg = get_switch_badge_svg( + hostname=f'{client.host}:{client.port}', + switch=switch, + ) + + response = await client.get(f'/api/v1/switches/{switch.id}/svg-badge') + + assert response.status == 200 + assert await response.text() == expected_badge_svg diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..413a3e8 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,86 @@ +import pytest +from aiohttp.test_utils import make_mocked_request +from anybadge import Badge + +from its_on.constants import ( + SVG_BADGE_BACKGROUND_COLOR, + SWITCH_NOT_FOUND_SVG_BADGE_PREFIX, + SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX, + SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX, + SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX, +) +from its_on.utils import get_switch_badge_svg, get_switch_markdown_badge + + +@pytest.mark.usefixtures('setup_tables_and_data', 'badge_mask_id_patch') +async def test_get_switch_badge_svg_for_active_switch(switch_factory): + hostname = 'flags-staging.bestdoctor.ru' + switch = await switch_factory(is_active=True, is_hidden=False) + expected_badge = Badge( + label=f'{SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX} {hostname}', value=switch.name, + default_color=SVG_BADGE_BACKGROUND_COLOR, + ) + + svg_badge = get_switch_badge_svg(hostname, switch) + + assert svg_badge == expected_badge.badge_svg_text + + +@pytest.mark.usefixtures('setup_tables_and_data', 'badge_mask_id_patch') +async def test_get_switch_badge_svg_for_inactive_switch(switch_factory): + hostname = 'flags-staging.bestdoctor.ru' + switch = await switch_factory(is_active=False, is_hidden=False) + expected_badge = Badge( + label=f'{SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX} {hostname}', value=switch.name, + default_color=SVG_BADGE_BACKGROUND_COLOR, + ) + + svg_badge = get_switch_badge_svg(hostname, switch) + + assert svg_badge == expected_badge.badge_svg_text + + +@pytest.mark.usefixtures('setup_tables_and_data', 'badge_mask_id_patch') +async def test_get_switch_badge_svg_for_deleted_switch(switch_factory): + hostname = 'flags-staging.bestdoctor.ru' + switch = await switch_factory(is_hidden=True) + expected_badge = Badge( + label=f'{SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX} {hostname}', + value=f'{switch.name} (deleted)', + default_color=SVG_BADGE_BACKGROUND_COLOR, + ) + + svg_badge = get_switch_badge_svg(hostname, switch) + + assert svg_badge == expected_badge.badge_svg_text + + +@pytest.mark.usefixtures('badge_mask_id_patch') +def test_get_switch_badge_svg_for_unknown_switch(): + hostname = 'flags-staging.bestdoctor.ru' + expected_badge = Badge( + label=f'{SWITCH_NOT_FOUND_SVG_BADGE_PREFIX} {hostname}', + value='not found', + default_color=SVG_BADGE_BACKGROUND_COLOR, + ) + + svg_badge = get_switch_badge_svg(hostname, switch=None) + + assert svg_badge == expected_badge.badge_svg_text + + +@pytest.mark.usefixtures('setup_tables_and_data', 'badge_mask_id_patch') +async def test_get_switch_markdown_badge(switch_factory, client): + switch = await switch_factory() + flag_url = str(client.make_url(f'/zbs/switches/{switch.id}')) + svg_badge_url = str(client.make_url(f'/api/v1/switches/{switch.id}/svg-badge')) + expected_badge = f'[![{switch.name}]({svg_badge_url})]({flag_url})' + request = make_mocked_request( + method='GET', + path=svg_badge_url, + app=client.app, + ) + + markdown_badge = get_switch_markdown_badge(request, switch) + + assert markdown_badge == expected_badge From 8fe2057c41974ebd040a73c26a30acba4adfe0af Mon Sep 17 00:00:00 2001 From: sidorov-as Date: Mon, 29 Aug 2022 15:00:55 +0300 Subject: [PATCH 2/3] EENG-25: add admin environment notice --- README.md | 21 ++++++++++++++++++ .../img/admin-environment-indicator.png | Bin 0 -> 64274 bytes its_on/main.py | 9 +++++++- its_on/templates/base.html | 14 ++++++++++++ settings.yaml | 17 ++++++++++++++ 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 docs/assets/img/admin-environment-indicator.png diff --git a/README.md b/README.md index cbbab9c..2f8dc1e 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,27 @@ Actual flag state will be displayed as follows: See [settings.yaml](settings.yaml) for additional settings. +## Environment notice + +Environment notice helps to visually distinguish environments (e.g. development, staging, production). + +
+ Screenshot + + ![admin-environment-indicator](docs/assets/img/admin-environment-indicator.png) + +
+ +To add the environment notice to every page in the admin, add following settings: + +```env +export DYNACONF_ENVIRONMENT_NOTICE__show=true # false by default +export DYNACONF_ENVIRONMENT_NOTICE__environment_name='' +export DYNACONF_ENVIRONMENT_NOTICE__background_color='' +``` + +See [settings.yaml](settings.yaml) for default settings for each specified environment. + ## Installation ### Prerequisites diff --git a/docs/assets/img/admin-environment-indicator.png b/docs/assets/img/admin-environment-indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..f923dc1f5d2260451fcb459688f1db26960ca44a GIT binary patch literal 64274 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%0D_WReJ1qu&HLUFt?&^(u1 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 literal 0 HcmV?d00001 diff --git a/its_on/main.py b/its_on/main.py index fba8e9b..037b3e1 100644 --- a/its_on/main.py +++ b/its_on/main.py @@ -55,12 +55,19 @@ async def dispose_redis_pool(app: web.Application) -> None: redis_pool.close() await redis_pool.wait_closed() - aiohttp_jinja2.setup( + jinja2_env = aiohttp_jinja2.setup( app, loader=jinja2.FileSystemLoader( str(BASE_DIR / 'its_on' / 'templates'), ), ) + + jinja2_env.globals.update({ + 'show_env_notice': settings.ENVIRONMENT_NOTICE.SHOW, + 'env_notice_name': settings.ENVIRONMENT_NOTICE.ENVIRONMENT_NAME, + 'env_notice_background_color': settings.ENVIRONMENT_NOTICE.BACKGROUND_COLOR, + }) + app['static_root_url'] = '/static' app.on_startup.append(init_pg) diff --git a/its_on/templates/base.html b/its_on/templates/base.html index b476f7a..4e5c261 100644 --- a/its_on/templates/base.html +++ b/its_on/templates/base.html @@ -13,6 +13,20 @@ + {% if show_env_notice %} + + {% endif %} {% endblock %} {% block head_js %} diff --git a/settings.yaml b/settings.yaml index a50638c..21b18bb 100644 --- a/settings.yaml +++ b/settings.yaml @@ -20,6 +20,11 @@ default: is_inactive: '❌' is_hidden: '⚠️' not_found: '⛔' + environment_notice: + show: false + environment_name: Development + background_color: '#74b91d' # green + development: environment: Dev @@ -31,9 +36,17 @@ development: production: environment: Prod + environment_notice: + dynaconf_merge: true + environment_name: Production + background_color: '#e64747' # red staging: environment: Staging + environment_notice: + dynaconf_merge: true + environment_name: Staging + background_color: '#c3721a' # orange testing: environment: Test @@ -43,3 +56,7 @@ testing: superuser_dsn: postgresql://bestdoctor:bestdoctor@localhost:5432/its_on cache_ttl: 0 cors_allow_origin: ['http://localhost:8081'] + environment_notice: + dynaconf_merge: true + environment_name: Test + background_color: '#c3721a' # orange From f8eb04b626aa57fbad07abc88c7f11dd9f707ee8 Mon Sep 17 00:00:00 2001 From: sidorov-as Date: Mon, 29 Aug 2022 15:58:40 +0300 Subject: [PATCH 3/3] EENG-25: reduce cognitive complexity --- its_on/utils.py | 24 +++++++++++++-------- tests/test_utils.py | 51 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/its_on/utils.py b/its_on/utils.py index 72b5870..065d921 100644 --- a/its_on/utils.py +++ b/its_on/utils.py @@ -38,17 +38,23 @@ def reverse( return str(request.url.join(path_url)) +def get_switch_badge_prefix_and_value(switch: RowProxy) -> tuple[str, str]: + value = switch.name + + if switch.is_hidden: + prefix = SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX + value = value + ' (deleted)' + elif switch.is_active: + prefix = SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX + else: + prefix = SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX + + return prefix, value + + def get_switch_badge_svg(hostname: str, switch: RowProxy | None = None) -> str: if switch is not None: - value = switch.name - - if switch.is_hidden: - prefix = SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX - value = value + ' (deleted)' - elif switch.is_active: - prefix = SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX - else: - prefix = SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX + prefix, value = get_switch_badge_prefix_and_value(switch) else: prefix = SWITCH_NOT_FOUND_SVG_BADGE_PREFIX value = 'not found' diff --git a/tests/test_utils.py b/tests/test_utils.py index 413a3e8..a759e42 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -9,7 +9,56 @@ SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX, SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX, ) -from its_on.utils import get_switch_badge_svg, get_switch_markdown_badge +from its_on.utils import ( + get_switch_badge_prefix_and_value, + get_switch_badge_svg, + get_switch_markdown_badge, +) + + +@pytest.mark.usefixtures('setup_tables_and_data') +@pytest.mark.parametrize( + ('switch_params', 'expected_prefix', 'expected_value'), + [ + ( + { + 'name': 'feature-flag-1', + 'is_active': True, + 'is_hidden': False, + }, + SWITCH_IS_ACTIVE_SVG_BADGE_PREFIX, + 'feature-flag-1', + ), + ( + { + 'name': 'feature-flag-1', + 'is_active': False, + 'is_hidden': False, + }, + SWITCH_IS_INACTIVE_SVG_BADGE_PREFIX, + 'feature-flag-1', + ), + + ( + { + 'name': 'feature-flag-1', + 'is_hidden': True, + }, + SWITCH_IS_HIDDEN_SVG_BADGE_PREFIX, + 'feature-flag-1 (deleted)', + ), + ], + ids=['active-flag', 'inactive-flag', 'deleted-flag'], +) +async def test_get_switch_badge_prefix_and_value( + switch_factory, switch_params, expected_prefix, expected_value, +): + switch = await switch_factory(**switch_params) + + prefix, value = get_switch_badge_prefix_and_value(switch) + + assert prefix == expected_prefix + assert value == expected_value @pytest.mark.usefixtures('setup_tables_and_data', 'badge_mask_id_patch')