From 10ada7658930957bf8d4b224139b59ad300da183 Mon Sep 17 00:00:00 2001 From: F-cq <2036478450@qq.com> Date: Fri, 8 Nov 2024 20:27:43 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(apis/web/resource/view):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B5=84=E6=BA=90=E7=BB=91=E5=AE=9A=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=9C=AA=E4=BF=AE=E6=94=B9=E4=BD=86=E8=A7=A6=E5=8F=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apigateway/apis/web/plugin/views.py | 52 +++++++++++++------ .../tests/apis/web/plugin/test_views.py | 51 ++++++++++++++++++ .../apigateway/apigateway/tests/conftest.py | 36 +++++++++++++ 3 files changed, 124 insertions(+), 15 deletions(-) diff --git a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py index 59584a66d..a5535f21b 100644 --- a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py +++ b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py @@ -41,6 +41,7 @@ from apigateway.core.models import Resource, Stage from apigateway.utils.django import get_model_dict from apigateway.utils.responses import OKJsonResponse +from apigateway.utils.yaml import yaml_loads from .serializers import ( PluginBindingListOutputSLZ, @@ -327,6 +328,25 @@ class PluginConfigRetrieveUpdateDestroyApi( lookup_field = "id" + def _check_if_changed(self, input_data: Dict[str, Any], instance: PluginConfig) -> bool: + + try: + input_yaml = yaml_loads(input_data["yaml"]) + current_yaml = yaml_loads(instance.yaml) + + if input_yaml != current_yaml: + return True + except Exception: + return True + + if input_data["name"] != instance.name: + return True + + if input_data["type_id"].id != instance.type.id: + return True + + return False + def get_queryset(self): return PluginConfig.objects.prefetch_related("type").filter(gateway=self.request.gateway) @@ -339,23 +359,25 @@ def perform_update(self, serializer): self.validate_scope() self.validate_code(type_id=serializer.validated_data["type_id"]) - data_before = get_model_dict(serializer.instance) + if self._check_if_changed(dict(serializer.validated_data), serializer.instance): - super().perform_update(serializer) + data_before = get_model_dict(serializer.instance) - # if scope_type is stage, should publish - scope_type = self.kwargs["scope_type"] - scope_id = self.kwargs["scope_id"] - self.post_modification( - source=PublishSourceEnum.PLUGIN_UPDATE, - op_type=OpTypeEnum.MODIFY, - scope_type=scope_type, - scope_id=scope_id, - instance_id=serializer.instance.id, - instance_name=serializer.instance.name, - data_before=data_before, - data_after=get_model_dict(serializer.instance), - ) + super().perform_update(serializer) + + # if scope_type is stage, should publish + scope_type = self.kwargs["scope_type"] + scope_id = self.kwargs["scope_id"] + self.post_modification( + source=PublishSourceEnum.PLUGIN_UPDATE, + op_type=OpTypeEnum.MODIFY, + scope_type=scope_type, + scope_id=scope_id, + instance_id=serializer.instance.id, + instance_name=serializer.instance.name, + data_before=data_before, + data_after=get_model_dict(serializer.instance), + ) @transaction.atomic def perform_destroy(self, instance): diff --git a/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py b/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py index d2e5e5478..e834cd02c 100644 --- a/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py +++ b/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py @@ -18,6 +18,7 @@ import pytest from django.utils.translation import override +from apigateway.apis.web.plugin.views import PluginConfigRetrieveUpdateDestroyApi from apigateway.utils.yaml import yaml_dumps @@ -215,6 +216,56 @@ def test_delete( assert response.status_code == 204 + def test_check_if_changed( + self, + request_view, + fake_gateway, + fake_stage, + fake_plugin_bk_header_rewrite, + fake_plugin_check_changed_binding, + ): + + yaml = yaml_dumps( + { + "set": [{"key": "foo", "value": "bar"}], + "remove": [{"key": "baz"}], + } + ) + + view = PluginConfigRetrieveUpdateDestroyApi() + + # update yaml + fake_input_data1 = { + "name": fake_plugin_bk_header_rewrite.name, + "type_id": fake_plugin_check_changed_binding[0], + "yaml": '', + } + assert view._check_if_changed(fake_input_data1, fake_plugin_bk_header_rewrite) + + # update name + fake_input_data2 = { + "name": "bk-header-rewrite-2", + "type_id": fake_plugin_check_changed_binding[0], + "yaml": yaml, + } + assert view._check_if_changed(fake_input_data2, fake_plugin_bk_header_rewrite) + + # update type_id + fake_input_data3 = { + "name": fake_plugin_bk_header_rewrite.name, + "type_id": fake_plugin_check_changed_binding[1], + "yaml": yaml, + } + assert view._check_if_changed(fake_input_data3, fake_plugin_bk_header_rewrite) + + # no update + fake_input_data4 = { + "name": fake_plugin_bk_header_rewrite.name, + "type_id": fake_plugin_check_changed_binding[0], + "yaml": yaml, + } + assert not view._check_if_changed(fake_input_data4, fake_plugin_bk_header_rewrite) + class TestPluginFormRetrieveApi: @pytest.mark.parametrize( diff --git a/src/dashboard/apigateway/apigateway/tests/conftest.py b/src/dashboard/apigateway/apigateway/tests/conftest.py index a67b61ed1..22e016e5c 100644 --- a/src/dashboard/apigateway/apigateway/tests/conftest.py +++ b/src/dashboard/apigateway/apigateway/tests/conftest.py @@ -903,6 +903,42 @@ def fake_plugin_resource_bk_cors_binding(fake_plugin_bk_cors, fake_resource): ) +@pytest.fixture() +def fake_plugin_check_changed(fake_plugin_type_bk_header_rewrite, fake_gateway): + return G( + PluginConfig, + gateway=fake_gateway, + name="bk-test", + type=fake_plugin_type_bk_header_rewrite, + yaml=yaml_dumps( + { + "set": [{"key": "foo", "value": "bar"}], + "remove": [{"key": "baz"}], + } + ), + ) + + +@pytest.fixture() +def fake_plugin_check_changed_binding(fake_plugin_bk_header_rewrite, fake_plugin_check_changed, fake_stage): + bangding1 = G( + PluginBinding, + gateway=fake_plugin_bk_header_rewrite.gateway, + config=fake_plugin_bk_header_rewrite, + scope_type=PluginBindingScopeEnum.STAGE.value, + scope_id=fake_stage.pk, + ) + + bangding2 = G( + PluginBinding, + gateway=fake_plugin_check_changed.gateway, + config=fake_plugin_check_changed, + scope_type=PluginBindingScopeEnum.STAGE.value, + scope_id=fake_stage.pk, + ) + return [bangding1, bangding2] + + @pytest.fixture() def fake_rsa_private_key(): return """-----BEGIN RSA PRIVATE KEY----- From 61ee92e6fddb498384a0571e6ee1994811f37e9f Mon Sep 17 00:00:00 2001 From: F-cq <2036478450@qq.com> Date: Mon, 11 Nov 2024 16:20:39 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix(apis/web/resource/view):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B5=84=E6=BA=90=E7=BB=91=E5=AE=9A=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=9C=AA=E4=BF=AE=E6=94=B9=E4=BD=86=E8=A7=A6=E5=8F=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apigateway/apigateway/apis/web/plugin/views.py | 8 +------- .../apigateway/tests/apis/web/plugin/test_views.py | 8 -------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py index a5535f21b..6881daf07 100644 --- a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py +++ b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py @@ -334,17 +334,11 @@ def _check_if_changed(self, input_data: Dict[str, Any], instance: PluginConfig) input_yaml = yaml_loads(input_data["yaml"]) current_yaml = yaml_loads(instance.yaml) - if input_yaml != current_yaml: + if input_yaml != current_yaml or input_data["type_id"].id != instance.type.id: return True except Exception: return True - if input_data["name"] != instance.name: - return True - - if input_data["type_id"].id != instance.type.id: - return True - return False def get_queryset(self): diff --git a/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py b/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py index e834cd02c..4a88c937c 100644 --- a/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py +++ b/src/dashboard/apigateway/apigateway/tests/apis/web/plugin/test_views.py @@ -242,14 +242,6 @@ def test_check_if_changed( } assert view._check_if_changed(fake_input_data1, fake_plugin_bk_header_rewrite) - # update name - fake_input_data2 = { - "name": "bk-header-rewrite-2", - "type_id": fake_plugin_check_changed_binding[0], - "yaml": yaml, - } - assert view._check_if_changed(fake_input_data2, fake_plugin_bk_header_rewrite) - # update type_id fake_input_data3 = { "name": fake_plugin_bk_header_rewrite.name, From 37809babe56001c7484a9d42e697161a1b8dbadf Mon Sep 17 00:00:00 2001 From: F-cq <2036478450@qq.com> Date: Mon, 11 Nov 2024 16:41:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(apis/web/resource/view):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=B5=84=E6=BA=90=E7=BB=91=E5=AE=9A=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=9C=AA=E4=BF=AE=E6=94=B9=E4=BD=86=E8=A7=A6=E5=8F=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dashboard/apigateway/apigateway/apis/web/plugin/views.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py index 6881daf07..8ec9685de 100644 --- a/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py +++ b/src/dashboard/apigateway/apigateway/apis/web/plugin/views.py @@ -333,13 +333,10 @@ def _check_if_changed(self, input_data: Dict[str, Any], instance: PluginConfig) try: input_yaml = yaml_loads(input_data["yaml"]) current_yaml = yaml_loads(instance.yaml) - - if input_yaml != current_yaml or input_data["type_id"].id != instance.type.id: - return True except Exception: return True - return False + return input_yaml != current_yaml or input_data["type_id"].id != instance.type.id def get_queryset(self): return PluginConfig.objects.prefetch_related("type").filter(gateway=self.request.gateway)