diff --git a/src/dashboard/apigateway/apigateway/apps/release/releasers.py b/src/dashboard/apigateway/apigateway/apps/release/releasers.py index f844d5725..6080e6441 100644 --- a/src/dashboard/apigateway/apigateway/apps/release/releasers.py +++ b/src/dashboard/apigateway/apigateway/apps/release/releasers.py @@ -292,15 +292,17 @@ def _create_release_task_for_micro_gateway(self, release: Release, release_histo username=self.username, ) # type: ignore - def _create_release_tasks(self, release: Release, release_history: ReleaseHistory): + def _create_release_task(self, release: Release, release_history: ReleaseHistory): # create publish event - if self._shared_micro_gateway: PublishEventReporter.report_create_publish_task_doing_event(release_history, release.stage) - for fn in [self._create_release_task_for_shared_gateway, self._create_release_task_for_micro_gateway]: - task = fn(release, release_history) - if task: - yield task + + # NOTE: 发布专享网关时,不再将资源同时发布到共享网关 + micro_gateway = release.stage.micro_gateway + if not micro_gateway or micro_gateway.is_shared: + return self._create_release_task_for_shared_gateway(release, release_history) + + return self._create_release_task_for_micro_gateway(release, release_history) def _do_release(self, releases: List[Release], release_history: ReleaseHistory): tasks = [] @@ -317,9 +319,9 @@ def _do_release(self, releases: List[Release], release_history: ReleaseHistory): ) # type: ignore for release in releases: - for task in self._create_release_tasks(release, release_history): - # 任意一个任务失败都表示发布失败 - tasks.append(task.on_error(release_failure_callback)) + task = self._create_release_task(release, release_history) + # 任意一个任务失败都表示发布失败 + tasks.append(task.on_error(release_failure_callback)) # 使用 celery 的编排能力,并发发布多个微网关,并且在发布完成后,更新微网关发布历史的状态 delay_on_commit(group(*tasks) | release_success_callback) diff --git a/src/dashboard/apigateway/apigateway/common/constants.py b/src/dashboard/apigateway/apigateway/common/constants.py index 6363d4c8c..1666f9e49 100644 --- a/src/dashboard/apigateway/apigateway/common/constants.py +++ b/src/dashboard/apigateway/apigateway/common/constants.py @@ -18,7 +18,7 @@ # import re from enum import Enum -from typing import Any, Dict +from typing import Any, Dict, Optional from blue_krill.data_types.enum import EnumField, StructuredEnum @@ -40,7 +40,7 @@ class CacheTimeLevel(Enum): class ExtendEnumField(EnumField): - def __init__(self, *args, metadata: Dict[str, Any] = None, **kwargs): + def __init__(self, *args, metadata: Optional[Dict[str, Any]] = None, **kwargs): super().__init__(*args, **kwargs) self.metadata = metadata or {} diff --git a/src/dashboard/apigateway/apigateway/controller/distributor/combine.py b/src/dashboard/apigateway/apigateway/controller/distributor/combine.py index 858dae72e..a34afaba4 100644 --- a/src/dashboard/apigateway/apigateway/controller/distributor/combine.py +++ b/src/dashboard/apigateway/apigateway/controller/distributor/combine.py @@ -46,20 +46,26 @@ def foreach_distributor( assert micro_gateway.is_shared managed_micro_gateway = stage.micro_gateway - if managed_micro_gateway != micro_gateway: - # 指定的共享实例 - callback(self.etcd_distributor_type(include_gateway_global_config=False), micro_gateway) - + # 如果微网关不存在, 只发布default共享网关 if not managed_micro_gateway: + callback(self.etcd_distributor_type(include_gateway_global_config=False), micro_gateway) return + # NOTE: 发布专享网关时不再同时发布共享网关 + # if managed_micro_gateway != micro_gateway: + # # 指定的共享实例 + # callback(self.etcd_distributor_type(include_gateway_global_config=False), micro_gateway) + + # if not managed_micro_gateway: + # return + + # 发布共享网关 if managed_micro_gateway.is_shared: - # 共享实例 callback(self.etcd_distributor_type(include_gateway_global_config=True), managed_micro_gateway) return + # 发布专享网关 if managed_micro_gateway.is_managed: - # 专享实例 callback(self.helm_distributor_type(generate_chart=False), managed_micro_gateway) def distribute( diff --git a/src/dashboard/apigateway/apigateway/controller/distributor/helm.py b/src/dashboard/apigateway/apigateway/controller/distributor/helm.py index d6bb8c7c9..93c4e2eff 100644 --- a/src/dashboard/apigateway/apigateway/controller/distributor/helm.py +++ b/src/dashboard/apigateway/apigateway/controller/distributor/helm.py @@ -130,8 +130,8 @@ class HelmDistributor(BaseDistributor): def __init__( self, operator: str = getattr(settings, "BK_APP_CODE", ""), - chart_helper: ChartHelper = None, - release_helper: ReleaseHelper = None, + chart_helper: Optional[ChartHelper] = None, + release_helper: Optional[ReleaseHelper] = None, generate_chart: bool = True, release_callback: Optional[Callable[[Release, MicroGateway, ReleaseInfo], bool]] = None, ): diff --git a/src/dashboard/apigateway/apigateway/tests/apps/release/test_releasers.py b/src/dashboard/apigateway/apigateway/tests/apps/release/test_releasers.py index 9d397d81a..deee32bdc 100644 --- a/src/dashboard/apigateway/apigateway/tests/apps/release/test_releasers.py +++ b/src/dashboard/apigateway/apigateway/tests/apps/release/test_releasers.py @@ -289,11 +289,11 @@ def test_do_release_edge_gateway( micro_gateway_release_history_id=mocker.ANY, username=releaser.username, ) - mock_release_gateway_by_registry.si.assert_called_once_with( - release_id=fake_release.pk, - micro_gateway_release_history_id=mocker.ANY, - micro_gateway_id=fake_shared_gateway.id, - ) + # mock_release_gateway_by_registry.si.assert_called_once_with( + # release_id=fake_release.pk, + # micro_gateway_release_history_id=mocker.ANY, + # micro_gateway_id=fake_shared_gateway.id, + # ) assert ReleaseHistory.objects.filter( id=fake_release_history.id, @@ -306,7 +306,7 @@ def test_do_release_edge_gateway( release_history=fake_release_history, ) - assert qs.filter(micro_gateway=fake_shared_gateway).exists() + # assert qs.filter(micro_gateway=fake_shared_gateway).exists() assert qs.filter(micro_gateway=fake_edge_gateway).exists() def test_do_release_shared_gateway( diff --git a/src/dashboard/apigateway/apigateway/tests/controller/distributor/test_combine.py b/src/dashboard/apigateway/apigateway/tests/controller/distributor/test_combine.py index cde40a158..52d5e11d1 100644 --- a/src/dashboard/apigateway/apigateway/tests/controller/distributor/test_combine.py +++ b/src/dashboard/apigateway/apigateway/tests/controller/distributor/test_combine.py @@ -52,27 +52,12 @@ def test_foreach_distributor_for_managed_edge_gateway(self, mocker, edge_gateway callback = mocker.MagicMock() self.distributor.foreach_distributor(edge_gateway_stage, micro_gateway, callback) - assert callback.call_count == 2 - callback.assert_any_call(self.etcd_distributor, micro_gateway) + assert callback.call_count == 1 + # callback.assert_any_call(self.etcd_distributor, micro_gateway) callback.assert_any_call(self.helm_distributor, edge_gateway_stage.micro_gateway) self.helm_distributor_type.assert_called_once_with(generate_chart=False) - self.etcd_distributor_type.assert_called_once_with(include_gateway_global_config=False) - - def test_foreach_distributor_for_non_managed_edge_gateway(self, mocker, edge_gateway_stage, micro_gateway): - edge_gateway_stage.micro_gateway = G( - MicroGateway, - is_shared=False, - is_managed=False, - ) - edge_gateway_stage.save() - - callback = mocker.MagicMock() - self.distributor.foreach_distributor(edge_gateway_stage, micro_gateway, callback) - - callback.assert_called_once_with(self.etcd_distributor, micro_gateway) - - self.etcd_distributor_type.assert_called_once_with(include_gateway_global_config=False) + # self.etcd_distributor_type.assert_called_once_with(include_gateway_global_config=False) def test_foreach_distributor_managed_shared_gateway(self, mocker, edge_gateway_stage, micro_gateway): assert edge_gateway_stage.micro_gateway == micro_gateway