Files
oci-portal/internal/api/attachment.go
T

264 lines
6.1 KiB
Go

package api
import (
"net/http"
"github.com/gin-gonic/gin"
"oci-portal/internal/oci"
)
// ---- 实例 IP ----
func (h *ociConfigHandler) changePublicIP(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req struct {
Region string `json:"region"`
}
_ = c.ShouldBindJSON(&req)
ip, err := h.svc.ChangeInstancePublicIP(c.Request.Context(), id, req.Region, c.Param("instanceId"))
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{"publicIp": ip})
}
func (h *ociConfigHandler) addInstanceIpv6(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req struct {
Region string `json:"region"`
Address string `json:"address"`
}
_ = c.ShouldBindJSON(&req)
address, err := h.svc.AddInstanceIpv6(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.Address)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusCreated, gin.H{"ipv6Address": address})
}
func (h *ociConfigHandler) deleteInstanceIpv6(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
err := h.svc.DeleteInstanceIpv6(c.Request.Context(), id, c.Query("region"), c.Param("instanceId"), c.Query("address"))
if err != nil {
respondError(c, err)
return
}
c.Status(http.StatusNoContent)
}
// ---- VNIC 管理 ----
type attachVnicRequest struct {
Region string `json:"region"`
oci.AttachVnicInput
}
func (h *ociConfigHandler) listInstanceVnics(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
vnics, err := h.svc.InstanceVnics(c.Request.Context(), id, c.Query("region"), c.Param("instanceId"))
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, vnics)
}
func (h *ociConfigHandler) attachVnic(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req attachVnicRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
vnic, err := h.svc.AttachVnic(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.AttachVnicInput)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusCreated, vnic)
}
func (h *ociConfigHandler) detachVnic(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
if err := h.svc.DetachVnic(c.Request.Context(), id, c.Query("region"), c.Param("attachmentId")); err != nil {
respondError(c, err)
return
}
c.Status(http.StatusNoContent)
}
// addVnicIpv6 为指定 VNIC 添加 IPv6;body.address 留空自动分配。
func (h *ociConfigHandler) addVnicIpv6(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req struct {
Region string `json:"region"`
Address string `json:"address"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
addr, err := h.svc.AddVnicIpv6(c.Request.Context(), id, req.Region, c.Param("vnicId"), req.Address)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusCreated, gin.H{"address": addr})
}
// ---- 引导卷挂载 ----
type attachBootVolumeRequest struct {
Region string `json:"region"`
BootVolumeID string `json:"bootVolumeId" binding:"required"`
}
func (h *ociConfigHandler) listBootVolumeAttachments(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
atts, err := h.svc.BootVolumeAttachments(c.Request.Context(), id, c.Query("region"), c.Param("instanceId"))
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, atts)
}
func (h *ociConfigHandler) attachBootVolume(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req attachBootVolumeRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
att, err := h.svc.AttachBootVolume(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.BootVolumeID)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusCreated, att)
}
func (h *ociConfigHandler) replaceBootVolume(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req attachBootVolumeRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
att, err := h.svc.ReplaceBootVolume(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.BootVolumeID)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, att)
}
func (h *ociConfigHandler) detachBootVolume(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
if err := h.svc.DetachBootVolume(c.Request.Context(), id, c.Query("region"), c.Param("attachmentId")); err != nil {
respondError(c, err)
return
}
c.Status(http.StatusNoContent)
}
// ---- 块卷挂载 ----
type attachVolumeRequest struct {
Region string `json:"region"`
VolumeID string `json:"volumeId" binding:"required"`
ReadOnly bool `json:"readOnly"`
}
func (h *ociConfigHandler) listBlockVolumes(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
volumes, err := h.svc.BlockVolumes(c.Request.Context(), id, c.Query("region"), c.Query("availabilityDomain"), c.Query("compartmentId"))
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, volumes)
}
func (h *ociConfigHandler) listVolumeAttachments(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
atts, err := h.svc.VolumeAttachments(c.Request.Context(), id, c.Query("region"), c.Param("instanceId"))
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusOK, atts)
}
func (h *ociConfigHandler) attachVolume(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
var req attachVolumeRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
att, err := h.svc.AttachVolume(c.Request.Context(), id, req.Region, c.Param("instanceId"), req.VolumeID, req.ReadOnly)
if err != nil {
respondError(c, err)
return
}
c.JSON(http.StatusCreated, att)
}
func (h *ociConfigHandler) detachVolume(c *gin.Context) {
id, ok := pathID(c)
if !ok {
return
}
if err := h.svc.DetachVolume(c.Request.Context(), id, c.Query("region"), c.Param("attachmentId")); err != nil {
respondError(c, err)
return
}
c.Status(http.StatusNoContent)
}