{ "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": [ { "path": "builder/sources/image_test.go", "selector": "TestMulitImageSave" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-image.parse-name", "title": "Parse image host name and tag components", "title_zh": "\u89e3\u6790\u955c\u50cf\u4ed3\u5e93\u4e3b\u673a\u540d\u955c\u50cf\u540d\u4e0e\u6807\u7b7e", "interface_type": "workflow", "interface": "builder/sources.ImageNameHandle", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestImageName" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-image.parse-name-with-namespace", "title": "Parse image references including explicit registry namespaces", "title_zh": "\u89e3\u6790\u5e26\u663e\u5f0f\u4ed3\u5e93\u547d\u540d\u7a7a\u95f4\u7684\u955c\u50cf\u5f15\u7528", "interface_type": "workflow", "interface": "builder/sources.ImageNameWithNamespaceHandle", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestImageNameWithNamespace" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-image.save", "title": "Save image to archive", "title_zh": "\u5c06\u955c\u50cf\u4fdd\u5b58\u4e3a\u5f52\u6863\u6587\u4ef6", "interface_type": "workflow", "interface": "builder/sources.ImageSave", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestImageSave" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-image.tag-from-ref", "title": "Extract image tags from normalized registry references", "title_zh": "\u4ece\u89c4\u8303\u5316\u955c\u50cf\u5f15\u7528\u4e2d\u63d0\u53d6\u6807\u7b7e", "interface_type": "workflow", "interface": "builder/sources.GetTagFromNamedRef", "code_paths": [ "builder/sources/registry.go" ], "tests": [ { "path": "builder/sources/registry_test.go", "selector": "TestGetTagFromNamedRef" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-image.trusted-registry-check", "title": "Validate trusted image repository", "title_zh": "\u6821\u9a8c\u53d7\u4fe1\u4efb\u7684\u955c\u50cf\u4ed3\u5e93", "interface_type": "workflow", "interface": "builder/sources.CheckTrustedRepositories", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestCheckTrustedRepositories" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-image.vm-build-host-taint-toleration", "title": "Add broad toleration for host-scheduled VM build pods", "title_zh": "\u4e3a\u7ed1\u5b9a\u4e3b\u673a\u7684 VM \u6784\u5efa Pod \u6dfb\u52a0\u901a\u914d\u5bb9\u5fcd", "interface_type": "package_function", "interface": "builder/sources.newBuildKitPodSpec", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestNewBuildKitPodSpecAddsTolerationForHostScheduling" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.build-info", "title": "Build repository source metadata including stripped URL and build path", "title_zh": "\u6784\u5efa\u5305\u542b\u51c0\u5316\u5730\u5740\u4e0e\u6784\u5efa\u5b50\u76ee\u5f55\u7684\u4ed3\u5e93\u5143\u6570\u636e", "interface_type": "workflow", "interface": "builder/sources.CreateRepostoryBuildInfo", "code_paths": [ "builder/sources/repo.go" ], "tests": [ { "path": "builder/sources/repo_test.go", "selector": "TestCreateRepostoryBuildInfo" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.cache-dir", "title": "Resolve repository source cache directory from repo branch tenant and service", "title_zh": "\u6839\u636e\u4ed3\u5e93\u5206\u652f\u79df\u6237\u4e0e\u670d\u52a1\u89e3\u6790\u6e90\u7801\u7f13\u5b58\u76ee\u5f55", "interface_type": "workflow", "interface": "builder/sources.GetCodeSourceDir", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/file_test.go", "selector": "TestGetCodeSourceDirUsesSourceDirEnv" }, { "path": "builder/sources/git_test.go", "selector": "TestGetCodeCacheDir" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.clone", "title": "Clone git repository source", "title_zh": "\u514b\u9686 Git \u6e90\u7801\u4ed3\u5e93", "interface_type": "workflow", "interface": "builder/sources.GitClone", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGitClone" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-repo.clone-by-tag", "title": "Clone git repository source by tag", "title_zh": "\u6309\u6807\u7b7e\u514b\u9686 Git \u6e90\u7801\u4ed3\u5e93", "interface_type": "workflow", "interface": "builder/sources.GitClone", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGitCloneByTag" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-repo.git-ref-name", "title": "Map branch and tag inputs to git reference names", "title_zh": "\u5c06\u5206\u652f\u548c\u6807\u7b7e\u8f93\u5165\u6620\u5c04\u4e3a git \u5f15\u7528\u540d", "interface_type": "workflow", "interface": "builder/sources.getBranch", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGetBranch" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.https-proxy", "title": "Route HTTPS Git clones through standard proxy settings", "title_zh": "\u901a\u8fc7\u6807\u51c6\u4ee3\u7406\u62c9\u53d6 HTTPS Git \u4ed3\u5e93", "interface_type": "package_function", "interface": "builder/sources.newGitCloneHTTPClient", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestNewGitCloneHTTPClientProxy" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.pull", "title": "Pull git repository source", "title_zh": "\u62c9\u53d6 Git \u6e90\u7801\u4ed3\u5e93", "interface_type": "workflow", "interface": "builder/sources.GitPull", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGitPull" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-repo.pull-or-clone", "title": "Pull or clone git repository source", "title_zh": "\u62c9\u53d6\u6216\u514b\u9686 Git \u6e90\u7801\u4ed3\u5e93", "interface_type": "workflow", "interface": "builder/sources.GitCloneOrPull", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGitPullOrClone" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.source-repo.show-url", "title": "Strip credentials from repository display URLs", "title_zh": "\u4ece\u4ed3\u5e93\u5c55\u793a\u5730\u5740\u4e2d\u53bb\u9664\u51ed\u636e", "interface_type": "workflow", "interface": "builder/sources.getShowURL", "code_paths": [ "builder/sources/git.go" ], "tests": [ { "path": "builder/sources/git_test.go", "selector": "TestGetShowURL" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.temp-build-info", "title": "Create isolated temporary repository workspaces for source tasks", "title_zh": "\u4e3a\u6e90\u7801\u4efb\u52a1\u521b\u5efa\u72ec\u7acb\u7684\u4e34\u65f6\u4ed3\u5e93\u5de5\u4f5c\u76ee\u5f55", "interface_type": "workflow", "interface": "builder/sources.CreateTempRepostoryBuildInfo", "code_paths": [ "builder/sources/repo.go" ], "tests": [ { "path": "builder/sources/repo_test.go", "selector": "TestCreateTempRepostoryBuildInfo" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-repo.temp-build-info-pkg", "title": "Keep package build sources on their original path when creating temp workspace info", "title_zh": "\u4e3a pkg \u6784\u5efa\u521b\u5efa\u4e34\u65f6\u5de5\u4f5c\u76ee\u5f55\u4fe1\u606f\u65f6\u4fdd\u6301\u539f\u59cb\u8def\u5f84", "interface_type": "workflow", "interface": "builder/sources.CreateTempRepostoryBuildInfo", "code_paths": [ "builder/sources/repo.go" ], "tests": [ { "path": "builder/sources/repo_test.go", "selector": "TestCreateTempRepostoryBuildInfoForPkg" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-sftp.close-safe", "title": "Close zero-value SFTP clients safely", "title_zh": "\u5b89\u5168\u5173\u95ed\u96f6\u503c SFTP \u5ba2\u6237\u7aef", "interface_type": "workflow", "interface": "builder/sources.SFTPClient.Close", "code_paths": [ "builder/sources/sftp.go" ], "tests": [ { "path": "builder/sources/sftp_test.go", "selector": "TestSFTPClientCloseZeroValue" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-sftp.port-parse", "title": "Parse SFTP ports with sane defaults", "title_zh": "\u89e3\u6790 SFTP \u7aef\u53e3\u5e76\u63d0\u4f9b\u5408\u7406\u9ed8\u8ba4\u503c", "interface_type": "workflow", "interface": "builder/sources.parseSFTPPort", "code_paths": [ "builder/sources/sftp.go" ], "tests": [ { "path": "builder/sources/sftp_test.go", "selector": "TestParseSFTPPort" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.source-svn.branch-path", "title": "Resolve svn branch tag and trunk URLs", "title_zh": "\u89e3\u6790 SVN \u5206\u652f\u6807\u7b7e\u4e0e trunk \u7684\u76ee\u6807\u8def\u5f84", "interface_type": "workflow", "interface": "builder/sources.getBranchPath", "code_paths": [ "builder/sources/svn.go" ], "tests": [ { "path": "builder/sources/svn_test.go", "selector": "TestGetBranchPath" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.chunk-cleanup-confirmation", "title": "Require complete scoped S3 chunk deletion acknowledgements", "title_zh": "Require complete scoped S3 chunk deletion acknowledgements", "interface_type": "workflow", "interface": "storage.S3Storage.CleanupChunks", "code_paths": [ "pkg/component/storage/chunk_cleanup_s3.go" ], "tests": [ { "path": "pkg/component/storage/chunk_cleanup_s3_test.go", "selector": "TestChunkCleanupRequiresCompleteScopedAcknowledgements" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.chunk-size-inventory", "title": "Measure complete scoped S3 upload chunk sizes", "title_zh": "Measure complete scoped S3 upload chunk sizes", "interface_type": "workflow", "interface": "S3Storage.MeasureUploadChunks", "code_paths": [ "pkg/component/storage/chunk_inventory.go", "pkg/component/storage/chunk_cleanup_s3.go" ], "tests": [ { "path": "pkg/component/storage/chunk_inventory_test.go", "selector": "TestUploadChunkUsageRequiresCompletePhysicalInventory" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.class-summary", "title": "Summarize storage class info", "title_zh": "\u6c47\u603b\u5b58\u50a8\u7c7b\u4fe1\u606f", "interface_type": "workflow", "interface": "api/handler.StorageClassInfo", "code_paths": [ "api/handler/storage.go" ], "tests": [ { "path": "api/handler/storage_test.go", "selector": "TestStorageClassInfoFields" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.handler-singleton", "title": "Reuse singleton storage handler", "title_zh": "\u590d\u7528\u5b58\u50a8\u5904\u7406\u5668\u5355\u4f8b", "interface_type": "workflow", "interface": "api/handler.GetStorageHandler", "code_paths": [ "api/handler/storage.go" ], "tests": [ { "path": "api/handler/storage_test.go", "selector": "TestGetStorageHandlerSingleton" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.storage.local-chunk-size-inventory", "title": "Measure local upload chunks without following symbolic links", "title_zh": "Measure local upload chunks without following symbolic links", "interface_type": "workflow", "interface": "LocalStorage.MeasureUploadChunks", "code_paths": [ "pkg/component/storage/chunk_inventory.go" ], "tests": [ { "path": "pkg/component/storage/chunk_inventory_test.go", "selector": "TestLocalUploadChunkUsageReadsFilesWithoutFollowingLinks" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.minio-chunk-cleanup", "title": "Delete all owned MinIO upload chunks while preserving a sibling session", "title_zh": "Delete all owned MinIO upload chunks while preserving a sibling session", "interface_type": "workflow", "interface": "storage.S3Storage.CleanupChunks", "code_paths": [ "pkg/component/storage/chunk_cleanup_s3.go" ], "tests": [ { "path": "pkg/component/storage/chunk_cleanup_minio_test.go", "selector": "TestMinIOChunkCleanupOwnsExactSession" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.storage.no-credential-startup-logs", "title": "Never print storage access or secret keys at startup", "title_zh": "Never print storage access or secret keys at startup", "interface_type": "workflow", "interface": "storage.Component.Start", "code_paths": [ "pkg/component/storage/storage.go" ], "tests": [ { "path": "pkg/component/storage/credential_logging_test.go", "selector": "TestStorageStartupDoesNotLogCredentials" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.s3-lifecycle-skip-logs", "title": "Suppress info logs when S3 lifecycle is already configured", "title_zh": "S3 \u751f\u547d\u5468\u671f\u5df2\u914d\u7f6e\u65f6\u4e0d\u518d\u8f93\u51fa info \u65e5\u5fd7", "interface_type": "package_function", "interface": "pkg/component/storage.(*S3Storage).ensureBucketLifecycle", "code_paths": [ "pkg/component/storage/s3_storage.go" ], "tests": [ { "path": "pkg/component/storage/s3_storage_test.go", "selector": "TestEnsureBucketExistsDoesNotLogInfoWhenLifecycleAlreadyConfigured" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.upload-chunk-binding", "title": "Bind native chunk storage without exposing credentials", "title_zh": "Bind native chunk storage without exposing credentials", "interface_type": "workflow", "interface": "Component.UploadChunkBinding", "code_paths": [ "pkg/component/storage/upload_binding.go" ], "tests": [ { "path": "pkg/component/storage/upload_binding_test.go", "selector": "TestUploadStorageBindingChangesWithTargetWithoutExposingCredentials" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.storage.upload-package-size", "title": "Measure scoped upload packages including extracted files", "title_zh": "Measure scoped upload packages including extracted files", "interface_type": "workflow", "interface": "storage.MeasureUploadEvent", "code_paths": [ "pkg/component/storage/upload_package_inventory.go", "api/controller/cleanup_upload_inventory.go" ], "tests": [ { "path": "pkg/component/storage/upload_package_inventory_test.go", "selector": "TestUploadPackageSizeIsScopedAndIncludesExtractedFiles" }, { "path": "pkg/component/storage/upload_package_inventory_test.go", "selector": "TestS3UploadPackageMeasurementUsesExactEventPrefix" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.tenant-resources.skip-unused-cluster-scans", "title": "Skip cluster scans when tenant limit records are complete", "title_zh": "Skip cluster scans when tenant limit records are complete", "interface_type": "handler_method", "interface": "api/handler.TenantAction.GetTenantsResources", "code_paths": [ "api/handler/tenant.go" ], "tests": [ { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesWithLimitsSkipsClusterReads" }, { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesWithLimitsDoesNotWaitForClusterCache" }, { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesMissingLimitsUsesOneClusterFallback" }, { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesEmptyIDsSkipsDownstreamCalls" }, { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesPreservesDAOErrors" }, { "path": "api/handler/tenant_resources_performance_test.go", "selector": "TestGetTenantsResourcesPreservesZeroFallbackAfterKubernetesFailure" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.endpoint-address-construct", "title": "Construct validated third-component endpoint addresses", "title_zh": "\u6784\u9020\u5e76\u6821\u9a8c\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u7aef\u70b9\u5730\u5740", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.NewEndpointAddress", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestNewEndpointAddress" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.endpoint-address-ip", "title": "Resolve endpoint IPs and sentinel domain placeholders", "title_zh": "\u89e3\u6790\u7aef\u70b9 IP \u4e0e\u57df\u540d\u54e8\u5175\u5730\u5740", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.EndpointAddress.GetIP", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestEndpointAddressGetIP" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.endpoint-address-port", "title": "Resolve effective ports from third-component endpoint addresses", "title_zh": "\u4ece\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u7aef\u70b9\u5730\u5740\u4e2d\u89e3\u6790\u6709\u6548\u7aef\u53e3", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.EndpointAddress.GetPort", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestEndpointAddressGetPort" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.endpoint-address-scheme", "title": "Apply default HTTP schemes to third-component endpoint addresses", "title_zh": "\u4e3a\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u7aef\u70b9\u5730\u5740\u8865\u9f50\u9ed8\u8ba4 HTTP \u534f\u8bae", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.EndpointAddress.EnsureScheme", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestEndpointAddressEnsureScheme" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.handler-equals", "title": "Compare third-component handlers across probe modes", "title_zh": "\u6bd4\u8f83\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u5904\u7406\u5668\u5728\u4e0d\u540c\u63a2\u6d4b\u6a21\u5f0f\u4e0b\u7684\u76f8\u7b49\u6027", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.Handler.Equals", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestHandlerEquals" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.http-get-equals", "title": "Compare HTTP probe handlers including header sets", "title_zh": "\u6bd4\u8f83 HTTP \u63a2\u6d4b\u5904\u7406\u5668\u53ca\u5176\u8bf7\u6c42\u5934\u96c6\u5408", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HTTPGetAction.Equals", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestHTTPGetActionEquals" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.identity-fields", "title": "Expose third-component identity and endpoint id helpers", "title_zh": "\u66b4\u9732\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u8eab\u4efd\u4e0e\u7aef\u70b9\u6807\u8bc6\u8f85\u52a9\u51fd\u6570", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.ThirdComponent.GetEndpointID", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestThirdComponentIdentityHelpers" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.legacy-endpoint-port", "title": "Split legacy third-component endpoint host and port pairs", "title_zh": "\u62c6\u5206\u65e7\u5f0f\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u7aef\u70b9\u7684\u4e3b\u673a\u4e0e\u7aef\u53e3\u5bf9", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.ThirdComponentEndpoint.GetPort", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestThirdComponentEndpointGetPortAndIP" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.probe-equals", "title": "Compare third-component probe definitions for equality", "title_zh": "\u6bd4\u8f83\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u63a2\u6d4b\u5b9a\u4e49\u662f\u5426\u76f8\u7b49", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.Probe.Equals", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestProbeEquals" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.probe-required", "title": "Decide whether third components require active probes", "title_zh": "\u5224\u65ad\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u662f\u5426\u9700\u8981\u4e3b\u52a8\u63a2\u6d4b", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.ThirdComponentSpec.NeedProbe", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestThirdComponentSpecNeedProbe" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.third-component.static-endpoints-detect", "title": "Detect whether third-component specs use static endpoints", "title_zh": "\u68c0\u6d4b\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u662f\u5426\u4f7f\u7528\u9759\u6001\u7aef\u70b9", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.ThirdComponentSpec.IsStaticEndpoints", "code_paths": [ "pkg/apis/rainbond/v1alpha1/third_component.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/third_component_unit_test.go", "selector": "TestThirdComponentSpecIsStaticEndpoints" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.upgrade-configmap-aggregates-create-update-errors", "title": "Aggregate ConfigMap create/update errors during upgrade", "title_zh": "Aggregate ConfigMap create/update errors during upgrade", "interface_type": "workflow", "interface": "worker/appm/controller.upgradeController.upgradeConfigMap", "code_paths": [ "worker/appm/controller/upgrade.go" ], "tests": [ { "path": "worker/appm/controller/upgrade_test.go", "selector": "TestUpgradeConfigMapErrorAggregation" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.upgrade-service-aggregates-create-update-errors", "title": "Aggregate Service create/update errors during upgrade", "title_zh": "Aggregate Service create/update errors during upgrade", "interface_type": "workflow", "interface": "worker/appm/controller.upgradeController.upgradeService", "code_paths": [ "worker/appm/controller/upgrade.go" ], "tests": [ { "path": "worker/appm/controller/upgrade_test.go", "selector": "TestUpgradeServiceErrorAggregation" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.array-deduplicate", "title": "Deduplicate string slices while preserving non-empty entries", "title_zh": "\u5bf9\u5b57\u7b26\u4e32\u5207\u7247\u53bb\u91cd\u5e76\u4fdd\u7559\u975e\u7a7a\u5143\u7d20", "interface_type": "workflow", "interface": "util.Deweight", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestDeweight" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.bytes-equality", "title": "Compare byte slices for exact equality including nil handling", "title_zh": "\u6bd4\u8f83\u5b57\u8282\u5207\u7247\u662f\u5426\u5b8c\u5168\u76f8\u7b49\u5e76\u533a\u5206 nil \u60c5\u51b5", "interface_type": "workflow", "interface": "util.BytesSliceEqual", "code_paths": [ "util/bytes.go" ], "tests": [ { "path": "util/bytes_test.go", "selector": "TestBytesSliceEqual" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.bytes-to-string", "title": "Convert byte slices to strings without allocation helpers", "title_zh": "\u4f7f\u7528\u96f6\u62f7\u8d1d\u8f85\u52a9\u5c06\u5b57\u8282\u5207\u7247\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32", "interface_type": "workflow", "interface": "util.ToString", "code_paths": [ "util/string.go" ], "tests": [ { "path": "util/bytes_test.go", "selector": "TestToString" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.core-helpers.hash-ip-string-uuid", "title": "Cover core helper behavior for hash IP string reversal and time version", "title_zh": "\u8986\u76d6\u54c8\u5e0cIP\u5b57\u7b26\u4e32\u53cd\u8f6c\u4e0e\u65f6\u95f4\u7248\u672c\u7b49\u6838\u5fc3\u8f85\u52a9\u884c\u4e3a", "interface_type": "workflow", "interface": "util.CreateFileHash", "code_paths": [ "util/hash.go", "util/ip.go", "util/string.go", "util/uuid.go" ], "tests": [ { "path": "util/hash_test.go", "selector": "TestCreateFileHash" }, { "path": "util/ip_test.go", "selector": "TestCheckIP" }, { "path": "util/string_test.go", "selector": "TestReverse" }, { "path": "util/uuid_test.go", "selector": "TestTimeVersion" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.core-helpers.hash-string", "title": "Create deterministic md5 hashes from raw strings", "title_zh": "\u4ece\u539f\u59cb\u5b57\u7b26\u4e32\u751f\u6210\u7a33\u5b9a\u7684 md5 \u54c8\u5e0c", "interface_type": "workflow", "interface": "util.CreateHashString", "code_paths": [ "util/hash.go" ], "tests": [ { "path": "util/hash_test.go", "selector": "TestCreateHashString" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.core-helpers.string-contains", "title": "Check membership in string slices", "title_zh": "\u68c0\u67e5\u5b57\u7b26\u4e32\u5207\u7247\u4e2d\u7684\u6210\u5458\u662f\u5426\u5b58\u5728", "interface_type": "workflow", "interface": "util.StringArrayContains", "code_paths": [ "util/string.go" ], "tests": [ { "path": "util/string_test.go", "selector": "TestStringArrayContains" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.current-dir-path", "title": "Return normalized current working directory paths", "title_zh": "\u8fd4\u56de\u89c4\u8303\u5316\u7684\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\u8def\u5f84", "interface_type": "workflow", "interface": "util.GetCurrentDir", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetCurrentDir" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.dir-list-depth", "title": "List nested directories up to a target depth", "title_zh": "\u6309\u76ee\u6807\u6df1\u5ea6\u5217\u51fa\u5d4c\u5957\u76ee\u5f55", "interface_type": "workflow", "interface": "util.GetDirList", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetDirList" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.dir-name-list", "title": "List directory names up to a target depth", "title_zh": "\u6309\u76ee\u6807\u6df1\u5ea6\u5217\u51fa\u76ee\u5f55\u540d\u79f0", "interface_type": "workflow", "interface": "util.GetDirNameList", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetDirNameList" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.dir-size-shell", "title": "Measure directory size using shell du command", "title_zh": "\u4f7f\u7528 shell du \u547d\u4ee4\u8ba1\u7b97\u76ee\u5f55\u5927\u5c0f", "interface_type": "workflow", "interface": "util.GetDirSizeByCmd", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetDirSizeByCmd" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.dir-size-walk", "title": "Measure directory size by walking files recursively", "title_zh": "\u901a\u8fc7\u9012\u5f52\u904d\u5386\u6587\u4ef6\u8ba1\u7b97\u76ee\u5f55\u5927\u5c0f", "interface_type": "workflow", "interface": "util.GetDirSize", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetDirSize" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.env-default", "title": "Return default values for empty environment variables", "title_zh": "\u5728\u73af\u5883\u53d8\u91cf\u4e3a\u7a7a\u65f6\u8fd4\u56de\u9ed8\u8ba4\u503c", "interface_type": "workflow", "interface": "util.GetenvDefault", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetenvDefault" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.etcd-key-id-parse", "title": "Extract stable ids from etcd-style keys", "title_zh": "\u4ece etcd \u98ce\u683c\u952e\u4e2d\u63d0\u53d6\u7a33\u5b9a ID", "interface_type": "workflow", "interface": "util.GetIDFromKey", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetIDFromKey" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.file-copy", "title": "Copy files while preserving content and metadata", "title_zh": "\u590d\u5236\u6587\u4ef6\u5e76\u4fdd\u7559\u5185\u5bb9\u4e0e\u5143\u6570\u636e", "interface_type": "workflow", "interface": "util.CopyFile", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestCopyFile" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.file-list-depth", "title": "List files recursively up to a target depth", "title_zh": "\u6309\u76ee\u6807\u6df1\u5ea6\u9012\u5f52\u5217\u51fa\u6587\u4ef6", "interface_type": "workflow", "interface": "util.GetFileList", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetFileList" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fs.archive-and-directory-ops", "title": "Handle file creation copy archive merge listing and directory sizing helpers", "title_zh": "\u5904\u7406\u6587\u4ef6\u521b\u5efa\u590d\u5236\u5f52\u6863\u5408\u5e76\u904d\u5386\u4e0e\u76ee\u5f55\u5927\u5c0f\u8f85\u52a9\u64cd\u4f5c", "interface_type": "workflow", "interface": "util.OpenOrCreateFile", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestOpenOrCreateFile" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fuzzy.find", "title": "Find fuzzy matches from candidate list", "title_zh": "\u5728\u5019\u9009\u5217\u8868\u4e2d\u67e5\u627e\u6a21\u7cca\u5339\u914d", "interface_type": "workflow", "interface": "util/fuzzy.Find", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestFind" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.fuzzy.find-fold", "title": "Find fuzzy matches case-insensitively across candidate lists", "title_zh": "\u5728\u5019\u9009\u5217\u8868\u4e2d\u6309\u5927\u5c0f\u5199\u4e0d\u654f\u611f\u65b9\u5f0f\u67e5\u627e\u6a21\u7cca\u5339\u914d", "interface_type": "workflow", "interface": "util/fuzzy.FindFold", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestFindFold" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fuzzy.levenshtein-distance", "title": "Compute Levenshtein edit distance between strings", "title_zh": "\u8ba1\u7b97\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684 Levenshtein \u7f16\u8f91\u8ddd\u79bb", "interface_type": "workflow", "interface": "util/fuzzy.LevenshteinDistance", "code_paths": [ "util/fuzzy/levenshtein.go" ], "tests": [ { "path": "util/fuzzy/levenshtein_test.go", "selector": "TestLevenshteinDistance" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fuzzy.match", "title": "Match fuzzy pattern against candidate", "title_zh": "\u6a21\u7cca\u5339\u914d\u5355\u4e2a\u5019\u9009\u5b57\u7b26\u4e32", "interface_type": "workflow", "interface": "util/fuzzy.Match", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestMatch" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.fuzzy.match-fold", "title": "Perform case-insensitive fuzzy subsequence matching", "title_zh": "\u6267\u884c\u5927\u5c0f\u5199\u4e0d\u654f\u611f\u7684\u6a21\u7cca\u5b50\u5e8f\u5217\u5339\u914d", "interface_type": "workflow", "interface": "util/fuzzy.MatchFold", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestMatchFold" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fuzzy.rank-find", "title": "Rank fuzzy matches from candidate list", "title_zh": "\u5bf9\u5019\u9009\u5217\u8868\u4e2d\u7684\u6a21\u7cca\u5339\u914d\u7ed3\u679c\u6392\u5e8f", "interface_type": "workflow", "interface": "util/fuzzy.RankFind", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestRankFind" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.fuzzy.rank-find-fold", "title": "Rank case-insensitive fuzzy matches by edit distance", "title_zh": "\u6309\u7f16\u8f91\u8ddd\u79bb\u5bf9\u5927\u5c0f\u5199\u4e0d\u654f\u611f\u7684\u6a21\u7cca\u5339\u914d\u7ed3\u679c\u6392\u5e8f", "interface_type": "workflow", "interface": "util/fuzzy.RankFindFold", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestRankFindFold" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.fuzzy.rank-match", "title": "Rank fuzzy matches by deletion distance", "title_zh": "\u6309\u5220\u9664\u8ddd\u79bb\u4e3a\u6a21\u7cca\u5339\u914d\u7ed3\u679c\u6253\u5206", "interface_type": "workflow", "interface": "util/fuzzy.RankMatch", "code_paths": [ "util/fuzzy/fuzzy.go" ], "tests": [ { "path": "util/fuzzy/fuzzy_test.go", "selector": "TestRankMatch" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.getenv", "title": "Return explicit or fallback environment values", "title_zh": "\u8fd4\u56de\u663e\u5f0f\u73af\u5883\u53d8\u91cf\u503c\u6216\u540e\u5907\u9ed8\u8ba4\u503c", "interface_type": "workflow", "interface": "util.Getenv", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestGetenv" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.host-id-generate", "title": "Generate stable host identifiers from machine state", "title_zh": "\u6839\u636e\u673a\u5668\u72b6\u6001\u751f\u6210\u7a33\u5b9a\u7684\u4e3b\u673a\u6807\u8bc6", "interface_type": "workflow", "interface": "util.CreateHostID", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestCreateHostID" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.network.interface-address-filter", "title": "Filter loopback and non-IP addresses from interface address scans", "title_zh": "\u5728\u7f51\u5361\u5730\u5740\u626b\u63cf\u4e2d\u8fc7\u6ee4\u56de\u73af\u4e0e\u975e IP \u5730\u5740", "interface_type": "workflow", "interface": "util.checkIPAddress", "code_paths": [ "util/ippool.go" ], "tests": [ { "path": "util/ippool_test.go", "selector": "TestCheckIPAddress" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.prober.manage-service-health-watchers", "title": "Manage probe status watchers and fan out health updates", "title_zh": "\u7ba1\u7406\u63a2\u6d4b\u72b6\u6001 watcher \u5e76\u5206\u53d1\u5065\u5eb7\u66f4\u65b0", "interface_type": "workflow", "interface": "util/prober.probeManager.handleStatus", "code_paths": [ "util/prober/manager.go" ], "tests": [ { "path": "util/prober/manager_test.go", "selector": "TestProbeManager_Start" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.ssh.auth-method-selection", "title": "Select SSH auth methods and reject unsupported auth modes", "title_zh": "\u9009\u62e9 SSH \u9274\u6743\u65b9\u5f0f\u5e76\u62d2\u7edd\u4e0d\u652f\u6301\u7684\u8ba4\u8bc1\u6a21\u5f0f", "interface_type": "workflow", "interface": "util.NewSSHClient", "code_paths": [ "util/sshclient.go" ], "tests": [ { "path": "util/sshclient_test.go", "selector": "TestNewSSHClientSelectsAuthMethod" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.statefulset-suffix-detect", "title": "Detect numeric suffixes used by stateful component names", "title_zh": "\u68c0\u6d4b\u72b6\u6001\u7ec4\u4ef6\u540d\u79f0\u4e2d\u7684\u6570\u5b57\u540e\u7f00", "interface_type": "workflow", "interface": "util.IsEndWithNumber", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestIsEndWithNumber" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.string-to-bytes", "title": "Convert strings to byte slices with helper utilities", "title_zh": "\u4f7f\u7528\u8f85\u52a9\u51fd\u6570\u5c06\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3a\u5b57\u8282\u5207\u7247", "interface_type": "workflow", "interface": "util.ToByte", "code_paths": [ "util/string.go" ], "tests": [ { "path": "util/bytes_test.go", "selector": "TestToByte" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.system.identity-and-template-helpers", "title": "Provide host identity version cwd variable and time formatting helpers", "title_zh": "\u63d0\u4f9b\u4e3b\u673a\u6807\u8bc6\u7248\u672c\u5f53\u524d\u76ee\u5f55\u53d8\u91cf\u66ff\u6362\u4e0e\u65f6\u95f4\u683c\u5f0f\u5316\u8f85\u52a9\u80fd\u529b", "interface_type": "workflow", "interface": "util.CreateHostID", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestDeweight" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.template-variable-parse", "title": "Expand template variables with defaults from config maps", "title_zh": "\u6839\u636e\u914d\u7f6e\u6620\u5c04\u5c55\u5f00\u5e26\u9ed8\u8ba4\u503c\u7684\u6a21\u677f\u53d8\u91cf", "interface_type": "workflow", "interface": "util.ParseVariable", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestParseVariable" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.termtables.render-bool-cell", "title": "Render boolean table cell", "title_zh": "\u6e32\u67d3\u5e03\u5c14\u8868\u683c\u5355\u5143\u683c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderBool" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-cell-padding", "title": "Render table cell with configured padding", "title_zh": "\u6309\u914d\u7f6e\u586b\u5145\u8868\u683c\u5355\u5143\u683c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderPadding" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-float-cell", "title": "Render float table cell", "title_zh": "\u6e32\u67d3\u6d6e\u70b9\u8868\u683c\u5355\u5143\u683c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderFloat" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-generic-cell", "title": "Render generic table cell value", "title_zh": "\u6e32\u67d3\u901a\u7528\u8868\u683c\u5355\u5143\u683c\u503c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderGeneric" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-alignment", "title": "Render HTML table with explicit alignment", "title_zh": "\u6e32\u67d3\u5e26\u663e\u5f0f\u5bf9\u9f50\u7684 HTML \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.RenderHTML", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableWithAlignment" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-alt-title-style", "title": "Render HTML table with alternate title style", "title_zh": "\u4ee5\u66ff\u4ee3\u6807\u9898\u6837\u5f0f\u6e32\u67d3 HTML \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.SetHTMLStyleTitle", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableWithAltTitleStyle" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-set-align", "title": "Apply SetAlign to HTML table rendering", "title_zh": "\u5c06 SetAlign \u5e94\u7528\u4e8e HTML \u8868\u683c\u6e32\u67d3", "interface_type": "workflow", "interface": "util/termtables.Table.SetAlign", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableAfterSetAlign" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-table", "title": "Render HTML table output with captions and alignment", "title_zh": "\u6e32\u67d3\u5e26\u6807\u9898\u4e0e\u5bf9\u9f50\u80fd\u529b\u7684 HTML \u8868\u683c\u8f93\u51fa", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestCreateTableHTML" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.termtables.render-html-title", "title": "Render HTML table with title header", "title_zh": "\u6e32\u67d3\u5e26\u6807\u9898\u7684 HTML \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.RenderHTML", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableWithHeaderHTML" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-title-width", "title": "Expand HTML table title to full width", "title_zh": "\u6309\u5bbd\u5ea6\u5c55\u5f00 HTML \u8868\u683c\u6807\u9898", "interface_type": "workflow", "interface": "util/termtables.Table.RenderHTML", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableTitleWidthAdjustsHTML" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-unicode-widths", "title": "Render HTML table with unicode widths", "title_zh": "\u6e32\u67d3\u5e26 Unicode \u5bbd\u5ea6\u7684 HTML \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.RenderHTML", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableUnicodeWidthsHTML" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-html-without-headers", "title": "Render HTML table without headers", "title_zh": "\u6e32\u67d3\u65e0\u8868\u5934\u7684 HTML \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.RenderHTML", "code_paths": [ "util/termtables/html.go" ], "tests": [ { "path": "util/termtables/html_test.go", "selector": "TestTableWithNoHeadersHTML" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-integer-cell", "title": "Render integer table cell", "title_zh": "\u6e32\u67d3\u6574\u6570\u8868\u683c\u5355\u5143\u683c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderInteger" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-markdown-table", "title": "Render markdown table output", "title_zh": "\u6e32\u67d3 Markdown \u8868\u683c\u8f93\u51fa", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableInMarkdown" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-row-width-padding", "title": "Pad rendered row to column width", "title_zh": "\u6309\u5217\u5bbd\u586b\u5145\u6e32\u67d3\u540e\u7684\u8868\u683c\u884c", "interface_type": "workflow", "interface": "util/termtables.Row.Render", "code_paths": [ "util/termtables/row.go" ], "tests": [ { "path": "util/termtables/row_test.go", "selector": "TestRowRenderWidthBasedPadding" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-stringer-cell", "title": "Render fmt.Stringer table cell", "title_zh": "\u6e32\u67d3 Stringer \u8868\u683c\u5355\u5143\u683c", "interface_type": "workflow", "interface": "util/termtables.Cell.Render", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderStringerStruct" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table", "title": "Render terminal and markdown tables with width and unicode handling", "title_zh": "\u6e32\u67d3\u5e26\u5bbd\u5ea6\u4e0e Unicode \u5904\u7406\u7684\u7ec8\u7aef\u4e0e Markdown \u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go", "util/termtables/cell.go", "util/termtables/row.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestCreateTable" }, { "path": "util/termtables/cell_test.go", "selector": "TestCellRenderString" }, { "path": "util/termtables/row_test.go", "selector": "TestBasicRowRender" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-append-headers", "title": "Append headers across multiple AddHeaders calls", "title_zh": "\u5728\u591a\u6b21 AddHeaders \u8c03\u7528\u4e2d\u8ffd\u52a0\u8868\u5934", "interface_type": "workflow", "interface": "util/termtables.Table.AddHeaders", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableMultipleAddHeader" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-cjk", "title": "Render text table with CJK characters", "title_zh": "\u6e32\u67d3\u542b CJK \u5b57\u7b26\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestCJKChars" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-header-width", "title": "Expand text table to fit header width", "title_zh": "\u6309\u8868\u5934\u5bbd\u5ea6\u6269\u5c55\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableHeaderWidthAdjusts" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-missing-cells", "title": "Render text table with missing trailing cells", "title_zh": "\u6e32\u67d3\u7f3a\u5931\u5c3e\u90e8\u5355\u5143\u683c\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableMissingCells" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-post-align", "title": "Apply column alignment after rows are added", "title_zh": "\u5728\u6dfb\u52a0\u884c\u540e\u5e94\u7528\u5217\u5bf9\u9f50", "interface_type": "workflow", "interface": "util/termtables.Table.SetAlign", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableAlignPostsetting" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-repeatable", "title": "Render table headers consistently across repeated renders", "title_zh": "\u91cd\u590d\u6e32\u67d3\u65f6\u4fdd\u6301\u8868\u5934\u4e00\u81f4", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWithHeaderMultipleTimes" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-style-reset", "title": "Reset table style back to ASCII rendering", "title_zh": "\u5c06\u8868\u683c\u6837\u5f0f\u91cd\u7f6e\u4e3a ASCII \u6e32\u67d3", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestStyleResets" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-title-unicode-width", "title": "Render text table title with unicode width accounting", "title_zh": "\u6309 Unicode \u5bbd\u5ea6\u6e32\u67d3\u6587\u672c\u8868\u683c\u6807\u9898", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTitleUnicodeWidths" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-title-width", "title": "Expand text table to fit title width", "title_zh": "\u6309\u6807\u9898\u5bbd\u5ea6\u6269\u5c55\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableTitleWidthAdjusts" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-unicode-widths", "title": "Render text table with unicode widths", "title_zh": "\u6e32\u67d3\u5e26 Unicode \u5bbd\u5ea6\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableUnicodeWidths" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-utf8-box", "title": "Render text table with UTF-8 box drawing", "title_zh": "\u4f7f\u7528 UTF-8 \u8fb9\u6846\u6e32\u67d3\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableInUTF8" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-utf8-sgr", "title": "Render UTF-8 text table with SGR formatting", "title_zh": "\u6e32\u67d3\u5e26\u7ec8\u7aef\u989c\u8272\u63a7\u5236\u5e8f\u5217\u7684 UTF-8 \u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableUnicodeUTF8AndSGR" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-width-balance", "title": "Balance text table width across rows", "title_zh": "\u5728\u591a\u884c\u4e4b\u95f4\u5e73\u8861\u6587\u672c\u8868\u683c\u5bbd\u5ea6", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWidthHandling" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-width-balance-second", "title": "Handle second text table width balancing case", "title_zh": "\u5904\u7406\u7b2c\u4e8c\u7c7b\u6587\u672c\u8868\u683c\u5bbd\u5ea6\u5e73\u8861\u573a\u666f", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWidthHandling_SecondErrorCondition" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-with-combining-chars", "title": "Render text table with combining characters", "title_zh": "\u6e32\u67d3\u542b\u7ec4\u5408\u5b57\u7b26\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWithCombiningChars" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-with-fullwidth-chars", "title": "Render text table with fullwidth characters", "title_zh": "\u6e32\u67d3\u542b\u5168\u89d2\u5b57\u7b26\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWithFullwidthChars" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-with-title", "title": "Render text table with title row", "title_zh": "\u6e32\u67d3\u5e26\u6807\u9898\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWithHeader" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.render-text-table-without-headers", "title": "Render text table without headers", "title_zh": "\u6e32\u67d3\u65e0\u8868\u5934\u7684\u6587\u672c\u8868\u683c", "interface_type": "workflow", "interface": "util/termtables.Table.Render", "code_paths": [ "util/termtables/table.go" ], "tests": [ { "path": "util/termtables/table_test.go", "selector": "TestTableWithNoHeaders" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.termtables.strip-color-codes", "title": "Strip ANSI color codes from cell content", "title_zh": "\u79fb\u9664\u5355\u5143\u683c\u5185\u5bb9\u4e2d\u7684 ANSI \u989c\u8272\u7801", "interface_type": "workflow", "interface": "util/termtables.filterColorCodes", "code_paths": [ "util/termtables/cell.go" ], "tests": [ { "path": "util/termtables/cell_test.go", "selector": "TestFilterColorCodes" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.util.time-format-rfc3339", "title": "Format parsed timestamps into RFC3339 strings", "title_zh": "\u5c06\u89e3\u6790\u540e\u7684\u65f6\u95f4\u683c\u5f0f\u5316\u4e3a RFC3339 \u5b57\u7b26\u4e32", "interface_type": "workflow", "interface": "time.Format", "code_paths": [ "util/comman_test.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestTimeFormat" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.version-timestamp", "title": "Generate timestamp-based version strings", "title_zh": "\u751f\u6210\u57fa\u4e8e\u65f6\u95f4\u6233\u7684\u7248\u672c\u5b57\u7b26\u4e32", "interface_type": "workflow", "interface": "util.CreateVersionByTime", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestCreateVersionByTime" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.whitespace-filter", "title": "Filter blank and whitespace-only entries from string slices", "title_zh": "\u4ece\u5b57\u7b26\u4e32\u5207\u7247\u4e2d\u8fc7\u6ee4\u7a7a\u767d\u4e0e\u4ec5\u7a7a\u683c\u9879", "interface_type": "workflow", "interface": "util.RemoveSpaces", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestRemoveSpaces" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.zip-archive", "title": "Archive directories into zip files", "title_zh": "\u5c06\u76ee\u5f55\u5f52\u6863\u4e3a zip \u6587\u4ef6", "interface_type": "workflow", "interface": "util.Zip", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestZip" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.util.zip-structure-detect", "title": "Detect whether zip archives share a common root directory", "title_zh": "\u68c0\u6d4b zip \u5f52\u6863\u662f\u5426\u5171\u4eab\u516c\u5171\u6839\u76ee\u5f55", "interface_type": "workflow", "interface": "util.detectZipStructure", "code_paths": [ "util/comman.go" ], "tests": [ { "path": "util/comman_test.go", "selector": "TestDetectZipStructure" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.version.commit-message-utf8", "title": "Version commit messages retain valid UTF-8 when truncated", "title_zh": "\u7248\u672c\u63d0\u4ea4\u4fe1\u606f\u5b89\u5168\u622a\u65ad\u5e76\u5b8c\u6210\u6784\u5efa\u5165\u5e93", "interface_type": "dao_method", "interface": "VersionInfoDaoImpl.AddModel/UpdateModel", "code_paths": [ "db/mysql/dao/version.go" ], "tests": [ { "path": "db/mysql/dao/version_commit_msg_test.go", "selector": "TestTruncateVersionCommitMsg" }, { "path": "db/mysql/dao/version_commit_msg_test.go", "selector": "TestTruncateVersionCommitMsgMalformedInputDoesNotPanic" }, { "path": "db/mysql/dao/version_commit_msg_test.go", "selector": "TestVersionCommitMsgPersistence" }, { "path": "db/mysql/dao/version_commit_msg_test.go", "selector": "FuzzTruncateVersionCommitMsg" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-build.buildkit-startup-retry", "title": "Increase VM BuildKit startup retry window", "title_zh": "\u589e\u52a0\u865a\u62df\u673a BuildKit \u542f\u52a8\u7b49\u5f85\u6b21\u6570", "interface_type": "package_function", "interface": "builder/sources.buildctlConnectRetriesMax", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestBuildctlConnectRetriesMaxUsesLongerDefaultForVMBuild" }, { "path": "builder/sources/image_test.go", "selector": "TestBuildctlConnectRetriesMaxPreservesExplicitEnv" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-build.retain-failed-build-pod", "title": "Retain failed VM build pods for diagnostics", "title_zh": "\u4fdd\u7559\u5931\u8d25\u7684\u865a\u62df\u673a\u6784\u5efa Pod \u4fbf\u4e8e\u8bca\u65ad", "interface_type": "package_function", "interface": "builder/sources.shouldRetainFailedBuildKitJob", "code_paths": [ "builder/sources/image.go" ], "tests": [ { "path": "builder/sources/image_test.go", "selector": "TestShouldRetainFailedBuildKitJobByDefault" }, { "path": "builder/sources/image_test.go", "selector": "TestShouldRetainFailedBuildKitJobCanBeDisabled" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-config-file-injected-as-configmap-volume", "title": "Inject VM config-file volumes as guest-visible ConfigMap disks", "title_zh": "\u5c06 VM \u914d\u7f6e\u6587\u4ef6\u5377\u6ce8\u5165\u4e3a guest \u53ef\u89c1\u7684 ConfigMap \u914d\u7f6e\u76d8", "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": "TestConfigFileVolumeCreateVolumeForVMBuildsGuestVisibleConfigDisk" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-export.root-disk-url", "title": "Create VMExport and expose root disk download URL", "title_zh": "\u521b\u5efa VMExport \u5e76\u8fd4\u56de\u7cfb\u7edf\u76d8\u4e0b\u8f7d\u5730\u5740", "interface_type": "handler_method", "interface": "api/handler.VMExportHandler", "code_paths": [ "api/handler/vm_export.go" ], "tests": [ { "path": "api/handler/vm_export_test.go", "selector": "TestCreateVMExport" }, { "path": "api/handler/vm_export_test.go", "selector": "TestGetVMExport" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-hotplug.add-volume-conflict-retry", "title": "Retry VM hotplug add volume on conflict", "title_zh": "\u70ed\u6dfb\u52a0\u865a\u62df\u673a\u78c1\u76d8\u65f6\u5728\u51b2\u7a81\u540e\u91cd\u8bd5", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.hotplugVMDataDisk", "code_paths": [ "api/handler/service_vm_hotplug.go" ], "tests": [ { "path": "api/handler/service_vm_hotplug_test.go", "selector": "TestPerformVMHotplugAddVolumeRetriesConflicts" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-hotplug.data-volume-capacity-gi", "title": "Create VM hotplug DataVolumes with Gi capacity", "title_zh": "\u4f7f\u7528 Gi \u5bb9\u91cf\u521b\u5efa\u865a\u62df\u673a\u70ed\u63d2\u6570\u636e\u5377", "interface_type": "package_function", "interface": "api/handler.buildVMHotplugDataVolumeObject", "code_paths": [ "api/handler/service_vm_hotplug.go" ], "tests": [ { "path": "api/handler/service_vm_hotplug_test.go", "selector": "TestBuildVMHotplugDataVolumeObjectUsesGiCapacity" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-hotplug.remove-volume-running-vm", "title": "Hot-unplug running VM data disks on delete", "title_zh": "\u5220\u9664\u5b58\u50a8\u65f6\u70ed\u79fb\u9664\u8fd0\u884c\u4e2d\u865a\u62df\u673a\u7684\u6570\u636e\u78c1\u76d8", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.VolumnVar", "code_paths": [ "api/handler/service.go", "api/handler/service_vm_hotplug.go" ], "tests": [ { "path": "api/handler/service_vm_hotplug_test.go", "selector": "TestHotunplugVMDataDiskRemovesVolumeFromRunningVM" }, { "path": "api/handler/service_vm_hotplug_test.go", "selector": "TestHotunplugVMDataDiskDeletesBackingDataVolumeAndPVC" }, { "path": "api/handler/service_vm_hotplug_test.go", "selector": "TestVolumnVarDeleteHotunplugsRunningVMDataDisk" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-import.registry-datavolume", "title": "Import VM root disk from registry DataVolume", "title_zh": "\u901a\u8fc7 registry DataVolume \u5bfc\u5165\u865a\u62df\u673a\u7cfb\u7edf\u76d8", "interface_type": "workflow", "interface": "worker/appm/volume.BuildVMDataVolumeTemplate", "code_paths": [ "worker/appm/volume/vm_import.go" ], "tests": [ { "path": "worker/appm/volume/vm_import_test.go", "selector": "TestBuildVMRegistryImportDataVolumeTemplate" }, { "path": "worker/appm/volume/vm_import_test.go", "selector": "TestBuildVMRegistryImportDataVolumeTemplateAddsDockerSchemeWhenMissing" }, { "path": "worker/appm/volume/vm_import_test.go", "selector": "TestBuildVMRegistryImportDataVolumeTemplatePrefixesInternalRegistryForShortImage" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-import.registry-reference-validation", "title": "Reject malformed VM registry image references", "title_zh": "Reject malformed VM registry image references", "interface_type": "workflow", "interface": "worker/appm/volume.normalizeVMRegistryImportURL", "code_paths": [ "worker/appm/volume/vm_import.go", "worker/appm/volume/share-file.go" ], "tests": [ { "path": "worker/appm/volume/vm_import_test.go", "selector": "TestNormalizeVMRegistryImportURLRejectsInvalidReference" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-import.validation-aborts-vm-definition", "title": "Abort VM definition for invalid registry imports", "title_zh": "Abort VM definition for invalid registry imports", "interface_type": "workflow", "interface": "worker/appm/conversion.createVolumes", "code_paths": [ "worker/appm/conversion/version.go", "worker/appm/volume/share-file.go", "worker/appm/volume/vm_import.go" ], "tests": [ { "path": "worker/appm/conversion/version_vm_import_test.go", "selector": "TestCreateVolumesRejectsInvalidVMRegistryImport" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.capability-requires-installer-media-removal", "title": "Block live update capability until installer media is removed", "title_zh": "\u521d\u59cb\u5316\u5b89\u88c5\u5149\u76d8\u672a\u5220\u9664\u65f6\u5c4f\u853d\u70ed\u66f4\u65b0\u80fd\u529b", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.GetVMLiveUpdateCapability", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestGetVMLiveUpdateCapabilityRejectsWhenInstallerMediaStillAttached" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.capability-requires-migration-target", "title": "Block hot update capability when no migration target node is available", "title_zh": "\u65e0\u53ef\u7528\u8fc1\u79fb\u76ee\u6807\u8282\u70b9\u65f6\u5c4f\u853d\u70ed\u66f4\u65b0\u80fd\u529b", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.GetVMLiveUpdateCapability", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestGetVMLiveUpdateCapabilityRejectsWhenNoMigrationTargetNode" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.cpu-memory-combined-rejected", "title": "Reject combined CPU and memory live updates", "title_zh": "\u62d2\u7edd\u8fd0\u884c\u4e2d\u865a\u62df\u673a\u540c\u65f6\u70ed\u66f4\u65b0 CPU \u548c\u5185\u5b58", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRejectsCombinedCPUAndMemoryChange" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.installer-media-removal-required", "title": "Reject live update until installer media is removed", "title_zh": "\u521d\u59cb\u5316\u5b89\u88c5\u5149\u76d8\u672a\u5220\u9664\u65f6\u62d2\u7edd\u865a\u62df\u673a\u70ed\u66f4\u65b0", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRejectsWhenInstallerMediaStillAttached" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.memory-target-below-max-guest", "title": "Reject memory live update targets at maxGuest", "title_zh": "\u62d2\u7edd\u7b49\u4e8e maxGuest \u7684\u865a\u62df\u673a\u5185\u5b58\u70ed\u66f4\u65b0\u76ee\u6807", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRejectsRunningVMMemoryAtMaxGuest" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.migration-target-missing-auto-restart", "title": "Restart VM when no live migration target node is available", "title_zh": "\u65e0\u53ef\u7528\u8fc1\u79fb\u76ee\u6807\u8282\u70b9\u65f6\u81ea\u52a8\u8c03\u6574\u89c4\u683c\u5e76\u91cd\u542f\u865a\u62df\u673a", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRestartsWhenNoMigrationTargetNode" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.running-cpu-shrink-rejected", "title": "Reject running VM CPU shrink during live update", "title_zh": "Reject running VM CPU shrink during live update", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRejectsRunningVMCPUShrink" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.running-memory-shrink-rejected", "title": "Reject running VM memory shrink during live update", "title_zh": "\u62d2\u7edd\u8fd0\u884c\u4e2d\u865a\u62df\u673a\u7684\u5185\u5b58\u70ed\u7f29\u5bb9", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMLiveUpdateRejectsRunningVMMemoryShrink" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.running-shrink-restart-allowed-before-event", "title": "Allow running VM shrink requests to reach vertical scaling handler", "title_zh": "\u8fd0\u884c\u4e2d\u865a\u62df\u673a\u7f29\u5bb9\u5141\u8bb8\u8fdb\u5165\u5782\u76f4\u4f38\u7f29\u6d41\u7a0b", "interface_type": "other", "interface": "api/middleware.WrapEL", "code_paths": [ "api/middleware/middleware.go" ], "tests": [ { "path": "api/middleware/middleware_test.go", "selector": "TestWrapELAllowsRunningVMShrinkToReachHandler" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-live-update.unsupported-auto-restart", "title": "Restart running VM when live update is unsupported", "title_zh": "\u4e0d\u6ee1\u8db3\u70ed\u66f4\u65b0\u6761\u4ef6\u65f6\u81ea\u52a8\u8c03\u6574\u89c4\u683c\u5e76\u91cd\u542f\u865a\u62df\u673a", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.applyVMLiveUpdateIfPossible", "code_paths": [ "api/handler/service_vm_live_update.go" ], "tests": [ { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMNonMigratableFallsBackToSpecSyncAndRestart" }, { "path": "api/handler/service_vm_live_update_test.go", "selector": "TestServiceVerticalVMPatchMigrationErrorFallsBackToSpecSyncAndRestart" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-pods.cleanup-completed-virt-launcher", "title": "Cleanup completed virt-launcher pods after VM hot update", "title_zh": "\u865a\u62df\u673a\u70ed\u66f4\u65b0\u540e\u6e05\u7406\u5df2\u5b8c\u6210\u7684 virt-launcher Pod", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.GetPods", "code_paths": [ "api/handler/service_vm_pod_cleanup.go" ], "tests": [ { "path": "api/handler/service_vm_pod_cleanup_test.go", "selector": "TestGetPodsCleansUpCompletedVMLauncherPodsAfterHotUpdate" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-power.direct-ops-event-close", "title": "Close direct VM power operation events after synchronous KubeVirt actions", "title_zh": "\u5728\u540c\u6b65\u6267\u884c KubeVirt \u865a\u62df\u673a\u7535\u6e90\u64cd\u4f5c\u540e\u95ed\u73af\u4e8b\u4ef6\u72b6\u6001", "interface_type": "workflow", "interface": "api/handler direct VM power operations", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMMarksDirectStartEventSuccess" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMMarksDirectStartEventFailure" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestRestartVMMarksDirectRestartEventSuccess" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStopVMMarksDirectStopEventSuccess" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-power.start-existing-or-create", "title": "Start existing stopped VM before falling back to worker create flow", "title_zh": "\u4f18\u5148\u542f\u52a8\u5df2\u5b58\u5728\u4e14\u5df2\u505c\u6b62\u7684\u865a\u62df\u673a\uff0c\u5426\u5219\u56de\u9000\u5230 worker \u521b\u5efa\u6d41\u7a0b", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.StartOrCreateVM", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMStartsExistingStoppedVM" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMStartsExistingStoppedVMWhenSpecSyncFindsMissingRootImport" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMStartsStoppedAlwaysRunStrategyVM" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMStartsExistingVMWithUnknownPrintableStatus" }, { "path": "api/handler/service_vm_power_test.go", "selector": "TestStartOrCreateVMFallsBackToWorkerStartWhenVMIsMissing" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-power.stop-restoring-fallback", "title": "Fallback to halt transient VM when direct stop fails", "title_zh": "Fallback to halt transient VM when direct stop fails", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.StopVM", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_power_test.go", "selector": "TestStopVMFallsBackToHaltingProvisioningVMWhenDirectStopFails" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-probe-attribute-syncs-spec", "title": "VM probe attributes trigger VirtualMachine spec sync", "title_zh": "VM probe attributes trigger VirtualMachine spec sync", "interface_type": "package_function", "interface": "api/handler.isVMRuntimeSpecAttribute", "code_paths": [ "api/handler/k8s_attribute.go" ], "tests": [ { "path": "api/handler/k8s_attribute_vm_runtime_test.go", "selector": "TestIsVMRuntimeSpecAttributeIncludesProbeAttributes" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-probe-change-syncs-spec", "title": "VM probe changes sync VirtualMachine spec", "title_zh": "VM probe changes sync VirtualMachine spec", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.ServiceProbe", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_resource_sync_test.go", "selector": "TestServiceProbeSyncsVirtualMachineSpecWhenVMProbeChanges" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-publish.http-artifact-image-build", "title": "Build VM publish image from exported disk as HTTP artifact", "title_zh": "\u5c06\u5bfc\u51fa\u7684\u865a\u62df\u673a\u78c1\u76d8\u6784\u5efa\u4e3a HTTP \u5236\u54c1\u955c\u50cf", "interface_type": "workflow", "interface": "builder/exector.BuildFromVM", "code_paths": [ "api/handler/share/service_share.go", "builder/exector/build_from_vm.go", "builder/sources/image.go", "builder/sourceutil/remote_http_client.go" ], "tests": [ { "path": "api/handler/share/service_share_test.go", "selector": "TestServiceShareVMImageSourceSkipsDeliveredPathReferenceValidation" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestRenderVMDockerfileUsesHTTPArtifactForGzipRawExport" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestDownloadFileUsesVMExportTokenHeader" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestDownloadFileOverwritesExistingPartialFile" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestVMRemoteImageSourceDirUsesEventID" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestMyDownloaderLogsUnknownSizeProgress" }, { "path": "builder/exector/share_image_test.go", "selector": "TestNewImageShareItemCapturesVMImageSource" }, { "path": "builder/sources/image_test.go", "selector": "TestBuildKitImageOutputUsesUncompressedLayersForVMBuild" }, { "path": "builder/sourceutil/remote_http_client_test.go", "selector": "TestNewRemotePackageHTTPClientSkipsTLSVerifyForVMExportService" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-publish.stage-timing-logs", "title": "Trace VM publish stage timing logs", "title_zh": "Trace VM publish stage timing logs", "interface_type": "workflow", "interface": "builder/exector.VMBuildItem.RunVMBuild", "code_paths": [ "builder/exector/build_from_vm.go", "builder/exector/share_image.go", "builder/sources/image.go" ], "tests": [ { "path": "builder/exector/build_from_vm_test.go", "selector": "TestRecordVMBuildStageLogsSuccess" }, { "path": "builder/exector/build_from_vm_test.go", "selector": "TestRecordVMBuildStageLogsError" }, { "path": "builder/sources/image_test.go", "selector": "TestRecordImageBuildStageLogsFields" }, { "path": "builder/sources/image_test.go", "selector": "TestRecordImageBuildStageLogsError" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-run.build-media-paths", "title": "Split VM runtime image build templates for ISO and disk sources", "title_zh": "\u62c6\u5206 ISO \u4e0e\u78c1\u76d8\u955c\u50cf\u7684 VM \u8fd0\u884c\u65f6\u6784\u5efa\u6a21\u677f\u8def\u5f84", "interface_type": "package_function", "interface": "builder/exector.renderVMDockerfile", "code_paths": [ "builder/exector/build_from_vm.go" ], "tests": [ { "path": "builder/exector/build_from_vm_test.go", "selector": "TestResolveVMBuildMediaDistinguishesISOAndDiskImages" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-run.local-package-storage-download", "title": "VM local package source falls back to storage download", "title_zh": "vm-run \u672c\u5730\u5305\u6e90\u5728\u76ee\u5f55\u7f3a\u5931\u65f6\u56de\u9000 storage \u4e0b\u8f7d", "interface_type": "package_function", "interface": "builder/sourceutil.ReadLocalPackageDir", "code_paths": [ "builder/sourceutil/local_package.go" ], "tests": [ { "path": "builder/sourceutil/local_package_test.go", "selector": "TestReadLocalPackageDirFallsBackToStorageDownload" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-run.remote-package-probe", "title": "VM remote package probe prefers HEAD", "title_zh": "vm-run \u8fdc\u7a0b\u5305\u63a2\u6d4b\u4f18\u5148\u4f7f\u7528 HEAD", "interface_type": "other", "interface": "builder/parser.VMServiceParse.Parse", "code_paths": [ "builder/parser/vm_service.go" ], "tests": [ { "path": "builder/parser/vm_service_test.go", "selector": "TestVMServiceParseRemoteURLPrefersHeadProbe" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-run.remote-package-probe-range-fallback", "title": "VM remote package probe falls back to range GET", "title_zh": "vm-run \u8fdc\u7a0b\u5305\u63a2\u6d4b\u5728 HEAD \u5931\u8d25\u65f6\u56de\u9000 Range GET", "interface_type": "other", "interface": "builder/parser.VMServiceParse.Parse", "code_paths": [ "builder/parser/vm_service.go" ], "tests": [ { "path": "builder/parser/vm_service_test.go", "selector": "TestVMServiceParseRemoteURLFallsBackToRangeGet" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-runtime-spec-sync-conflict-retry", "title": "Retry VM spec sync when KubeVirt update conflicts", "title_zh": "Retry VM spec sync when KubeVirt update conflicts", "interface_type": "handler_method", "interface": "github.com/goodrain/rainbond/api/handler.(*ServiceAction).syncVirtualMachineSpec", "code_paths": [ "api/handler/k8s_attribute.go" ], "tests": [ { "path": "api/handler/k8s_attribute_vm_runtime_test.go", "selector": "TestSyncVirtualMachineSpecRetriesOnConflict" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-runtime.disk-layout-attr-triggers-spec-sync", "title": "Treat vm_disk_layout as a VM spec sync attribute", "title_zh": "\u5c06 vm_disk_layout \u89c6\u4e3a\u89e6\u53d1 VM \u89c4\u683c\u540c\u6b65\u7684\u5c5e\u6027", "interface_type": "package_function", "interface": "api/handler.isVMRuntimeSpecAttribute", "code_paths": [ "api/handler/k8s_attribute.go" ], "tests": [ { "path": "api/handler/k8s_attribute_vm_runtime_test.go", "selector": "TestIsVMRuntimeSpecAttributeIncludesDiskLayout" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-template-import.registry-restore-progress", "title": "Expose registry VM DataVolume import progress", "title_zh": "\u66b4\u9732 registry \u865a\u62df\u673a DataVolume \u5bfc\u5165\u8fdb\u5ea6", "interface_type": "package_function", "interface": "api/handler.vmRestoreDataVolumeNames", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMDataVolumeRestoreIncludesRegistryImportDataVolumes" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-template-import.restore-progress", "title": "Expose VM template import restore progress", "title_zh": "Expose VM template import restore progress", "interface_type": "package_function", "interface": "api/handler.resolveVMDataVolumeRestoreStatus", "code_paths": [ "api/handler/service.go", "api/model/model.go" ], "tests": [ { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMRestoreStatusIncludesDataVolumeProgress" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMRestoreStatusMarksAllDataVolumesSucceeded" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMDataVolumeRestoreIgnoresInitialBlankDataVolumes" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.vm-template-import.status-restoring", "title": "VM restore status is limited to artifact imports", "title_zh": "VM restore status is limited to artifact imports", "interface_type": "package_function", "interface": "api/handler.resolveVMServiceRuntimeStatus", "code_paths": [ "api/handler/service.go" ], "tests": [ { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMTransitionStatusReturnsStartingForDataVolumeImportWithoutRestoreContext" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMServiceRuntimeStatusReturnsRestoringWhenArtifactDataVolumeImportsBeforeVMIExists" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMServiceRuntimeStatusReturnsStartingForInitialBlankDataVolume" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMServiceRuntimeStatusReturnsStartingForInitialHTTPDataVolume" }, { "path": "api/handler/service_vm_status_test.go", "selector": "TestResolveVMTransitionStatusReturnsAbnormalForDataVolumeError" } ], "test_type": "unit", "status": "active" }, { "id": "rainbond.vm-volume-selected-storage-class", "title": "Preserve selected storage class for VM data volumes", "title_zh": "\u4e3a VM \u6570\u636e\u5377\u4fdd\u7559\u6240\u9009\u5b58\u50a8\u7c7b", "interface_type": "workflow", "interface": "worker/appm/volume.ShareFileVolume.CreateVolume", "code_paths": [ "worker/appm/volume/share-file.go", "worker/appm/volume/volume.go" ], "tests": [ { "path": "worker/appm/volume/share_file_vm_test.go", "selector": "TestNewVolumeManagerUsesSelectedStorageClassForVMDisks" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-volume-vm-file-backward-compatible", "title": "Keep local-path fallback for legacy vm-file VM volumes", "title_zh": "\u65e7\u7248 vm-file \u865a\u673a\u5377\u7ee7\u7eed\u56de\u9000\u5230 local-path", "interface_type": "workflow", "interface": "worker/appm/volume.ShareFileVolume.CreateVolume", "code_paths": [ "worker/appm/volume/share-file.go", "worker/appm/volume/volume.go" ], "tests": [ { "path": "worker/appm/volume/share_file_vm_test.go", "selector": "TestShareFileVolumeVMStorageClassFallsBackToLocalPathForLegacyVMFile" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.vm-volume.allow-shared-device-paths", "title": "Allow VM services to reuse device paths across volumes", "title_zh": "\u5141\u8bb8 VM \u670d\u52a1\u5728\u4e0d\u540c\u6570\u636e\u5377\u95f4\u590d\u7528\u8bbe\u5907\u8def\u5f84", "interface_type": "dao_method", "interface": "db/mysql/dao.TenantServiceVolumeDaoImpl.AddModel", "code_paths": [ "db/mysql/dao/tenants.go" ], "tests": [ { "path": "db/mysql/dao/tenant_service_volume_vm_test.go", "selector": "TestTenantServiceVolumeDaoAddModelAllowsDuplicateVMDevicePath" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.volume-dependency.precise-delete", "title": "Delete only the requested provider volume relation", "title_zh": "\u4ec5\u5220\u9664\u6307\u5b9a\u63d0\u4f9b\u65b9\u7684\u6302\u8f7d\u5173\u7cfb", "interface_type": "handler_method", "interface": "api/handler.ServiceAction.VolumeDependency", "code_paths": [ "api/handler/service.go", "db/dao/dao.go", "db/mysql/dao/tenants.go" ], "tests": [ { "path": "api/handler/service_volume_dependency_test.go", "selector": "TestVolumeDependencyDeleteUsesConsumerProviderAndVolumeName" }, { "path": "db/mysql/dao/tenant_service_mount_relation_test.go", "selector": "TestTenantServiceMountRelationDaoDeletesOnlyRequestedProviderVolume" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.volume.keep-non-vm-path-uniqueness", "title": "Keep duplicate path checks for non-VM service volumes", "title_zh": "\u4fdd\u6301\u975e VM \u670d\u52a1\u5377\u8def\u5f84\u552f\u4e00\u6027\u6821\u9a8c", "interface_type": "dao_method", "interface": "db/mysql/dao.TenantServiceVolumeDaoImpl.AddModel", "code_paths": [ "db/mysql/dao/tenants.go" ], "tests": [ { "path": "db/mysql/dao/tenant_service_volume_vm_test.go", "selector": "TestTenantServiceVolumeDaoAddModelRejectsDuplicatePathForNonVMService" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.error-dispatch", "title": "Dispatch watch backend errors onto the internal error channel", "title_zh": "\u5c06 watch \u540e\u7aef\u9519\u8bef\u5206\u53d1\u5230\u5185\u90e8\u9519\u8bef\u901a\u9053", "interface_type": "workflow", "interface": "util/watch.watchChan.sendError", "code_paths": [ "util/watch/watcher.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestWatchChanSendError" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.error-parse", "title": "Convert watch backend errors into API error events", "title_zh": "\u5c06 watch \u540e\u7aef\u9519\u8bef\u8f6c\u6362\u4e3a API \u9519\u8bef\u4e8b\u4ef6", "interface_type": "workflow", "interface": "util/watch.parseError", "code_paths": [ "util/watch/watcher.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestParseError" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.etcd-event-parse", "title": "Parse etcd watch events into internal watch event structs", "title_zh": "\u5c06 etcd watch \u4e8b\u4ef6\u89e3\u6790\u4e3a\u5185\u90e8\u4e8b\u4ef6\u7ed3\u6784", "interface_type": "workflow", "interface": "util/watch.parseEvent", "code_paths": [ "util/watch/event.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestParseEvent" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.event-accessors", "title": "Expose key and payload accessors for watch events", "title_zh": "\u4e3a watch \u4e8b\u4ef6\u66b4\u9732\u952e\u4e0e\u8f7d\u8377\u8bbf\u95ee\u5668", "interface_type": "workflow", "interface": "util/watch.Event.GetKey", "code_paths": [ "util/watch/watch.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestEventAccessors" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.event-byte-accessors", "title": "Expose raw byte payload accessors for watch events", "title_zh": "\u4e3a watch \u4e8b\u4ef6\u66b4\u9732\u539f\u59cb\u5b57\u8282\u8f7d\u8377\u8bbf\u95ee\u5668", "interface_type": "workflow", "interface": "util/watch.Event.GetValue", "code_paths": [ "util/watch/watch.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestEventByteAccessors" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.event-dispatch", "title": "Dispatch low-level watch events onto the incoming event channel", "title_zh": "\u5c06\u5e95\u5c42 watch \u4e8b\u4ef6\u5206\u53d1\u5230\u8f93\u5165\u4e8b\u4ef6\u901a\u9053", "interface_type": "workflow", "interface": "util/watch.watchChan.sendEvent", "code_paths": [ "util/watch/watcher.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestWatchChanSendEvent" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.event-type-transform", "title": "Transform low-level watch events into added modified and deleted results", "title_zh": "\u5c06\u5e95\u5c42 watch \u4e8b\u4ef6\u8f6c\u6362\u4e3a Added/Modified/Deleted \u7ed3\u679c", "interface_type": "workflow", "interface": "util/watch.watchChan.transform", "code_paths": [ "util/watch/watcher.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestWatchChanTransform" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.resource-version-parse", "title": "Parse watch resource versions into etcd revisions", "title_zh": "\u5c06 watch \u8d44\u6e90\u7248\u672c\u89e3\u6790\u4e3a etcd \u4fee\u8ba2\u53f7", "interface_type": "workflow", "interface": "util/watch.ParseWatchResourceVersion", "code_paths": [ "util/watch/util.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestParseWatchResourceVersion" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.status-error-format", "title": "Format watch status errors into stable error strings", "title_zh": "\u5c06 watch \u72b6\u6001\u9519\u8bef\u683c\u5f0f\u5316\u4e3a\u7a33\u5b9a\u5b57\u7b26\u4e32", "interface_type": "workflow", "interface": "util/watch.Status.Error", "code_paths": [ "util/watch/event.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestStatusError" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.watch.synthetic-create-event", "title": "Convert initial etcd key-values into synthetic create events", "title_zh": "\u5c06\u521d\u59cb etcd \u952e\u503c\u8f6c\u6362\u4e3a\u5408\u6210\u521b\u5efa\u4e8b\u4ef6", "interface_type": "workflow", "interface": "util/watch.parseKV", "code_paths": [ "util/watch/event.go" ], "tests": [ { "path": "util/watch/watch_test.go", "selector": "TestParseKVMarksCreateEvent" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.auth-signature", "title": "Generate stable websocket auth md5 signatures", "title_zh": "\u751f\u6210\u7a33\u5b9a\u7684 WebSocket \u9274\u6743 MD5 \u6458\u8981", "interface_type": "workflow", "interface": "api/webcli/app.md5Func", "code_paths": [ "api/webcli/app/app.go" ], "tests": [ { "path": "api/webcli/app/app_test.go", "selector": "TestMD5Func" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.completed-pod-guard", "title": "Reject exec sessions against completed pods", "title_zh": "\u62d2\u7edd\u5bf9\u5df2\u5b8c\u6210 Pod \u5efa\u7acb exec \u4f1a\u8bdd", "interface_type": "workflow", "interface": "api/webcli/app.App.GetContainerArgs", "code_paths": [ "api/webcli/app/app.go" ], "tests": [ { "path": "api/webcli/app/app_test.go", "selector": "TestGetContainerArgsRejectsCompletedPod" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.config-defaults", "title": "Apply Kubernetes REST client defaults for webcli requests", "title_zh": "\u4e3a WebCLI \u8bf7\u6c42\u8865\u9f50 Kubernetes REST \u5ba2\u6237\u7aef\u9ed8\u8ba4\u914d\u7f6e", "interface_type": "workflow", "interface": "api/webcli/app.SetConfigDefaults", "code_paths": [ "api/webcli/app/app.go" ], "tests": [ { "path": "api/webcli/app/app_test.go", "selector": "TestSetConfigDefaults" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.container-args", "title": "Resolve exec container pod ip and shell args for webcli sessions", "title_zh": "\u4e3a WebCLI \u4f1a\u8bdd\u89e3\u6790\u6267\u884c\u5bb9\u5668Pod IP\u4e0e\u547d\u4ee4\u53c2\u6570", "interface_type": "workflow", "interface": "api/webcli/app.App.GetContainerArgs", "code_paths": [ "api/webcli/app/app.go" ], "tests": [ { "path": "api/webcli/app/app_test.go", "selector": "TestGetContainerArgsSelectsContainerAndExecArgs" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.max-width", "title": "Clamp webcli terminal output to max width", "title_zh": "\u9650\u5236 WebCLI \u7ec8\u7aef\u8f93\u51fa\u6700\u5927\u5bbd\u5ea6", "interface_type": "workflow", "interface": "api/webcli/term.NewMaxWidthWriter", "code_paths": [ "api/webcli/term/term_writer.go" ], "tests": [ { "path": "api/webcli/term/term_writer_test.go", "selector": "TestMaxWidthWriter" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.missing-container-guard", "title": "Reject exec sessions when the requested container is missing", "title_zh": "\u8bf7\u6c42\u7684\u5bb9\u5668\u4e0d\u5b58\u5728\u65f6\u62d2\u7edd\u5efa\u7acb exec \u4f1a\u8bdd", "interface_type": "workflow", "interface": "api/webcli/app.App.GetContainerArgs", "code_paths": [ "api/webcli/app/app.go" ], "tests": [ { "path": "api/webcli/app/app_test.go", "selector": "TestGetContainerArgsRejectsMissingContainer" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.terminal-resize", "title": "Queue and apply terminal resize events for webcli exec sessions", "title_zh": "\u4e3a WebCLI \u6267\u884c\u4f1a\u8bdd\u6392\u961f\u5e76\u5e94\u7528\u7ec8\u7aef\u5c3a\u5bf8\u53d8\u66f4", "interface_type": "workflow", "interface": "api/webcli/app.execContext.ResizeTerminal", "code_paths": [ "api/webcli/app/exec.go" ], "tests": [ { "path": "api/webcli/app/tty_test.go", "selector": "TestResizeTerminalQueuesWindowSize" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.webcli.word-wrap", "title": "Wrap webcli terminal output by words", "title_zh": "\u6309\u5355\u8bcd\u6298\u884c WebCLI \u7ec8\u7aef\u8f93\u51fa", "interface_type": "workflow", "interface": "api/webcli/term.NewWordWrapWriter", "code_paths": [ "api/webcli/term/term_writer.go" ], "tests": [ { "path": "api/webcli/term/term_writer_test.go", "selector": "TestWordWrapWriter" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.app-status-no-unused-component-query", "title": "Single application status avoids unused component query", "title_zh": "\u5355\u5e94\u7528\u72b6\u6001\u907f\u514d\u65e0\u7528\u7ec4\u4ef6\u67e5\u8be2\u4e14\u4fdd\u7559\u8d44\u6e90\u53caHelm\u884c\u4e3a", "interface_type": "workflow", "interface": "worker/server.RuntimeServer.GetAppStatus", "code_paths": [ "worker/server/server.go" ], "tests": [ { "path": "worker/server/app_status_query_test.go", "selector": "TestGetAppStatusSkipsUnusedComponentRead" }, { "path": "worker/server/app_status_query_test.go", "selector": "TestGetAppStatusPreservesHelmStatusAndErrors" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.autoscaler.build-hpa-spec", "title": "Build HPA metric specs and manifests from autoscaler rules", "title_zh": "\u6839\u636e\u81ea\u52a8\u4f38\u7f29\u89c4\u5219\u6784\u5efa HPA \u6307\u6807\u4e0e\u5bf9\u8c61", "interface_type": "workflow", "interface": "worker/appm/conversion.newHPA", "code_paths": [ "worker/appm/conversion/autoscaler.go" ], "tests": [ { "path": "worker/appm/conversion/autoscaler_test.go", "selector": "TestNewHPA" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.discovery.etcd-config", "title": "Configure appm etcd discovery and guard fetch without client", "title_zh": "\u914d\u7f6e appm \u7684 etcd \u53d1\u73b0\u5668\u5e76\u5728\u65e0\u5ba2\u6237\u7aef\u65f6\u4fdd\u62a4\u6293\u53d6\u903b\u8f91", "interface_type": "workflow", "interface": "worker/appm/thirdparty/discovery.NewEtcd", "code_paths": [ "worker/appm/thirdparty/discovery/etcd.go" ], "tests": [ { "path": "worker/appm/thirdparty/discovery/etcd_test.go", "selector": "TestNewEtcdAndFetchGuard" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.discovery.unsupported-type", "title": "Return errors for unsupported appm discovery backends", "title_zh": "\u5bf9\u4e0d\u652f\u6301\u7684 appm \u53d1\u73b0\u540e\u7aef\u8fd4\u56de\u9519\u8bef", "interface_type": "workflow", "interface": "worker/appm/thirdparty/discovery.NewDiscoverier", "code_paths": [ "worker/appm/thirdparty/discovery/discovery.go" ], "tests": [ { "path": "worker/appm/thirdparty/discovery/discovery_unit_test.go", "selector": "TestNewDiscoverierUnsupportedType" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.gateway.reassign-conflicting-nodeport", "title": "Reassign worker TCP NodePorts already allocated in Kubernetes", "interface_type": "package_function", "interface": "worker/appm/conversion.reassignAllocatedNodePort", "code_paths": [ "worker/appm/conversion/gateway.go" ], "tests": [ { "path": "worker/appm/conversion/gateway_test.go", "selector": "TestReassignAllocatedNodePort" }, { "path": "worker/appm/conversion/gateway_test.go", "selector": "TestReassignAllocatedNodePortKeepsCurrentServicePort" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.gateway.vm-nodeport-service-uses-local-external-traffic-policy", "title": "Use Local externalTrafficPolicy for VM worker NodePort services", "title_zh": "Use Local externalTrafficPolicy for VM worker NodePort services", "interface_type": "package_function", "interface": "worker/appm/conversion.outerServiceExternalTrafficPolicy", "code_paths": [ "worker/appm/conversion/gateway.go" ], "tests": [ { "path": "worker/appm/conversion/gateway_test.go", "selector": "TestOuterServiceExternalTrafficPolicyForVM" }, { "path": "worker/appm/conversion/gateway_test.go", "selector": "TestOuterServiceExternalTrafficPolicyForNonVM" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.patch.statefulset-modified-configuration", "title": "Compute allowed StatefulSet patch payloads from old and new workload specs", "title_zh": "\u6839\u636e\u65b0\u65e7\u5de5\u4f5c\u8d1f\u8f7d\u89c4\u683c\u8ba1\u7b97\u5141\u8bb8\u7684 StatefulSet Patch \u5185\u5bb9", "interface_type": "workflow", "interface": "worker/appm/types/v1.getStatefulsetModifiedConfiguration", "code_paths": [ "worker/appm/types/v1/patch.go" ], "tests": [ { "path": "worker/appm/types/v1/patch_test.go", "selector": "TestGetStatefulsetModifiedConfiguration" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.store.aggregate-app-status", "title": "Aggregate component runtime states into app status", "title_zh": "\u5c06\u7ec4\u4ef6\u8fd0\u884c\u72b6\u6001\u6c47\u603b\u4e3a\u5e94\u7528\u72b6\u6001", "interface_type": "workflow", "interface": "worker/appm/store.getAppStatus", "code_paths": [ "worker/appm/store/store.go" ], "tests": [ { "path": "worker/appm/store/store_test.go", "selector": "TestGetAppStatus" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.store.skip-managed-tcp-nodeport-reservation", "title": "Skip anonymous reservations for Rainbond-managed TCP routes", "title_zh": "\u8df3\u8fc7 Rainbond \u7ba1\u7406\u7684 TCP \u8def\u7531\u533f\u540d\u7aef\u53e3\u9884\u7559", "interface_type": "workflow", "interface": "worker/appm/store.shouldTrackNodePortService", "code_paths": [ "worker/appm/store/store.go" ], "tests": [ { "path": "worker/appm/store/store_test.go", "selector": "TestShouldTrackNodePortService" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.store.stateful-volume-capacity-reconciliation", "title": "New StatefulSet claims converge to stored capacity without recreating workloads", "title_zh": "New StatefulSet claims converge to stored capacity without recreating workloads", "interface_type": "workflow", "interface": "appRuntimeStore.OnAdd", "code_paths": [ "worker/appm/store/store.go", "worker/appm/store/volume_expansion.go" ], "tests": [ { "path": "worker/appm/store/volume_expansion_test.go", "selector": "TestStatefulVolumeExpansionOnClaimEvents" }, { "path": "worker/appm/store/volume_expansion_test.go", "selector": "TestStatefulVolumeExpansionRetriesAfterDatabaseCommit" }, { "path": "worker/appm/store/volume_expansion_test.go", "selector": "TestStatefulVolumeExpansionRetriesFailuresAndConflicts" }, { "path": "worker/appm/store/volume_expansion_test.go", "selector": "TestStatefulVolumeExpansionSkipsUnsupportedOrForeignClaims" }, { "path": "worker/appm/store/volume_expansion_test.go", "selector": "TestStatefulVolumeExpansionAcceptsManualVolumeLabel" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.store.sync-managed-namespace-image-pull-secret", "title": "Sync image pull secrets for managed namespaces on namespace events", "title_zh": "\u5728\u547d\u540d\u7a7a\u95f4\u4e8b\u4ef6\u4e2d\u540c\u6b65\u53d7\u7ba1\u547d\u540d\u7a7a\u95f4\u7684\u955c\u50cf\u62c9\u53d6\u5bc6\u94a5", "interface_type": "workflow", "interface": "worker/appm/store.appRuntimeStore.nsEventHandler", "code_paths": [ "worker/appm/store/store.go" ], "tests": [ { "path": "worker/appm/store/store_test.go", "selector": "TestNsEventHandlerProvidesAddFunc" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.vm-boot-media-paths", "title": "Separate ISO and QCOW2 VM boot media assembly paths", "title_zh": "\u62c6\u5206 ISO \u4e0e QCOW2 \u7684 VM \u542f\u52a8\u4ecb\u8d28\u7ec4\u88c5\u8def\u5f84", "interface_type": "workflow", "interface": "worker/appm/conversion.TenantServiceVersion", "code_paths": [ "worker/appm/conversion/version.go", "worker/appm/conversion/vm_runtime.go" ], "tests": [ { "path": "worker/appm/conversion/version_vm_test.go", "selector": "TestResolveVMBootPathUsesISOInstallerWhenRootDiskIsBlank" }, { "path": "worker/appm/conversion/version_vm_test.go", "selector": "TestApplyVMBootVolumeLayoutDropsInstallerVolumeWhenDiskLayoutRemovesIt" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.vm-container-disk-cdrom", "title": "VM container disk CD-ROM media", "title_zh": "VM container disk CD-ROM media", "interface_type": "package_function", "interface": "worker/appm/conversion.appendVMContainerDiskCDROMs", "code_paths": [ "worker/appm/conversion/vm_runtime.go", "worker/appm/conversion/version.go" ], "tests": [ { "path": "worker/appm/conversion/vm_runtime_test.go", "selector": "TestBuildVMDiskLayoutKeepsContainerDiskImage" }, { "path": "worker/appm/conversion/vm_runtime_test.go", "selector": "TestAppendVMContainerDiskCDROMsCreatesContainerDiskVolumeAndDisk" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.vm-default-interface-virtio", "title": "Use VirtIO network interfaces for every virtual machine", "title_zh": "\u6240\u6709\u865a\u62df\u673a\u7edf\u4e00\u4f7f\u7528 VirtIO \u7f51\u7edc\u63a5\u53e3", "interface_type": "workflow", "interface": "worker/appm/conversion.resolveVMInterfaceModel", "code_paths": [ "worker/appm/conversion/vm_runtime.go" ], "tests": [ { "path": "worker/appm/conversion/vm_runtime_test.go", "selector": "TestBuildVMRuntimeConfigRandomNetwork" }, { "path": "worker/appm/conversion/vm_runtime_test.go", "selector": "TestBuildVMRuntimeConfigRandomWindowsNetworkUsesVirtio" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.appm.vm-memory-hotplug-headroom", "title": "Default VM memory hotplug headroom", "title_zh": "\u9ed8\u8ba4\u865a\u62df\u673a\u5185\u5b58\u70ed\u63d2\u62d4\u4e0a\u9650\u9884\u7559", "interface_type": "package_function", "interface": "worker/appm/conversion.buildStandardVMMemory", "code_paths": [ "worker/appm/conversion/version.go" ], "tests": [ { "path": "worker/appm/conversion/version_vm_test.go", "selector": "TestBuildStandardVMMemorySetsGuestAndMaxGuest" }, { "path": "worker/appm/conversion/version_vm_test.go", "selector": "TestBuildStandardVMMemoryAlignsGuestMemoryToTwoMi" }, { "path": "worker/appm/conversion/version_vm_test.go", "selector": "TestBuildStandardVMMemoryUsesFourTimesGuestAboveFloor" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.bounded-mq-health-check", "title": "Bounded and shared worker MQ health checks", "title_zh": "Worker \u6d88\u606f\u961f\u5217\u5065\u5eb7\u68c0\u67e5\u8d85\u65f6\u4e0e\u5e76\u53d1\u4fdd\u62a4", "interface_type": "package_function", "interface": "worker/discover.HealthCheckContext", "code_paths": [ "worker/discover/health.go", "worker/discover/manager.go", "worker/monitor/exporter.go" ], "tests": [ { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckReturnsPromptlyWhenMQIsHealthy" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckUsesOneDeadlineForEnqueueAndDequeue" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckBoundsBackgroundCaller" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckStopsOnCallerCancellation" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckCoalescesConcurrentProbes" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckCanceledWaiterDoesNotStartAnotherRoundTrip" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckRejectsFailedOrEmptyRoundTrips" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckRecoversAfterTransientMQFailure" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckCanceledRoundTripDoesNotCacheFailure" }, { "path": "worker/discover/health_test.go", "selector": "TestHealthCheckContextReportsMissingMQ" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.config-group-component-isolation", "title": "Isolate rendered application configuration by component", "title_zh": "Isolate rendered application configuration by component", "interface_type": "workflow", "interface": "worker/appm/conversion.createEnv", "code_paths": [ "worker/appm/conversion/version.go" ], "tests": [ { "path": "worker/appm/conversion/configgroup_test.go", "selector": "TestConfigGroupComponentIsolation" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.conversion.cmd-args-yaml", "title": "Parse component cmd and args attributes as YAML arrays", "title_zh": "Parse component cmd and args attributes as YAML arrays", "interface_type": "workflow", "interface": "worker/appm/conversion.getMainContainer", "code_paths": [ "api/handler/k8s_attribute.go", "worker/appm/conversion/version.go" ], "tests": [ { "path": "api/handler/k8s_attribute_test.go", "selector": "TestUpdateK8sAttributeUpdatesSaveType" }, { "path": "worker/appm/conversion/version_cmd_args_test.go", "selector": "TestParseStringSequenceAttribute" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.conversion.daemonset-workload", "title": "Create DaemonSet workload from service type", "title_zh": "\u6839\u636e\u7ec4\u4ef6\u7c7b\u578b\u521b\u5efa DaemonSet \u5de5\u4f5c\u8d1f\u8f7d", "interface_type": "service_method", "interface": "worker.appm.conversion.TenantServiceBase", "code_paths": [ "worker/appm/conversion/service.go" ], "tests": [ { "path": "worker/appm/conversion/service_daemonset_test.go", "selector": "TestInitBaseDaemonSetCreatesDaemonSetWorkload" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.conversion.pod-security-context", "title": "Pod security context attributes", "title_zh": "\u7ec4\u4ef6 Pod \u5b89\u5168\u4e0a\u4e0b\u6587\u5c5e\u6027", "interface_type": "package_function", "interface": "worker.appm.conversion.createPodSecurityContext", "code_paths": [ "worker/appm/conversion/version.go" ], "tests": [ { "path": "worker/appm/conversion/version_security_context_test.go", "selector": "TestCreatePodSecurityContextUsesK8sAttribute" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.chart-ref", "title": "Compose Helm chart references from repo and template names", "title_zh": "\u6839\u636e\u4ed3\u5e93\u540d\u4e0e\u6a21\u677f\u540d\u62fc\u88c5 Helm chart \u5f15\u7528", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.App.Chart", "code_paths": [ "worker/master/controller/helmapp/app.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestAppChart" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.condition-lifecycle", "title": "Manage HelmApp condition insert update and success transitions", "title_zh": "\u7ba1\u7406 HelmApp \u6761\u4ef6\u7684\u65b0\u589e\u66f4\u65b0\u4e0e\u6210\u529f\u6001\u5207\u6362", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppStatus.UpdateConditionStatus", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_status.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppStatusConditionLifecycle" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.condition-query", "title": "Query HelmApp conditions and truth states by type", "title_zh": "\u6309\u7c7b\u578b\u67e5\u8be2 HelmApp \u6761\u4ef6\u53ca\u5176\u771f\u503c\u72b6\u6001", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppStatus.GetCondition", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_status.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppStatusConditionQuery" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.condition-set-noop", "title": "Skip redundant HelmApp condition writes when nothing changed", "title_zh": "\u5728\u6761\u4ef6\u672a\u53d8\u5316\u65f6\u8df3\u8fc7\u5197\u4f59\u7684 HelmApp \u6761\u4ef6\u5199\u5165", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppStatus.SetCondition", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_status.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppStatusSetConditionDoesNotDuplicateUnchangedCondition" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.condition-status-default-create", "title": "Create missing HelmApp conditions when updating condition status", "title_zh": "\u66f4\u65b0\u6761\u4ef6\u72b6\u6001\u65f6\u81ea\u52a8\u521b\u5efa\u7f3a\u5931\u7684 HelmApp \u6761\u4ef6", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppStatus.UpdateConditionStatus", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_status.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppStatusUpdateConditionStatusCreatesMissingCondition" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.condition-transition-time", "title": "Preserve condition transition time when status does not change", "title_zh": "\u5728\u72b6\u6001\u672a\u53d8\u5316\u65f6\u4fdd\u7559\u6761\u4ef6\u7684\u8f6c\u79fb\u65f6\u95f4", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppStatus.UpdateCondition", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_status.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppStatusUpdateConditionPreservesTransitionTimeOnSameStatus" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.detect-required", "title": "Decide whether a HelmApp still needs detection", "title_zh": "\u5224\u65ad HelmApp \u662f\u5426\u4ecd\u9700\u6267\u884c\u68c0\u6d4b", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.App.NeedDetect", "code_paths": [ "worker/master/controller/helmapp/app.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestAppNeedDetect" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.detected-prerequisites", "title": "Decide whether HelmApp detection prerequisites are fully satisfied", "title_zh": "\u5224\u65ad HelmApp \u68c0\u6d4b\u524d\u7f6e\u6761\u4ef6\u662f\u5426\u5df2\u7ecf\u6ee1\u8db3", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.Status.isDetected", "code_paths": [ "worker/master/controller/helmapp/status.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestStatusGetPhase" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.envtest-suite", "title": "Bootstrap helmapp envtest suite", "title_zh": "\u542f\u52a8 HelmApp envtest \u96c6\u6210\u6d4b\u8bd5\u5957\u4ef6", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.BeforeSuite", "code_paths": [ "worker/master/controller/helmapp/suite_test.go" ], "tests": [ { "path": "worker/master/controller/helmapp/suite_test.go" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.helmapp.finalizer-stop", "title": "Stop the HelmApp finalizer by shutting down its queue", "title_zh": "\u901a\u8fc7\u5173\u95ed\u961f\u5217\u505c\u6b62 HelmApp finalizer", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.Finalizer.Stop", "code_paths": [ "worker/master/controller/helmapp/finilizer.go" ], "tests": [ { "path": "worker/master/controller/helmapp/store_unit_test.go", "selector": "TestFinalizerStop" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.install-and-deploy", "title": "Install and deploy helm app through control loop", "title_zh": "\u901a\u8fc7\u63a7\u5236\u5faa\u73af\u5b89\u88c5\u5e76\u90e8\u7f72 Helm \u5e94\u7528", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.ControlLoop", "code_paths": [ "worker/master/controller/helmapp/controlloop.go" ], "tests": [ { "path": "worker/master/controller/helmapp/controlloop_test.go" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.helmapp.overrides-compare", "title": "Compare desired and applied HelmApp overrides regardless of order", "title_zh": "\u6309\u65e0\u5e8f\u65b9\u5f0f\u6bd4\u8f83 HelmApp \u671f\u671b\u4e0e\u5df2\u751f\u6548\u7684 overrides", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmApp.OverridesEqual", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_types.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppOverridesEqual" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.phase-derive", "title": "Derive HelmApp phase from conditions and pre-status", "title_zh": "\u6839\u636e\u6761\u4ef6\u4e0e\u524d\u7f6e\u72b6\u6001\u63a8\u5bfc HelmApp \u9636\u6bb5", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.Status.getPhase", "code_paths": [ "worker/master/controller/helmapp/status.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestStatusGetPhase" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.preserve-current-spec", "title": "Preserve current HelmApp image intent during setup", "title_zh": "Preserve current HelmApp image intent during setup", "interface_type": "workflow", "interface": "helmapp.App.UpdateSpec", "code_paths": [ "worker/master/controller/helmapp/app.go" ], "tests": [ { "path": "worker/master/controller/helmapp/spec_defaults_test.go", "selector": "TestHelmAppSpecDefaultsPreserveCurrentReferences" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.queue-key-parse", "title": "Split HelmApp workqueue keys into name and namespace segments", "title_zh": "\u5c06 HelmApp \u961f\u5217\u952e\u62c6\u5206\u4e3a\u540d\u79f0\u4e0e\u547d\u540d\u7a7a\u95f4\u7247\u6bb5", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.nameNamespace", "code_paths": [ "worker/master/controller/helmapp/controlloop.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestNameNamespace" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.reconcile-configuring-phase", "title": "Reconcile helm app configuring phase", "title_zh": "\u534f\u8c03 Helm \u5e94\u7528\u8fdb\u5165\u914d\u7f6e\u9636\u6bb5", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.ControlLoop", "code_paths": [ "worker/master/controller/helmapp/controlloop.go" ], "tests": [ { "path": "worker/master/controller/helmapp/controlloop_test.go" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.helmapp.reconcile-default-values", "title": "Reconcile helm app default values", "title_zh": "\u534f\u8c03 Helm \u5e94\u7528\u9ed8\u8ba4\u503c", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.ControlLoop", "code_paths": [ "worker/master/controller/helmapp/controlloop.go" ], "tests": [ { "path": "worker/master/controller/helmapp/controlloop_test.go" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.helmapp.reconcile-start-detecting", "title": "Reconcile helm app detecting phase", "title_zh": "\u534f\u8c03 Helm \u5e94\u7528\u8fdb\u5165\u68c0\u6d4b\u9636\u6bb5", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.ControlLoop", "code_paths": [ "worker/master/controller/helmapp/controlloop.go" ], "tests": [ { "path": "worker/master/controller/helmapp/controlloop_test.go" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.helmapp.setup-required", "title": "Decide whether a HelmApp still needs default setup", "title_zh": "\u5224\u65ad HelmApp \u662f\u5426\u4ecd\u9700\u521d\u59cb\u5316\u9ed8\u8ba4\u914d\u7f6e", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.App.NeedSetup", "code_paths": [ "worker/master/controller/helmapp/app.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestAppNeedSetup" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.store-fetch", "title": "Fetch HelmApp objects from the controller store lister", "title_zh": "\u4ece\u63a7\u5236\u5668 store lister \u83b7\u53d6 HelmApp \u5bf9\u8c61", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.store.GetHelmApp", "code_paths": [ "worker/master/controller/helmapp/store.go" ], "tests": [ { "path": "worker/master/controller/helmapp/store_unit_test.go", "selector": "TestStoreGetHelmApp" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.store-full-name", "title": "Build full app store names from eid and store name", "title_zh": "\u6839\u636e EID \u4e0e\u5546\u5e97\u540d\u6784\u5efa\u5b8c\u6574\u5e94\u7528\u5546\u5e97\u540d\u79f0", "interface_type": "workflow", "interface": "pkg/apis/rainbond/v1alpha1.HelmAppSpec.FullName", "code_paths": [ "pkg/apis/rainbond/v1alpha1/helmapp_types.go" ], "tests": [ { "path": "pkg/apis/rainbond/v1alpha1/helmapp_unit_test.go", "selector": "TestHelmAppSpecFullName" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.helmapp.update-required", "title": "Decide whether a configured HelmApp requires install or update", "title_zh": "\u5224\u65ad\u5df2\u914d\u7f6e HelmApp \u662f\u5426\u9700\u8981\u5b89\u88c5\u6216\u66f4\u65b0", "interface_type": "workflow", "interface": "worker/master/controller/helmapp.App.NeedUpdate", "code_paths": [ "worker/master/controller/helmapp/app.go" ], "tests": [ { "path": "worker/master/controller/helmapp/unit_test.go", "selector": "TestAppNeedUpdate" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.patch.daemonset-upgrade", "title": "DaemonSet upgrade patch", "title_zh": "DaemonSet \u5347\u7ea7\u8865\u4e01\u751f\u6210", "interface_type": "service_method", "interface": "worker.appm.types.v1.AppService.SetUpgradePatch", "code_paths": [ "worker/appm/types/v1/patch.go" ], "tests": [ { "path": "worker/appm/types/v1/patch_test.go", "selector": "TestSetUpgradePatchCreatesDaemonSetPatch" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.pod-status.describe", "title": "Describe pod status from conditions container states and events", "title_zh": "\u6839\u636e\u6761\u4ef6\u5bb9\u5668\u72b6\u6001\u4e0e\u4e8b\u4ef6\u5f52\u7c7b Pod \u72b6\u6001", "interface_type": "workflow", "interface": "worker/util.DescribePodStatus", "code_paths": [ "worker/util/pod.go" ], "tests": [ { "path": "worker/util/pod_test.go", "selector": "TestDescribePodStatus" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.status.daemonset", "title": "DaemonSet runtime status", "title_zh": "DaemonSet \u8fd0\u884c\u72b6\u6001\u8ba1\u7b97", "interface_type": "service_method", "interface": "worker.appm.types.v1.AppService.GetServiceStatus", "code_paths": [ "worker/appm/types/v1/status.go" ], "tests": [ { "path": "worker/appm/types/v1/status_test.go", "selector": "TestGetServiceStatusReturnsRunningForReadyDaemonSet" }, { "path": "worker/appm/types/v1/status_test.go", "selector": "TestGetServiceStatusReturnsAbnormalForUnschedulableDaemonSetPod" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.thirdcomponent.prober.execute-endpoint-probe", "title": "Execute third-component endpoint probes and map results", "title_zh": "\u6267\u884c\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u7aef\u70b9\u63a2\u6d4b\u5e76\u6620\u5c04\u7ed3\u679c", "interface_type": "workflow", "interface": "worker/master/controller/thirdcomponent/prober.prober.probe", "code_paths": [ "worker/master/controller/thirdcomponent/prober/prober.go" ], "tests": [ { "path": "worker/master/controller/thirdcomponent/prober/prober_test.go", "selector": "TestProbe" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.thirdcomponent.prober.manage-results-cache", "title": "Cache and evict third-component probe results", "title_zh": "\u7f13\u5b58\u5e76\u6e05\u7406\u7b2c\u4e09\u65b9\u7ec4\u4ef6\u63a2\u6d4b\u7ed3\u679c", "interface_type": "workflow", "interface": "worker/master/controller/thirdcomponent/prober/results.NewManager", "code_paths": [ "worker/master/controller/thirdcomponent/prober/results/results_manager.go" ], "tests": [ { "path": "worker/master/controller/thirdcomponent/prober/results/results_manager_test.go", "selector": "TestCacheOperations" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.volume-provider.pvc-identifiers", "title": "Derive pod names and volume ids from PVC names", "title_zh": "\u6839\u636e PVC \u540d\u79f0\u89e3\u6790 Pod \u540d\u4e0e\u5377 ID", "interface_type": "workflow", "interface": "worker/master/volumes/provider.getVolumeIDByPVCName", "code_paths": [ "worker/master/volumes/provider/rainbondsssc.go" ], "tests": [ { "path": "worker/master/volumes/provider/rainbondsslc_test.go", "selector": "TestGetVolumeIDByPVCName" } ], "test_type": "regression", "status": "active" }, { "id": "rainbond.worker.volume-provider.select-node", "title": "Select storage node by available memory", "title_zh": "\u6309\u53ef\u7528\u5185\u5b58\u9009\u62e9\u5b58\u50a8\u8282\u70b9", "interface_type": "workflow", "interface": "worker/master/volumes/provider.rainbondsslcProvisioner.selectNode", "code_paths": [ "worker/master/volumes/provider/rainbondsslc.go" ], "tests": [ { "path": "worker/master/volumes/provider/rainbondsslc_test.go", "selector": "TestSelectNode" } ], "test_type": "integration", "status": "active" }, { "id": "rainbond.worker.volume-type.from-storageclass", "title": "Project storage classes into Rainbond volume types", "title_zh": "\u5c06\u5b58\u50a8\u7c7b\u8f6c\u6362\u4e3a Rainbond \u5377\u7c7b\u578b", "interface_type": "workflow", "interface": "worker/util.TransStorageClass2RBDVolumeType", "code_paths": [ "worker/util/volumetype.go", "db/mysql/dao/volume_type.go" ], "tests": [ { "path": "worker/util/volumetype_test.go", "selector": "TestTransStorageClass2RBDVolumeType" }, { "path": "db/mysql/dao/volume_type_test.go", "selector": "TestShouldBackfillStorageClassAccessMode" } ], "test_type": "regression", "status": "active" } ] }