Skip to content
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

feat: when publishing a managed gateway, shard gateway will no longer… #76

Merged
merged 5 commits into from
Jul 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
zhu327 marked this conversation as resolved.
Show resolved Hide resolved
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