Skip to content

Commit d494226

Browse files
wklkencursoragent
andauthored
fix(dashboard): keep programmable stage list usable after PaaS publish (#3165)
Why this change was needed: Publishing a programmable gateway from the developer center creates a Release but no ProgrammableGatewayDeployHistory. The stage overview then crashed when comparing deploy_history.version. What changed: - Treat a missing deploy history as not deploying from the gateway - Keep empty deploy-history objects so serializers do not receive None - Add a regression test for the PaaS-only publish path Problem solved: The environment overview no longer returns 500, so users can open the page and publish from the gateway after a developer-center release. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent d3c3fdd commit d494226

2 files changed

Lines changed: 23 additions & 2 deletions

File tree

src/dashboard/apigateway/apigateway/biz/programmable/releaser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ def get_stage_deploy_status(gateway: Gateway, stage_id: int, user_credentials: U
195195
gateway=gateway, stage_id=stage_id, version=stage_release["resource_version_display"]
196196
).first()
197197
or deploy_history # 回退到最新记录
198+
or last_deploy_history # 从开发者中心发布时可能没有 deploy history
198199
)
199200
# 查询当前生效环境的 release history
200201
last_release_history = ReleaseHistory.objects.filter(
@@ -204,7 +205,8 @@ def get_stage_deploy_status(gateway: Gateway, stage_id: int, user_credentials: U
204205
last_publish_status = ReleaseHandler.get_release_status(last_release_history.id)
205206

206207
# 如果 stage_release 的版本和 deploy_history 的第一个不一致,说明正在发布
207-
if stage_release["resource_version_display"] != deploy_history.version:
208+
# 从开发者中心直接发布时可能没有 deploy_history
209+
if deploy_history and stage_release["resource_version_display"] != deploy_history.version:
208210
latest_deploy_history = deploy_history
209211
latest_publish_status = ReleaseHistoryStatusEnum.DOING.value
210212

src/dashboard/apigateway/apigateway/tests/biz/programmable/test_releaser.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222

2323
from apigateway.apps.programmable_gateway.models import ProgrammableGatewayDeployHistory
2424
from apigateway.biz.programmable import ProgrammableGatewayReleaser
25-
from apigateway.core.models import Gateway, Stage
25+
from apigateway.common.tenant.user_credentials import UserCredentials
26+
from apigateway.core.models import Gateway, Release, ResourceVersion, Stage
2627
from apigateway.tests.utils.testing import dummy_time
2728

2829
pytestmark = pytest.mark.django_db
@@ -118,3 +119,21 @@ def test_filter_deploy_history(self):
118119
gateway, fuzzy=test.get("fuzzy", True), **test["params"]
119120
)
120121
assert result.count() == test["expected"]["count"]
122+
123+
def test_get_stage_deploy_status_without_deploy_history_when_stage_released(self):
124+
"""从开发者中心发布后,网关侧可能只有 Release 而没有 DeployHistory。"""
125+
gateway = G(Gateway)
126+
stage = G(Stage, gateway=gateway, status=1)
127+
resource_version = G(ResourceVersion, gateway=gateway, version="1.0.0")
128+
G(Release, gateway=gateway, stage=stage, resource_version=resource_version)
129+
user_credentials = UserCredentials(credentials="token", tenant_id="default")
130+
131+
result = ProgrammableGatewayReleaser.get_stage_deploy_status(gateway, stage.id, user_credentials)
132+
133+
assert result["latest_publish_status"] == ""
134+
assert result["last_publish_status"] == ""
135+
assert result["latest_history_id"] == 0
136+
assert result["last_deploy_history"] is not None
137+
assert result["last_deploy_history"].pk is None
138+
assert result["latest_deploy_history"] is not None
139+
assert result["latest_deploy_history"].pk is None

0 commit comments

Comments
 (0)