@@ -2,6 +2,7 @@ package api
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
@@ -202,6 +203,7 @@ func (h *ociConfigHandler) updateInstance(c *gin.Context) {
|
||||
// @Param id path int true "配置 ID"
|
||||
// @Param instanceId path string true "instanceId"
|
||||
// @Success 204 "无内容"
|
||||
// @Failure 409 {object} errorResponse "该实例的生命周期操作正在处理中"
|
||||
// @Security BearerAuth
|
||||
// @Router /api/v1/oci-configs/{id}/instances/{instanceId} [delete]
|
||||
func (h *ociConfigHandler) terminateInstance(c *gin.Context) {
|
||||
@@ -209,20 +211,43 @@ func (h *ociConfigHandler) terminateInstance(c *gin.Context) {
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
instanceID := c.Param("instanceId")
|
||||
if !beginInstanceLifecycleOperation(instanceID) {
|
||||
respondInstanceLifecycleBusy(c)
|
||||
return
|
||||
}
|
||||
defer endInstanceLifecycleOperation(instanceID)
|
||||
preserve := c.Query("preserveBootVolume") == "true"
|
||||
if err := h.svc.TerminateInstance(c.Request.Context(), id, c.Query("region"), c.Param("instanceId"), preserve); err != nil {
|
||||
if err := h.svc.TerminateInstance(c.Request.Context(), id, c.Query("region"), instanceID, preserve); err != nil {
|
||||
respondError(c, err)
|
||||
return
|
||||
}
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
|
||||
// instanceLifecycleGuard 按实例 OCID 互斥 HTTP 请求飞行期内的终止与电源操作。
|
||||
var instanceLifecycleGuard sync.Map
|
||||
|
||||
func beginInstanceLifecycleOperation(instanceID string) bool {
|
||||
_, busy := instanceLifecycleGuard.LoadOrStore(instanceID, struct{}{})
|
||||
return !busy
|
||||
}
|
||||
|
||||
func endInstanceLifecycleOperation(instanceID string) {
|
||||
instanceLifecycleGuard.Delete(instanceID)
|
||||
}
|
||||
|
||||
func respondInstanceLifecycleBusy(c *gin.Context) {
|
||||
c.JSON(http.StatusConflict, gin.H{"error": "该实例的生命周期操作正在处理中"})
|
||||
}
|
||||
|
||||
// @Summary 实例电源操作(启停/重启)
|
||||
// @Tags 计算
|
||||
// @Param id path int true "配置 ID"
|
||||
// @Param instanceId path string true "instanceId"
|
||||
// @Param body body instanceActionRequest true "请求体"
|
||||
// @Success 200 {object} oci.Instance
|
||||
// @Failure 409 {object} errorResponse "该实例的生命周期操作正在处理中"
|
||||
// @Security BearerAuth
|
||||
// @Router /api/v1/oci-configs/{id}/instances/{instanceId}/action [post]
|
||||
func (h *ociConfigHandler) instanceAction(c *gin.Context) {
|
||||
@@ -235,7 +260,13 @@ func (h *ociConfigHandler) instanceAction(c *gin.Context) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
instance, err := h.svc.InstanceAction(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.Action)
|
||||
instanceID := c.Param("instanceId")
|
||||
if !beginInstanceLifecycleOperation(instanceID) {
|
||||
respondInstanceLifecycleBusy(c)
|
||||
return
|
||||
}
|
||||
defer endInstanceLifecycleOperation(instanceID)
|
||||
instance, err := h.svc.InstanceAction(c.Request.Context(), id, req.Region, instanceID, req.Action)
|
||||
if err != nil {
|
||||
respondError(c, err)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user