Skip to content

Commit

Permalink
feat: when publishing a managed gateway, shard gateway will no longer… (
Browse files Browse the repository at this point in the history
#76)

* feat: when publishing a managed gateway, shard gateway will no longer be published at the same time.
  • Loading branch information
zhu327 authored Jul 7, 2023
1 parent 333c231 commit fed56cc
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 43 deletions.
20 changes: 11 additions & 9 deletions src/dashboard/apigateway/apigateway/apps/release/releasers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/dashboard/apigateway/apigateway/common/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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 {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit fed56cc

Please sign in to comment.