368 lines
8.9 KiB
Go
368 lines
8.9 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"oci-portal/internal/oci"
|
|
)
|
|
|
|
func (h *ociConfigHandler) shapes(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
shapes, err := h.svc.Shapes(c.Request.Context(), id, c.Query("region"), c.Query("availabilityDomain"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, shapes)
|
|
}
|
|
|
|
func (h *ociConfigHandler) images(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
images, err := h.svc.Images(c.Request.Context(), id, oci.ImagesQuery{
|
|
Region: c.Query("region"),
|
|
OperatingSystem: c.Query("operatingSystem"),
|
|
Shape: c.Query("shape"),
|
|
})
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, images)
|
|
}
|
|
|
|
func (h *ociConfigHandler) getImage(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
image, err := h.svc.Image(c.Request.Context(), id, c.Query("region"), c.Param("imageId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, image)
|
|
}
|
|
|
|
// ---- VCN ----
|
|
|
|
type createVCNRequest struct {
|
|
Region string `json:"region"`
|
|
CompartmentID string `json:"compartmentId"` // 为空时建在租户根
|
|
DisplayName string `json:"displayName" binding:"required"`
|
|
CidrBlock string `json:"cidrBlock" binding:"required"`
|
|
DnsLabel string `json:"dnsLabel"`
|
|
EnableIPv6 *bool `json:"enableIpv6"` // 缺省默认启用
|
|
}
|
|
|
|
type renameRequest struct {
|
|
Region string `json:"region"`
|
|
DisplayName string `json:"displayName" binding:"required"`
|
|
}
|
|
|
|
func (h *ociConfigHandler) listVCNs(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
vcns, err := h.svc.VCNs(c.Request.Context(), id, c.Query("region"), c.Query("compartmentId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, vcns)
|
|
}
|
|
|
|
func (h *ociConfigHandler) createVCN(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req createVCNRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
vcn, err := h.svc.CreateVCN(c.Request.Context(), id, oci.CreateVCNInput{
|
|
Region: req.Region,
|
|
CompartmentID: req.CompartmentID,
|
|
DisplayName: req.DisplayName,
|
|
CidrBlock: req.CidrBlock,
|
|
DnsLabel: req.DnsLabel,
|
|
EnableIPv6: req.EnableIPv6 == nil || *req.EnableIPv6,
|
|
})
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusCreated, vcn)
|
|
}
|
|
|
|
func (h *ociConfigHandler) getVCN(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
vcn, err := h.svc.VCN(c.Request.Context(), id, c.Query("region"), c.Param("vcnId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, vcn)
|
|
}
|
|
|
|
func (h *ociConfigHandler) updateVCN(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req renameRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
vcn, err := h.svc.UpdateVCN(c.Request.Context(), id, req.Region, c.Param("vcnId"), req.DisplayName)
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, vcn)
|
|
}
|
|
|
|
func (h *ociConfigHandler) deleteVCN(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
if err := h.svc.DeleteVCN(c.Request.Context(), id, c.Query("region"), c.Param("vcnId")); err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.Status(http.StatusNoContent)
|
|
}
|
|
|
|
type enableIPv6Request struct {
|
|
Region string `json:"region"`
|
|
}
|
|
|
|
func (h *ociConfigHandler) enableVCNIPv6(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req enableIPv6Request
|
|
if err := c.ShouldBindJSON(&req); err != nil && c.Request.ContentLength > 0 {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
steps, err := h.svc.EnableVCNIPv6(c.Request.Context(), id, req.Region, c.Param("vcnId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"steps": steps})
|
|
}
|
|
|
|
// ---- Subnet ----
|
|
|
|
type createSubnetRequest struct {
|
|
Region string `json:"region"`
|
|
VcnID string `json:"vcnId" binding:"required"`
|
|
DisplayName string `json:"displayName" binding:"required"`
|
|
CidrBlock string `json:"cidrBlock" binding:"required"`
|
|
DnsLabel string `json:"dnsLabel"`
|
|
Ipv6CidrBlock string `json:"ipv6CidrBlock"`
|
|
ProhibitPublicIP bool `json:"prohibitPublicIp"`
|
|
}
|
|
|
|
func (h *ociConfigHandler) listSubnets(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
subnets, err := h.svc.Subnets(c.Request.Context(), id, c.Query("region"), c.Query("vcnId"), c.Query("compartmentId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, subnets)
|
|
}
|
|
|
|
func (h *ociConfigHandler) createSubnet(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req createSubnetRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
subnet, err := h.svc.CreateSubnet(c.Request.Context(), id, oci.CreateSubnetInput{
|
|
Region: req.Region,
|
|
VcnID: req.VcnID,
|
|
DisplayName: req.DisplayName,
|
|
CidrBlock: req.CidrBlock,
|
|
DnsLabel: req.DnsLabel,
|
|
Ipv6CidrBlock: req.Ipv6CidrBlock,
|
|
ProhibitPublicIP: req.ProhibitPublicIP,
|
|
})
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusCreated, subnet)
|
|
}
|
|
|
|
func (h *ociConfigHandler) getSubnet(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
subnet, err := h.svc.Subnet(c.Request.Context(), id, c.Query("region"), c.Param("subnetId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, subnet)
|
|
}
|
|
|
|
func (h *ociConfigHandler) updateSubnet(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req renameRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
subnet, err := h.svc.UpdateSubnet(c.Request.Context(), id, req.Region, c.Param("subnetId"), req.DisplayName)
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, subnet)
|
|
}
|
|
|
|
func (h *ociConfigHandler) deleteSubnet(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
if err := h.svc.DeleteSubnet(c.Request.Context(), id, c.Query("region"), c.Param("subnetId")); err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.Status(http.StatusNoContent)
|
|
}
|
|
|
|
// ---- Security List ----
|
|
|
|
type createSecurityListRequest struct {
|
|
Region string `json:"region"`
|
|
VcnID string `json:"vcnId" binding:"required"`
|
|
DisplayName string `json:"displayName" binding:"required"`
|
|
IngressRules []oci.SecurityRule `json:"ingressRules"`
|
|
EgressRules []oci.SecurityRule `json:"egressRules"`
|
|
}
|
|
|
|
type updateSecurityListRequest struct {
|
|
Region string `json:"region"`
|
|
DisplayName string `json:"displayName"`
|
|
IngressRules *[]oci.SecurityRule `json:"ingressRules"`
|
|
EgressRules *[]oci.SecurityRule `json:"egressRules"`
|
|
}
|
|
|
|
func (h *ociConfigHandler) listSecurityLists(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
lists, err := h.svc.SecurityLists(c.Request.Context(), id, c.Query("region"), c.Query("vcnId"), c.Query("compartmentId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, lists)
|
|
}
|
|
|
|
func (h *ociConfigHandler) createSecurityList(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req createSecurityListRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
list, err := h.svc.CreateSecurityList(c.Request.Context(), id, oci.CreateSecurityListInput{
|
|
Region: req.Region,
|
|
VcnID: req.VcnID,
|
|
DisplayName: req.DisplayName,
|
|
IngressRules: req.IngressRules,
|
|
EgressRules: req.EgressRules,
|
|
})
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusCreated, list)
|
|
}
|
|
|
|
func (h *ociConfigHandler) getSecurityList(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
list, err := h.svc.SecurityList(c.Request.Context(), id, c.Query("region"), c.Param("securityListId"))
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, list)
|
|
}
|
|
|
|
func (h *ociConfigHandler) updateSecurityList(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req updateSecurityListRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
list, err := h.svc.UpdateSecurityList(c.Request.Context(), id, c.Param("securityListId"), oci.UpdateSecurityListInput{
|
|
Region: req.Region,
|
|
DisplayName: req.DisplayName,
|
|
IngressRules: req.IngressRules,
|
|
EgressRules: req.EgressRules,
|
|
})
|
|
if err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, list)
|
|
}
|
|
|
|
func (h *ociConfigHandler) deleteSecurityList(c *gin.Context) {
|
|
id, ok := pathID(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
if err := h.svc.DeleteSecurityList(c.Request.Context(), id, c.Query("region"), c.Param("securityListId")); err != nil {
|
|
respondError(c, err)
|
|
return
|
|
}
|
|
c.Status(http.StatusNoContent)
|
|
}
|