test-manifest.json
Rama main · réplica de lectura del repositorio original.
{
"version": 1,
"repo": "rainbond",
"capabilities": [
{
"id": "rainbond.api-gateway.vm-nodeport-service-uses-local-external-traffic-policy",
"title": "Use Local externalTrafficPolicy for VM NodePort services",
"title_zh": "Use Local externalTrafficPolicy for VM NodePort services",
"interface_type": "handler_method",
"interface": "api.controller.apigateway.Struct.CreateTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCreateTCPRouteSetsExternalTrafficPolicyLocalForVMService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.api.apiserver-request-metrics",
"title": "Collect missing API server request counters through existing rbd-api metrics",
"title_zh": "Collect missing API server request counters through existing rbd-api metrics",
"interface_type": "workflow",
"interface": "api/metric.NewAPIServerCollector",
"code_paths": [
"api/metric/apiserver.go",
"api/server/api.go",
"api/client/prometheus/prometheus.go"
],
"tests": [
{
"path": "api/metric/apiserver_test.go"
},
{
"path": "api/client/prometheus/prometheus_timeout_test.go",
"selector": "TestGetMetricHonorsCallerDeadline"
},
{
"path": "api/client/prometheus/prometheus_timeout_test.go",
"selector": "TestGetMetricCallerContextPreservesSuccessfulResults"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.api.kubeblocks.adapter-service-namespace",
"title": "KubeBlocks adapter service namespace",
"title_zh": "KubeBlocks adapter service namespace",
"interface_type": "handler_method",
"interface": "api/controller.KubeBlocksController.forwardRequest",
"code_paths": [
"api/controller/kubeblocks.go"
],
"tests": [
{
"path": "api/controller/kubeblocks_test.go",
"selector": "TestKubeBlocksAdapterBaseURLUsesPluginNamespace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.api.kubeblocks.backup-repo-mutation-proxy",
"title": "KubeBlocks backup repo mutation proxy",
"title_zh": "KubeBlocks backup repo mutation proxy",
"interface_type": "handler_method",
"interface": "api/controller.KubeBlocksController.CreateBackupRepo",
"code_paths": [
"api/controller/kubeblocks.go"
],
"tests": [
{
"path": "api/controller/kubeblocks_test.go",
"selector": "TestKubeBlocksBackupRepoMutationProxy"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-backup.metadata-version-detect",
"title": "Detect legacy and new backup metadata schema versions",
"title_zh": "\u8bc6\u522b\u65e7\u7248\u4e0e\u65b0\u7248\u5e94\u7528\u5907\u4efd\u5143\u6570\u636e\u7ed3\u6784",
"interface_type": "workflow",
"interface": "builder/exector.judgeMetadataVersion",
"code_paths": [
"builder/exector/groupapp_backup.go"
],
"tests": [
{
"path": "builder/exector/groupapp_backup_test.go",
"selector": "TestJudgeMetadataVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-backup.service-volume-archive",
"title": "Archive service volume data into backup packages",
"title_zh": "\u5c06\u670d\u52a1\u5377\u6570\u636e\u5f52\u6863\u4e3a\u5907\u4efd\u5305",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPNew.backupServiceInfo",
"code_paths": [
"builder/exector/groupapp_backup.go"
],
"tests": [
{
"path": "builder/exector/groupapp_backup_test.go",
"selector": "TestBackupServiceVolume"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-backup.upload-package",
"title": "Upload backup package to external storage",
"title_zh": "\u5c06\u5e94\u7528\u5907\u4efd\u5305\u4e0a\u4f20\u5230\u5916\u90e8\u5b58\u50a8",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPNew.uploadPkg",
"code_paths": [
"builder/exector/groupapp_backup.go"
],
"tests": [
{
"path": "builder/exector/groupapp_backup_test.go",
"selector": "TestUploadPkg"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.app-backup.upload-package-download-guard",
"title": "Guard removed download API during backup package upload flow",
"title_zh": "\u5728\u5907\u4efd\u5305\u4e0a\u4f20\u6d41\u7a0b\u4e2d\u4fdd\u62a4\u5df2\u79fb\u9664\u7684\u4e0b\u8f7d\u63a5\u53e3",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPNew.uploadPkg",
"code_paths": [
"builder/exector/groupapp_backup.go"
],
"tests": [
{
"path": "builder/exector/groupapp_backup_test.go",
"selector": "TestUploadPkg2"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.app-backup.volume-dir-defaults",
"title": "Resolve local and shared backup volume directories from environment",
"title_zh": "\u6839\u636e\u73af\u5883\u53d8\u91cf\u89e3\u6790\u672c\u5730\u4e0e\u5171\u4eab\u5907\u4efd\u5377\u76ee\u5f55",
"interface_type": "workflow",
"interface": "builder/exector.GetVolumeDir",
"code_paths": [
"builder/exector/groupapp_backup.go"
],
"tests": [
{
"path": "builder/exector/groupapp_backup_test.go",
"selector": "TestGetVolumeDir"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.bind-component",
"title": "Bind component to app config group",
"title_zh": "\u5c06\u7ec4\u4ef6\u7ed1\u5b9a\u5230\u5e94\u7528\u914d\u7f6e\u7ec4",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupServiceDaoImpl.AddModel",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestAppConfigGroupServiceDaoAddModel"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.create",
"title": "Create app config group record",
"title_zh": "\u521b\u5efa\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupDaoImpl.AddModel",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestAppConfigGroupDaoAddModel"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.delete",
"title": "Delete app config group record",
"title_zh": "\u5220\u9664\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupDaoImpl.DeleteConfigGroup",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestDeleteConfigGroup"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.get",
"title": "Query app config group record",
"title_zh": "\u67e5\u8be2\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupDaoImpl.GetConfigGroupByID",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestAppGetConfigGroupByID"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.item-create",
"title": "Create app config group item",
"title_zh": "\u521b\u5efa\u5e94\u7528\u914d\u7f6e\u9879",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.AddModel",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestAppConfigGroupItemDaoAddModel"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.item-delete",
"title": "Delete app config group item",
"title_zh": "\u5220\u9664\u5e94\u7528\u914d\u7f6e\u9879",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.DeleteConfigGroupItem",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestDeleteConfigGroupItem"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.item-update",
"title": "Update app config group item",
"title_zh": "\u66f4\u65b0\u5e94\u7528\u914d\u7f6e\u9879",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.UpdateModel",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestAppConfigGroupItemDaoUpdateModel"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.pending-component-bindings",
"title": "Preserve configuration bindings before component creation",
"title_zh": "Preserve configuration bindings before component creation",
"interface_type": "handler_method",
"interface": "api/handler.ApplicationAction.AddConfigGroup/UpdateConfigGroup",
"code_paths": [
"api/handler/application_config_group.go",
"worker/appm/conversion/configgroup.go"
],
"tests": [
{
"path": "api/handler/application_config_group_test.go",
"selector": "TestConfigGroupRetainsPendingComponentBindings"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-config-group.unbind-components",
"title": "Remove component bindings from app config group",
"title_zh": "\u79fb\u9664\u5e94\u7528\u914d\u7f6e\u7ec4\u7ec4\u4ef6\u7ed1\u5b9a",
"interface_type": "dao_method",
"interface": "db/mysql/dao.AppConfigGroupServiceDaoImpl.DeleteConfigGroupService",
"code_paths": [
"db/mysql/dao/application_config_group.go"
],
"tests": [
{
"path": "db/mysql/dao/application_config_group_test.go",
"selector": "TestDeleteConfigGroupService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.package-name-normalize",
"title": "Normalize imported image package names from linux file names",
"title_zh": "\u4ece Linux \u6587\u4ef6\u540d\u8fd8\u539f\u5bfc\u5165\u955c\u50cf\u5305\u540d",
"interface_type": "workflow",
"interface": "builder/exector.buildFromLinuxFileName",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestBuildFromLinuxFileName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.propagate-image-push-error",
"title": "Return imported image push errors during app import",
"interface_type": "workflow",
"interface": "builder/exector.ensureImportedImagesPushed",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestEnsureImportedImagesPushedReturnsPushError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.propagate-task-error",
"title": "Return app import task errors to the import worker",
"interface_type": "workflow",
"interface": "builder/exector.runImportAppTasks",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestRunImportAppTasksReturnsTaskError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.scaling-rule-compat",
"title": "Preserve legacy scaling rules during app import",
"title_zh": "\u5bfc\u5165\u5e94\u7528\u65f6\u4fdd\u7559\u65e7\u7248\u4f38\u7f29\u89c4\u5219",
"interface_type": "workflow",
"interface": "builder/exector.normalizeImportedRAM",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestNormalizeImportedRAMPreservesLegacyScalingRule"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.status-serialization",
"title": "Serialize and parse per-app import status maps",
"title_zh": "\u5e8f\u5217\u5316\u5e76\u89e3\u6790\u6309\u5e94\u7528\u8bb0\u5f55\u7684\u5bfc\u5165\u72b6\u6001",
"interface_type": "workflow",
"interface": "builder/exector.map2str",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestAppStatusMapRoundTrip"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-import.wait-image-push",
"title": "Wait for imported component and plugin images to be pushed",
"interface_type": "workflow",
"interface": "builder/exector.ensureImportedImagesPushed",
"code_paths": [
"builder/exector/import_app.go"
],
"tests": [
{
"path": "builder/exector/import_app_test.go",
"selector": "TestEnsureImportedImagesPushedPushesComponentsAndPluginsOnce"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-restore.image-registry-rewrite",
"title": "Rewrite image registry during app restore",
"title_zh": "\u5e94\u7528\u6062\u590d\u65f6\u91cd\u5199\u955c\u50cf\u4ed3\u5e93\u5730\u5740",
"interface_type": "workflow",
"interface": "builder/exector.getNewImageName",
"code_paths": [
"builder/exector/groupapp_restore.go"
],
"tests": [
{
"path": "builder/exector/groupapp_restore_test.go",
"selector": "TestGetImageName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-restore.service-id-lookup",
"title": "Resolve original service ids from restored service mappings",
"title_zh": "\u4ece\u6062\u590d\u540e\u7684\u670d\u52a1\u6620\u5c04\u4e2d\u53cd\u67e5\u539f\u59cb\u670d\u52a1 ID",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPRestore.getOldServiceID",
"code_paths": [
"builder/exector/groupapp_restore.go"
],
"tests": [
{
"path": "builder/exector/groupapp_restore_test.go",
"selector": "TestGetOldServiceID"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-restore.snapshot-relationship-rewrite",
"title": "Rewrite service relationships during app restore",
"title_zh": "\u5e94\u7528\u6062\u590d\u65f6\u91cd\u5199\u670d\u52a1\u4f9d\u8d56\u5173\u7cfb",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPRestore.modify",
"code_paths": [
"builder/exector/groupapp_restore.go"
],
"tests": [
{
"path": "builder/exector/groupapp_restore_test.go",
"selector": "TestModify"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-restore.unzip-all-data",
"title": "Unzip full backup data archive during restore",
"title_zh": "\u5728\u6062\u590d\u65f6\u89e3\u538b\u5b8c\u6574\u5907\u4efd\u6570\u636e\u5305",
"interface_type": "workflow",
"interface": "builder/exector.BackupAPPRestore",
"code_paths": [
"builder/exector/groupapp_restore.go"
],
"tests": [
{
"path": "builder/exector/groupapp_restore_test.go",
"selector": "TestUnzipAllDataFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.app-upgrade.cross-app-config-mount",
"title": "Preserve cross-application config-file mounts during upgrade",
"title_zh": "Preserve cross-application config-file mounts during upgrade",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.SyncComponentVolumeRels",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_sync_volume_relations_test.go",
"selector": "TestSyncComponentVolumeRelsPreservesCrossApplicationConfigFileMount"
},
{
"path": "api/handler/service_sync_volume_relations_test.go",
"selector": "TestSyncComponentVolumeRelsRejectsInvalidExternalProviders"
},
{
"path": "api/handler/service_sync_volume_relations_test.go",
"selector": "TestSyncComponentVolumeRelsReturnsExternalProviderLookupError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.application.check-port-k8s-service-name-duplicate",
"title": "Reject duplicate Kubernetes service names across app ports",
"title_zh": "\u6821\u9a8c\u5e94\u7528\u7aef\u53e3 Kubernetes Service \u540d\u79f0\u91cd\u590d",
"interface_type": "handler_method",
"interface": "api/handler.ApplicationAction.checkPorts",
"code_paths": [
"api/handler/application_handler.go"
],
"tests": [
{
"path": "api/handler/application_handler_test.go",
"selector": "TestApplicationActionCheckPortsRejectsDuplicateK8sServiceName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.application.delete-config-secrets",
"title": "Delete config group Secrets with applications",
"title_zh": "Delete config group Secrets with applications",
"interface_type": "handler_method",
"interface": "api/handler.ApplicationAction.deleteApplicationConfigSecrets",
"code_paths": [
"api/handler/application_handler.go",
"api/handler/application_config_group.go"
],
"tests": [
{
"path": "api/handler/application_handler_test.go",
"selector": "TestApplicationActionDeleteApplicationConfigSecrets"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.build.select-builder-by-language",
"title": "Select builder implementation by source language and build type",
"title_zh": "\u6309\u6e90\u7801\u8bed\u8a00\u548c\u6784\u5efa\u7c7b\u578b\u9009\u62e9\u6784\u5efa\u5668",
"interface_type": "workflow",
"interface": "builder/build.GetBuildByType",
"code_paths": [
"builder/build/build.go"
],
"tests": [
{
"path": "builder/build/build_type_matrix_test.go",
"selector": "TestGetBuildByType_SourceBuildLanguageMatrix"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.builder.build-pod-resources",
"title": "Build pod CPU and memory from chaos environment",
"title_zh": "Chaos \u73af\u5883\u53d8\u91cf\u63a7\u5236\u6784\u5efa Pod CPU \u548c\u5185\u5b58",
"interface_type": "workflow",
"interface": "builder/job.controller.ExecJob",
"code_paths": [
"builder/job/job.go",
"builder/job/resources.go"
],
"tests": [
{
"path": "builder/job/resources_test.go",
"selector": "TestApplyBuildPodResourcesFromEnv"
},
{
"path": "builder/job/resources_test.go",
"selector": "TestApplyBuildPodResourcesRejectsInvalidConfig"
},
{
"path": "builder/job/resources_test.go",
"selector": "TestExecJobAppliesResourcesBeforeCreate"
},
{
"path": "builder/job/resources_test.go",
"selector": "TestExecJobReusesExistingPodWithoutApplyingResources"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-config",
"title": "Dynamic mirror config defaults and env overrides",
"title_zh": "Dynamic mirror config defaults and env overrides",
"interface_type": "workflow",
"interface": "builder/mirror.LoadConfig",
"code_paths": [
"builder/mirror/config.go"
],
"tests": [
{
"path": "builder/mirror/config_test.go",
"selector": "TestLoadConfigDefaults"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-fetch",
"title": "Fetch mirror candidates from remote JSON source with schema validation",
"title_zh": "Fetch mirror candidates from remote JSON source with schema validation",
"interface_type": "workflow",
"interface": "builder/mirror.FetchCandidates",
"code_paths": [
"builder/mirror/fetcher.go"
],
"tests": [
{
"path": "builder/mirror/fetcher_test.go",
"selector": "TestFetchCandidates"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-fetch-fallback",
"title": "Mirror source fetch falls back to next URL on failure",
"title_zh": "Mirror source fetch falls back to next URL on failure",
"interface_type": "workflow",
"interface": "builder/mirror.FetchCandidates",
"code_paths": [
"builder/mirror/fetcher.go"
],
"tests": [
{
"path": "builder/mirror/fetcher_test.go",
"selector": "TestFetchCandidatesFallsBackToNextURL"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-probe",
"title": "Probe filters dead mirrors and sorts alive ones by latency",
"title_zh": "Probe filters dead mirrors and sorts alive ones by latency",
"interface_type": "workflow",
"interface": "builder/mirror.Probe",
"code_paths": [
"builder/mirror/prober.go"
],
"tests": [
{
"path": "builder/mirror/prober_test.go",
"selector": "TestProbeFiltersAndSortsByLatency"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-refresh",
"title": "Mirror manager refresh updates list and persists configmap",
"title_zh": "Mirror manager refresh updates list and persists configmap",
"interface_type": "workflow",
"interface": "builder/mirror.Manager.Refresh",
"code_paths": [
"builder/mirror/manager.go"
],
"tests": [
{
"path": "builder/mirror/manager_test.go",
"selector": "TestManagerRefreshUpdatesMirrorsAndConfigMap"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.dynamic-mirror-restore",
"title": "Mirror manager restores last good list from configmap",
"title_zh": "Mirror manager restores last good list from configmap",
"interface_type": "workflow",
"interface": "builder/mirror.Manager.restore",
"code_paths": [
"builder/mirror/manager.go"
],
"tests": [
{
"path": "builder/mirror/manager_test.go",
"selector": "TestManagerRestoreFromConfigMap"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.mirror-containerd-hosts",
"title": "containerd pulls try docker.io mirrors first with upstream fallback",
"title_zh": "containerd pulls try docker.io mirrors first with upstream fallback",
"interface_type": "workflow",
"interface": "builder/sources.mirrorRegistryHosts",
"code_paths": [
"builder/sources/mirror_hosts.go"
],
"tests": [
{
"path": "builder/sources/mirror_hosts_test.go",
"selector": "TestMirrorRegistryHosts"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.mirror-docker-ref-rewrite",
"title": "docker daemon pulls rewrite docker.io refs to mirrors with fallback order",
"title_zh": "docker daemon pulls rewrite docker.io refs to mirrors with fallback order",
"interface_type": "workflow",
"interface": "builder/sources.mirrorPullRefs",
"code_paths": [
"builder/sources/mirror_hosts.go"
],
"tests": [
{
"path": "builder/sources/mirror_hosts_test.go",
"selector": "TestMirrorPullRefs"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.mirror-merge-manual-priority",
"title": "Manual REGISTRY_MIRRORS take priority over dynamic mirrors with host dedup",
"title_zh": "Manual REGISTRY_MIRRORS take priority over dynamic mirrors with host dedup",
"interface_type": "workflow",
"interface": "builder/sources.mergeMirrors",
"code_paths": [
"builder/sources/mirror_merge.go"
],
"tests": [
{
"path": "builder/sources/mirror_merge_test.go",
"selector": "TestMergeMirrors"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.builder.registered-worker-dispatch",
"title": "Dispatch registered worker tasks without unknown warnings",
"title_zh": "\u5df2\u6ce8\u518c worker \u5206\u53d1\u65f6\u4e0d\u518d\u8bef\u62a5\u672a\u77e5\u4efb\u52a1",
"interface_type": "workflow",
"interface": "builder/exector.exectorManager.RunTask",
"code_paths": [
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/exector_test.go",
"selector": "TestRunTaskDoesNotWarnForRegisteredWorker"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.builder.source-type-compatibility",
"title": "Normalize blank source build types without changing explicit protocols",
"title_zh": "Normalize blank source build types without changing explicit protocols",
"interface_type": "workflow",
"interface": "builder/exector.NewSouceCodeBuildItem",
"code_paths": [
"builder/exector/build_from_sourcecode_run.go"
],
"tests": [
{
"path": "builder/exector/source_server_type_test.go",
"selector": "TestNewSourceBuildServerType"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.activation-registry-coordination",
"title": "Rollback and activation cannot reference deleting images",
"title_zh": "Rollback and activation cannot reference deleting images",
"interface_type": "workflow",
"interface": "cleanup.TrackServiceActivation",
"code_paths": [
"pkg/cleanup/activation.go",
"pkg/cleanup/store.go"
],
"tests": [
{
"path": "pkg/cleanup/activation_coordination_test.go",
"selector": "TestActivationAndRollbackRejectDeletingImage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.app-import-admission",
"title": "Hold application import admission through metadata publication",
"title_zh": "Hold application import admission through metadata publication",
"interface_type": "workflow",
"interface": "exector.exec.import_app",
"code_paths": [
"builder/exector/exector.go",
"builder/exector/import_app.go",
"builder/exector/cleanup_image_admission.go"
],
"tests": [
{
"path": "builder/exector/cleanup_import_admission_test.go",
"selector": "TestImportWorkerHoldsAdmissionUntilPublication"
},
{
"path": "builder/exector/cleanup_import_admission_test.go",
"selector": "TestImportSuccessWaitsForMetadataUpload"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.cache-builder-startup",
"title": "Enroll actual cache writer before task consumption",
"title_zh": "Enroll actual cache writer before task consumption",
"interface_type": "workflow",
"interface": "exector.registerCacheBuilderStartup",
"code_paths": [
"builder/exector/cleanup_cache_startup.go",
"builder/exector/exector.go",
"pkg/cleanup/kubeidentity/cache_builder.go",
"pkg/cleanup/node_readiness.go",
"pkg/cleanup/participant.go"
],
"tests": [
{
"path": "builder/exector/cleanup_cache_startup_test.go",
"selector": "TestCacheStartupRegistersActualInstanceWithoutEnablingDeletion"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.cache-observation-before-readiness",
"title": "Observe cache storage without enabling legacy writer deletion",
"title_zh": "Observe cache storage without enabling legacy writer deletion",
"interface_type": "workflow",
"interface": "kubeidentity.InspectManagedBuildCacheSource",
"code_paths": [
"pkg/cleanup/kubeidentity/managed_cache.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
"selector": "TestReadOnlyCacheEnrollmentDoesNotRequireDeletionReadiness"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.cache-writer-certification",
"title": "Certify cache readiness only with current membership and no writers",
"title_zh": "Certify cache readiness only with current membership and no writers",
"interface_type": "workflow",
"interface": "cleanup.CertifyManagedCacheWriters",
"code_paths": [
"pkg/cleanup/cache_certification.go"
],
"tests": [
{
"path": "pkg/cleanup/cache_certification_test.go",
"selector": "TestCacheCertificationRequiresMembershipAndQuiescence"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.cache-writer-coverage",
"title": "Verify current coordinated writer rollout and detached builds",
"title_zh": "Verify current coordinated writer rollout and detached builds",
"interface_type": "workflow",
"interface": "kubeidentity.InspectCacheWriterCoverage",
"code_paths": [
"pkg/cleanup/kubeidentity/cache_coverage.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/cache_coverage_test.go",
"selector": "TestCacheCoverageRejectsRollingWritersAndDetachedBuilds"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.cache-writer-native-gate",
"title": "Recheck live writer coverage before native deletion grant",
"title_zh": "Recheck live writer coverage before native deletion grant",
"interface_type": "view_endpoint",
"interface": "POST node/enter-job",
"code_paths": [
"api/controller/cleanup_cache_readiness.go",
"api/controller/cleanup_node_launch.go"
],
"tests": [
{
"path": "api/controller/cleanup_node_executor_test.go",
"selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.configured-node-helper-references",
"title": "Protect configured executor images across API rollout and rollback",
"title_zh": "Protect configured executor images across API rollout and rollback",
"interface_type": "workflow",
"interface": "kubeidentity.ReadAPIHelperReferences",
"code_paths": [
"pkg/cleanup/kubeidentity/helper_references.go",
"pkg/cleanup/reference_audit.go",
"api/controller/cleanup_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_audit_test.go",
"selector": "TestConfiguredHelperImagesRemainProtectedWithoutRunningPods"
},
{
"path": "pkg/cleanup/kubeidentity/helper_references_test.go",
"selector": "TestAPIHelperReferencesIncludeDesiredRollbackAndRunningImages"
},
{
"path": "pkg/cleanup/kubeidentity/helper_references_test.go",
"selector": "TestAPIHelperDoesNotReadSecretBackedEnvironment"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.console-signed-coordinator",
"title": "Use installation-scoped signatures for coordinator requests",
"title_zh": "Use installation-scoped signatures for coordinator requests",
"interface_type": "package_function",
"interface": "cleanup.NewConsoleCoordinationClient",
"code_paths": [
"pkg/cleanup/console_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/console_coordination_test.go",
"selector": "TestConsoleCoordinationUsesScopedSignatureWithoutAdminCredential"
},
{
"path": "pkg/cleanup/console_coordination_test.go",
"selector": "TestConsoleCoordinationRejectsUnsafeScopePathsAndDoesNotRetry"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.console-signed-coordinator-runtime",
"title": "Run signed coordinator with an independent permit key",
"title_zh": "Run signed coordinator with an independent permit key",
"interface_type": "workflow",
"interface": "registry-coordinator.run",
"code_paths": [
"cmd/registry-coordinator/main.go",
"cmd/registry-coordinator/credentials.go"
],
"tests": [
{
"path": "cmd/registry-coordinator/main_test.go",
"selector": "TestCoordinatorUsesSignedConsoleAndIndependentPermitKey"
},
{
"path": "cmd/registry-coordinator/main_test.go",
"selector": "TestSignedCoordinatorRejectsSharedOrMissingPermitKey"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.console-signed-gc-command",
"title": "Authenticate original GC callbacks with installation signatures",
"title_zh": "Authenticate original GC callbacks with installation signatures",
"interface_type": "workflow",
"interface": "registry-gc.runGC",
"code_paths": [
"cmd/registry-gc/main.go"
],
"tests": [
{
"path": "cmd/registry-gc/main_test.go",
"selector": "TestGCCommandUsesInstallationSignatureForOriginalReceipt"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.console-writer-announcement",
"title": "Authenticate Console announcements and bind observed runtime identity",
"title_zh": "Authenticate Console announcements and bind observed runtime identity",
"interface_type": "workflow",
"interface": "CleanupCoordinationHandler.RegisterConsoleReferenceWriter",
"code_paths": [
"api/controller/cleanup_reference_writer.go",
"api/api_routers/version2/v2Routers.go"
],
"tests": [
{
"path": "api/controller/cleanup_reference_writer_test.go",
"selector": "TestConsoleWriterAnnouncementRequiresAuthenticationAndObservedIdentity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.coordinated-registry-delete-gc",
"title": "Verify coordinated deletion and separate GC against isolated real Registry",
"title_zh": "Verify coordinated deletion and separate GC against isolated real Registry",
"interface_type": "workflow",
"interface": "Region coordination API and Registry sidecar",
"code_paths": [
"pkg/cleanup/registryproxy/coordinator.go",
"api/controller/cleanup_coordination.go"
],
"tests": [
{
"path": "api/controller/cleanup_registryproxy_test.go",
"selector": "TestCoordinatedRegistryRealDeletionAndGC"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.coordination-route-auth",
"title": "Require Region authentication for every coordination route",
"title_zh": "Require Region authentication for every coordination route",
"interface_type": "view_endpoint",
"interface": "/v2/cleanup/stores/{storage_id}/operations",
"code_paths": [
"api/api_routers/version2/v2Routers.go"
],
"tests": [
{
"path": "api/api_routers/version2/cleanup_coordination_test.go",
"selector": "TestCleanupCoordinationRoutesAlwaysRequireRegionAuthentication"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.coordinator-runtime",
"title": "Run verified readiness and terminate the coordinator cleanly",
"title_zh": "Run verified readiness and terminate the coordinator cleanly",
"interface_type": "workflow",
"interface": "cmd/registry-coordinator.run",
"code_paths": [
"cmd/registry-coordinator/main.go"
],
"tests": [
{
"path": "cmd/registry-coordinator/main_test.go",
"selector": "TestCoordinatorRunsReadinessAndStopsWithContext"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.deferred-helmapp-references",
"title": "Require settled HelmApp intent covered by retained release evidence",
"title_zh": "Require settled HelmApp intent covered by retained release evidence",
"interface_type": "workflow",
"interface": "kubeidentity.ReadHelmAppReferenceInventory",
"code_paths": [
"pkg/cleanup/kubeidentity/helmapp_references.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/helmapp_references_test.go",
"selector": "TestHelmAppReferencesRequireSettledRelease"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.durable-coordination",
"title": "Persist coordinated operations across restarts and conflicts",
"title_zh": "Persist coordinated operations across restarts and conflicts",
"interface_type": "workflow",
"interface": "pkg/cleanup.AcquireOperation",
"code_paths": [
"pkg/cleanup/coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/coordination_test.go",
"selector": "TestPersistentCoordinationConflictsAndRecovery"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.durable-gc-receipt",
"title": "Recover only immutable GC execution evidence without replay",
"title_zh": "Recover only immutable GC execution evidence without replay",
"interface_type": "workflow",
"interface": "registryproxy.RecoverGCReceipt",
"code_paths": [
"pkg/cleanup/registryproxy/gc_receipt.go",
"pkg/cleanup/registryproxy/gc_executor.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/gc_receipt_test.go",
"selector": "TestGCReceiptIsBoundImmutableAndDoesNotPermitReplay"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.durable-maintenance-measurements",
"title": "Persist GC measurements without releasing maintenance protection",
"title_zh": "Persist GC measurements without releasing maintenance protection",
"interface_type": "workflow",
"interface": "cleanup.RecordMaintenanceMeasurement",
"code_paths": [
"pkg/cleanup/maintenance_measurement.go",
"pkg/cleanup/storage_measurement.go"
],
"tests": [
{
"path": "pkg/cleanup/maintenance_measurement_test.go",
"selector": "TestMaintenanceMeasurementsPersistWithoutGrantingRestore"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.executor-preview-authority",
"title": "Reject admission changes to native executor authority",
"title_zh": "Reject admission changes to native executor authority",
"interface_type": "workflow",
"interface": "cleanup.sameExecutorPreview",
"code_paths": [
"pkg/cleanup/executor_preview.go",
"pkg/cleanup/node_job_submit.go",
"pkg/cleanup/gc_job_submit.go"
],
"tests": [
{
"path": "pkg/cleanup/node_job_submit_test.go",
"selector": "TestNodeDryRunCannotChangeExecutorIdentity"
},
{
"path": "pkg/cleanup/gc_job_submit_test.go",
"selector": "TestGCPreviewCannotInjectLifecycleOrStorage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.expired-upload-reinitialize",
"title": "Start a new session instead of resuming expired chunk metadata",
"title_zh": "Start a new session instead of resuming expired chunk metadata",
"interface_type": "workflow",
"interface": "controller.ChunkUploadManager.InitUploadSession",
"code_paths": [
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/chunk_upload_cleanup_test.go",
"selector": "TestExpiredUploadStartsNewSessionInsteadOfResumingRemovedChunks"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.expired-upload-retirement",
"title": "Retire original expired upload before one-shot chunk deletion and retain recovery evidence",
"title_zh": "Retire original expired upload before one-shot chunk deletion and retain recovery evidence",
"interface_type": "workflow",
"interface": "DeleteExpiredUploadChunks",
"code_paths": [
"pkg/cleanup/upload_retirement.go",
"db/model/package_upload_use.go"
],
"tests": [
{
"path": "pkg/cleanup/upload_retirement_test.go",
"selector": "TestExpiredUploadDeletionRetiresSessionAndDoesNotReplay"
},
{
"path": "pkg/cleanup/upload_retirement_test.go",
"selector": "TestExpiredUploadDeletionRejectsChangedOrActiveEvidence"
},
{
"path": "pkg/cleanup/upload_retirement_test.go",
"selector": "TestInterruptedUploadRetirementDoesNotReplayAfterRestart"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.expired-upload-writes",
"title": "Reject writes and completion on expired upload sessions",
"title_zh": "Reject writes and completion on expired upload sessions",
"interface_type": "workflow",
"interface": "controller.ChunkUploadManager.SaveChunk",
"code_paths": [
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/chunk_upload_cleanup_test.go",
"selector": "TestExpiredUploadCannotContinueWriting"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-executor-command",
"title": "Bind native GC command to the verified Job admission",
"title_zh": "Bind native GC command to the verified Job admission",
"interface_type": "workflow",
"interface": "registry-gc.runGC",
"code_paths": [
"cmd/registry-gc/main.go"
],
"tests": [
{
"path": "cmd/registry-gc/main_test.go",
"selector": "TestGCCommandValidatesBeforeExecutionAndSeparatesRecovery"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-executor-identity",
"title": "Verify GC pod ownership image and physical volume",
"title_zh": "Verify GC pod ownership image and physical volume",
"interface_type": "workflow",
"interface": "kubeidentity.InspectGCExecutor",
"code_paths": [
"pkg/cleanup/kubeidentity/gc_executor.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/gc_executor_test.go",
"selector": "TestGCExecutorIdentityRejectsUntrustedPodAndStorage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-executor-termination",
"title": "Require actual original GC container termination and unchanged source",
"title_zh": "Require actual original GC container termination and unchanged source",
"interface_type": "workflow",
"interface": "kubeidentity.InspectTerminatedGCExecutor",
"code_paths": [
"pkg/cleanup/kubeidentity/gc_executor.go",
"pkg/cleanup/kubeidentity/gc_job_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/gc_executor_test.go",
"selector": "TestTerminatedGCExecutorRequiresActualOriginalContainerExit"
},
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestGCSourceFingerprintDetectsRuntimeAndConfigurationChanges"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-failed-before-admission",
"title": "Cancel failed GC only before execution admission",
"title_zh": "Cancel failed GC only before execution admission",
"interface_type": "view_endpoint",
"interface": "POST maintenance/job/cancel-failed",
"code_paths": [
"api/controller/cleanup_gc_restore.go"
],
"tests": [
{
"path": "api/controller/cleanup_gc_failed_test.go",
"selector": "TestFailedGCBeforeAdmissionCanEndMaintenanceWithoutDeletion"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-execution-api",
"title": "Grant verified GC Job execution once after writer drain",
"title_zh": "Grant verified GC Job execution once after writer drain",
"interface_type": "view_endpoint",
"interface": "POST maintenance/enter-job",
"code_paths": [
"api/controller/cleanup_gc_executor.go",
"pkg/cleanup/gc_executor_client.go",
"pkg/cleanup/registryproxy/gc_recorder.go"
],
"tests": [
{
"path": "api/controller/cleanup_gc_executor_test.go",
"selector": "TestGCJobAdmissionAPIRequiresVerifiedExecutorAndGrantsOnce"
},
{
"path": "pkg/cleanup/registryproxy/gc_recorder_test.go",
"selector": "TestGCJobRecorderUsesVerifiedGateWithoutFallback"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-progress",
"title": "Expose only the bound GC operation receipt",
"title_zh": "Expose only the bound GC operation receipt",
"interface_type": "workflow",
"interface": "cleanup.ReadGCJobProgress",
"code_paths": [
"pkg/cleanup/gc_job_progress.go",
"api/controller/cleanup_gc_restore.go"
],
"tests": [
{
"path": "pkg/cleanup/gc_job_restore_test.go",
"selector": "TestGCProgressRejectsAnotherOperationIdentity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-restore",
"title": "Restore only the original verified GC operation with durable measurements",
"title_zh": "Restore only the original verified GC operation with durable measurements",
"interface_type": "workflow",
"interface": "cleanup.FinishGCJobRestore",
"code_paths": [
"pkg/cleanup/gc_job_restore.go",
"api/controller/cleanup_gc_restore.go",
"pkg/cleanup/maintenance.go"
],
"tests": [
{
"path": "pkg/cleanup/gc_job_restore_test.go",
"selector": "TestGCJobRestoreRequiresOriginalBindingAndMeasurements"
},
{
"path": "api/controller/cleanup_gc_executor_test.go",
"selector": "TestGCJobAdmissionAPIRequiresVerifiedExecutorAndGrantsOnce"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-start",
"title": "Start the recorded GC Job only after writer drain",
"title_zh": "Start the recorded GC Job only after writer drain",
"interface_type": "workflow",
"interface": "cleanup.StartGCJob",
"code_paths": [
"pkg/cleanup/gc_job_start.go",
"pkg/cleanup/maintenance.go"
],
"tests": [
{
"path": "pkg/cleanup/gc_job_start_test.go",
"selector": "TestGCJobStartWaitsForWritersAndNeverReplaysLostStart"
},
{
"path": "pkg/cleanup/gc_job_start_test.go",
"selector": "TestGCJobStartRejectsCanceledOperation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-submission",
"title": "Persist GC submission and reconcile without replay",
"title_zh": "Persist GC submission and reconcile without replay",
"interface_type": "workflow",
"interface": "cleanup.SubmitSuspendedGCJob",
"code_paths": [
"pkg/cleanup/gc_job_submit.go",
"pkg/cleanup/gc_job.go"
],
"tests": [
{
"path": "pkg/cleanup/gc_job_submit_test.go",
"selector": "TestGCSubmissionPersistsBeforeCreateAndReconcilesLostResponse"
},
{
"path": "pkg/cleanup/gc_job_submit_test.go",
"selector": "TestGCSubmissionRejectsUnsafeRetrySettings"
},
{
"path": "pkg/cleanup/gc_job_submit_test.go",
"selector": "TestGCSubmissionDefaultingAndMutation"
},
{
"path": "pkg/cleanup/gc_job_submit_test.go",
"selector": "TestGCSubmissionCanceledAndDryRunFailureLeaveNoIntent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-job-template",
"title": "Derive GC Job from verified Registry storage and credential references",
"title_zh": "Derive GC Job from verified Registry storage and credential references",
"interface_type": "workflow",
"interface": "kubeidentity.BuildRegistryGCJob",
"code_paths": [
"pkg/cleanup/kubeidentity/gc_job_template.go",
"api/controller/cleanup_gc_launch.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestGCJobTemplateUsesObservedStorageAndMountedCredentials"
},
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestGCJobTemplateRejectsUnsafeSource"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.gc-reject-legacy-cleaner",
"title": "Reject GC while legacy automatic cleanup is enabled",
"title_zh": "Reject GC while legacy automatic cleanup is enabled",
"interface_type": "workflow",
"interface": "BuildRegistryGCJob",
"code_paths": [
"pkg/cleanup/kubeidentity/legacy_cleanup.go",
"pkg/cleanup/kubeidentity/gc_job_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestGCJobRejectsLegacyAutomaticCleanup"
},
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestGCSourceTracksCleanerProcessButNotStatusHeartbeat"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.generic-activation-fence",
"title": "Reject generic activation of retired version records",
"title_zh": "Reject generic activation of retired version records",
"interface_type": "workflow",
"interface": "cleanup.TrackServiceActivation",
"code_paths": [
"pkg/cleanup/activation.go"
],
"tests": [
{
"path": "pkg/cleanup/store_test.go",
"selector": "TestActivationCannotRestoreRetiredTargetThroughGenericSave"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.helm-native-mutation-admission",
"title": "Coordinate native Helm mutations and track actual Kubernetes write outcomes",
"title_zh": "Coordinate native Helm mutations and track actual Kubernetes write outcomes",
"interface_type": "workflow",
"interface": "helm.runCoordinatedMutation",
"code_paths": [
"pkg/helm/cleanup_mutation.go",
"pkg/helm/cleanup_transport.go",
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/cleanup_mutation_test.go",
"selector": "TestHelmMutationRequiresDurableProducerAdmission"
},
{
"path": "pkg/helm/cleanup_transport_test.go",
"selector": "TestHelmTracksActualReleaseStorageWrites"
},
{
"path": "pkg/helm/cleanup_transport_test.go",
"selector": "TestHelmTransportKeepsUncertainWritesAndRejectsUnguardedWrites"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.helm-release-identity",
"title": "Keep bounded Helm release identity private to reference correlation",
"title_zh": "Keep bounded Helm release identity private to reference correlation",
"interface_type": "workflow",
"interface": "cleanup.InspectHelmReleaseReferences",
"code_paths": [
"pkg/cleanup/helm_references.go"
],
"tests": [
{
"path": "pkg/cleanup/helm_release_identity_test.go",
"selector": "TestHelmReleaseIdentityDoesNotExposeChartConfiguration"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.helm-release-values-proof",
"title": "Match desired Helm overrides to actual release config digests",
"title_zh": "Match desired Helm overrides to actual release config digests",
"interface_type": "workflow",
"interface": "cleanup.HelmReleaseMatchesOverrides",
"code_paths": [
"pkg/cleanup/helm_value_evidence.go"
],
"tests": [
{
"path": "pkg/cleanup/helm_release_identity_test.go",
"selector": "TestHelmReleaseOverridesRequireActualConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.helm-retained-reference-inventory",
"title": "Protect retained Helm manifests and hooks without exposing Secret contents",
"title_zh": "Protect retained Helm manifests and hooks without exposing Secret contents",
"interface_type": "workflow",
"interface": "cleanup.InspectHelmReleaseReferences",
"code_paths": [
"pkg/cleanup/helm_references.go",
"pkg/cleanup/kubeidentity/helm_references.go",
"api/controller/cleanup_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/helm_references_test.go",
"selector": "TestHelmRetainedManifestAndHooksProvideReferencesOnly"
},
{
"path": "pkg/cleanup/helm_references_test.go",
"selector": "TestHelmCorruptForeignAndUnknownReleasesAreNotEmptySuccess"
},
{
"path": "pkg/cleanup/helm_references_test.go",
"selector": "TestHelmReferenceDecompressionIsBounded"
},
{
"path": "pkg/cleanup/kubeidentity/helm_references_test.go",
"selector": "TestHelmInventoryReadsOnlyReleaseDataIncludingUnlabelledHistory"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.helmapp-mutation-admission",
"title": "Protect HelmApp create update and install intents during cleanup",
"title_zh": "Protect HelmApp create update and install intents during cleanup",
"interface_type": "workflow",
"interface": "ApplicationAction.CreateApp",
"code_paths": [
"api/handler/application_handler.go"
],
"tests": [
{
"path": "api/handler/cleanup_helmapp_test.go",
"selector": "TestHelmAppMutationsHoldCleanupAdmission"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.import_reference_handoff",
"title": "Atomically hand import references to successful versions",
"title_zh": "Atomically hand import references to successful versions",
"interface_type": "workflow",
"interface": "TransferImportedReferencesToVersions",
"code_paths": [
"pkg/cleanup/reference_handoff.go",
"pkg/cleanup/reference_import.go",
"db/mysql/dao/version.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_handoff_test.go",
"selector": "TestImportHandoffWaitsForEverySuccessfulVersionAndRollsBack"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.managed-cache-binding",
"title": "Bind managed cache enrollment to observed system storage",
"title_zh": "Bind managed cache enrollment to observed system storage",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/managed-cache/prepare",
"code_paths": [
"pkg/cleanup/kubeidentity/managed_cache.go",
"pkg/cleanup/registration.go",
"api/controller/cleanup_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
"selector": "TestManagedCachePreparationUsesActualNodeAndVolume"
},
{
"path": "api/controller/cleanup_coordination_test.go",
"selector": "TestManagedCachePreparationDerivesIdentityAndNeverPromotesReady"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.managed-package-binding",
"title": "Managed package roots bind to observed grdata storage",
"title_zh": "Managed package roots bind to observed grdata storage",
"interface_type": "workflow",
"interface": "kubeidentity.InspectManagedPackageSource",
"code_paths": [
"pkg/cleanup/kubeidentity/managed_packages.go",
"pkg/cleanup/registration.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
"selector": "TestManagedPackagePreparationUsesActualGrdataVolume"
},
{
"path": "pkg/cleanup/registration_test.go",
"selector": "TestManagedPackageRegistrationsAreFixedDistinctAndNeverReady"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.manual-gc-maintenance",
"title": "Drain writes and require confirmed restoration around manual GC",
"title_zh": "Drain writes and require confirmed restoration around manual GC",
"interface_type": "workflow",
"interface": "pkg/cleanup.RequestMaintenance",
"code_paths": [
"pkg/cleanup/maintenance.go"
],
"tests": [
{
"path": "pkg/cleanup/maintenance_test.go",
"selector": "TestMaintenanceDrainsWritersAndRestoresOnlyAfterConfirmation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.market-slug-task-completion",
"title": "Market slug task waits for completion before returning",
"title_zh": "Market slug task waits for completion before returning",
"interface_type": "workflow",
"interface": "exectorManager.buildFromMarketSlug",
"code_paths": [
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/cleanup_task_boundary_test.go",
"selector": "TestMarketSlugTaskWaitsForCompletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.native-image-build-admission",
"title": "Image builds hold durable cleanup admission through completion",
"title_zh": "Image builds hold durable cleanup admission through completion",
"interface_type": "workflow",
"interface": "exectorManager.buildFromImage",
"code_paths": [
"builder/exector/cleanup_image_admission.go",
"builder/exector/exector.go",
"pkg/cleanup/reference_mutation.go"
],
"tests": [
{
"path": "builder/exector/cleanup_image_admission_test.go",
"selector": "TestImageBuildAdmissionBlocksGCAndNeverReplays"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.native-queue-reservation",
"title": "Persist native builder task identity before queue delivery",
"title_zh": "Persist native builder task identity before queue delivery",
"interface_type": "workflow",
"interface": "mqClient.SendBuilderTopic",
"code_paths": [
"mq/client/client.go",
"pkg/cleanup/queued_task_kind.go"
],
"tests": [
{
"path": "mq/client/cleanup_queue_test.go",
"selector": "TestNativeMQTaskReservesStableIdentityBeforeNetwork"
},
{
"path": "mq/client/cleanup_queue_test.go",
"selector": "TestNonNativeMQMessagesKeepExistingDelivery"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.native-service-mesh-references",
"title": "Classify only native ServiceMesh reference schemas",
"title_zh": "Classify only native ServiceMesh reference schemas",
"interface_type": "workflow",
"interface": "cleanup.inspectWorkloadObject",
"code_paths": [
"pkg/cleanup/reference_workloads.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_service_mesh_test.go",
"selector": "TestSavedServiceMeshRequiresKnownNativeProvider"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-cancel-before-grant",
"title": "Cancel only node operations without a native grant",
"title_zh": "Cancel only node operations without a native grant",
"interface_type": "workflow",
"interface": "cleanup.CancelNodeBeforeGrant",
"code_paths": [
"pkg/cleanup/node_cancel.go",
"api/controller/cleanup_node_launch.go"
],
"tests": [
{
"path": "pkg/cleanup/node_cancel_test.go",
"selector": "TestNodeCancellationCannotOverrideNativeAdmission"
},
{
"path": "api/controller/cleanup_node_launch_test.go",
"selector": "TestNodeLaunchAPIRechecksSourceBeforeStarting"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-candidate-readiness",
"title": "Require idle coordinated storage before showing cache candidates",
"title_zh": "Require idle coordinated storage before showing cache candidates",
"interface_type": "workflow",
"interface": "cleanup.InspectManagedCacheReadiness",
"code_paths": [
"pkg/cleanup/node_readiness.go"
],
"tests": [
{
"path": "pkg/cleanup/node_readiness_test.go",
"selector": "TestNodeReadinessDoesNotIgnoreActiveOperations"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-executor-admission",
"title": "Admit exactly one observed node executor and verify its termination",
"title_zh": "Admit exactly one observed node executor and verify its termination",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/enter-job",
"code_paths": [
"pkg/cleanup/node_execution.go",
"pkg/cleanup/kubeidentity/node_executor.go",
"api/controller/cleanup_node_executor.go"
],
"tests": [
{
"path": "pkg/cleanup/node_execution_test.go",
"selector": "TestNodeExecutorAdmissionIsBoundAndSingleUse"
},
{
"path": "pkg/cleanup/kubeidentity/node_executor_test.go",
"selector": "TestNodeExecutorRequiresOriginalRuntimeNodeAndMount"
},
{
"path": "api/controller/cleanup_node_executor_test.go",
"selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-inventory-api",
"title": "Authenticated manual inventory preserves deletion protection",
"title_zh": "Authenticated manual inventory preserves deletion protection",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/managed-cache/inventory",
"code_paths": [
"api/controller/cleanup_node_inventory.go"
],
"tests": [
{
"path": "api/controller/cleanup_node_inventory_test.go",
"selector": "TestInventoryAPIStartsReadOnlyJobWithoutDeletionReadiness"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-inventory-report",
"title": "Return inventory only from the original verified successful pod",
"title_zh": "Return inventory only from the original verified successful pod",
"interface_type": "workflow",
"interface": "kubeidentity.ReadNodeInventoryReport",
"code_paths": [
"pkg/cleanup/kubeidentity/node_inventory_report.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/node_inventory_report_test.go",
"selector": "TestInventoryReportRequiresOriginalSuccessfulPod"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-inventory-submission",
"title": "Retry manual inventory without duplicating an existing job",
"title_zh": "Retry manual inventory without duplicating an existing job",
"interface_type": "workflow",
"interface": "cleanup.RunNodeInventoryJob",
"code_paths": [
"pkg/cleanup/node_inventory_submit.go"
],
"tests": [
{
"path": "pkg/cleanup/node_inventory_submit_test.go",
"selector": "TestInventoryRequestReusesJobAfterLostCreate"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-inventory-template",
"title": "Read-only cache inventory binds observed storage",
"title_zh": "Read-only cache inventory binds observed storage",
"interface_type": "workflow",
"interface": "kubeidentity.BuildManagedCacheInventoryJob",
"code_paths": [
"pkg/cleanup/kubeidentity/node_inventory_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/node_inventory_template_test.go",
"selector": "TestCacheInventoryTemplateUsesObservedReadOnlyStorage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-job-intent",
"title": "Persist immutable node execution identity before job creation",
"title_zh": "Persist immutable node execution identity before job creation",
"interface_type": "workflow",
"interface": "PrepareNodeJob",
"code_paths": [
"pkg/cleanup/node_job.go",
"pkg/cleanup/coordination.go",
"pkg/cleanup/deletion_attempt.go",
"db/model/cleanup_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/node_job_test.go",
"selector": "TestNodeJobIntentIsImmutableAndDoesNotGrantRecreation"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-job-launch-api",
"title": "Launch only the original verified node cleanup job",
"title_zh": "Launch only the original verified node cleanup job",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/submit-job",
"code_paths": [
"api/controller/cleanup_node_launch.go"
],
"tests": [
{
"path": "api/controller/cleanup_node_launch_test.go",
"selector": "TestNodeLaunchAPIRechecksSourceBeforeStarting"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-job-start",
"title": "Start only the original protected node cleanup Job",
"title_zh": "Start only the original protected node cleanup Job",
"interface_type": "workflow",
"interface": "StartNodeJob",
"code_paths": [
"pkg/cleanup/node_job_start.go"
],
"tests": [
{
"path": "pkg/cleanup/node_job_start_test.go",
"selector": "TestNodeJobStartChecksProtectionAndReconcilesLostReply"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-job-submission",
"title": "Submit one suspended node cleanup Job and reconcile original identity",
"title_zh": "Submit one suspended node cleanup Job and reconcile original identity",
"interface_type": "workflow",
"interface": "SubmitSuspendedNodeJob",
"code_paths": [
"pkg/cleanup/node_job_submit.go"
],
"tests": [
{
"path": "pkg/cleanup/node_job_submit_test.go",
"selector": "TestNodeSubmissionReconcilesLostCreateWithoutRecreating"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-job-template",
"title": "Bind node cleanup jobs to observed cache and persistent state",
"title_zh": "Bind node cleanup jobs to observed cache and persistent state",
"interface_type": "workflow",
"interface": "kubeidentity.BuildManagedNodeJob",
"code_paths": [
"pkg/cleanup/kubeidentity/node_job_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/node_job_template_test.go",
"selector": "TestNodeJobTemplateBindsCacheAndDurableState"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-journal-identity",
"title": "Bind original node execution journal to PVC and PV identities",
"title_zh": "Bind original node execution journal to PVC and PV identities",
"interface_type": "workflow",
"interface": "kubeidentity.InspectNodeJournalVolume",
"code_paths": [
"pkg/cleanup/kubeidentity/node_journal.go",
"pkg/cleanup/kubeidentity/node_job_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/node_job_template_test.go",
"selector": "TestNodeJobTemplateBindsCacheAndDurableState"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-recovery-api",
"title": "Recover original node receipt after verified executor exit",
"title_zh": "Recover original node receipt after verified executor exit",
"interface_type": "view_endpoint",
"interface": "POST node/recover",
"code_paths": [
"api/controller/cleanup_node_recovery.go"
],
"tests": [
{
"path": "api/controller/cleanup_node_executor_test.go",
"selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.node-recovery-binding",
"title": "Persist recovery intent without changing original native authority",
"title_zh": "Persist recovery intent without changing original native authority",
"interface_type": "workflow",
"interface": "cleanup.PrepareNodeRecovery",
"code_paths": [
"pkg/cleanup/node_recovery.go",
"pkg/cleanup/node_job.go"
],
"tests": [
{
"path": "pkg/cleanup/node_recovery_test.go",
"selector": "TestNodeRecoveryIntentIsDurableAndCannotReplaceOriginal"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-recovery-submission",
"title": "Reconcile original recovery Job after lost create response",
"title_zh": "Reconcile original recovery Job after lost create response",
"interface_type": "workflow",
"interface": "cleanup.SubmitSuspendedNodeRecovery",
"code_paths": [
"pkg/cleanup/node_recovery_submit.go"
],
"tests": [
{
"path": "pkg/cleanup/node_recovery_test.go",
"selector": "TestRecoverySubmissionNeverRecreatesAfterLostResponse"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-recovery-template",
"title": "Build receipt recovery without cache access after verified executor exit",
"title_zh": "Build receipt recovery without cache access after verified executor exit",
"interface_type": "workflow",
"interface": "kubeidentity.BuildNodeRecoveryJob",
"code_paths": [
"pkg/cleanup/kubeidentity/node_recovery_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/node_recovery_template_test.go",
"selector": "TestNodeRecoveryRequiresOriginalExitAndOmitsCacheVolume"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.node-result-finalization",
"title": "Finalize known original node results only after verified executor exit",
"title_zh": "Finalize known original node results only after verified executor exit",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/finish",
"code_paths": [
"pkg/cleanup/node_result.go",
"api/controller/cleanup_node_executor.go",
"pkg/cleanup/node_executor_client.go"
],
"tests": [
{
"path": "pkg/cleanup/node_result_test.go",
"selector": "TestNodeResultIsImmutableAndRequiresExitedOriginalExecutor"
},
{
"path": "pkg/cleanup/node_result_test.go",
"selector": "TestNodeResultRejectsInvalidFilesystemEvidence"
},
{
"path": "api/controller/cleanup_node_executor_test.go",
"selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.package-check-before-enqueue",
"title": "Reserve package source checks before sending MQ messages",
"title_zh": "Reserve package source checks before sending MQ messages",
"interface_type": "handler_method",
"interface": "ServiceAction.ServiceCheck",
"code_paths": [
"api/handler/service_check.go",
"pkg/cleanup/queued_tar.go"
],
"tests": [
{
"path": "api/handler/cleanup_queued_tar_test.go",
"selector": "TestServiceCheckReservesOnlyUploadedPackageSources"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.package-check-queue-classification",
"title": "Classify native package checks consistently before enqueue and execution",
"title_zh": "Classify native package checks consistently before enqueue and execution",
"interface_type": "workflow",
"interface": "PackageCheckIdentity",
"code_paths": [
"pkg/cleanup/queued_check.go",
"builder/exector/service_check.go"
],
"tests": [
{
"path": "pkg/cleanup/queued_check_test.go",
"selector": "TestPackageChecksUseSharedQueueClassification"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.package-inventory-mount",
"title": "Observe and bind read-only package inventory subtree independently of cache deletion",
"title_zh": "Observe and bind read-only package inventory subtree independently of cache deletion",
"interface_type": "workflow",
"interface": "BuildManagedCacheInventoryJob",
"code_paths": [
"pkg/cleanup/kubeidentity/package_inventory_template.go",
"pkg/cleanup/kubeidentity/node_inventory_template.go",
"pkg/cleanup/kubeidentity/node_inventory_report.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/package_inventory_template_test.go",
"selector": "TestPackageInventoryUsesObservedReadOnlySubtree"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.package-upload-exclusive-close",
"title": "Drain concurrent upload parts before terminal mutation and preserve uncertain requests",
"title_zh": "Drain concurrent upload parts before terminal mutation and preserve uncertain requests",
"interface_type": "workflow",
"interface": "AcquirePackageUploadRequest",
"code_paths": [
"pkg/cleanup/package_upload_use.go",
"db/model/package_upload_use.go",
"db/mysql/mysql.go",
"api/controller/cleanup_upload_use.go"
],
"tests": [
{
"path": "pkg/cleanup/package_upload_use_test.go",
"selector": "TestPackageUploadCloseDrainsPartsAndRetainsUnknownAcrossRestart"
},
{
"path": "pkg/cleanup/package_upload_use_test.go",
"selector": "TestPackageUploadAdmissionChecksFreshSessionAndOriginalRequest"
},
{
"path": "api/controller/cleanup_upload_use_test.go",
"selector": "TestNativeUploadCancelCannotOverlapAnActivePart"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.package-writer-coverage",
"title": "Managed package coverage rejects active builds",
"title_zh": "Managed package coverage rejects active builds",
"interface_type": "workflow",
"interface": "kubeidentity.InspectManagedPackageWriterCoverage",
"code_paths": [
"pkg/cleanup/kubeidentity/package_coverage.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/package_coverage_test.go",
"selector": "TestManagedPackageCoverageRejectsBuildsAndChangingRollout"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.package-writer-readiness",
"title": "Managed package deletion requires current coordinated writers",
"title_zh": "Managed package deletion requires current coordinated writers",
"interface_type": "workflow",
"interface": "cleanup.CertifyManagedPackageWriters",
"code_paths": [
"pkg/cleanup/package_certification.go"
],
"tests": [
{
"path": "pkg/cleanup/package_certification_test.go",
"selector": "TestManagedPackageReadinessRequiresCurrentWritersAndNoUnfinishedUse"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.participant-replacement",
"title": "Participant replacement preserves active deletion protection",
"title_zh": "Participant replacement preserves active deletion protection",
"interface_type": "workflow",
"interface": "cleanup.RegisterParticipant",
"code_paths": [
"pkg/cleanup/participant.go",
"pkg/cleanup/deletion_attempt.go"
],
"tests": [
{
"path": "pkg/cleanup/participant_test.go",
"selector": "TestParticipantReplacementWithdrawsReadinessWithoutLosingDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.pending-import-references",
"title": "Include retained tar import and check receipts in reference audits",
"title_zh": "Include retained tar import and check receipts in reference audits",
"interface_type": "workflow",
"interface": "cleanup.collectRegionReferenceImages",
"code_paths": [
"pkg/cleanup/reference_import.go",
"pkg/cleanup/reference_audit.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_import_test.go",
"selector": "TestImportedImagesRemainReferencedUntilTheirRecordsAreReleased"
},
{
"path": "pkg/cleanup/reference_import_test.go",
"selector": "TestIncompleteImportRecordsCannotProveAbsence"
},
{
"path": "pkg/cleanup/reference_import_test.go",
"selector": "TestRejectedAndNonImageChecksDoNotInventReferences"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.platform-future-helper-references",
"title": "Protect default and configured builder and worker helper images",
"title_zh": "Protect default and configured builder and worker helper images",
"interface_type": "workflow",
"interface": "kubeidentity.ReadPlatformHelperReferences",
"code_paths": [
"pkg/cleanup/kubeidentity/platform_helper_references.go",
"pkg/cleanup/kubeidentity/helper_references.go",
"util/constants/helper_images.go",
"builder/build/cnb/config.go",
"builder/exector/build_from_vm.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
"selector": "TestPlatformDefaultsRemainReferencedWithoutActiveBuilds"
},
{
"path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
"selector": "TestPlatformHelperOverridesNeverExposeOtherEnvironmentValues"
},
{
"path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
"selector": "TestBuilderDaemonSetRollbackHelperReferences"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.platform-resource-admission",
"title": "Protect namespace and cluster resource mutations from concurrent cleanup",
"title_zh": "Protect namespace and cluster resource mutations from concurrent cleanup",
"interface_type": "workflow",
"interface": "NsResourceHandler.CreateNsResource",
"code_paths": [
"api/handler/ns_resource.go",
"api/handler/cluster_resource.go"
],
"tests": [
{
"path": "api/handler/cleanup_namespace_admission_test.go",
"selector": "TestNamespaceMutationsCannotBypassCleanupAdmission"
},
{
"path": "api/handler/cleanup_namespace_admission_test.go",
"selector": "TestClusterMutationsCannotBypassCleanupAdmission"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.plugin-version-reference-coordination",
"title": "Plugin version writes respect selected deletion and cannot resurrect records",
"title_zh": "Plugin version writes respect selected deletion and cannot resurrect records",
"interface_type": "workflow",
"interface": "PluginBuildVersionDaoImpl",
"code_paths": [
"db/mysql/dao/plugin_cleanup.go"
],
"tests": [
{
"path": "db/mysql/dao/version_cleanup_test.go",
"selector": "TestPluginVersionWritesRespectDeletionAndNeverResurrect"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.queued-producer-handoff",
"title": "Protect queued producer lifetime and atomically claim once",
"title_zh": "Protect queued producer lifetime and atomically claim once",
"interface_type": "workflow",
"interface": "QueueOperation",
"code_paths": [
"pkg/cleanup/queued_operation.go",
"pkg/cleanup/coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/queued_operation_test.go",
"selector": "TestQueuedProducerProtectsWaitingWorkAndClaimsExactlyOnce"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.queued-tar-consumer",
"title": "Claim original queued tar reservation before native execution",
"title_zh": "Claim original queued tar reservation before native execution",
"interface_type": "workflow",
"interface": "admitBuild",
"code_paths": [
"builder/exector/cleanup_image_admission.go",
"pkg/cleanup/queued_tar.go"
],
"tests": [
{
"path": "builder/exector/cleanup_image_admission_test.go",
"selector": "TestTarConsumerClaimsOriginalQueueReservation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.reference-writer-controller-coverage",
"title": "Require complete stable platform writer controller coverage",
"title_zh": "Require complete stable platform writer controller coverage",
"interface_type": "workflow",
"interface": "kubeidentity.InspectReferenceWriterCoverage",
"code_paths": [
"pkg/cleanup/kubeidentity/reference_writer_coverage.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/reference_writer_coverage_test.go",
"selector": "TestReferenceWriterCoverageRejectsIncompleteRollout"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.reference-writer-runtime-evidence",
"title": "Bind reference-writer protocol evidence to immutable running containers",
"title_zh": "Bind reference-writer protocol evidence to immutable running containers",
"interface_type": "workflow",
"interface": "cleanup.RegisterReferenceWriter",
"code_paths": [
"db/model/cleanup_reference_writer.go",
"pkg/cleanup/reference_writer.go",
"pkg/cleanup/kubeidentity/reference_writer.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_writer_test.go",
"selector": "TestReferenceWriterEvidenceIsIndependentAndImmutable"
},
{
"path": "pkg/cleanup/kubeidentity/reference_writer_test.go",
"selector": "TestReferenceWriterIdentityUsesActualRuntime"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.reference-writer-startup",
"title": "Register reference writer runtime evidence at service startup",
"title_zh": "Register reference writer runtime evidence at service startup",
"interface_type": "workflow",
"interface": "kubeidentity.RegisterReferenceWriterStartup",
"code_paths": [
"pkg/cleanup/kubeidentity/reference_writer_startup.go",
"pkg/component/reference_writer.go",
"cmd/api/main.go",
"cmd/worker/worker.go",
"cmd/builder/builder.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/reference_writer_startup_test.go",
"selector": "TestReferenceWriterStartupWaitsForOwnRuntimeOnly"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registered-storage-discovery",
"title": "Storage discovery rejects incomplete enrollment",
"title_zh": "Storage discovery rejects incomplete enrollment",
"interface_type": "workflow",
"interface": "cleanup.DiscoverStores",
"code_paths": [
"pkg/cleanup/discovery.go"
],
"tests": [
{
"path": "pkg/cleanup/discovery_test.go",
"selector": "TestDiscoverStoresRejectsIncompleteRegistration"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-audit-writer-coverage",
"title": "Require current registered platform writers in execution reference audit",
"title_zh": "Require current registered platform writers in execution reference audit",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/registry-references",
"code_paths": [
"api/controller/cleanup_coordination.go",
"api/controller/cleanup_reference_writers.go"
],
"tests": [
{
"path": "api/controller/cleanup_coordination_test.go",
"selector": "TestRegistryReferenceAuditUsesBoundAuthenticatedOperation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-certification",
"title": "Derive registry readiness from runtime evidence and quiescence",
"title_zh": "Derive registry readiness from runtime evidence and quiescence",
"interface_type": "workflow",
"interface": "cleanup.CertifyRegistry",
"code_paths": [
"pkg/cleanup/registry_certification.go"
],
"tests": [
{
"path": "pkg/cleanup/registry_certification_test.go",
"selector": "TestRegistryCertificationRequiresCompleteEvidence"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-delete-permit",
"title": "Bind registry deletion permits to immutable targets and expiry",
"title_zh": "Bind registry deletion permits to immutable targets and expiry",
"interface_type": "workflow",
"interface": "pkg/cleanup.VerifyRegistryDeletionPermit",
"code_paths": [
"pkg/cleanup/deletion_permit.go"
],
"tests": [
{
"path": "pkg/cleanup/deletion_permit_test.go",
"selector": "TestRegistryDeletionPermitBindsOriginalTargetAndExpiry"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-gc-executor",
"title": "Execute native Registry GC once against a verified storage descriptor",
"title_zh": "Execute native Registry GC once against a verified storage descriptor",
"interface_type": "workflow",
"interface": "registryproxy.ExecuteGC",
"code_paths": [
"pkg/cleanup/registryproxy/gc_executor.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/gc_executor_test.go",
"selector": "TestGCExecutorDoesNotStartWithoutAdmission"
},
{
"path": "api/controller/cleanup_registryproxy_test.go",
"selector": "TestCoordinatedRegistryExecutorRealDeletionAndGC"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-identity-provision",
"title": "Provision independent platform registry identities without overwrites",
"title_zh": "Provision independent platform registry identities without overwrites",
"interface_type": "workflow",
"interface": "provision_identity.provision",
"code_paths": [
"hack/contrib/docker/registry-gc/provision_identity.py"
],
"tests": [
{
"path": "hack/contrib/docker/registry-gc/provision_identity_test.py"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-ingress-isolation",
"title": "Reject registry routes that bypass the coordinator",
"title_zh": "Reject registry routes that bypass the coordinator",
"interface_type": "workflow",
"interface": "pkg/cleanup/kubeidentity.InspectRegistryIngress",
"code_paths": [
"pkg/cleanup/kubeidentity/registry_ingress.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/registry_ingress_test.go",
"selector": "TestRegistryIngressRequiresExclusiveCoordinatedRoute"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-kubernetes-binding",
"title": "Verify actual registry Pod and backing volume identity",
"title_zh": "Verify actual registry Pod and backing volume identity",
"interface_type": "workflow",
"interface": "pkg/cleanup/kubeidentity.InspectRegistryMount",
"code_paths": [
"pkg/cleanup/kubeidentity/registry_mount.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/registry_mount_test.go",
"selector": "TestRegistryMountBindingUsesRealVolumeAndPodIdentity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-participant-coverage",
"title": "Verify every selected registry ingress against its runtime enrollment",
"title_zh": "Verify every selected registry ingress against its runtime enrollment",
"interface_type": "workflow",
"interface": "kubeidentity.InspectRegistryParticipantCoverage",
"code_paths": [
"pkg/cleanup/kubeidentity/registry_participant_coverage.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/registry_participant_test.go",
"selector": "TestParticipantIdentityComesFromCurrentContainerStatus"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-permit-fresh-coverage",
"title": "Revalidate current registry coverage before deletion permits",
"title_zh": "Revalidate current registry coverage before deletion permits",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/registry-permit",
"code_paths": [
"api/controller/cleanup_coordination.go",
"api/controller/cleanup_registry_readiness.go"
],
"tests": [
{
"path": "api/controller/cleanup_registry_readiness_test.go",
"selector": "TestRegistryPermitRevalidatesCurrentCoverage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-permit-key-separation",
"title": "Separate registry permit signing from control authentication",
"title_zh": "Separate registry permit signing from control authentication",
"interface_type": "workflow",
"interface": "controller.systemRegistryPermitKey",
"code_paths": [
"api/controller/cleanup_permit_key.go"
],
"tests": [
{
"path": "api/controller/cleanup_permit_key_test.go",
"selector": "TestRegistryPermitKeyUsesDedicatedFileAndNeverFallsBackOnFailure"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-preparation",
"title": "Derive registry identity from controlled inspection without granting cleanup",
"title_zh": "Derive registry identity from controlled inspection without granting cleanup",
"interface_type": "view_endpoint",
"interface": "/v2/cleanup/registry/prepare",
"code_paths": [
"api/controller/cleanup_coordination.go"
],
"tests": [
{
"path": "api/controller/cleanup_coordination_test.go",
"selector": "TestRegistryPreparationDerivesIdentityAndNeverPromotesReady"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-reference-bootstrap",
"title": "Read collecting registry references without granting deletion",
"title_zh": "Read collecting registry references without granting deletion",
"interface_type": "workflow",
"interface": "cleanup.ReadRegionReferenceInventory",
"code_paths": [
"pkg/cleanup/reference_audit.go"
],
"tests": [
{
"path": "pkg/cleanup/reference_audit_test.go",
"selector": "TestReferenceInventoryBootstrapsWithoutGrantingDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-request-scope",
"title": "Reject ambiguous Registry paths and direct blob deletion",
"title_zh": "Reject ambiguous Registry paths and direct blob deletion",
"interface_type": "workflow",
"interface": "pkg/cleanup/registryproxy.ClassifyRequest",
"code_paths": [
"pkg/cleanup/registryproxy/request.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/request_test.go",
"selector": "TestRegistryProxyRejectsAmbiguousPathsAndUnselectedDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-service-coverage",
"title": "Check every registry service instance without accepting partial coverage",
"title_zh": "Check every registry service instance without accepting partial coverage",
"interface_type": "workflow",
"interface": "pkg/cleanup/kubeidentity.InspectRegistryService",
"code_paths": [
"pkg/cleanup/kubeidentity/registry_service.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/registry_service_test.go",
"selector": "TestRegistryServiceRejectsMixedAndEmptyDeployments"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-service-stable-membership",
"title": "Reject registry membership changes during ingress inspection",
"title_zh": "Reject registry membership changes during ingress inspection",
"interface_type": "workflow",
"interface": "kubeidentity.InspectRegistryService",
"code_paths": [
"pkg/cleanup/kubeidentity/registry_service.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/registry_service_test.go",
"selector": "TestRegistryServiceRejectsMembershipChangeDuringInspection"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-stream-admission",
"title": "Require admission before forwarding mutations without credential leakage",
"title_zh": "Require admission before forwarding mutations without credential leakage",
"interface_type": "workflow",
"interface": "pkg/cleanup/registryproxy.Proxy.ServeHTTP",
"code_paths": [
"pkg/cleanup/registryproxy/proxy.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/proxy_test.go",
"selector": "TestProxyAcquiresBeforeForwardingAndPreservesRegistryAuth"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.registry-upload-lifecycle",
"title": "Keep upload leases across parts and drain existing sessions safely",
"title_zh": "Keep upload leases across parts and drain existing sessions safely",
"interface_type": "workflow",
"interface": "pkg/cleanup.AcquireUploadRequest",
"code_paths": [
"pkg/cleanup/upload_coordination.go"
],
"tests": [
{
"path": "pkg/cleanup/upload_coordination_test.go",
"selector": "TestUploadSessionRemainsProtectedBetweenParts"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.restore-producer-transaction",
"title": "Keep restore metadata and result publication in admitted transactions",
"title_zh": "Keep restore metadata and result publication in admitted transactions",
"interface_type": "workflow",
"interface": "BackupAPPRestore.withMetadataWrite",
"code_paths": [
"builder/exector/groupapp_restore.go",
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/cleanup_restore_admission_test.go",
"selector": "TestRestoreMetadataRetainsAdmissionAndRollsBackFailure"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cleanup.saved-workload-reference-coordination",
"title": "Serialize saved workload reference writes with cleanup admission",
"title_zh": "Serialize saved workload reference writes with cleanup admission",
"interface_type": "workflow",
"interface": "K8sResourceDaoImpl",
"code_paths": [
"db/mysql/dao/k8s_resource.go"
],
"tests": [
{
"path": "db/mysql/dao/k8s_resource_cleanup_test.go",
"selector": "TestSavedWorkloadWritesRespectCleanupAdmission"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.service-mesh-mutation-admission",
"title": "Protect ServiceMesh mutations until reference persistence is confirmed",
"title_zh": "Protect ServiceMesh mutations until reference persistence is confirmed",
"interface_type": "workflow",
"interface": "ApplicationAction.CreateServiceMeshCR",
"code_paths": [
"api/handler/application_handler.go"
],
"tests": [
{
"path": "api/handler/cleanup_service_mesh_test.go",
"selector": "TestServiceMeshMutationsHoldCleanupAdmission"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.service_check_import_handoff",
"title": "Preserve imported image references across component creation",
"title_zh": "Preserve imported image references across component creation",
"interface_type": "workflow",
"interface": "CleanServiceCheckData",
"code_paths": [
"api/handler/etcd_handler.go",
"api/controller/resources.go"
],
"tests": [
{
"path": "api/handler/service_check_cleanup_test.go",
"selector": "TestServiceCheckCreationCleanupPreservesImportReferences"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.share-task-completion",
"title": "Slug sharing remains active until result persistence finishes",
"title_zh": "Slug sharing remains active until result persistence finishes",
"interface_type": "workflow",
"interface": "exectorManager.slugShare",
"code_paths": [
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/cleanup_task_boundary_test.go",
"selector": "TestSlugShareTaskWaitsForResultPersistence"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.signed-gc-job-template",
"title": "Project GC identity without exposing permit signing authority",
"title_zh": "Project GC identity without exposing permit signing authority",
"interface_type": "package_function",
"interface": "kubeidentity.BuildRegistryGCJob",
"code_paths": [
"pkg/cleanup/kubeidentity/gc_job_template.go"
],
"tests": [
{
"path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
"selector": "TestSignedGCJobCopiesScopeButNeverPermitSigningSecret"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.single-deletion-attempt",
"title": "Consume deletion permission once and retain verification protection",
"title_zh": "Consume deletion permission once and retain verification protection",
"interface_type": "workflow",
"interface": "pkg/cleanup.BeginDeletionAttempt",
"code_paths": [
"pkg/cleanup/deletion_attempt.go"
],
"tests": [
{
"path": "pkg/cleanup/deletion_attempt_test.go",
"selector": "TestDeletionAttemptIsConsumedOnceAndRemainsProtectedUntilVerified"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.sqlite-activation",
"title": "Support activation tracking on SQLite",
"title_zh": "Support activation tracking on SQLite",
"interface_type": "workflow",
"interface": "cleanup.TrackServiceActivation",
"code_paths": [
"pkg/cleanup/activation.go"
],
"tests": [
{
"path": "pkg/cleanup/activation_sqlite_test.go",
"selector": "TestTrackServiceActivationSupportsSQLite"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.sqlite-version-store",
"title": "SQLite version selection inspection and retirement",
"title_zh": "SQLite version selection inspection and retirement",
"interface_type": "workflow",
"interface": "pkg/cleanup.SelectRollbackVersion",
"code_paths": [
"pkg/cleanup/store.go"
],
"tests": [
{
"path": "pkg/cleanup/store_sqlite_test.go",
"selector": "TestVersionStoreSupportsSQLite"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.storage-enrollment",
"title": "Collect writes during enrollment without granting cleanup",
"title_zh": "Collect writes during enrollment without granting cleanup",
"interface_type": "workflow",
"interface": "pkg/cleanup.RegisterStorage",
"code_paths": [
"pkg/cleanup/registration.go"
],
"tests": [
{
"path": "pkg/cleanup/registration_test.go",
"selector": "TestStorageRegistrationCollectsWritesWithoutEnablingDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.storage-identity",
"title": "Bind storage identity atomically without replacing prior markers",
"title_zh": "Bind storage identity atomically without replacing prior markers",
"interface_type": "workflow",
"interface": "pkg/cleanup/registryproxy.InitializeStorageIdentity",
"code_paths": [
"pkg/cleanup/registryproxy/identity.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/identity_test.go",
"selector": "TestStorageIdentityIsBoundAndNeverOverwritten"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-admission-before-enqueue",
"title": "Persist exact tar task reservation before MQ and retain unknown outcome",
"title_zh": "Persist exact tar task reservation before MQ and retain unknown outcome",
"interface_type": "handler_method",
"interface": "TarImageHandle.LoadTarImage",
"code_paths": [
"api/handler/tar_image_handler.go"
],
"tests": [
{
"path": "api/handler/cleanup_queued_tar_test.go",
"selector": "TestTarAPIReservesBeforeEnqueueAndRetainsLostAcknowledgement"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-check-event-path",
"title": "Restrict tar check input to event directory identifiers",
"title_zh": "Restrict tar check input to event directory identifiers",
"interface_type": "workflow",
"interface": "parser.TarImageEventID",
"code_paths": [
"builder/parser/tar_event.go",
"builder/parser/docker_run.go"
],
"tests": [
{
"path": "builder/parser/tar_event_test.go",
"selector": "TestTarImageEventIDRejectsTraversalAndMalformedSources"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-image-admission",
"title": "Fence tar image import through native work and result persistence",
"title_zh": "Fence tar image import through native work and result persistence",
"interface_type": "workflow",
"interface": "exector.loadTarImage",
"code_paths": [
"builder/exector/tar_image_load.go",
"builder/exector/cleanup_image_admission.go"
],
"tests": [
{
"path": "builder/exector/cleanup_tar_admission_test.go",
"selector": "TestTarImportAdmissionCoversWorkAndResultPersistence"
},
{
"path": "builder/exector/cleanup_tar_admission_test.go",
"selector": "TestTarImportUnknownOutcomeRetainsProtection"
},
{
"path": "builder/exector/cleanup_tar_admission_test.go",
"selector": "TestTarImportInvalidIdentityStopsBeforeFilesystemOrDatabase"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-image-entry",
"title": "Reject tar import before native work and preserve original result",
"title_zh": "Reject tar import before native work and preserve original result",
"interface_type": "workflow",
"interface": "exector.loadTarImage",
"code_paths": [
"builder/exector/tar_image_load.go"
],
"tests": [
{
"path": "builder/exector/cleanup_tar_admission_test.go",
"selector": "TestTarImportEntryReportsMaintenanceWithoutStartingNativeWork"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-image-redelivery",
"title": "Do not overwrite a running tar import on duplicate delivery",
"title_zh": "Do not overwrite a running tar import on duplicate delivery",
"interface_type": "workflow",
"interface": "exector.loadTarImage",
"code_paths": [
"builder/exector/tar_image_load.go"
],
"tests": [
{
"path": "builder/exector/cleanup_tar_admission_test.go",
"selector": "TestTarImportRedeliveryDoesNotPublishFailureOverActiveWork"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.tar-service-check-admission",
"title": "Block tar service check native work during maintenance",
"title_zh": "Block tar service check native work during maintenance",
"interface_type": "workflow",
"interface": "exector.serviceCheck",
"code_paths": [
"builder/exector/service_check.go",
"builder/exector/cleanup_image_admission.go"
],
"tests": [
{
"path": "builder/exector/cleanup_service_check_test.go",
"selector": "TestTarServiceCheckCannotPushDuringMaintenance"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-cancel-evidence",
"title": "Retain upload session evidence when physical cleanup fails",
"title_zh": "Retain upload session evidence when physical cleanup fails",
"interface_type": "workflow",
"interface": "controller.ChunkUploadManager.CancelUpload",
"code_paths": [
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/chunk_upload_cleanup_test.go",
"selector": "TestCancelUploadRetainsRecoveryEvidenceOnFailure"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-completion-evidence",
"title": "Persist upload completion before deleting resumable chunks",
"title_zh": "Persist upload completion before deleting resumable chunks",
"interface_type": "workflow",
"interface": "ChunkUploadManager.CompleteUpload",
"code_paths": [
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/chunk_upload_completion_test.go",
"selector": "TestUploadCompletionPreservesEvidenceBeforeChunkDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-delete-api",
"title": "Gate selected upload chunk deletion on current writers storage identity expiry and scanned session",
"title_zh": "Gate selected upload chunk deletion on current writers storage identity expiry and scanned session",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/uploads/chunks/delete",
"code_paths": [
"api/controller/cleanup_upload_delete.go",
"api/api_routers/version2/v2Routers.go"
],
"tests": [
{
"path": "api/controller/cleanup_upload_delete_test.go",
"selector": "TestUploadDeleteAPIRequiresWriterStorageRuleAndSelectionEvidence"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-expiration-evidence",
"title": "Preserve unverified expired upload records without expanding background deletion",
"title_zh": "Preserve unverified expired upload records without expanding background deletion",
"interface_type": "workflow",
"interface": "controller.ChunkUploadManager.cleanExpiredSessions",
"code_paths": [
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/chunk_upload_cleanup_test.go",
"selector": "TestExpiredUploadCleanupPreservesRecoveryEvidence"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-inventory-api",
"title": "Scope manual upload inventory and retain unknown measured sizes",
"title_zh": "Scope manual upload inventory and retain unknown measured sizes",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/uploads/inventory",
"code_paths": [
"api/controller/cleanup_upload_inventory.go",
"api/api_routers/version2/v2Routers.go"
],
"tests": [
{
"path": "api/controller/cleanup_upload_inventory_test.go",
"selector": "TestUploadInventoryRestrictsEventsAndPreservesUnknownSizes"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-inventory-bounds",
"title": "Bound upload inventory before physical storage reads",
"title_zh": "Bound upload inventory before physical storage reads",
"interface_type": "view_endpoint",
"interface": "POST /v2/cleanup/uploads/inventory",
"code_paths": [
"api/controller/cleanup_upload_inventory.go"
],
"tests": [
{
"path": "api/controller/cleanup_upload_inventory_test.go",
"selector": "TestUploadInventoryRejectsOversizedResultBeforeReadingStorage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-retained-references",
"title": "Protect package events referenced by retained versions and source checks",
"title_zh": "Protect package events referenced by retained versions and source checks",
"interface_type": "workflow",
"interface": "ReadUploadPackageReferences",
"code_paths": [
"pkg/cleanup/package_references.go"
],
"tests": [
{
"path": "pkg/cleanup/package_references_test.go",
"selector": "TestUploadReferencesProtectRetainedVersionsAndSourceChecks"
},
{
"path": "pkg/cleanup/package_references_test.go",
"selector": "TestUploadReferencePathsAreCanonical"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-use-lifetime",
"title": "Keep native upload storage work protected through completion and restart",
"title_zh": "Keep native upload storage work protected through completion and restart",
"interface_type": "workflow",
"interface": "ChunkUploadManager native storage lifecycle",
"code_paths": [
"api/controller/cleanup_upload_use.go",
"api/controller/chunk_upload_manager.go"
],
"tests": [
{
"path": "api/controller/cleanup_upload_use_test.go",
"selector": "TestUploadUsePersistsAcrossStorageWorkAndUncertainResults"
},
{
"path": "api/controller/cleanup_upload_use_test.go",
"selector": "TestUploadMaintenanceStopsNativeChunkWriteCancelAndExpiry"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.upload-writer-coverage",
"title": "Require current API instances to register upload guard support separately from registry references",
"title_zh": "Require current API instances to register upload guard support separately from registry references",
"interface_type": "workflow",
"interface": "UploadWriterCoverageRegistered",
"code_paths": [
"pkg/cleanup/upload_writer.go",
"pkg/cleanup/reference_writer.go",
"pkg/cleanup/kubeidentity/reference_writer_startup.go"
],
"tests": [
{
"path": "pkg/cleanup/upload_writer_test.go",
"selector": "TestUploadDeletionRequiresEveryCurrentAPIWriterProtocol"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.verified-client-identity",
"title": "Cleanup requires configured token or verified platform client certificate",
"title_zh": "Cleanup requires configured token or verified platform client certificate",
"interface_type": "workflow",
"interface": "api.middleware.CleanupIdentity",
"code_paths": [
"api/middleware/cleanup_identity.go"
],
"tests": [
{
"path": "api/middleware/cleanup_identity_test.go",
"selector": "TestCleanupIdentityRequiresVerifiedClientOrConfiguredToken"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.verified-storage-measurement",
"title": "Measure only the verified registry backing filesystem",
"title_zh": "Measure only the verified registry backing filesystem",
"interface_type": "workflow",
"interface": "registryproxy.MeasureStorage",
"code_paths": [
"pkg/cleanup/registryproxy/measurement.go"
],
"tests": [
{
"path": "pkg/cleanup/registryproxy/measurement_test.go",
"selector": "TestMeasurementRequiresBoundStorageAndRejectsSymlinks"
},
{
"path": "cmd/registry-coordinator/main_test.go",
"selector": "TestMeasurementModeDoesNotInitializeOrNeedCredentials"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.version-activation-fence",
"title": "Fence upgrade and rollback against version retirement",
"title_zh": "Fence upgrade and rollback against version retirement",
"interface_type": "workflow",
"interface": "OperationHandler.upgrade and ServiceAction.RollBack",
"code_paths": [
"api/handler/service.go",
"api/handler/service_operation.go"
],
"tests": [
{
"path": "api/handler/cleanup_rollback_test.go",
"selector": "TestLegacyRollbackCannotActivateRetiredVersion"
},
{
"path": "api/handler/cleanup_rollback_test.go",
"selector": "TestExplicitUpgradeRechecksVersionUnderRetirementLock"
},
{
"path": "api/handler/cleanup_rollback_test.go",
"selector": "TestUpgradeQueueFailureCannotOverwriteNewerDeployment"
},
{
"path": "api/handler/cleanup_rollback_test.go",
"selector": "TestLegacyRollbackRejectsWrongTenant"
},
{
"path": "api/handler/cleanup_rollback_test.go",
"selector": "TestExplicitUpgradeEnqueuesValidatedVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.version-reference-coordination",
"title": "Version writes serialize with manifest deletion",
"title_zh": "Version writes serialize with manifest deletion",
"interface_type": "workflow",
"interface": "VersionInfoDaoImpl",
"code_paths": [
"db/mysql/dao/version.go",
"pkg/cleanup/reference_mutation.go"
],
"tests": [
{
"path": "db/mysql/dao/version_cleanup_test.go",
"selector": "TestVersionCreationCannotRaceManifestDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.version-update-no-resurrection",
"title": "Version callbacks preserve activation and never recreate retired records",
"title_zh": "Version callbacks preserve activation and never recreate retired records",
"interface_type": "dao_method",
"interface": "VersionInfoDaoImpl.UpdateModel",
"code_paths": [
"db/mysql/dao/version.go"
],
"tests": [
{
"path": "db/mysql/dao/version_cleanup_test.go",
"selector": "TestVersionUpdateNeverRecreatesRetiredRecordsOrResetsActivation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.vm-activation-dispatch",
"title": "Do not deploy VM after version activation rejection",
"title_zh": "Do not deploy VM after version activation rejection",
"interface_type": "workflow",
"interface": "exectorManager.buildFromVM",
"code_paths": [
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/cleanup_activation_test.go",
"selector": "TestVMBuildCannotDispatchAfterActivationRejected"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.workload-apply-admission",
"title": "Keep workload producer admission through Kubernetes mutation and reference commit",
"title_zh": "Keep workload producer admission through Kubernetes mutation and reference commit",
"interface_type": "workflow",
"interface": "handler.admitWorkload",
"code_paths": [
"api/handler/cleanup_workload_admission.go",
"api/handler/resource.go"
],
"tests": [
{
"path": "api/handler/cleanup_workload_admission_test.go",
"selector": "TestWorkloadAdmissionProtectsExternalApplyThroughCommit"
},
{
"path": "api/handler/cleanup_workload_admission_test.go",
"selector": "TestWorkloadAdmissionRetainsOnlyUnresolvedEffects"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cleanup.yaml-apply-admission-integration",
"title": "Exercise YAML apply protection through HTTP and durable database outcomes",
"title_zh": "Exercise YAML apply protection through HTTP and durable database outcomes",
"interface_type": "workflow",
"interface": "clusterAction.AddAppK8SResource",
"code_paths": [
"api/handler/resource.go"
],
"tests": [
{
"path": "api/handler/cleanup_workload_apply_test.go",
"selector": "TestYAMLApplyAdmissionCoversRequestsAndPartialResults"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.cloud-storage.alioss-error-map",
"title": "Convert AliOSS service errors into shared storage SDK errors",
"title_zh": "\u5c06 AliOSS \u670d\u52a1\u9519\u8bef\u8f6c\u6362\u4e3a\u7edf\u4e00\u5b58\u50a8 SDK \u9519\u8bef",
"interface_type": "workflow",
"interface": "builder/cloudos.svcErrToS3SDKError",
"code_paths": [
"builder/cloudos/alioss.go"
],
"tests": [
{
"path": "builder/cloudos/alioss_test.go",
"selector": "TestSvcErrToS3SDKError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cloud-storage.driver-factory",
"title": "Dispatch cloud storage configs to the correct driver implementation",
"title_zh": "\u5c06\u4e91\u5b58\u50a8\u914d\u7f6e\u5206\u53d1\u5230\u6b63\u786e\u7684\u9a71\u52a8\u5b9e\u73b0",
"interface_type": "workflow",
"interface": "builder/cloudos.New",
"code_paths": [
"builder/cloudos/cloudos.go"
],
"tests": [
{
"path": "builder/cloudos/cloudos_test.go",
"selector": "TestNewDispatchesProviderDrivers"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cloud-storage.provider-parse",
"title": "Parse configured cloud storage provider names",
"title_zh": "\u89e3\u6790\u4e91\u5b58\u50a8 provider \u914d\u7f6e\u503c",
"interface_type": "workflow",
"interface": "builder/cloudos.Str2S3Provider",
"code_paths": [
"builder/cloudos/cloudos.go"
],
"tests": [
{
"path": "builder/cloudos/cloudos_test.go",
"selector": "TestStr2S3Provider"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cloud-storage.s3-driver-config",
"title": "Initialize S3 storage driver with the expected config",
"title_zh": "\u6309\u9884\u671f\u914d\u7f6e\u521d\u59cb\u5316 S3 \u5b58\u50a8\u9a71\u52a8",
"interface_type": "workflow",
"interface": "builder/cloudos.newS3",
"code_paths": [
"builder/cloudos/s3.go"
],
"tests": [
{
"path": "builder/cloudos/s3_test.go",
"selector": "TestNewS3DriverKeepsConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cluster-resource.detect-subresource",
"title": "Detect cluster resource subresource path",
"title_zh": "\u8bc6\u522b\u96c6\u7fa4\u8d44\u6e90\u5b50\u8def\u5f84",
"interface_type": "workflow",
"interface": "api/handler.containsSlash",
"code_paths": [
"api/handler/cluster_resource.go"
],
"tests": [
{
"path": "api/handler/cluster_resource_test.go",
"selector": "TestContainsSlash"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cluster-resource.exclude-terminal-pods",
"title": "Exclude terminal pods from cluster resource allocation",
"title_zh": "\u4ece\u96c6\u7fa4\u8d44\u6e90\u5206\u914d\u7edf\u8ba1\u4e2d\u6392\u9664\u7ec8\u6001 Pod",
"interface_type": "workflow",
"interface": "api/handler.(*TenantAction).initClusterResource",
"code_paths": [
"api/handler/tenant.go"
],
"tests": [
{
"path": "api/handler/resource_query_scope_test.go",
"selector": "TestInitClusterResourceExcludesTerminalPods"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cluster-resource.handler-singleton",
"title": "Reuse singleton cluster resource handler",
"title_zh": "\u590d\u7528\u96c6\u7fa4\u8d44\u6e90\u5904\u7406\u5668\u5355\u4f8b",
"interface_type": "workflow",
"interface": "api/handler.GetClusterResourceHandler",
"code_paths": [
"api/handler/cluster_resource.go"
],
"tests": [
{
"path": "api/handler/cluster_resource_test.go",
"selector": "TestGetClusterResourceHandlerSingleton"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.cluster-resource.validate-gvr",
"title": "Validate cluster resource GVR parameters",
"title_zh": "\u6821\u9a8c\u96c6\u7fa4\u8d44\u6e90 GVR \u53c2\u6570",
"interface_type": "workflow",
"interface": "api/handler.validateGVRParams",
"code_paths": [
"api/handler/cluster_resource.go"
],
"tests": [
{
"path": "api/handler/cluster_resource_test.go",
"selector": "TestValidateGVRParams"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cluster.rbd-component-readiness",
"title": "Rainbond component readiness overview",
"title_zh": "Rainbond component readiness overview",
"interface_type": "handler_method",
"interface": "api/handler.clusterAction.ListRainbondComponents",
"code_paths": [
"api/handler/cluster.go"
],
"tests": [
{
"path": "api/handler/cluster_overview_test.go",
"selector": "TestPodReadyForOverview"
},
{
"path": "api/handler/cluster_overview_test.go",
"selector": "TestBuildRainbondComponentOverviewSortsByName"
},
{
"path": "api/handler/cluster_overview_test.go",
"selector": "TestFinalizeRainbondComponentOverviewKeepsZeroPodOperatorSorted"
},
{
"path": "api/handler/cluster_overview_test.go",
"selector": "TestDeduplicateRainbondComponentPodsPreventsOverlappingCounts"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cluster.upgrade-preserves-component-config",
"title": "Preserve custom component configuration during image upgrades",
"title_zh": "Preserve custom component configuration during image upgrades",
"interface_type": "view_endpoint",
"interface": "POST /v2/cluster/rbd-upgrade",
"code_paths": [
"api/controller/cluster.go"
],
"tests": [
{
"path": "api/controller/cluster_upgrade_test.go",
"selector": "TestUpgradePreservesComponentConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.extract-major",
"title": "Extract major version from CNB spec",
"title_zh": "\u4ece CNB \u7248\u672c\u8868\u8fbe\u5f0f\u63d0\u53d6\u4e3b\u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/code.extractMajorFromSpec",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestExtractMajorFromSpec"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.golang-order-and-default",
"title": "Keep Go CNB versions ordered with the latest default",
"title_zh": "\u4fdd\u6301 Go CNB \u7248\u672c\u987a\u5e8f\u5e76\u5c06\u6700\u65b0\u7248\u672c\u8bbe\u4e3a\u9ed8\u8ba4",
"interface_type": "workflow",
"interface": "builder/parser/code.GetCNBVersions",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestGetCNBVersionsGoOrderingAndDefault"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.match-golang",
"title": "Normalize and match Go CNB version specs",
"title_zh": "\u5f52\u4e00\u5316\u5e76\u5339\u914d Go CNB \u7248\u672c\u8868\u8fbe\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.MatchCNBVersion",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestMatchCNBVersion_Golang"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.match-language",
"title": "Match CNB version for composite language",
"title_zh": "\u4e3a\u590d\u5408\u8bed\u8a00\u5339\u914d CNB \u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/code.MatchCNBVersion",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestMatchCNBVersion_CompositeLanguage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.python-order-and-default",
"title": "Keep Python CNB versions ordered with the latest default",
"title_zh": "\u4fdd\u6301 Python CNB \u7248\u672c\u987a\u5e8f\u5e76\u5c06\u6700\u65b0\u7248\u672c\u8bbe\u4e3a\u9ed8\u8ba4",
"interface_type": "workflow",
"interface": "builder/parser/code.GetCNBVersions",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestGetCNBVersionsPythonOrderingAndDefault"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb-version.resolve-supported",
"title": "Resolve supported CNB versions by language",
"title_zh": "\u6309\u8bed\u8a00\u89e3\u6790\u652f\u6301\u7684 CNB \u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/code.GetCNBVersions",
"code_paths": [
"builder/parser/code/cnb_versions.go"
],
"tests": [
{
"path": "builder/parser/code/cnb_versions_test.go",
"selector": "TestGetCNBVersions"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.annotation-key-decode",
"title": "Decode CNB annotation key into BP env name",
"title_zh": "\u5c06 CNB \u6ce8\u89e3\u952e\u89e3\u7801\u4e3a BP \u73af\u5883\u53d8\u91cf\u540d",
"interface_type": "workflow",
"interface": "builder/build/cnb.annotationKeyToBPEnv",
"code_paths": [
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestAnnotationKeyToBPEnv"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.annotation-key-encode",
"title": "Encode BP env name into CNB annotation key",
"title_zh": "\u5c06 BP \u73af\u5883\u53d8\u91cf\u540d\u7f16\u7801\u4e3a CNB \u6ce8\u89e3\u952e",
"interface_type": "workflow",
"interface": "builder/build/cnb.bpEnvToAnnotationKey",
"code_paths": [
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBpEnvToAnnotationKey"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.bp-annotation-priority",
"title": "Keep explicit CNB annotations over BP passthrough values",
"title_zh": "\u663e\u5f0f CNB \u6ce8\u89e3\u4f18\u5148\u4e8e BP \u900f\u4f20\u503c",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildPlatformAnnotations",
"code_paths": [
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildPlatformAnnotationsBPNoOverride"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.build-job-execution",
"title": "Execute CNB build job lifecycle",
"title_zh": "\u6267\u884c CNB \u6784\u5efa\u4efb\u52a1\u5168\u6d41\u7a0b",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.runCNBBuildJob",
"code_paths": [
"builder/build/cnb/build.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestRunCNBBuildJob"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.builder-image",
"title": "Resolve CNB builder image from environment",
"title_zh": "\u89e3\u6790 CNB builder \u955c\u50cf",
"interface_type": "workflow",
"interface": "builder/build/cnb.GetCNBBuilderImage",
"code_paths": [
"builder/build/cnb/config.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestGetCNBBuilderImage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.config-file",
"title": "Inject specific CNB config file content",
"title_zh": "\u6ce8\u5165\u6307\u5b9a\u7684 CNB \u914d\u7f6e\u6587\u4ef6\u5185\u5bb9",
"interface_type": "workflow",
"interface": "builder/build/cnb.injectConfigFile",
"code_paths": [
"builder/build/cnb/lang_nodejs.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestInjectConfigFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.creator-args",
"title": "Build CNB creator command arguments",
"title_zh": "\u751f\u6210 CNB creator \u547d\u4ee4\u53c2\u6570",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildCreatorArgs",
"code_paths": [
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildCreatorArgs"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.creator-args-insecure-registry",
"title": "Append insecure registry args for CNB creator",
"title_zh": "\u4e3a CNB creator \u9644\u52a0 insecure registry \u53c2\u6570",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildCreatorArgs",
"code_paths": [
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildCreatorArgsInsecureRegistry"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.dependency-mirror",
"title": "Resolve CNB dependency mirror source",
"title_zh": "\u89e3\u6790 CNB \u4f9d\u8d56\u955c\u50cf\u6e90",
"interface_type": "workflow",
"interface": "builder/build/cnb.getDependencyMirror",
"code_paths": [
"builder/build/cnb/lang_nodejs.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildPlatformAnnotationsMirrorDefault"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildPlatformAnnotationsMirrorExplicit"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestGetDependencyMirrorOffline"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.env-vars",
"title": "Build CNB job environment variables",
"title_zh": "\u751f\u6210 CNB \u6784\u5efa\u4efb\u52a1\u73af\u5883\u53d8\u91cf",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildEnvVars",
"code_paths": [
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildEnvVars"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.mirror-config",
"title": "Inject CNB mirror config files by source mode",
"title_zh": "\u6309\u6765\u6e90\u6a21\u5f0f\u6ce8\u5165 CNB \u955c\u50cf\u914d\u7f6e",
"interface_type": "workflow",
"interface": "builder/build/cnb.nodejsConfig.InjectMirrorConfig",
"code_paths": [
"builder/build/cnb/lang_nodejs.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestInjectMirrorConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.mirror-config-write-error",
"title": "Propagate CNB mirror config write failure",
"title_zh": "\u4f20\u64ad CNB \u955c\u50cf\u914d\u7f6e\u5199\u5165\u5931\u8d25",
"interface_type": "workflow",
"interface": "builder/build/cnb.nodejsConfig.InjectMirrorConfig",
"code_paths": [
"builder/build/cnb/lang_nodejs.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestInjectMirrorConfigWriteError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.new-builder",
"title": "Create CNB builder instance",
"title_zh": "\u521b\u5efa CNB \u6784\u5efa\u5668\u5b9e\u4f8b",
"interface_type": "workflow",
"interface": "builder/build/cnb.NewBuilder",
"code_paths": [
"builder/build/cnb/build.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestNewBuilder"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.npm-cache-policy",
"title": "Avoid ineffective npm registry caching while retaining image layer reuse",
"title_zh": "Avoid ineffective npm registry caching while retaining image layer reuse",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildCreatorArgs",
"code_paths": [
"builder/build/cnb/cache_policy.go",
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cache_policy_test.go",
"selector": "TestCNBNPMCachePolicy"
},
{
"path": "builder/build/cnb/cache_policy_test.go",
"selector": "TestCNBCachePolicyExplainsAutomaticBypass"
},
{
"path": "builder/build/cnb/cache_policy_test.go",
"selector": "TestCNBCachePolicyPreservesCacheForUnknownSources"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.npm-global-registry",
"title": "Export NPM_CONFIG_REGISTRY for global npm installs",
"title_zh": "\u4e3a\u5168\u5c40 npm \u5b89\u88c5\u5bfc\u51fa NPM_CONFIG_REGISTRY",
"interface_type": "workflow",
"interface": "builder/build/cnb.resolveNpmRegistry",
"code_paths": [
"builder/build/cnb/lang_nodejs.go",
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestResolveNpmRegistry"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestNodejsNpmRegistryAnnotation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.npmrc-registry-parse",
"title": "Parse default registry key from .npmrc content",
"title_zh": "\u4ece .npmrc \u5185\u5bb9\u4e2d\u89e3\u6790\u9ed8\u8ba4 registry \u914d\u7f6e\u9879",
"interface_type": "package_function",
"interface": "builder/build/cnb.npmRegistryFromNpmrc",
"code_paths": [
"builder/build/cnb/lang_nodejs.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestNpmRegistryFromNpmrc"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.cnb.offline-mode",
"title": "Resolve offline mode CNB image behavior",
"title_zh": "\u89e3\u6790\u79bb\u7ebf\u6a21\u5f0f\u4e0b\u7684 CNB \u955c\u50cf\u884c\u4e3a",
"interface_type": "workflow",
"interface": "builder/build/cnb offline mode helpers",
"code_paths": [
"builder/build/cnb/config.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestIsOfflineMode"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestGetCNBBuilderImageOffline"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestGetCNBRunImageOffline"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.order-toml",
"title": "Write custom CNB order definition",
"title_zh": "\u5199\u5165\u81ea\u5b9a\u4e49 CNB order \u5b9a\u4e49",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.writeCustomOrder",
"code_paths": [
"builder/build/cnb/order.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestWriteCustomOrder"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.order-write-failure",
"title": "Return empty order flag when CNB order file write fails",
"title_zh": "CNB order \u6587\u4ef6\u5199\u5165\u5931\u8d25\u65f6\u8fd4\u56de\u7a7a\u6807\u8bb0",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.writeCustomOrder",
"code_paths": [
"builder/build/cnb/order.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestWriteCustomOrderFailure"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.package-workspace-isolation",
"title": "Isolate each CNB source package build from retained generated files",
"title_zh": "\u9694\u79bb\u6e90\u7801\u5305 CNB \u6784\u5efa\u5de5\u4f5c\u76ee\u5f55\u5e76\u4fdd\u7559\u539f\u59cb\u4e0a\u4f20\u5185\u5bb9",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.Build",
"code_paths": [
"builder/build/cnb/build.go",
"builder/parser/package_workspace.go",
"util/comman.go"
],
"tests": [
{
"path": "builder/build/cnb/package_workspace_test.go",
"selector": "TestCNBPackageBuildUsesPristineWorkspace"
},
{
"path": "builder/build/cnb/package_workspace_test.go",
"selector": "TestCNBNonPackageBuildKeepsSourceDirectory"
},
{
"path": "builder/parser/package_workspace_test.go",
"selector": "TestPreparePackageBuildWorkspace"
},
{
"path": "builder/parser/package_workspace_test.go",
"selector": "TestPreparePackageBuildWorkspaceRejectsInvalidInput"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.phase-timing",
"title": "Report observed CNB lifecycle phase durations without changing build output",
"title_zh": "Report observed CNB lifecycle phase durations without changing build output",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.runCNBBuildJob",
"code_paths": [
"builder/build/cnb/phase_logger.go",
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/phase_logger_test.go",
"selector": "TestCNBPhaseTiming"
},
{
"path": "builder/build/cnb/phase_logger_test.go",
"selector": "TestCNBPhaseTimingHandlesFragmentedLogs"
},
{
"path": "builder/build/cnb/phase_logger_test.go",
"selector": "TestCNBPhaseTimingPreservesWriterErrors"
},
{
"path": "builder/build/cnb/phase_logger_test.go",
"selector": "TestCNBPhaseTimingSerializesConcurrentWrites"
},
{
"path": "builder/build/cnb/phase_logger_test.go",
"selector": "TestCNBJobEmitsFinalPhaseTiming"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.platform-annotations",
"title": "Build CNB platform annotations from build envs",
"title_zh": "\u6839\u636e\u6784\u5efa\u73af\u5883\u751f\u6210 CNB \u5e73\u53f0\u6ce8\u89e3",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.buildPlatformAnnotations",
"code_paths": [
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestBuildPlatformAnnotations"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.platform-volume",
"title": "Create CNB platform volume from annotations",
"title_zh": "\u6839\u636e\u6ce8\u89e3\u521b\u5efa CNB \u5e73\u53f0\u5377",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.createPlatformVolume",
"code_paths": [
"builder/build/cnb/platform.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestCreatePlatformVolume"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestCreatePlatformVolumeEmpty"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestCreatePlatformVolumeNonCNBKeys"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.prebuild-job-cleanup",
"title": "Clean up previous CNB prebuild jobs",
"title_zh": "\u6e05\u7406\u5386\u53f2 CNB \u9884\u6784\u5efa\u4efb\u52a1",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.stopPreBuildJob",
"code_paths": [
"builder/build/cnb/build.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestStopPreBuildJob"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.project-file-validation",
"title": "Validate project files before CNB build",
"title_zh": "CNB \u6784\u5efa\u524d\u6821\u9a8c\u9879\u76ee\u6587\u4ef6",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.validateProjectFiles",
"code_paths": [
"builder/build/cnb/build.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestValidateProjectFiles"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.run-image",
"title": "Resolve CNB run image from environment",
"title_zh": "\u89e3\u6790 CNB run \u955c\u50cf",
"interface_type": "workflow",
"interface": "builder/build/cnb.GetCNBRunImage",
"code_paths": [
"builder/build/cnb/config.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestGetCNBRunImage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.source-dir-permissions",
"title": "Normalize source directory permissions before CNB build",
"title_zh": "CNB \u6784\u5efa\u524d\u89c4\u8303\u5316\u6e90\u7801\u76ee\u5f55\u6743\u9650",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.setSourceDirPermissions",
"code_paths": [
"builder/build/cnb/build.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestSetSourceDirPermissions"
},
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestSetSourceDirPermissionsNonexistent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.static-buildpacks",
"title": "Select nginx buildpack for pure static source",
"title_zh": "\u7eaf\u9759\u6001\u6e90\u7801\u4f7f\u7528 nginx buildpack",
"interface_type": "workflow",
"interface": "builder/build/cnb.staticConfig.CustomOrder",
"code_paths": [
"builder/build/cnb/order.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestStaticBuildpacks"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.volume-mounts",
"title": "Create CNB build volumes and mounts",
"title_zh": "\u521b\u5efa CNB \u6784\u5efa\u5377\u4e0e\u6302\u8f7d",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.createVolumeAndMount",
"code_paths": [
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestCreateVolumeAndMount"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.cnb.waiting-complete",
"title": "Wait for CNB build job completion status",
"title_zh": "\u7b49\u5f85 CNB \u6784\u5efa\u4efb\u52a1\u5b8c\u6210\u72b6\u6001",
"interface_type": "workflow",
"interface": "builder/build/cnb.Builder.waitingComplete",
"code_paths": [
"builder/build/cnb/job.go"
],
"tests": [
{
"path": "builder/build/cnb/cnb_test.go",
"selector": "TestWaitingComplete"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-delete-blocks-shared-mount",
"title": "Block deleting shared mounted component volumes",
"title_zh": "Block deleting shared mounted component volumes",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.VolumnVar",
"code_paths": [
"api/handler/service.go",
"db/dao/dao.go",
"db/mysql/dao/tenants.go"
],
"tests": [
{
"path": "api/handler/service_volume_test.go",
"selector": "TestServiceActionVolumnVarDeleteRejectsSharedMountedVolume"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-expansion-only-grows",
"title": "Reject PVC volume shrink requests",
"title_zh": "Reject PVC volume shrink requests",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.UpdVolume",
"code_paths": [
"api/handler/service_volume_expansion.go",
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_test.go",
"selector": "TestServiceActionUpdVolumeRejectsShrink"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-expansion-reconciles-drift",
"title": "Reconcile PVC request with stored volume capacity",
"title_zh": "Reconcile PVC request with stored volume capacity",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.UpdVolume",
"code_paths": [
"api/handler/service_volume_expansion.go",
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_test.go",
"selector": "TestServiceActionUpdVolumeReconcilesStoredCapacity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-expansion-status",
"title": "Report PVC volume expansion capability and status",
"title_zh": "Report PVC volume expansion capability and status",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.GetVolumes",
"code_paths": [
"api/handler/service_volume_expansion.go",
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_expansion_test.go",
"selector": "TestInspectVolumeExpansion"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.component.volume-expansion-updates-claims",
"title": "Expand every PVC for a component volume",
"title_zh": "Expand every PVC for a component volume",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.UpdVolume",
"code_paths": [
"api/handler/service_volume_expansion.go",
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_expansion_test.go",
"selector": "TestExpandVolumeClaims"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-path-update-without-expansion",
"title": "Path edits with unchanged capacity do not require PVC expansion support",
"title_zh": "Path edits with unchanged capacity do not require PVC expansion support",
"interface_type": "handler_method",
"interface": "ServiceAction.UpdVolume",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_test.go",
"selector": "TestServiceActionUpdVolumePathDoesNotRequireExpansion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-update-persists-capacity",
"title": "Persist component volume capacity updates",
"title_zh": "\u6301\u4e45\u5316\u7ec4\u4ef6\u5b58\u50a8\u5bb9\u91cf\u66f4\u65b0",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.UpdVolume",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_volume_test.go",
"selector": "TestServiceActionUpdVolumeUpdatesVolumeCapacity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.component.volume-update-preserves-capacity",
"title": "Preserve volume capacity in update request payloads",
"title_zh": "\u7ec4\u4ef6\u5b58\u50a8\u66f4\u65b0\u8bf7\u6c42\u4fdd\u7559\u5bb9\u91cf\u5b57\u6bb5",
"interface_type": "other",
"interface": "api/model.UpdVolumeReq",
"code_paths": [
"api/model/volume.go"
],
"tests": [
{
"path": "api/model/volume_test.go",
"selector": "TestUpdVolumeReqPreservesVolumeCapacityFromJSON"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.config-volume-file-content",
"title": "Preserve config volume file content field semantics",
"title_zh": "\u4fdd\u7559\u914d\u7f6e\u5377\u6587\u4ef6\u5185\u5bb9\u5b57\u6bb5\u8bed\u4e49",
"interface_type": "workflow",
"interface": "builder/parser/types.Volume.FileContent",
"code_paths": [
"builder/parser/types/types.go"
],
"tests": [
{
"path": "builder/parser/file_content_test.go",
"selector": "TestVolumeFileContent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.config-volume-path-mode",
"title": "Docker Compose config volumes keep container path and mode",
"title_zh": "Docker Compose config volumes keep container path and mode",
"interface_type": "workflow",
"interface": "builder/parser.DockerComposeParse.Parse",
"code_paths": [
"builder/parser/docker_compose.go",
"builder/parser/compose/volume_helpers.go"
],
"tests": [
{
"path": "builder/parser/docker_compose_warnings_test.go",
"selector": "TestDockerComposeParseConfigVolumeUsesContainerPathAndMode"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.detect-config-file-mount",
"title": "Detect config-file style bind mounts",
"title_zh": "\u8bc6\u522b\u914d\u7f6e\u6587\u4ef6\u7c7b\u578b\u7684\u6302\u8f7d\u8def\u5f84",
"interface_type": "workflow",
"interface": "builder/parser/compose.isConfigFile",
"code_paths": [
"builder/parser/compose/version_detect.go"
],
"tests": [
{
"path": "builder/parser/compose/version_detect_test.go",
"selector": "TestIsConfigFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.detect-version",
"title": "Infer compose file version from features",
"title_zh": "\u6839\u636e\u8bed\u6cd5\u7279\u5f81\u63a8\u65ad compose \u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/compose.inferComposeVersion",
"code_paths": [
"builder/parser/compose/version_detect.go"
],
"tests": [
{
"path": "builder/parser/compose/version_detect_test.go",
"selector": "TestInferComposeVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.missing-file-bind-warning",
"title": "Warn when missing bind mount looks like a file",
"title_zh": "Warn when missing bind mount looks like a file",
"interface_type": "workflow",
"interface": "builder/parser.DockerComposeParse.Parse",
"code_paths": [
"builder/parser/docker_compose.go"
],
"tests": [
{
"path": "builder/parser/docker_compose_warnings_test.go",
"selector": "TestDockerComposeParseWarnsMissingFileLikeBindMount"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.parse-warnings",
"title": "Parse docker compose file and return degraded warnings",
"title_zh": "\u89e3\u6790 docker compose \u5e76\u8fd4\u56de\u964d\u7ea7\u544a\u8b66",
"interface_type": "workflow",
"interface": "builder/parser.CreateDockerComposeParse.Parse",
"code_paths": [
"builder/parser/docker_compose.go"
],
"tests": [
{
"path": "builder/parser/docker_compose_warnings_test.go",
"selector": "TestDockerComposeParseWithWarnings"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.preserve-volume-source-path",
"title": "Preserve docker compose volume source paths",
"title_zh": "Preserve docker compose volume source paths",
"interface_type": "package_function",
"interface": "builder/parser/compose.loadV3Volumes",
"code_paths": [
"builder/parser/compose/version3.go"
],
"tests": [
{
"path": "builder/parser/compose/version_detect_test.go",
"selector": "TestLoadV3VolumesPreservesSourcePathUnderscores"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.compose.yaml-anchor-support",
"title": "Support YAML anchors in docker compose parsing",
"title_zh": "\u652f\u6301 docker compose \u4e2d\u7684 YAML anchors",
"interface_type": "workflow",
"interface": "builder/parser.CreateDockerComposeParse.Parse",
"code_paths": [
"builder/parser/docker_compose.go"
],
"tests": [
{
"path": "builder/parser/docker_compose_warnings_test.go",
"selector": "TestDockerComposeParseWithYAMLAnchors"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-file.dependent-configmap-ownership",
"title": "Dependent config maps keep provider ownership",
"title_zh": "\u4f9d\u8d56\u914d\u7f6e\u6587\u4ef6\u4fdd\u6301\u63d0\u4f9b\u65b9\u6240\u6709\u6743",
"interface_type": "workflow",
"interface": "worker/appm/volume.ConfigFileVolume.CreateDependVolume",
"code_paths": [
"worker/appm/volume/config-file.go",
"worker/appm/controller/upgrade.go",
"worker/appm/types/v1/labels.go"
],
"tests": [
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateDependVolumeUsesProviderConfigMap"
},
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateDependVolumeForVMUsesProviderIdentity"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapLeavesExistingDependencyConfigMapToProvider"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapCreatesMissingDependencyConfigMapForProvider"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapDoesNotDeleteProviderDependency"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapReclaimsLegacyProviderConfigMap"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapDoesNotAdoptForeignCollision"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-file.dependent-source-key",
"title": "Dependent config files use provider source keys",
"title_zh": "\u4f9d\u8d56\u914d\u7f6e\u6587\u4ef6\u4f7f\u7528\u63d0\u4f9b\u65b9\u6e90\u6587\u4ef6\u952e",
"interface_type": "workflow",
"interface": "worker/appm/volume.ConfigFileVolume.CreateDependVolume",
"code_paths": [
"worker/appm/volume/config-file.go",
"worker/appm/controller/upgrade.go"
],
"tests": [
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateDependVolumeUsesProviderFileKey"
},
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateDependVolumeForVMUsesProviderFileKey"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapMigratesOnlyLegacyDependentSourceKey"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapMigratesOnlyKnownLegacyConsumerConfigMap"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapRetriesDependentMigrationConflict"
},
{
"path": "worker/appm/controller/upgrade_test.go",
"selector": "TestUpgradeConfigMapHandlesDependentCreateRace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-file.k8s-volume-name-safe",
"title": "Keep config-file Kubernetes volume names DNS-safe",
"title_zh": "Keep config-file Kubernetes volume names DNS-safe",
"interface_type": "workflow",
"interface": "worker/appm/volume.ConfigFileVolume.CreateVolume",
"code_paths": [
"worker/appm/volume/config-file.go",
"worker/appm/volume/volume.go"
],
"tests": [
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateVolumeForDeploymentUsesK8sSafeVolumeName"
},
{
"path": "worker/appm/volume/share_file_vm_test.go",
"selector": "TestConfigFileVolumeCreateDependVolumeForDeploymentUsesK8sSafeVolumeName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-files.detect",
"title": "Detect npm and yarn config files in source tree",
"title_zh": "\u8bc6\u522b\u6e90\u7801\u76ee\u5f55\u4e2d\u7684 npm \u548c yarn \u914d\u7f6e\u6587\u4ef6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectConfigFiles",
"code_paths": [
"builder/parser/code/config_files.go"
],
"tests": [
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestDetectConfigFiles_Npmrc"
},
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestDetectConfigFiles_YarnrcClassic"
},
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestDetectConfigFiles_YarnrcYml"
},
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestDetectConfigFiles_Multiple"
},
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestDetectConfigFiles_None"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-files.has-any",
"title": "Detect whether source tree has any package manager config file",
"title_zh": "\u68c0\u6d4b\u6e90\u7801\u4e2d\u662f\u5426\u5b58\u5728\u5305\u7ba1\u7406\u5668\u914d\u7f6e\u6587\u4ef6",
"interface_type": "workflow",
"interface": "builder/parser/code.ConfigFiles.HasAnyConfigFile",
"code_paths": [
"builder/parser/code/config_files.go"
],
"tests": [
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestConfigFiles_HasAnyConfigFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-files.read-npmrc",
"title": "Read npmrc content from source tree",
"title_zh": "\u8bfb\u53d6\u6e90\u7801\u4e2d\u7684 npmrc \u5185\u5bb9",
"interface_type": "workflow",
"interface": "builder/parser/code.ConfigFiles.GetNpmrcContent",
"code_paths": [
"builder/parser/code/config_files.go"
],
"tests": [
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestConfigFiles_GetNpmrcContent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-files.read-yarnrc",
"title": "Read yarnrc content from source tree",
"title_zh": "\u8bfb\u53d6\u6e90\u7801\u4e2d\u7684 yarnrc \u5185\u5bb9",
"interface_type": "workflow",
"interface": "builder/parser/code.ConfigFiles.GetYarnrcContent",
"code_paths": [
"builder/parser/code/config_files.go"
],
"tests": [
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestConfigFiles_GetYarnrcContent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.config-files.resolve-relevant-file",
"title": "Resolve relevant config file for package manager",
"title_zh": "\u4e3a\u5305\u7ba1\u7406\u5668\u9009\u62e9\u76f8\u5173\u914d\u7f6e\u6587\u4ef6",
"interface_type": "workflow",
"interface": "builder/parser/code.ConfigFiles.GetRelevantConfigFile",
"code_paths": [
"builder/parser/code/config_files.go"
],
"tests": [
{
"path": "builder/parser/code/config_files_test.go",
"selector": "TestConfigFiles_GetRelevantConfigFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile-build.proxy-env-inheritance",
"title": "Dockerfile BuildKit proxy environment inheritance",
"title_zh": "Dockerfile BuildKit proxy environment inheritance",
"interface_type": "workflow",
"interface": "builder/build.buildKitProxyEnvVars",
"code_paths": [
"builder/build/dockerfile_build.go"
],
"tests": [
{
"path": "builder/build/dockerfile_build_test.go",
"selector": "TestBuildKitProxyEnvVars"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile-build.registry-mirror-toml",
"title": "Render BuildKit TOML with optional registry mirrors",
"title_zh": "Render BuildKit TOML with optional registry mirrors",
"interface_type": "workflow",
"interface": "builder/sources.buildKitTomlContent",
"code_paths": [
"builder/sources/image.go"
],
"tests": [
{
"path": "builder/sources/buildkit_toml_test.go",
"selector": "TestBuildKitTomlContent"
},
{
"path": "builder/sources/buildkit_toml_test.go",
"selector": "TestBuildKitTomlContentLegacyEquivalence"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile.line-info",
"title": "Track Dockerfile AST line information",
"title_zh": "\u8ddf\u8e2a Dockerfile AST \u7684\u884c\u53f7\u4fe1\u606f",
"interface_type": "workflow",
"interface": "util/dockerfile/parser.Parse",
"code_paths": [
"util/dockerfile/parser/parser.go"
],
"tests": [
{
"path": "util/dockerfile/parser/parser_test.go",
"selector": "TestLineInformation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile.parse-fixtures",
"title": "Parse canonical Dockerfile fixtures into stable ASTs",
"title_zh": "\u5c06\u6807\u51c6 Dockerfile \u793a\u4f8b\u89e3\u6790\u4e3a\u7a33\u5b9a AST",
"interface_type": "workflow",
"interface": "util/dockerfile/parser.Parse",
"code_paths": [
"util/dockerfile/parser/parser.go"
],
"tests": [
{
"path": "util/dockerfile/parser/parser_test.go",
"selector": "TestTestData"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile.parse-json-array",
"title": "Parse JSON array syntax in Dockerfile instructions",
"title_zh": "\u89e3\u6790 Dockerfile \u6307\u4ee4\u4e2d\u7684 JSON \u6570\u7ec4\u8bed\u6cd5",
"interface_type": "workflow",
"interface": "util/dockerfile/parser.parseJSON",
"code_paths": [
"util/dockerfile/parser/line_parsers.go"
],
"tests": [
{
"path": "util/dockerfile/parser/json_test.go",
"selector": "TestJSONArraysOfStrings"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile.parse-words",
"title": "Split Dockerfile instruction words with quoting rules",
"title_zh": "\u6309\u5f15\u53f7\u4e0e\u8f6c\u4e49\u89c4\u5219\u62c6\u5206 Dockerfile \u6307\u4ee4\u53c2\u6570",
"interface_type": "workflow",
"interface": "util/dockerfile/parser.parseWords",
"code_paths": [
"util/dockerfile/parser/parser.go"
],
"tests": [
{
"path": "util/dockerfile/parser/parser_test.go",
"selector": "TestParseWords"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.dockerfile.reject-invalid",
"title": "Reject invalid Dockerfile fixtures during parsing",
"title_zh": "\u89e3\u6790 Dockerfile \u65f6\u62d2\u7edd\u65e0\u6548\u793a\u4f8b",
"interface_type": "workflow",
"interface": "util/dockerfile/parser.Parse",
"code_paths": [
"util/dockerfile/parser/parser.go"
],
"tests": [
{
"path": "util/dockerfile/parser/parser_test.go",
"selector": "TestTestNegative"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.endpoint.address-split",
"title": "Split endpoint addresses from schemes and ports",
"title_zh": "\u4ece\u534f\u8bae\u4e0e\u7aef\u53e3\u4e2d\u62c6\u5206\u7aef\u70b9\u5730\u5740",
"interface_type": "workflow",
"interface": "util/endpoint.SplitEndpointAddress",
"code_paths": [
"util/endpoint/validation.go"
],
"tests": [
{
"path": "util/endpoint/validation_test.go",
"selector": "TestSplitEndpointAddress"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.endpoint.domain-not-ip",
"title": "Detect when endpoint addresses should be treated as domains instead of IPs",
"title_zh": "\u5224\u65ad\u7aef\u70b9\u5730\u5740\u5e94\u6309\u57df\u540d\u800c\u4e0d\u662f IP \u5904\u7406",
"interface_type": "workflow",
"interface": "util/endpoint.IsDomainNotIP",
"code_paths": [
"util/endpoint/validation.go"
],
"tests": [
{
"path": "util/endpoint/validation_test.go",
"selector": "TestIsDomainNotIP"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.endpoint.domain-validate",
"title": "Validate endpoint domains and wildcard domains",
"title_zh": "\u6821\u9a8c\u7aef\u70b9\u57df\u540d\u53ca\u901a\u914d\u57df\u540d",
"interface_type": "workflow",
"interface": "util/endpoint.ValidateDomain",
"code_paths": [
"util/endpoint/validation.go"
],
"tests": [
{
"path": "util/endpoint/validation_test.go",
"selector": "TestValidateDomain"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.endpoint.ip-validate",
"title": "Validate endpoint IP addresses and reject restricted ranges",
"title_zh": "\u6821\u9a8c\u7aef\u70b9 IP \u5730\u5740\u5e76\u62d2\u7edd\u53d7\u9650\u7f51\u6bb5",
"interface_type": "workflow",
"interface": "util/endpoint.ValidateEndpointIP",
"code_paths": [
"util/endpoint/validation.go"
],
"tests": [
{
"path": "util/endpoint/validation_test.go",
"selector": "TestValidateEndpointIP"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.env-var.noop-update",
"title": "Treat no-op component env updates as success",
"title_zh": "Treat no-op component env updates as success",
"interface_type": "dao_method",
"interface": "db.mysql.dao.TenantServiceEnvVarDaoImpl.UpdateModelByAttrName",
"code_paths": [
"db/mysql/dao/tenants.go"
],
"tests": [
{
"path": "db/mysql/dao/tenant_service_env_var_test.go",
"selector": "TestTenantServiceEnvVarDaoUpdateModelByAttrNameNoopSucceeds"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.envutil.custom-memory",
"title": "Decide whether memory sizes are custom or predefined",
"title_zh": "\u5224\u65ad\u5185\u5b58\u5927\u5c0f\u662f\u81ea\u5b9a\u4e49\u503c\u8fd8\u662f\u9884\u8bbe\u503c",
"interface_type": "workflow",
"interface": "util/envutil.IsCustomMemory",
"code_paths": [
"util/envutil/envutil.go"
],
"tests": [
{
"path": "util/envutil/envutil_test.go",
"selector": "TestIsCustomMemory"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.envutil.getenv-default",
"title": "Return default values for missing environment variables in envutil",
"title_zh": "\u5728 envutil \u4e2d\u4e3a\u7f3a\u5931\u73af\u5883\u53d8\u91cf\u8fd4\u56de\u9ed8\u8ba4\u503c",
"interface_type": "workflow",
"interface": "util/envutil.GetenvDefault",
"code_paths": [
"util/envutil/envutil.go"
],
"tests": [
{
"path": "util/envutil/envutil_test.go",
"selector": "TestGetenvDefault"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.envutil.memory-label",
"title": "Map memory sizes to preset memory labels",
"title_zh": "\u5c06\u5185\u5b58\u5927\u5c0f\u6620\u5c04\u4e3a\u9884\u8bbe\u5185\u5b58\u6807\u7b7e",
"interface_type": "workflow",
"interface": "util/envutil.GetMemoryType",
"code_paths": [
"util/envutil/envutil.go"
],
"tests": [
{
"path": "util/envutil/envutil_test.go",
"selector": "TestGetMemoryType"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.event-log.require-log-identity",
"title": "Reject log list requests without a component identity",
"title_zh": "Reject log list requests without a component identity",
"interface_type": "view_endpoint",
"interface": "GET /v2/cluster/log-file",
"code_paths": [
"api/controller/event_log.go"
],
"tests": [
{
"path": "api/controller/event_log_test.go",
"selector": "TestLogListRejectsMissingLogIdentity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.eventlog.file-store",
"title": "Append, read, delete and clean event log file store",
"title_zh": "\u4e8b\u4ef6\u65e5\u5fd7\u6587\u4ef6\u5b58\u50a8\u7684\u8ffd\u52a0\u8bfb\u53d6\u4e0e\u6e05\u7406",
"interface_type": "workflow",
"interface": "api/eventlog/store.JSONLinesFileStore",
"code_paths": [
"api/eventlog/store/filestore.go"
],
"tests": [
{
"path": "api/eventlog/store/filestore_test.go",
"selector": "TestJSONLinesFileStore"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.eventlog.file-store-concurrency",
"title": "Support concurrent appends in event log file store",
"title_zh": "\u4e8b\u4ef6\u65e5\u5fd7\u6587\u4ef6\u5b58\u50a8\u652f\u6301\u5e76\u53d1\u5199\u5165",
"interface_type": "workflow",
"interface": "api/eventlog/store.JSONLinesFileStore.Append",
"code_paths": [
"api/eventlog/store/filestore.go"
],
"tests": [
{
"path": "api/eventlog/store/filestore_test.go",
"selector": "TestFileStoreConcurrency"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.file-operate.upload-folder-path-traversal",
"title": "Reject unsafe folder upload relative paths",
"title_zh": "\u6587\u4ef6\u64cd\u4f5c\u4e0a\u4f20\u62d2\u7edd\u4e0d\u5b89\u5168\u76f8\u5bf9\u8def\u5f84",
"interface_type": "handler_method",
"interface": "api/controller.resolveUploadRelativePath",
"code_paths": [
"api/controller/service_monitor.go"
],
"tests": [
{
"path": "api/controller/service_monitor_upload_test.go",
"selector": "TestResolveUploadRelativePathRejectsTraversal"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.file-operate.upload-folder-relative-path",
"title": "Preserve folder paths during file operation uploads",
"title_zh": "\u6587\u4ef6\u64cd\u4f5c\u4e0a\u4f20\u4fdd\u7559\u6587\u4ef6\u5939\u8def\u5f84",
"interface_type": "handler_method",
"interface": "api/controller.resolveUploadRelativePath",
"code_paths": [
"api/controller/service_monitor.go"
],
"tests": [
{
"path": "api/controller/service_monitor_upload_test.go",
"selector": "TestResolveUploadRelativePathPreservesFolderFromContentDisposition"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.filepersistence.volcengine-client-init",
"title": "Initialize and reuse Volcengine NAS clients idempotently",
"title_zh": "\u5e42\u7b49\u521d\u59cb\u5316\u5e76\u590d\u7528\u706b\u5c71\u5f15\u64ce NAS \u5ba2\u6237\u7aef",
"interface_type": "workflow",
"interface": "pkg/component/filepersistence.VolcengineProvider.init",
"code_paths": [
"pkg/component/filepersistence/volcengine.go"
],
"tests": [
{
"path": "pkg/component/filepersistence/volcengine_test.go",
"selector": "TestVolcengineProviderInitIsIdempotent"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.angular-spa",
"title": "Detect Angular SPA framework",
"title_zh": "\u8bc6\u522b Angular SPA \u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Angular_SPA"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.angular-ssr",
"title": "Detect Angular SSR framework",
"title_zh": "\u8bc6\u522b Angular SSR \u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Angular_SSR"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.cra",
"title": "Detect Create React App framework",
"title_zh": "\u8bc6\u522b Create React App \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_CRA"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.display-name",
"title": "Resolve framework display name",
"title_zh": "\u89e3\u6790\u6846\u67b6\u5c55\u793a\u540d\u79f0",
"interface_type": "workflow",
"interface": "builder/parser/code.GetDisplayName",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestGetDisplayName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.express",
"title": "Detect Express framework",
"title_zh": "\u8bc6\u522b Express \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Express"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nestjs",
"title": "Detect NestJS framework",
"title_zh": "\u8bc6\u522b NestJS \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NestJS"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nextjs",
"title": "Detect Next.js framework from source tree",
"title_zh": "\u4ece\u6e90\u7801\u76ee\u5f55\u8bc6\u522b Next.js \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NextJS"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nextjs-no-config",
"title": "Detect Next.js without config file",
"title_zh": "\u65e0\u914d\u7f6e\u6587\u4ef6\u65f6\u8bc6\u522b Next.js",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NextJS_NoConfigFile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nextjs-ssr",
"title": "Detect Next.js SSR mode",
"title_zh": "\u8bc6\u522b Next.js SSR \u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NextJS_SSR"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nextjs-static-export",
"title": "Detect Next.js static export mode",
"title_zh": "\u8bc6\u522b Next.js \u9759\u6001\u5bfc\u51fa\u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NextJS_StaticExport"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.no-framework",
"title": "Return no framework for plain Node project",
"title_zh": "\u666e\u901a Node \u9879\u76ee\u4e0d\u8bc6\u522b\u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NoFramework"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.no-package-json",
"title": "Return no framework when package.json is missing",
"title_zh": "\u7f3a\u5c11 package.json \u65f6\u4e0d\u8bc6\u522b\u524d\u7aef\u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_NoPackageJSON"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nuxt",
"title": "Detect Nuxt framework from source tree",
"title_zh": "\u4ece\u6e90\u7801\u76ee\u5f55\u8bc6\u522b Nuxt \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Nuxt"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nuxt-static-target",
"title": "Detect Nuxt static target mode",
"title_zh": "\u8bc6\u522b Nuxt \u9759\u6001\u76ee\u6807\u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Nuxt_StaticTarget"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nuxt3-ssr-false",
"title": "Detect Nuxt3 with ssr disabled",
"title_zh": "\u8bc6\u522b\u5173\u95ed SSR \u7684 Nuxt3",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Nuxt3_SSRFalse"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.nuxt3-static",
"title": "Detect Nuxt3 nitro static mode",
"title_zh": "\u8bc6\u522b Nuxt3 \u9759\u6001\u8f93\u51fa\u6a21\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Nuxt3_NitroStatic"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.supported-list",
"title": "List supported frontend frameworks",
"title_zh": "\u5217\u51fa\u652f\u6301\u8bc6\u522b\u7684\u524d\u7aef\u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.GetSupportedFrameworks",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestGetSupportedFrameworks"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.version-normalization",
"title": "Normalize framework dependency version strings",
"title_zh": "\u89c4\u8303\u5316\u6846\u67b6\u4f9d\u8d56\u7248\u672c\u53f7",
"interface_type": "workflow",
"interface": "builder/parser/code.cleanVersion",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestCleanVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.framework-detect.vite",
"title": "Detect Vite framework",
"title_zh": "\u8bc6\u522b Vite \u6846\u67b6",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectFramework",
"code_paths": [
"builder/parser/code/framework.go"
],
"tests": [
{
"path": "builder/parser/code/framework_test.go",
"selector": "TestDetectFramework_Vite"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.allocate-lb-port",
"title": "Allocate available gateway load balancer port",
"title_zh": "\u5206\u914d\u53ef\u7528\u7f51\u5173\u8d1f\u8f7d\u5747\u8861\u7aef\u53e3",
"interface_type": "workflow",
"interface": "api/handler.selectAvailablePort",
"code_paths": [
"api/handler/gateway_action.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestSelectAvailablePort"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.auto-certificate-route-lifecycle",
"title": "Reconcile automatic certificate resources across route ownership changes",
"title_zh": "Reconcile automatic certificate resources across route ownership changes",
"interface_type": "workflow",
"interface": "automatic certificate route lifecycle",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestEnsureCertManagerResourcesAdoptsExistingRouteOwnership"
},
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestDeleteCertManagerResourcesRemovesCertificateAndTLS"
},
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCertManagerRouteNameUsesResourceSegment"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.certificate-resource-consistency",
"title": "Keep gateway certificate resources consistent",
"title_zh": "Keep gateway certificate resources consistent",
"interface_type": "handler_method",
"interface": "api/handler.GatewayAction.AddGatewayCertificate",
"code_paths": [
"api/handler/gateway_action.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestGatewayCertificateResourceConsistency"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.client-ca-lifecycle",
"title": "Manage gateway client CA lifecycle",
"title_zh": "Manage gateway client CA lifecycle",
"interface_type": "handler_method",
"interface": "api/handler.GatewayAction.AddGatewayClientCA",
"code_paths": [
"api/handler/gateway_action.go",
"api/model/gateway_model.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestGatewayClientCALifecycle"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.domain-mtls",
"title": "Configure inbound mTLS per gateway domain",
"title_zh": "Configure inbound mTLS per gateway domain",
"interface_type": "handler_method",
"interface": "api/handler.GatewayAction.ConfigureGatewayDomainMTLS",
"code_paths": [
"api/handler/gateway_action.go",
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestGatewayDomainMTLS"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.http-route-delete-component-event",
"title": "Record component event when deleting Gateway HTTPRoute",
"title_zh": "\u5220\u9664\u7f51\u5173 HTTPRoute \u65f6\u8bb0\u5f55\u7ec4\u4ef6\u4e8b\u4ef6",
"interface_type": "service_method",
"interface": "github.com/goodrain/rainbond/api/handler.(*GatewayAction).DeleteGatewayHTTPRoute",
"code_paths": [
"api/handler/gateway_action.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestCreateGatewayHTTPRouteDeleteEvents"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.http-route-source-ip-validation",
"title": "Normalize and validate HTTP route source IP restrictions",
"title_zh": "Normalize and validate HTTP route source IP restrictions",
"interface_type": "handler_method",
"interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_remote_addrs_test.go",
"selector": "TestCreateHTTPAPIRouteNormalizesRemoteAddrs"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.http-route-stable-rule-name",
"title": "Keep APISIX HTTP route rule identity stable",
"title_zh": "Keep APISIX HTTP route rule identity stable",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestStableHTTPRouteRuleName"
},
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestHTTPRouteCreateFailure"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.prevent-tcp-route-delete-recreation-race",
"title": "Protect recreated TCP route Services with UID delete preconditions",
"title_zh": "Protect recreated TCP route Services with UID delete preconditions",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestDeleteTCPRouteDoesNotDeleteRecreatedServiceWithStaleUID"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.protect-tcp-route-service-ownership",
"title": "Reject TCP route updates for missing or different Service owners",
"title_zh": "Reject TCP route updates for missing or different Service owners",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.CreateTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCreateTCPRouteRejectsExistingServiceWithoutMatchingOwner"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.protect-unlabeled-tcp-route-service",
"title": "Do not delete unlabeled TCP route Services for owned requests",
"title_zh": "Do not delete unlabeled TCP route Services for owned requests",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestDeleteTCPRouteWithServiceIDDoesNotDeleteUnlabeledService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.reassign-conflicting-imported-tcp-port",
"title": "Reassign imported TCP ports that conflict with existing NodePorts",
"interface_type": "package_function",
"interface": "api/handler.reassignConflictingTCPRulePorts",
"code_paths": [
"api/handler/gateway_action.go"
],
"tests": [
{
"path": "api/handler/gateway_action_test.go",
"selector": "TestReassignConflictingTCPRulePorts"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.reconcile-stale-tcp-nodeport-rules",
"title": "Reconcile stale TCP NodePort database rules after Kubernetes allocation",
"title_zh": "Reconcile stale TCP NodePort database rules after Kubernetes allocation",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.CreateTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCreateTCPRouteReconcilesStaleDatabaseRules"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.reject-duplicate-tcp-nodeport",
"title": "Reject duplicate TCP NodePort bindings",
"title_zh": "Reject duplicate TCP NodePort bindings",
"interface_type": "workflow",
"interface": "TCP NodePort binding",
"code_paths": [
"db/mysql/dao/gateway.go",
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "db/mysql/dao/gateway_test.go",
"selector": "TestTCPRuleDaoAddModelRejectsPortOwnedByAnotherRule"
},
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCreateTCPRouteRejectsExplicitPortOwnedByAnotherService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.release-absent-tcp-nodeport-owner",
"title": "Release only the requested owner when a TCP route Service is absent",
"title_zh": "Release only the requested owner when a TCP route Service is absent",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestDeleteTCPRouteAlreadyAbsentReleasesOnlyRequestedOwner"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.release-captured-tcp-nodeport-rules",
"title": "Release only TCP NodePort rules captured before Service deletion",
"title_zh": "Release only TCP NodePort rules captured before Service deletion",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestDeleteTCPRouteReleasesOnlyCapturedRuleIDs"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.report-tcp-service-create-error-details",
"title": "TCP route creation reports Kubernetes error details",
"title_zh": "TCP route creation reports Kubernetes error details",
"interface_type": "view_endpoint",
"interface": "POST /api-gateway/v1/{tenant_name}/routes/tcp",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestCreateTCPRouteReportsServiceCreateErrorDetails"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.validate-http-route-match",
"title": "Reject HTTP gateway routes without hosts or paths",
"title_zh": "Reject HTTP gateway routes without hosts or paths",
"interface_type": "workflow",
"interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestHTTPRouteResourceNameValidatesMatch"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.gateway.validate-tcp-nodeport-route-name",
"title": "Reject out-of-range TCP NodePorts parsed from route names",
"title_zh": "Reject out-of-range TCP NodePorts parsed from route names",
"interface_type": "package_function",
"interface": "api/controller/apigateway.nodePortFromTCPRouteName",
"code_paths": [
"api/controller/apigateway/api_gateway_route.go"
],
"tests": [
{
"path": "api/controller/apigateway/api_gateway_route_test.go",
"selector": "TestNodePortFromTCPRouteNameValidatesRange"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.app-version-format",
"title": "Format Helm application versions for history output",
"title_zh": "\u4e3a Helm \u5386\u53f2\u8f93\u51fa\u683c\u5f0f\u5316\u5e94\u7528\u7248\u672c\u53f7",
"interface_type": "workflow",
"interface": "pkg/helm.formatAppVersion",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestGetReleaseHistory"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.chart-name-format",
"title": "Format Helm chart names for history and summary output",
"title_zh": "\u4e3a\u5386\u53f2\u548c\u6458\u8981\u8f93\u51fa\u683c\u5f0f\u5316 Helm chart \u540d\u79f0",
"interface_type": "workflow",
"interface": "pkg/helm.formatChartName",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestGetReleaseHistory"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.classify-resources",
"title": "Classify helm release resources by kind",
"title_zh": "\u6309\u8d44\u6e90\u7c7b\u578b\u5f52\u7c7b Helm \u53d1\u5e03\u8d44\u6e90",
"interface_type": "workflow",
"interface": "api/handler.splitHelmReleaseResources",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestSplitHelmReleaseResourcesClassifiesKinds"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.default-namespace",
"title": "Derive default helm release namespace",
"title_zh": "\u63a8\u5bfc Helm \u53d1\u5e03\u9ed8\u8ba4\u547d\u540d\u7a7a\u95f4",
"interface_type": "workflow",
"interface": "api/handler.helmReleaseNamespace",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestHelmReleaseNamespaceUsesTenantNamespaceWhenPresent"
},
{
"path": "api/handler/helm_release_test.go",
"selector": "TestHelmReleaseNamespaceFallsBackToTenantUUID"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.detail-summary",
"title": "Summarize helm release detail",
"title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u8be6\u60c5",
"interface_type": "workflow",
"interface": "api/handler.summarizeHelmReleaseDetail",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestSummarizeHelmReleaseDetailBuildsStableDTO"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.history-summary",
"title": "Summarize Helm release history",
"title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u5386\u53f2",
"interface_type": "handler_method",
"interface": "api/handler.summarizeHelmReleaseHistory",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestSummarizeHelmReleaseHistoryBuildsStableDTO"
},
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestGetReleaseHistory"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.install-defaults",
"title": "Normalize Helm install defaults",
"title_zh": "\u89c4\u8303 Helm \u5b89\u88c5\u9ed8\u8ba4\u53c2\u6570",
"interface_type": "handler_method",
"interface": "api/handler.HelmReleaseInstallRequest.Normalize",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestHelmReleaseInstallRequestNormalizeDefaults"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.install-validate",
"title": "Validate Helm install request",
"title_zh": "\u6821\u9a8c Helm \u5b89\u88c5\u8bf7\u6c42",
"interface_type": "handler_method",
"interface": "api/handler.HelmReleaseInstallRequest.Validate",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestHelmReleaseInstallRequestValidate"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.installable-check",
"title": "Reject non-installable Helm chart types",
"title_zh": "\u62d2\u7edd\u4e0d\u53ef\u5b89\u88c5\u7684 Helm chart \u7c7b\u578b",
"interface_type": "workflow",
"interface": "pkg/helm.checkIfInstallable",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestCheckIfInstallable"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.list-summary",
"title": "Summarize helm release list item",
"title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u5217\u8868\u9879",
"interface_type": "workflow",
"interface": "api/handler.summarizeHelmRelease",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestSummarizeHelmReleaseBuildsStableDTO"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.match-managed-resource",
"title": "Match managed helm release resources",
"title_zh": "\u8bc6\u522b Helm \u6258\u7ba1\u8d44\u6e90\u5f52\u5c5e",
"interface_type": "workflow",
"interface": "api/handler.isHelmReleaseResource",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestIsHelmReleaseResourceMatchesManagedByAndInstanceLabels"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.oci-reference-normalize",
"title": "Normalize OCI chart references and derive version tags",
"title_zh": "\u89c4\u8303\u5316 OCI chart \u5f15\u7528\u5e76\u63a8\u5bfc\u7248\u672c\u6807\u7b7e",
"interface_type": "workflow",
"interface": "pkg/helm.normalizeOCIChartReference",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestNormalizeOCIChartReference"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.preview-source-error",
"title": "Convert helm preview source error to bad request",
"title_zh": "\u5c06 Helm \u9884\u89c8\u6765\u6e90\u9519\u8bef\u8f6c\u6362\u4e3a\u9519\u8bef\u8bf7\u6c42",
"interface_type": "workflow",
"interface": "api/handler.wrapHelmChartPreviewSourceError",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestWrapHelmChartPreviewSourceErrorConvertsToBadRequest"
},
{
"path": "api/handler/helm_release_test.go",
"selector": "TestWrapHelmChartPreviewSourceErrorPreservesBadRequest"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.resolve-namespace",
"title": "Resolve Helm release namespace",
"title_zh": "\u89e3\u6790 Helm \u53d1\u5e03\u547d\u540d\u7a7a\u95f4",
"interface_type": "handler_method",
"interface": "api/handler.HelmReleaseHandler.resolveNamespace",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestResolveHelmReleaseNamespaceUsesExplicitNamespace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.resolve-namespace-fallback",
"title": "Resolve helm namespace from tenant when request omits namespace",
"title_zh": "\u8bf7\u6c42\u672a\u6307\u5b9a\u65f6\u4ece\u56e2\u961f\u63a8\u5bfc Helm \u547d\u540d\u7a7a\u95f4",
"interface_type": "workflow",
"interface": "api/handler.(*HelmReleaseHandler).resolveNamespace",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestResolveHelmReleaseNamespaceFallsBackToTenantNamespace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.rollback-validate",
"title": "Validate helm release rollback revision",
"title_zh": "\u6821\u9a8c Helm \u56de\u6eda\u7248\u672c",
"interface_type": "workflow",
"interface": "api/handler.HelmReleaseRollbackRequest.Validate",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestHelmReleaseRollbackRequestValidate"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.strip-kube-version",
"title": "Strip kubeVersion requirements from charts before install or load",
"title_zh": "\u5728\u5b89\u88c5\u6216\u52a0\u8f7d\u524d\u79fb\u9664 chart \u7684 kubeVersion \u8981\u6c42",
"interface_type": "workflow",
"interface": "pkg/helm.removeKubeVersionFromChart",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestCheckIfInstallable"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.upgrade-chart-guard",
"title": "Guard helm upgrade chart mismatch",
"title_zh": "\u62e6\u622a Helm \u5347\u7ea7\u56fe\u8868\u4e0d\u5339\u914d",
"interface_type": "workflow",
"interface": "api/handler.validateUpgradeChartName",
"code_paths": [
"api/handler/helm_release.go"
],
"tests": [
{
"path": "api/handler/helm_release_test.go",
"selector": "TestValidateUpgradeChartNameRejectsMismatchByDefault"
},
{
"path": "api/handler/helm_release_test.go",
"selector": "TestValidateUpgradeChartNameAllowsMismatchWithExplicitConfirmation"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-release.values-yaml",
"title": "Parse Helm values YAML into installable values maps",
"title_zh": "\u5c06 Helm values YAML \u89e3\u6790\u4e3a\u53ef\u5b89\u88c5\u7684 values \u6620\u5c04",
"interface_type": "workflow",
"interface": "pkg/helm.parseValuesYAML",
"code_paths": [
"pkg/helm/helm.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestParseValuesYAML"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-repo.add",
"title": "Add helm repository",
"title_zh": "\u6dfb\u52a0 Helm \u4ed3\u5e93",
"interface_type": "workflow",
"interface": "pkg/helm.Repo.Add",
"code_paths": [
"pkg/helm/repo.go"
],
"tests": [
{
"path": "pkg/helm/repo_test.go",
"selector": "TestRepoAdd"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.helm-repo.add-idempotent",
"title": "Skip Helm repo add when the same repo already exists",
"title_zh": "\u5f53\u76f8\u540c Helm \u4ed3\u5e93\u5df2\u5b58\u5728\u65f6\u8df3\u8fc7\u91cd\u590d\u6dfb\u52a0",
"interface_type": "workflow",
"interface": "pkg/helm.Repo.Add",
"code_paths": [
"pkg/helm/repo.go"
],
"tests": [
{
"path": "pkg/helm/repo_test.go",
"selector": "TestRepoAddSkipsExistingConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-repo.reject-deprecated",
"title": "Reject deprecated Helm repository endpoints",
"title_zh": "\u62d2\u7edd\u5df2\u5e9f\u5f03\u7684 Helm \u4ed3\u5e93\u5730\u5740",
"interface_type": "workflow",
"interface": "pkg/helm.Repo.Add",
"code_paths": [
"pkg/helm/repo.go"
],
"tests": [
{
"path": "pkg/helm/repo_test.go",
"selector": "TestRepoAddRejectsDeprecatedRepo"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.helm-repo.requested-filter",
"title": "Validate and match requested Helm repository names",
"title_zh": "\u6821\u9a8c\u5e76\u5339\u914d\u8bf7\u6c42\u66f4\u65b0\u7684 Helm \u4ed3\u5e93\u540d\u79f0",
"interface_type": "workflow",
"interface": "pkg/helm.checkRequestedRepos",
"code_paths": [
"pkg/helm/update.go"
],
"tests": [
{
"path": "pkg/helm/helm_release_test.go",
"selector": "TestCheckRequestedRepos"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.image-clean.registry-gc-noop",
"title": "Skip registry garbage collect exec when no hub pod matches",
"title_zh": "\u5f53\u6ca1\u6709\u5339\u914d\u7684\u4ed3\u5e93 Pod \u65f6\u8df3\u8fc7\u5783\u573e\u56de\u6536\u6267\u884c",
"interface_type": "workflow",
"interface": "builder/clean.Manager.PodExecCmd",
"code_paths": [
"builder/clean/clean.go"
],
"tests": [
{
"path": "builder/clean/clean_test.go",
"selector": "TestPodExecCmdNoMatchingPod"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.image-clean.stop-loop",
"title": "Stop image clean manager by cancelling its loop context",
"title_zh": "\u901a\u8fc7\u53d6\u6d88\u4e0a\u4e0b\u6587\u505c\u6b62\u955c\u50cf\u6e05\u7406\u7ba1\u7406\u5668\u5faa\u73af",
"interface_type": "workflow",
"interface": "builder/clean.Manager.Stop",
"code_paths": [
"builder/clean/clean.go"
],
"tests": [
{
"path": "builder/clean/clean_test.go",
"selector": "TestManagerStopCancelsContext"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.image-share.single-attempt",
"title": "Run image share only once",
"title_zh": "\u955c\u50cf\u5206\u4eab\u5931\u8d25\u540e\u4e0d\u81ea\u52a8\u91cd\u8bd5",
"interface_type": "workflow",
"interface": "builder/exector.imageShare",
"code_paths": [
"builder/exector/exector.go"
],
"tests": [
{
"path": "builder/exector/share_image_test.go",
"selector": "TestExecuteImageShareOnceDoesNotRetryFailure"
},
{
"path": "builder/exector/share_image_test.go",
"selector": "TestExecuteImageShareOnceReturnsSuccess"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ingress-nginx.meta-namespace-key",
"title": "Build meta namespace keys for ingress-nginx watched objects",
"title_zh": "\u4e3a ingress-nginx \u76d1\u542c\u5bf9\u8c61\u6784\u5efa namespace/name \u952e",
"interface_type": "workflow",
"interface": "util/ingress-nginx/k8s.MetaNamespaceKey",
"code_paths": [
"util/ingress-nginx/k8s/main.go"
],
"tests": [
{
"path": "util/ingress-nginx/k8s/main_test.go",
"selector": "TestMetaNamespaceKey"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ingress-nginx.name-namespace-parse",
"title": "Parse namespace/name identifiers for ingress-nginx resources",
"title_zh": "\u89e3\u6790 ingress-nginx \u8d44\u6e90\u7684 namespace/name \u6807\u8bc6",
"interface_type": "workflow",
"interface": "util/ingress-nginx/k8s.ParseNameNS",
"code_paths": [
"util/ingress-nginx/k8s/main.go"
],
"tests": [
{
"path": "util/ingress-nginx/k8s/main_test.go",
"selector": "TestParseNameNS"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ingress-nginx.node-ip-resolve",
"title": "Resolve node internal or external IPs for ingress-nginx helpers",
"title_zh": "\u4e3a ingress-nginx helper \u89e3\u6790\u8282\u70b9\u5185\u5916\u7f51 IP",
"interface_type": "workflow",
"interface": "util/ingress-nginx/k8s.GetNodeIPOrName",
"code_paths": [
"util/ingress-nginx/k8s/main.go"
],
"tests": [
{
"path": "util/ingress-nginx/k8s/main_test.go",
"selector": "TestGetNodeIPOrName"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ingress-nginx.pod-details",
"title": "Resolve running ingress-nginx pod details from env and cluster state",
"title_zh": "\u6839\u636e\u73af\u5883\u53d8\u91cf\u548c\u96c6\u7fa4\u72b6\u6001\u89e3\u6790 ingress-nginx Pod \u8be6\u60c5",
"interface_type": "workflow",
"interface": "util/ingress-nginx/k8s.GetPodDetails",
"code_paths": [
"util/ingress-nginx/k8s/main.go"
],
"tests": [
{
"path": "util/ingress-nginx/k8s/main_test.go",
"selector": "TestGetPodDetails"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.crd-cascade-delete",
"title": "CRD cascade deletion preserves dependency order",
"title_zh": "CRD cascade deletion preserves dependency order",
"interface_type": "handler_method",
"interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionDeletesCustomResourcesBeforeDefinition"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.deletion-request-timeout",
"title": "Kubernetes deletion requests outlive the global HTTP timeout",
"title_zh": "Kubernetes deletion requests outlive the global HTTP timeout",
"interface_type": "workflow",
"interface": "pkg/interceptors.requestTimeout",
"code_paths": [
"pkg/interceptors/http.go"
],
"tests": [
{
"path": "pkg/interceptors/http_test.go",
"selector": "TestRequestTimeout"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.deletion-timeout-final-check",
"title": "Kubernetes deletion timeout performs a final live check",
"title_zh": "Kubernetes deletion timeout performs a final live check",
"interface_type": "handler_method",
"interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionFinalCheckAvoidsTimeoutRace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.failed-delete-metadata-only",
"title": "Failed resources are metadata-only during deletion",
"title_zh": "Failed resources are metadata-only during deletion",
"interface_type": "handler_method",
"interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionSkipsFailedResourceKubernetesDeletion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.metadata-reconcile",
"title": "Kubernetes resource metadata reconciliation",
"title_zh": "Kubernetes resource metadata reconciliation",
"interface_type": "handler_method",
"interface": "api/handler.k8sResourceDeletionOrchestrator.Reconcile",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceReconcileDistinguishesMissingAndUnknown"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.response-array-contract",
"title": "Resource deletion and reconciliation responses encode empty lists as arrays",
"title_zh": "Resource deletion and reconciliation responses encode empty lists as arrays",
"interface_type": "workflow",
"interface": "k8sResourceDeletionOrchestrator",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionResponseArrays"
},
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceReconcileResponseArrays"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s-resource.stop-recreating-controller",
"title": "Stop in-application controllers before deleting generated custom resources",
"title_zh": "Stop in-application controllers before deleting generated custom resources",
"interface_type": "handler_method",
"interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
"code_paths": [
"api/handler/resource_deletion.go"
],
"tests": [
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionStopsManagedControllerBeforeGeneratedResources"
},
{
"path": "api/handler/resource_deletion_test.go",
"selector": "TestK8sResourceDeletionKeepsControllerUntilFinalizedResourcesAreGone"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.k8s.scheme-registers-kubevirt-vm",
"title": "K8s scheme registers KubeVirt VirtualMachine",
"title_zh": "K8s scheme registers KubeVirt VirtualMachine",
"interface_type": "package_function",
"interface": "pkg/component/k8s.init",
"code_paths": [
"pkg/component/k8s/k8sComponent.go"
],
"tests": [
{
"path": "pkg/component/k8s/k8sComponent_test.go",
"selector": "TestSchemeRegistersKubeVirtVirtualMachine"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.kubeblocks.component-selector",
"title": "Generate label selectors for KubeBlocks components",
"title_zh": "\u4e3a KubeBlocks \u7ec4\u4ef6\u751f\u6210\u6807\u7b7e\u9009\u62e9\u5668",
"interface_type": "workflow",
"interface": "util/kubeblocks.GenerateKubeBlocksSelector",
"code_paths": [
"util/kubeblocks/kubeblocks.go"
],
"tests": [
{
"path": "util/kubeblocks/kubeblocks_test.go",
"selector": "TestGenerateKubeBlocksSelector"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.decode",
"title": "Decode and parse license token payload",
"title_zh": "\u89e3\u7801\u5e76\u89e3\u6790\u8bb8\u53ef\u8bc1\u4ee4\u724c\u5185\u5bb9",
"interface_type": "workflow",
"interface": "api/util/license.DecodeLicense",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestDecodeLicense"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.parse-public-key",
"title": "Parse PEM encoded RSA public keys",
"title_zh": "\u89e3\u6790 PEM \u7f16\u7801\u7684 RSA \u516c\u94a5",
"interface_type": "workflow",
"interface": "api/util/license.ParsePublicKey",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestParsePublicKey"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.plugin-allowlist",
"title": "Decide whether a plugin is allowed by license mapping",
"title_zh": "\u6839\u636e\u8bb8\u53ef\u8bc1\u6620\u5c04\u5224\u65ad\u63d2\u4ef6\u662f\u5426\u5141\u8bb8\u4f7f\u7528",
"interface_type": "workflow",
"interface": "api/util/license.IsPluginAllowed",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestIsPluginAllowed_Wildcard"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.round-trip",
"title": "Round-trip encode decode and validate license token",
"title_zh": "\u5f80\u8fd4\u7f16\u7801\u89e3\u7801\u5e76\u6821\u9a8c\u8bb8\u53ef\u8bc1\u4ee4\u724c",
"interface_type": "workflow",
"interface": "api/util/license.EncodeLicense",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestRoundTrip"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.status-projection",
"title": "Project license tokens into status responses",
"title_zh": "\u5c06\u8bb8\u53ef\u8bc1\u4ee4\u724c\u6295\u5f71\u4e3a\u72b6\u6001\u54cd\u5e94",
"interface_type": "workflow",
"interface": "api/util/license.TokenToStatus",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestTokenToStatus"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.validate-token",
"title": "Validate license enterprise binding and validity window",
"title_zh": "\u6821\u9a8c\u8bb8\u53ef\u8bc1\u4f01\u4e1a\u7ed1\u5b9a\u4e0e\u751f\u6548\u65f6\u95f4\u7a97\u53e3",
"interface_type": "workflow",
"interface": "api/util/license.ValidateToken",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestValidateToken_Valid"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.license.verify-signature",
"title": "Verify RSA license signatures",
"title_zh": "\u6821\u9a8c\u8bb8\u53ef\u8bc1 RSA \u7b7e\u540d",
"interface_type": "workflow",
"interface": "api/util/license.VerifySignature",
"code_paths": [
"api/util/license/rsa_license.go"
],
"tests": [
{
"path": "api/util/license/rsa_license_test.go",
"selector": "TestVerifySignature_Valid"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.lifecycle.service-reconcile-preserves-identity",
"title": "Service reconciliation preserves allocated Kubernetes identity",
"title_zh": "Service reconciliation preserves allocated Kubernetes identity",
"interface_type": "package_function",
"interface": "worker/appm/controller.CreateKubeService",
"code_paths": [
"worker/appm/controller/kube-controller.go"
],
"tests": [
{
"path": "worker/appm/controller/kube-controller_test.go",
"selector": "TestCreateKubeServiceReconcilesOwnedServiceAndPreservesIdentity"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.lifecycle.service-reconcile-rejects-foreign-owner",
"title": "Service reconciliation rejects foreign ownership",
"title_zh": "Service reconciliation rejects foreign ownership",
"interface_type": "package_function",
"interface": "worker/appm/controller.CreateKubeService",
"code_paths": [
"worker/appm/controller/kube-controller.go"
],
"tests": [
{
"path": "worker/appm/controller/kube-controller_test.go",
"selector": "TestCreateKubeServiceRejectsForeignService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.lifecycle.stop-preserves-service",
"title": "Stopping a component preserves its generated Service identity",
"title_zh": "Stopping a component preserves its generated Service identity",
"interface_type": "workflow",
"interface": "worker/appm/controller.stopController.stopOne",
"code_paths": [
"worker/appm/controller/stop.go"
],
"tests": [
{
"path": "worker/appm/controller/stop_test.go",
"selector": "TestStopPreservesGeneratedService"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.lifecycle.stop-suppresses-exit-event",
"title": "Suppress container exit events during intentional stop",
"title_zh": "Suppress container exit events during intentional stop",
"interface_type": "package_function",
"interface": "worker/master/podevent.shouldReportContainerExit",
"code_paths": [
"worker/master/podevent/podevent.go"
],
"tests": [
{
"path": "worker/master/podevent/health_event_test.go",
"selector": "TestShouldReportContainerExit"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-delete-idempotent",
"title": "Manual PVC cleanup tolerates absent claims and preserves deletion errors",
"title_zh": "Manual PVC cleanup tolerates absent claims and preserves deletion errors",
"interface_type": "workflow",
"interface": "upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/f/function.go",
"worker/appm/controller/upgrade.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsDeletesStaleClaims"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-preserves-bound-claim-immutable-spec",
"title": "Preserve bound manual PVC immutable spec fields during app upgrade",
"interface_type": "workflow",
"interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/controller/upgrade.go",
"worker/appm/f/function.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsPreservesBoundClaimImmutableSpec"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-preserves-existing-metadata",
"title": "Preserve existing manual PVC metadata during app upgrade",
"interface_type": "workflow",
"interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/f/function.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsPreservesExistingMetadata"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-skips-unchanged-storage",
"title": "Skip manual PVC updates when storage request is unchanged",
"interface_type": "workflow",
"interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/f/function.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsSkipsUnchangedStorage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-surfaces-update-errors",
"title": "Surface manual PVC update errors during app upgrade",
"title_zh": "\u5e94\u7528\u5347\u7ea7\u65f6\u8fd4\u56de\u624b\u52a8 PVC \u66f4\u65b0\u9519\u8bef",
"interface_type": "workflow",
"interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/controller/upgrade.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsReturnsUpdateError"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.manual-pvc-upgrade-updates-existing-claim",
"title": "Update existing manual PVCs during app upgrade",
"title_zh": "\u5e94\u7528\u5347\u7ea7\u65f6\u66f4\u65b0\u5df2\u6709\u624b\u52a8 PVC",
"interface_type": "workflow",
"interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
"code_paths": [
"worker/appm/controller/upgrade.go"
],
"tests": [
{
"path": "worker/appm/controller/upgrade_manual_claim_test.go",
"selector": "TestUpgradeControllerUpgradeManualClaimsUpdatesExistingClaim"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.maven.list-modules",
"title": "List Maven modules for multi-service build",
"title_zh": "\u5217\u51fa Maven \u591a\u670d\u52a1\u6a21\u5757",
"interface_type": "workflow",
"interface": "builder/parser/code/multisvc.maven.ListModules",
"code_paths": [
"builder/parser/code/multisvc/maven.go"
],
"tests": [
{
"path": "builder/parser/code/multisvc/maven_test.go",
"selector": "TestMaven_ListModules"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.maven.parse-pom",
"title": "Parse Maven parent pom for modules and packaging",
"title_zh": "\u89e3\u6790 Maven \u7236 pom \u7684\u6a21\u5757\u4e0e\u6253\u5305\u65b9\u5f0f",
"interface_type": "workflow",
"interface": "builder/parser/code/multisvc.parsePom",
"code_paths": [
"builder/parser/code/multisvc/maven.go"
],
"tests": [
{
"path": "builder/parser/code/multisvc/maven_test.go",
"selector": "TestMaven_ParsePom"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.mq.cancelable-dequeue",
"title": "Cancelable MQ dequeues preserve queued messages",
"title_zh": "\u6d88\u606f\u961f\u5217\u51fa\u961f\u54cd\u5e94\u53d6\u6d88\u5e76\u4fdd\u7559\u5f85\u5904\u7406\u6d88\u606f",
"interface_type": "workflow",
"interface": "mq/api/mq.etcdQueue.Dequeue",
"code_paths": [
"mq/api/mq/mq.go",
"mq/api/mq/store.go"
],
"tests": [
{
"path": "mq/api/mq/store_test.go",
"selector": "TestDequeueCanceledRequestPreservesQueuedMessage"
},
{
"path": "mq/api/mq/store_test.go",
"selector": "TestDequeueHonorsCallerDeadline"
},
{
"path": "mq/api/mq/store_test.go",
"selector": "TestCanceledDequeueDoesNotConsumeLaterMessage"
},
{
"path": "mq/api/mq/store_test.go",
"selector": "TestDequeueWaitsForMessagesInFIFOOrder"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.multisvc.ignore-non-java",
"title": "Ignore non-Java languages in multi-service parser selection",
"title_zh": "\u5728\u591a\u670d\u52a1\u89e3\u6790\u5668\u9009\u62e9\u4e2d\u5ffd\u7565\u975e Java \u8bed\u8a00",
"interface_type": "workflow",
"interface": "builder/parser/code/multisvc.NewMultiServiceI",
"code_paths": [
"builder/parser/code/multisvc/multi_services.go"
],
"tests": [
{
"path": "builder/parser/code/multisvc/multi_services_test.go",
"selector": "TestNewMultiServiceI_IgnoresLanguagesWithoutJavaMaven"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.multisvc.select-java-maven",
"title": "Select Java Maven multi-service parser for composite language",
"title_zh": "\u4e3a\u590d\u5408\u8bed\u8a00\u9009\u62e9 Java Maven \u591a\u670d\u52a1\u89e3\u6790\u5668",
"interface_type": "workflow",
"interface": "builder/parser/code/multisvc.NewMultiServiceI",
"code_paths": [
"builder/parser/code/multisvc/multi_services.go"
],
"tests": [
{
"path": "builder/parser/code/multisvc/multi_services_test.go",
"selector": "TestNewMultiServiceI_SupportsCompositeJavaMaven"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.display-info",
"title": "Summarize node version display and derived metadata",
"title_zh": "\u6c47\u603b Node \u7248\u672c\u5c55\u793a\u4e0e\u6d3e\u751f\u4fe1\u606f",
"interface_type": "workflow",
"interface": "builder/parser/code.NodeVersionInfo helpers",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestCleanVersionSpec"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestExtractMajorVersion"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestExtractMinorPatch"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestNodeVersionInfo_IsLTS"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestNodeVersionInfo_GetNodeVersionDisplay"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.fallback-supported-range",
"title": "Fallback unsupported Node.js versions into supported range",
"title_zh": "\u5c06\u4e0d\u53d7\u652f\u6301\u7684 Node.js \u7248\u672c\u56de\u9000\u5230\u652f\u6301\u8303\u56f4",
"interface_type": "workflow",
"interface": "builder/parser/code.ResolveNodeVersion",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_UnsupportedVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.normalize-v-prefix",
"title": "Normalize v-prefixed Node.js version",
"title_zh": "\u89c4\u8303\u5316\u5e26 v \u524d\u7f00\u7684 Node.js \u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/code.ResolveNodeVersion",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_WithVPrefix"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.parse-package-json",
"title": "Parse node version requirements from package.json",
"title_zh": "\u4ece package.json \u89e3\u6790 Node \u7248\u672c\u8981\u6c42",
"interface_type": "workflow",
"interface": "builder/parser/code.ParseNodeVersionFromPackageJSON",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestParseNodeVersionFromPackageJSON"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestParseNodeVersionFromPackageJSON_NoEngines"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestParseNodeVersionFromPackageJSON_NoPackageJSON"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.resolve-range",
"title": "Resolve ranged Node.js version constraint",
"title_zh": "\u89e3\u6790\u8303\u56f4\u5f62\u5f0f\u7684 Node.js \u7248\u672c\u7ea6\u675f",
"interface_type": "workflow",
"interface": "builder/parser/code.ResolveNodeVersion",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_Range"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.node-version.resolve-spec",
"title": "Resolve node version spec into supported runtime line",
"title_zh": "\u5c06 Node \u7248\u672c\u8868\u8fbe\u5f0f\u89e3\u6790\u4e3a\u652f\u6301\u7684\u8fd0\u884c\u65f6\u7248\u672c",
"interface_type": "workflow",
"interface": "builder/parser/code.ResolveNodeVersion",
"code_paths": [
"builder/parser/code/node_version.go"
],
"tests": [
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_Empty"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_Wildcard"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_GreaterThanOrEqual"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_Caret"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_Tilde"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_XNotation"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_MajorOnly"
},
{
"path": "builder/parser/code/node_version_test.go",
"selector": "TestResolveNodeVersion_ExactVersion"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ns-resource.batch-create",
"title": "Create namespace resources from multi-document YAML",
"title_zh": "\u6279\u91cf\u521b\u5efa\u547d\u540d\u7a7a\u95f4\u8d44\u6e90",
"interface_type": "handler_method",
"interface": "api/handler.NsResourceHandler.CreateNsResource",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestCreateNsResourceBatchAggregatesPartialSuccess"
},
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestCreateNsResourceBatchPreservesExplicitNamespace"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ns-resource.detect-source",
"title": "Detect namespace resource source",
"title_zh": "\u8bc6\u522b\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u6765\u6e90",
"interface_type": "workflow",
"interface": "api/handler.detectResourceSource",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestDetectResourceSource"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ns-resource.handler-singleton",
"title": "Reuse singleton namespace resource handler",
"title_zh": "\u590d\u7528\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u5904\u7406\u5668\u5355\u4f8b",
"interface_type": "workflow",
"interface": "api/handler.GetNsResourceHandler",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestGetNsResourceHandlerSingleton"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.ns-resource.ingress-summary",
"title": "Summarize ingress routing metadata for namespace resources",
"title_zh": "\u6c47\u603b Ingress \u8d44\u6e90\u8def\u7531\u5143\u6570\u636e",
"interface_type": "workflow",
"interface": "api/handler.toNsResourceInfo",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestToNsResourceInfoIncludesIngressSummary"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ns-resource.mark-source",
"title": "Mark namespace resource source labels",
"title_zh": "\u6807\u8bb0\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u6765\u6e90",
"interface_type": "workflow",
"interface": "api/handler.injectSourceLabel",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestInjectSourceLabelYaml"
},
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestInjectSourceLabelManual"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.ns-resource.resolve-tenant-namespace",
"title": "Resolve tenant namespace for namespaced resource operations",
"title_zh": "\u89e3\u6790\u56e2\u961f\u547d\u540d\u7a7a\u95f4",
"interface_type": "workflow",
"interface": "api/handler.(*NsResourceHandler).getTenantNamespace",
"code_paths": [
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestGetTenantNamespaceUsesNamespaceField"
},
{
"path": "api/handler/ns_resource_test.go",
"selector": "TestGetTenantNamespaceFallsBackToUUIDWhenNamespaceEmpty"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.disk-availability",
"title": "Distinguish missing node filesystem measurements",
"title_zh": "Distinguish missing node filesystem measurements",
"interface_type": "handler_method",
"interface": "nodesHandle.ListNodes",
"code_paths": [
"api/handler/nodes.go",
"api/handler/node_filesystem_stats.go",
"api/model/nodes.go"
],
"tests": [
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewDiskStatsAvailability"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.empty-installed-plugins",
"title": "Empty installed plugin results encode as an array",
"title_zh": "Empty installed plugin results encode as an array",
"interface_type": "handler_method",
"interface": "clusterAction.ListPlugins",
"code_paths": [
"api/handler/cluster.go"
],
"tests": [
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewEmptyInstalledPluginsAreAnArray"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.kubernetes-cluster-resources",
"title": "Read truthful bounded Kubernetes workload resource snapshots",
"title_zh": "Read truthful bounded Kubernetes workload resource snapshots",
"interface_type": "handler_method",
"interface": "clusterAction.GetClusterInfo",
"code_paths": [
"api/handler/cluster.go",
"api/handler/cluster_overview_resources.go",
"api/handler/tenant.go",
"api/model/cluster.go"
],
"tests": [
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourcesUseKubernetesNotPrometheus"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourcesReportZeroOnlyAfterSuccessfulReads"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourcesCoalesceConcurrentRefresh"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourceRequestsIncludeInitSidecarsAndOverhead"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourcesPreserveFractionalCapacityAndScheduledScope"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourcesIncludeEmptySchedulableNodes"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourceRefreshWaitRespectsCancellation"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourceOptionalVersionCannotBlockResources"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.lightweight-nodes",
"title": "Lightweight node health skips optional statistics",
"title_zh": "Lightweight node health skips optional statistics",
"interface_type": "handler_method",
"interface": "nodesHandle.ListNodesWithOptions",
"code_paths": [
"api/handler/nodes.go",
"api/model/nodes.go"
],
"tests": [
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewLightweightNodesSkipStats"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.nodes-request-context",
"title": "Preserve node request context and optional statistics default",
"title_zh": "Preserve node request context and optional statistics default",
"interface_type": "view_endpoint",
"interface": "GET /v2/nodes",
"code_paths": [
"api/controller/nodes.go"
],
"tests": [
{
"path": "api/controller/overview_nodes_test.go",
"selector": "TestOverviewNodesRequestPreservesContextAndDefaults"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.overview.nonblocking-local-disk",
"title": "Optional local disk sampling never blocks cluster resources",
"title_zh": "Optional local disk sampling never blocks cluster resources",
"interface_type": "workflow",
"interface": "clusterAction.withLocalDiskStats",
"code_paths": [
"api/handler/cluster.go",
"api/handler/cluster_overview_resources.go",
"api/model/cluster.go"
],
"tests": [
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewClusterResourceCannotBeBlockedByLocalDisk"
},
{
"path": "api/handler/overview_truthful_data_test.go",
"selector": "TestOverviewLocalDiskFailureUsesCooldownAndPreservesStaleSample"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-build.clean-extracted-content",
"title": "Clean stale extracted package content before unpacking",
"title_zh": "\u89e3\u538b\u524d\u6e05\u7406\u65e7\u5305\u5c55\u5f00\u5185\u5bb9",
"interface_type": "package_function",
"interface": "builder/parser.cleanPackageExtractDir",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/package_archive_test.go",
"selector": "TestCleanPackageExtractDirKeepsSelectedArchiveOnly"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-build.select-archive-over-extracted-content",
"title": "Select uploaded package archive over extracted content",
"title_zh": "\u4f18\u5148\u9009\u62e9\u4e0a\u4f20\u538b\u7f29\u5305\u800c\u4e0d\u662f\u65e7\u89e3\u538b\u5185\u5bb9",
"interface_type": "package_function",
"interface": "builder/parser.selectPackageArchive",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/package_archive_test.go",
"selector": "TestSelectPackageArchiveSkipsExtractedDirectories"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-build.select-latest-archive",
"title": "Select latest uploaded package archive",
"title_zh": "\u4e8c\u6b21\u4e0a\u4f20\u65f6\u9009\u62e9\u6700\u65b0\u538b\u7f29\u5305",
"interface_type": "package_function",
"interface": "builder/parser.selectPackageArchive",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/package_archive_test.go",
"selector": "TestSelectPackageArchiveUsesLatestArchiveForSecondUpload"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.commands",
"title": "Generate install/build/start commands from package manager",
"title_zh": "\u6309\u5305\u7ba1\u7406\u5668\u751f\u6210\u5b89\u88c5\u6784\u5efa\u542f\u52a8\u547d\u4ee4",
"interface_type": "workflow",
"interface": "builder/parser/code.PackageManagerInfo",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestPackageManagerInfo_GetCommands"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.default-npm",
"title": "Default to npm when no package manager lockfiles exist",
"title_zh": "\u65e0\u9501\u6587\u4ef6\u65f6\u9ed8\u8ba4\u4f7f\u7528 npm",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectPackageManager",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_Default"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.detect-lockfile",
"title": "Detect package manager from lock files",
"title_zh": "\u901a\u8fc7\u9501\u6587\u4ef6\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectPackageManager",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_PNPM"
},
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_Yarn"
},
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_NPM"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.package-json-field",
"title": "Detect package manager from package.json field",
"title_zh": "\u901a\u8fc7 package.json \u5b57\u6bb5\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectPackageManager",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_PackageManagerField"
},
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_PackageManagerFieldYarn"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.parse-package-manager-field",
"title": "Parse packageManager field syntax",
"title_zh": "\u89e3\u6790 packageManager \u5b57\u6bb5\u8bed\u6cd5",
"interface_type": "workflow",
"interface": "builder/parser/code.parsePackageManagerField",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestParsePackageManagerField"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.priority",
"title": "Prefer higher-priority package manager when multiple lock files exist",
"title_zh": "\u591a\u9501\u6587\u4ef6\u573a\u666f\u4e0b\u6309\u4f18\u5148\u7ea7\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
"interface_type": "workflow",
"interface": "builder/parser/code.DetectPackageManager",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_Priority"
},
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestDetectPackageManager_YarnOverNPM"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.package-manager.stringer",
"title": "Render package manager enum as string",
"title_zh": "\u5c06\u5305\u7ba1\u7406\u5668\u679a\u4e3e\u6e32\u67d3\u4e3a\u5b57\u7b26\u4e32",
"interface_type": "workflow",
"interface": "builder/parser/code.PackageManager.String",
"code_paths": [
"builder/parser/code/package_manager.go"
],
"tests": [
{
"path": "builder/parser/code/package_manager_test.go",
"selector": "TestPackageManager_String"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.plugin-build.detect-dockerfile",
"title": "Detect whether plugin source contains a Dockerfile",
"title_zh": "\u68c0\u6d4b\u63d2\u4ef6\u6e90\u7801\u76ee\u5f55\u4e2d\u662f\u5426\u5b58\u5728 Dockerfile",
"interface_type": "workflow",
"interface": "builder/exector.checkDockerfile",
"code_paths": [
"builder/exector/plugin_dockerfile.go"
],
"tests": [
{
"path": "builder/exector/plugin_dockerfile_test.go",
"selector": "TestCheckDockerfile"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.plugin-build.image-input-validate",
"title": "Reject empty or invalid plugin image references before build",
"title_zh": "\u5728\u63d2\u4ef6\u955c\u50cf\u6784\u5efa\u524d\u62d2\u7edd\u7a7a\u503c\u6216\u975e\u6cd5\u955c\u50cf\u5f15\u7528",
"interface_type": "workflow",
"interface": "builder/exector.exectorManager.run",
"code_paths": [
"builder/exector/plugin_image.go"
],
"tests": [
{
"path": "builder/exector/plugin_image_test.go",
"selector": "TestPluginImageRunRejectsEmptyImageURL"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.plugin-build.image-tag",
"title": "Derive plugin image tags from source image names and versions",
"title_zh": "\u6839\u636e\u6e90\u955c\u50cf\u540d\u548c\u7248\u672c\u751f\u6210\u63d2\u4ef6\u955c\u50cf\u6807\u7b7e",
"interface_type": "workflow",
"interface": "builder/exector.createPluginImageTag",
"code_paths": [
"builder/exector/plugin_image.go"
],
"tests": [
{
"path": "builder/exector/plugin_image_test.go",
"selector": "TestCreatePluginImageTag"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.plugin-dockerfile-build.default-arch-affinity",
"title": "Default plugin Dockerfile build arch affinity",
"title_zh": "Default plugin Dockerfile build arch affinity",
"interface_type": "workflow",
"interface": "builder/sources.newBuildKitPodSpec",
"code_paths": [
"builder/sources/image.go",
"builder/exector/plugin_dockerfile.go",
"api/handler/plugin.go",
"api/model/pluginModel.go"
],
"tests": [
{
"path": "builder/sources/image_test.go",
"selector": "TestNewBuildKitPodSpecDefaultsMissingArchToRuntime"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.rainbondfile.missing",
"title": "Return not found when rainbondfile is missing",
"title_zh": "\u7f3a\u5c11 rainbondfile \u65f6\u8fd4\u56de\u672a\u627e\u5230",
"interface_type": "workflow",
"interface": "builder/parser/code.ReadRainbondFile",
"code_paths": [
"builder/parser/code/rainbondfile.go"
],
"tests": [
{
"path": "builder/parser/code/rainbondfile_test.go",
"selector": "TestReadRainbondFile_ReturnsNotFoundWhenMissing"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.rainbondfile.parse",
"title": "Parse rainbondfile yaml configuration",
"title_zh": "\u89e3\u6790 rainbondfile YAML \u914d\u7f6e",
"interface_type": "workflow",
"interface": "builder/parser/code.ReadRainbondFile",
"code_paths": [
"builder/parser/code/rainbondfile.go"
],
"tests": [
{
"path": "builder/parser/code/rainbondfile_test.go",
"selector": "TestReadRainbondFile_ParsesYamlConfig"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.rainbondfile.read-project-root",
"title": "Read rainbondfile from project root",
"title_zh": "\u4ece\u9879\u76ee\u6839\u76ee\u5f55\u8bfb\u53d6 rainbondfile",
"interface_type": "workflow",
"interface": "builder/parser/code.ReadRainbondFile",
"code_paths": [
"builder/parser/code/rainbondfile.go"
],
"tests": [
{
"path": "builder/parser/code/rainbondfile_test.go",
"selector": "TestReadRainbondFile"
}
],
"test_type": "unit",
"status": "active"
},
{
"id": "rainbond.region-api.configured-token-only",
"title": "Only configured region token is accepted",
"title_zh": "\u4ec5\u63a5\u53d7\u914d\u7f6e\u7684\u96c6\u7fa4 Token",
"interface_type": "package_function",
"interface": "api/middleware.FullToken",
"code_paths": [
"api/middleware/token.go"
],
"tests": [
{
"path": "api/middleware/token_test.go",
"selector": "TestFullTokenAllowsOnlyConfiguredRegionToken"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.registry.delete-vm-image-manifest",
"title": "Delete internal VM image manifest from registry",
"title_zh": "Delete internal VM image manifest from registry",
"interface_type": "handler_method",
"interface": "api/handler.ServiceAction.DeleteRegistryImageManifest",
"code_paths": [
"api/handler/registry_image.go",
"api/controller/registry_image.go",
"api/api_routers/version2/v2Routers.go"
],
"tests": [
{
"path": "api/handler/registry_image_test.go",
"selector": "TestDeleteRegistryImageManifestDeletesInternalVMImage"
},
{
"path": "api/handler/registry_image_test.go",
"selector": "TestDeleteRegistryImageManifestRejectsExternalRegistry"
},
{
"path": "api/handler/registry_image_test.go",
"selector": "TestDeleteRegistryImageManifestTreatsMissingManifestAsDeleted"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.registry.manifest-exists-oci",
"title": "Resolve OCI image manifests during backup checks",
"title_zh": "\u5907\u4efd\u6821\u9a8c\u652f\u6301 OCI \u955c\u50cf\u6e05\u5355",
"interface_type": "workflow",
"interface": "builder/sources/registry.Registry.ManifestExists",
"code_paths": [
"builder/sources/registry/manifest.go"
],
"tests": [
{
"path": "builder/sources/registry/manifest_test.go",
"selector": "TestManifestExistsAcceptsOCIManifestTypes"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.resource-center.collect-ingress-services",
"title": "Collect ingress backend service names",
"title_zh": "\u6536\u96c6 Ingress \u540e\u7aef\u670d\u52a1\u540d",
"interface_type": "workflow",
"interface": "api/handler.collectIngressServiceNames",
"code_paths": [
"api/handler/resource_center.go"
],
"tests": [
{
"path": "api/handler/resource_center_test.go",
"selector": "TestCollectIngressServiceNames"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.resource-center.event-summary",
"title": "Summarize resource event info",
"title_zh": "\u6c47\u603b\u8d44\u6e90\u4e8b\u4ef6\u4fe1\u606f",
"interface_type": "workflow",
"interface": "api/handler.toResourceEventInfo",
"code_paths": [
"api/handler/resource_center.go"
],
"tests": [
{
"path": "api/handler/resource_center_test.go",
"selector": "TestToResourceEventInfo"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.resource-center.match-selector",
"title": "Match resource labels against selector",
"title_zh": "\u6309\u9009\u62e9\u5668\u5339\u914d\u8d44\u6e90\u6807\u7b7e",
"interface_type": "workflow",
"interface": "api/handler.labelsMatchSelector",
"code_paths": [
"api/handler/resource_center.go"
],
"tests": [
{
"path": "api/handler/resource_center_test.go",
"selector": "TestLabelsMatchSelector"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.resource-center.rfc3339-timestamps",
"title": "Serialize resource center timestamps as RFC3339",
"title_zh": "Serialize resource center timestamps as RFC3339",
"interface_type": "package_function",
"interface": "api/handler.formatResourceTimestamp",
"code_paths": [
"api/handler/resource_center.go",
"api/handler/ns_resource.go"
],
"tests": [
{
"path": "api/handler/resource_center_test.go",
"selector": "TestFormatResourceTimestamp"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.resource-import.daemonset-component",
"title": "Import DaemonSet as component",
"title_zh": "\u5c06 DaemonSet \u5bfc\u5165\u4e3a\u7ec4\u4ef6",
"interface_type": "handler_method",
"interface": "api.handler.ComponentController.CreateComponent",
"code_paths": [
"api/handler/resource_import.go",
"api/model/namespace_resource.go"
],
"tests": [
{
"path": "api/handler/resource_import_daemonset_test.go",
"selector": "TestExtendMethodForResourceTypeSupportsDaemonSet"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.runtime.composite-nodejs",
"title": "Use node runtime parser for composite dockerfile and node language",
"title_zh": "\u590d\u5408\u8bed\u8a00\u573a\u666f\u4f7f\u7528 Node \u8fd0\u884c\u65f6\u89e3\u6790",
"interface_type": "workflow",
"interface": "builder/parser/code.CheckRuntime",
"code_paths": [
"builder/parser/code/runtime.go"
],
"tests": [
{
"path": "builder/parser/code/runtime_test.go",
"selector": "TestCheckRuntime_CompositeNodejsLanguageUsesNodeRuntime"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.runtime.node-cnb-framework-detection",
"title": "Detect Node.js framework metadata for CNB builds",
"title_zh": "CNB \u6784\u5efa\u68c0\u6d4b Node.js \u6846\u67b6\u4fe1\u606f",
"interface_type": "package_function",
"interface": "builder/parser/code.CheckRuntimeByStrategy",
"code_paths": [
"builder/parser/code/runtime.go"
],
"tests": [
{
"path": "builder/parser/code/runtime_test.go",
"selector": "TestCheckRuntimeByStrategy_NodejsCNBDetectsFrameworkWithoutEngines"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.runtime.node-defaults",
"title": "Return default node runtime info from package.json",
"title_zh": "\u4ece package.json \u8fd4\u56de\u9ed8\u8ba4 Node \u8fd0\u884c\u65f6\u4fe1\u606f",
"interface_type": "workflow",
"interface": "builder/parser/code.CheckRuntime",
"code_paths": [
"builder/parser/code/runtime.go"
],
"tests": [
{
"path": "builder/parser/code/runtime_test.go",
"selector": "TestCheckRuntime_NodejsReturnsDefaultRuntimeInfoFromPackageJson"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.runtime.static-empty",
"title": "Return empty runtime info for static language",
"title_zh": "\u9759\u6001\u8bed\u8a00\u8fd4\u56de\u7a7a\u8fd0\u884c\u65f6\u4fe1\u606f",
"interface_type": "workflow",
"interface": "builder/parser/code.CheckRuntime",
"code_paths": [
"builder/parser/code/runtime.go"
],
"tests": [
{
"path": "builder/parser/code/runtime_test.go",
"selector": "TestCheckRuntime_StaticReturnsEmptyRuntimeInfo"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service-check.completion-log-summary",
"title": "Service check completion log reflects check status",
"title_zh": "\u670d\u52a1\u68c0\u6d4b\u5b8c\u6210\u6458\u8981\u65e5\u5fd7\u53cd\u6620\u771f\u5b9e\u68c0\u6d4b\u72b6\u6001",
"interface_type": "other",
"interface": "builder/exector.serviceCheckCompletionLogSummary",
"code_paths": [
"builder/exector/service_check.go"
],
"tests": [
{
"path": "builder/exector/service_check_test.go",
"selector": "TestServiceCheckCompletionLogSummary"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service-check.eventlog-progress",
"title": "Mirror service-check progress messages to the event logger",
"title_zh": "\u5c06\u670d\u52a1\u68c0\u6d4b\u8fdb\u5ea6\u6d88\u606f\u540c\u6b65\u5199\u5165\u4e8b\u4ef6\u65e5\u5fd7",
"interface_type": "other",
"interface": "builder/exector.logServiceCheckProgress",
"code_paths": [
"builder/exector/service_check.go"
],
"tests": [
{
"path": "builder/exector/service_check_test.go",
"selector": "TestLogServiceCheckProgressMirrorsMessageToEventLogger"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service-probe.reconcile-duplicate-mode",
"title": "Reconcile duplicate service probe modes",
"title_zh": "\u534f\u8c03\u91cd\u590d\u7684\u7ec4\u4ef6\u63a2\u9488\u6a21\u5f0f",
"interface_type": "dao_method",
"interface": "db/mysql/dao.ServiceProbeDaoImpl.AddModel",
"code_paths": [
"db/mysql/dao/k8s.go"
],
"tests": [
{
"path": "db/mysql/dao/service_probe_test.go",
"selector": "TestServiceProbeDaoAddModelReconcilesExistingMode"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service-type.daemonset",
"title": "DaemonSet service type classification",
"title_zh": "DaemonSet \u7ec4\u4ef6\u7c7b\u578b\u5206\u7c7b",
"interface_type": "service_method",
"interface": "db.model.ServiceType",
"code_paths": [
"db/model/tenant.go"
],
"tests": [
{
"path": "db/model/tenant_daemonset_test.go",
"selector": "TestServiceTypeDaemonSetClassification"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service.file-manage-command-safety",
"title": "Build safe file-manage list command with path separator",
"title_zh": "\u6784\u5efa\u5e26\u8def\u5f84\u5206\u9694\u7b26\u7684\u5b89\u5168\u6587\u4ef6\u7ba1\u7406\u5217\u8868\u547d\u4ee4",
"interface_type": "other",
"interface": "api/handler.buildFileManageListCommand",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_file_manage_test.go",
"selector": "TestBuildFileManageListCommand"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service.file-manage-exec-error-detail",
"title": "Preserve exec stderr when file-manage listing fails",
"title_zh": "\u6587\u4ef6\u7ba1\u7406\u5217\u8868\u5931\u8d25\u65f6\u4fdd\u7559 exec \u7684 stderr \u7ec6\u8282",
"interface_type": "other",
"interface": "api/handler.wrapFileManageExecError",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_file_manage_test.go",
"selector": "TestWrapFileManageExecErrorIncludesStderr"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.service.port-outer-idempotent-close",
"title": "Keep repeated external port closes idempotent",
"title_zh": "Keep repeated external port closes idempotent",
"interface_type": "handler_method",
"interface": "api/handler.(*ServiceAction).PortOuter",
"code_paths": [
"api/handler/service.go"
],
"tests": [
{
"path": "api/handler/service_port_outer_test.go",
"selector": "TestServiceActionPortOuterAlreadyClosedReturnsPort"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.share.image-from-snapshot-deploy-version",
"title": "Share image snapshots using the requested deploy version",
"title_zh": "\u955c\u50cf\u5206\u4eab\u4f7f\u7528\u8bf7\u6c42\u4e2d\u7684\u5feb\u7167\u90e8\u7f72\u7248\u672c",
"interface_type": "workflow",
"interface": "api/handler/share.ServiceShareHandle.Share",
"code_paths": [
"api/handler/share/service_share.go"
],
"tests": [
{
"path": "api/handler/share/service_share_test.go",
"selector": "TestServiceShareUsesRequestedDeployVersionForImageShare"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.share.slug-from-snapshot-deploy-version",
"title": "Share slug snapshots using the requested deploy version",
"title_zh": "Slug \u5206\u4eab\u4f7f\u7528\u8bf7\u6c42\u4e2d\u7684\u5feb\u7167\u90e8\u7f72\u7248\u672c",
"interface_type": "workflow",
"interface": "api/handler/share.ServiceShareHandle.Share",
"code_paths": [
"api/handler/share/service_share.go"
],
"tests": [
{
"path": "api/handler/share/service_share_test.go",
"selector": "TestServiceShareUsesRequestedDeployVersionForSlugShare"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-args.default-cnb-ports",
"title": "Apply default CNB ports for multi-language projects",
"title_zh": "\u4e3a\u591a\u8bed\u8a00\u9879\u76ee\u5e94\u7528\u9ed8\u8ba4 CNB \u7aef\u53e3",
"interface_type": "workflow",
"interface": "builder/parser.applyCNBDefaultPorts",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/source_code_args_test.go",
"selector": "TestCNBDefaultPorts_MultiLanguage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-args.multi-language",
"title": "Resolve source build args for multi-language projects",
"title_zh": "\u4e3a\u591a\u8bed\u8a00\u9879\u76ee\u89e3\u6790\u6e90\u7801\u6784\u5efa\u53c2\u6570",
"interface_type": "workflow",
"interface": "builder/parser.SourceCodeParse.GetArgs",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/source_code_args_test.go",
"selector": "TestGetArgs_MultiLanguage"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.dockerfile-subdir",
"title": "Detect Dockerfile in nested source directory",
"title_zh": "\u8bc6\u522b\u5b50\u76ee\u5f55\u4e2d\u7684 Dockerfile",
"interface_type": "workflow",
"interface": "builder/parser/code.GetLangType",
"code_paths": [
"builder/parser/code/lang.go"
],
"tests": [
{
"path": "builder/parser/code/language_matrix_test.go",
"selector": "TestGetLangType_DetectsDockerfileInSubDirectory"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.hidden-dockerfiles",
"title": "Detect Dockerfiles inside hidden directories",
"title_zh": "\u8bc6\u522b\u9690\u85cf\u76ee\u5f55\u4e2d\u7684 Dockerfile",
"interface_type": "workflow",
"interface": "builder/parser/code.FindDockerfiles",
"code_paths": [
"builder/parser/code/lang.go"
],
"tests": [
{
"path": "builder/parser/code/lang_test.go",
"selector": "TestFindDockerfilesInHiddenDirs"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.ignore-excluded-dirs",
"title": "Ignore excluded directories when scanning Dockerfiles",
"title_zh": "\u626b\u63cf Dockerfile \u65f6\u5ffd\u7565\u6392\u9664\u76ee\u5f55",
"interface_type": "workflow",
"interface": "builder/parser/code.FindDockerfiles",
"code_paths": [
"builder/parser/code/lang.go"
],
"tests": [
{
"path": "builder/parser/code/lang_test.go",
"selector": "TestFindDockerfilesIgnoreSpecificDirs"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.language-matrix",
"title": "Detect supported source-build language matrix",
"title_zh": "\u8bc6\u522b\u652f\u6301\u7684\u6e90\u7801\u6784\u5efa\u8bed\u8a00\u77e9\u9635",
"interface_type": "workflow",
"interface": "builder/parser/code.GetLangType",
"code_paths": [
"builder/parser/code/lang.go"
],
"tests": [
{
"path": "builder/parser/code/language_matrix_test.go",
"selector": "TestGetLangType_SupportedSourceBuildLanguages"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.multi-module-dockerfile",
"title": "Preserve Dockerfile detection for Maven modules",
"title_zh": "Preserve Dockerfile detection for Maven modules",
"interface_type": "workflow",
"interface": "builder/parser.SourceCodeParse.GetServiceInfo",
"code_paths": [
"builder/parser/source_code.go"
],
"tests": [
{
"path": "builder/parser/source_code_args_test.go",
"selector": "TestGetServiceInfo_MultiModulesPreserveDockerfileDetection"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-detect.nodejs-over-static",
"title": "Prefer Node.js over static when package.json exists",
"title_zh": "\u5b58\u5728 package.json \u65f6\u4f18\u5148\u8bc6\u522b\u4e3a Node.js",
"interface_type": "workflow",
"interface": "builder/parser/code.GetLangType",
"code_paths": [
"builder/parser/code/lang.go"
],
"tests": [
{
"path": "builder/parser/code/language_matrix_test.go",
"selector": "TestGetLangType_NodeJsWinsOverStaticWhenPackageJsonExists"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-discovery.etcd-config",
"title": "Configure parser etcd discovery and guard fetch without client",
"title_zh": "\u914d\u7f6e parser \u7684 etcd \u53d1\u73b0\u5668\u5e76\u5728\u65e0\u5ba2\u6237\u7aef\u65f6\u4fdd\u62a4\u6293\u53d6\u903b\u8f91",
"interface_type": "workflow",
"interface": "builder/parser/discovery.NewEtcd",
"code_paths": [
"builder/parser/discovery/etcd.go"
],
"tests": [
{
"path": "builder/parser/discovery/etcd_test.go",
"selector": "TestNewEtcdAndFetchGuard"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-discovery.unsupported-type",
"title": "Return no discoverier for unsupported parser discovery types",
"title_zh": "\u5bf9\u4e0d\u652f\u6301\u7684 parser \u53d1\u73b0\u7c7b\u578b\u8fd4\u56de\u7a7a\u53d1\u73b0\u5668",
"interface_type": "workflow",
"interface": "builder/parser/discovery.NewDiscoverier",
"code_paths": [
"builder/parser/discovery/discovery.go"
],
"tests": [
{
"path": "builder/parser/discovery/discovery_unit_test.go",
"selector": "TestNewDiscoverierUnsupportedType"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-image.auth-base64-encode",
"title": "Encode registry auth config as base64 JSON payload",
"title_zh": "\u5c06\u955c\u50cf\u4ed3\u5e93\u8ba4\u8bc1\u4fe1\u606f\u7f16\u7801\u4e3a base64 JSON \u8f7d\u8377",
"interface_type": "workflow",
"interface": "builder/sources.EncodeAuthToBase64",
"code_paths": [
"builder/sources/image.go"
],
"tests": [
{
"path": "builder/sources/image_test.go",
"selector": "TestEncodeAuthToBase64"
}
],
"test_type": "regression",
"status": "active"
},
{
"id": "rainbond.source-image.import",
"title": "Import image from archive",
"title_zh": "\u4ece\u5f52\u6863\u6587\u4ef6\u5bfc\u5165\u955c\u50cf",
"interface_type": "workflow",
"interface": "builder/sources.ImageImport",
"code_paths": [
"builder/sources/image.go"
],
"tests": [
{
"path": "builder/sources/image_test.go",
"selector": "TestImageImport"
}
],
"test_type": "integration",
"status": "active"
},
{
"id": "rainbond.source-image.multi-save",
"title": "Save multiple images to archive",
"title_zh": "\u5c06\u591a\u4e2a\u955c\u50cf\u4fdd\u5b58\u4e3a\u5f52\u6863\u6587\u4ef6",
"interface_type": "workflow",
"interface": "builder/sources.MultiImageSave",
"code_paths": [
"builder/sources/image.go"
],
"tests": [