package controller
import (
"net/http"
"strings"
"github.com/go-chi/chi"
"github.com/goodrain/rainbond/api/handler"
api_model "github.com/goodrain/rainbond/api/model"
"github.com/goodrain/rainbond/api/util/bcode"
ctxutil "github.com/goodrain/rainbond/api/util/ctx"
dbmodel "github.com/goodrain/rainbond/db/model"
httputil "github.com/goodrain/rainbond/util/http"
"github.com/sirupsen/logrus"
)
func (t *TenantStruct) VolumeDependency(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "DELETE":
t.DeleteVolumeDependency(w, r)
case "POST":
t.AddVolumeDependency(w, r)
}
}
func (t *TenantStruct) AddVolumeDependency(w http.ResponseWriter, r *http.Request) {
logrus.Debugf("trans add volumn dependency service ")
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
var tsr api_model.V2AddVolumeDependencyStruct
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &tsr.Body, nil); !ok {
return
}
vd := &dbmodel.TenantServiceMountRelation{
TenantID: tenantID,
ServiceID: serviceID,
DependServiceID: tsr.Body.DependServiceID,
HostPath: tsr.Body.MntDir,
VolumePath: tsr.Body.MntName,
}
if err := handler.GetServiceManager().VolumeDependency(vd, "add"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func (t *TenantStruct) DeleteVolumeDependency(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
var tsr api_model.V2DelVolumeDependencyStruct
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &tsr.Body, nil); !ok {
return
}
vd := &dbmodel.TenantServiceMountRelation{
TenantID: tenantID,
ServiceID: serviceID,
DependServiceID: tsr.Body.DependServiceID,
}
if err := handler.GetServiceManager().VolumeDependency(vd, "delete"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func (t *TenantStruct) AddVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
avs := &api_model.V2AddVolumeStruct{}
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &avs.Body, nil); !ok {
return
}
tsv := &dbmodel.TenantServiceVolume{
ServiceID: serviceID,
VolumePath: avs.Body.VolumePath,
HostPath: avs.Body.HostPath,
Category: avs.Body.Category,
VolumeCapacity: avs.Body.VolumeCapacity,
VolumeType: dbmodel.ShareFileVolumeType.String(),
VolumeProviderName: avs.Body.VolumeProviderName,
AccessMode: avs.Body.AccessMode,
SharePolicy: avs.Body.SharePolicy,
BackupPolicy: avs.Body.BackupPolicy,
ReclaimPolicy: avs.Body.ReclaimPolicy,
}
if !strings.HasPrefix(tsv.VolumePath, "/") {
httputil.ReturnError(r, w, 400, "volume path is invalid,must begin with /")
return
}
if err := handler.GetServiceManager().VolumnVar(tsv, tenantID, "", "add"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func (t *TenantStruct) UpdVolume(w http.ResponseWriter, r *http.Request) {
var req api_model.UpdVolumeReq
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &req, nil); !ok {
return
}
if req.Mode != nil && (*req.Mode > 777 || *req.Mode < 0) {
httputil.ReturnBcodeError(r, w, bcode.NewBadRequest("mode be a number between 0 and 777 (octal)"))
return
}
sid := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
if err := handler.GetServiceManager().UpdVolume(sid, &req); err != nil {
httputil.ReturnError(r, w, 500, err.Error())
}
httputil.ReturnSuccess(r, w, "success")
}
func (t *TenantStruct) DeleteVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
avs := &api_model.V2DelVolumeStruct{}
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &avs.Body, nil); !ok {
return
}
tsv := &dbmodel.TenantServiceVolume{
ServiceID: serviceID,
VolumePath: avs.Body.VolumePath,
Category: avs.Body.Category,
}
if err := handler.GetServiceManager().VolumnVar(tsv, tenantID, "", "delete"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func AddVolumeDependency(w http.ResponseWriter, r *http.Request) {
logrus.Debugf("trans add volumn dependency service ")
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
var tsr api_model.AddVolumeDependencyStruct
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &tsr.Body, nil); !ok {
return
}
vd := &dbmodel.TenantServiceMountRelation{
TenantID: tenantID,
ServiceID: serviceID,
DependServiceID: tsr.Body.DependServiceID,
VolumeName: tsr.Body.VolumeName,
VolumePath: tsr.Body.VolumePath,
VolumeType: tsr.Body.VolumeType,
}
if err := handler.GetServiceManager().VolumeDependency(vd, "add"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func DeleteVolumeDependency(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
var tsr api_model.DeleteVolumeDependencyStruct
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &tsr.Body, nil); !ok {
return
}
vd := &dbmodel.TenantServiceMountRelation{
TenantID: tenantID,
ServiceID: serviceID,
DependServiceID: tsr.Body.DependServiceID,
VolumeName: tsr.Body.VolumeName,
}
if err := handler.GetServiceManager().VolumeDependency(vd, "delete"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func AddVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
avs := &api_model.AddVolumeStruct{}
if ok := httputil.ValidatorRequestStructAndErrorResponse(r, w, &avs.Body, nil); !ok {
return
}
if avs.Body.Mode != nil && (*avs.Body.Mode > 777 || *avs.Body.Mode < 0) {
httputil.ReturnBcodeError(r, w, bcode.NewBadRequest("mode be a number between 0 and 777 (octal)"))
return
}
tsv := &dbmodel.TenantServiceVolume{
ServiceID: serviceID,
VolumeName: avs.Body.VolumeName,
VolumePath: avs.Body.VolumePath,
VolumeType: avs.Body.VolumeType,
Category: avs.Body.Category,
VolumeProviderName: avs.Body.VolumeProviderName,
IsReadOnly: avs.Body.IsReadOnly,
VolumeCapacity: avs.Body.VolumeCapacity,
AccessMode: avs.Body.AccessMode,
SharePolicy: avs.Body.SharePolicy,
BackupPolicy: avs.Body.BackupPolicy,
ReclaimPolicy: avs.Body.ReclaimPolicy,
AllowExpansion: avs.Body.AllowExpansion,
Mode: avs.Body.Mode,
}
if !strings.HasPrefix(avs.Body.VolumePath, "/") {
httputil.ReturnError(r, w, 400, "volume path is invalid,must begin with /")
return
}
if err := handler.GetServiceManager().VolumnVar(tsv, tenantID, avs.Body.FileContent, "add"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func DeleteVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
tenantID := r.Context().Value(ctxutil.ContextKey("tenant_id")).(string)
tsv := &dbmodel.TenantServiceVolume{}
tsv.ServiceID = serviceID
tsv.VolumeName = chi.URLParam(r, "volume_name")
if err := handler.GetServiceManager().VolumnVar(tsv, tenantID, "", "delete"); err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, nil)
}
func GetVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
volumes, err := handler.GetServiceManager().GetVolumes(serviceID)
if err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, volumes)
}
func GetDepVolume(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
volumes, err := handler.GetServiceManager().GetDepVolumes(serviceID)
if err != nil {
err.Handle(r, w)
return
}
httputil.ReturnSuccess(r, w, volumes)
}