{"record":{"id":"c07c4d2c4c2045e1","repo":"apolloconfig/apollo","slug":"can-not-delete-default-cluster","errorCode":null,"errorMessage":"can not delete default cluster!","messagePattern":"can not delete default cluster!","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ClusterController.java","lineNumber":77,"sourceCode":"    } else {\n      entity = clusterService.saveWithoutInstanceOfAppNamespaces(entity);\n    }\n\n    return BeanUtils.transform(ClusterDTO.class, entity);\n  }\n\n  @DeleteMapping(\"/apps/{appId}/clusters/{clusterName:.+}\")\n  public void delete(@PathVariable(\"appId\") String appId,\n      @PathVariable(\"clusterName\") String clusterName, @RequestParam String operator) {\n\n    Cluster entity = clusterService.findOne(appId, clusterName);\n\n    if (entity == null) {\n      throw NotFoundException.clusterNotFound(appId, clusterName);\n    }\n\n    if (ConfigConsts.CLUSTER_NAME_DEFAULT.equals(entity.getName())) {\n      throw new BadRequestException(\"can not delete default cluster!\");\n    }\n\n    clusterService.delete(entity.getId(), operator);\n  }\n\n  @GetMapping(\"/apps/{appId}/clusters\")\n  public List<ClusterDTO> find(@PathVariable(\"appId\") String appId) {\n    List<Cluster> clusters = clusterService.findParentClusters(appId);\n    return BeanUtils.batchTransform(ClusterDTO.class, clusters);\n  }\n\n  @GetMapping(\"/apps/{appId}/clusters/{clusterName:.+}\")\n  public ClusterDTO get(@PathVariable(\"appId\") String appId,\n      @PathVariable(\"clusterName\") String clusterName) {\n    Cluster cluster = clusterService.findOne(appId, clusterName);\n    if (cluster == null) {\n      throw NotFoundException.clusterNotFound(appId, clusterName);\n    }","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/apolloconfig/apollo/blob/d95fc18d112589efc09ddcbe1507047584d55251/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ClusterController.java#L59-L95","documentation":"A BadRequestException (HTTP 400) thrown from ClusterController.delete() (DELETE /apps/{appId}/clusters/{clusterName}) when the cluster being deleted is the default cluster (name equals ConfigConsts.CLUSTER_NAME_DEFAULT, i.e. \"default\"). Apollo forbids deleting the default cluster because every application requires exactly one; it is the root cluster from which other clusters branch.","triggerScenarios":"DELETE /apps/{appId}/clusters/default (or the localized default cluster name) when the resolved cluster entity name equals ConfigConsts.CLUSTER_NAME_DEFAULT.","commonSituations":"Automated cleanup scripts that iterate all clusters and attempt to delete each one without excluding 'default'; a UI bug that renders a delete button for the default cluster; attempting to reset an environment by deleting all clusters.","solutions":["Exclude the default cluster from any automated deletion loop.","If you need to reset the default cluster's contents, delete/edit its namespaces and items individually instead of the cluster itself.","Add a guard in client code: skip clusters where name equals 'default' before calling the delete endpoint."],"exampleFix":"// before: deletes all clusters including default\nfor (ClusterDTO cluster : clusters) {\n    clusterApi.delete(appId, env, cluster.getName());\n}\n\n// after: skip the default cluster\nfor (ClusterDTO cluster : clusters) {\n    if (!\"default\".equals(cluster.getName())) {\n        clusterApi.delete(appId, env, cluster.getName());\n    }\n}","handlingStrategy":"validation","validationCode":"// Skip the default cluster in any deletion loop\nif (\"default\".equals(cluster.getName())) {\n    return; // never delete the default cluster\n}\nclusterApi.delete(appId, env, cluster.getName());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always exclude the 'default' cluster from automated deletion scripts.","To reset the default cluster, delete its namespaces and items individually instead of the cluster.","Filter cluster lists by name before iterating with delete operations."],"tags":["cluster","default-cluster","business-rule","bad-request","apollo-adminservice"],"backgroundTag":null,"analyzedSha":"d95fc18d112589efc09ddcbe1507047584d55251","analyzedAt":"2026-08-14T04:00:05.477Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}