Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 0 additions & 115 deletions api/compute/controller/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,118 +124,3 @@ func (h *SlurmClusterConfigController) delete(w http.ResponseWriter, r *http.Req
}
httpx.WriteJSON(w, http.StatusNoContent, nil)
}

// SlurmClusterConfigSharingController serves the share sub-resources of one config.
type SlurmClusterConfigSharingController struct {
svc *service.SlurmClusterConfigSharingService
}

// NewSlurmClusterConfigSharingController returns a handler delegating to svc.
func NewSlurmClusterConfigSharingController(svc *service.SlurmClusterConfigSharingService) *SlurmClusterConfigSharingController {
return &SlurmClusterConfigSharingController{svc: svc}
}

// Register mounts the cluster config sharing routes.
func (h *SlurmClusterConfigSharingController) Register(mux *http.ServeMux) {
const base = "/api/v1/slurm-cluster-configs/{slurmClusterConfigId}"

mux.HandleFunc("GET "+base+"/group-shares", h.listGroupShares)
mux.HandleFunc("POST "+base+"/group-shares", h.shareWithGroup)
mux.HandleFunc("PUT "+base+"/group-shares/{sharingId}", h.updateGroupShare)
mux.HandleFunc("DELETE "+base+"/group-shares/{sharingId}", h.revokeGroupShare)

mux.HandleFunc("GET "+base+"/user-shares", h.listUserShares)
mux.HandleFunc("POST "+base+"/user-shares", h.shareWithUser)
mux.HandleFunc("PUT "+base+"/user-shares/{sharingId}", h.updateUserShare)
mux.HandleFunc("DELETE "+base+"/user-shares/{sharingId}", h.revokeUserShare)
}

func (h *SlurmClusterConfigSharingController) listGroupShares(w http.ResponseWriter, r *http.Request) {
shares, err := h.svc.ListGroupShares(r.Context(), r.PathValue("slurmClusterConfigId"))
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, shares)
}

func (h *SlurmClusterConfigSharingController) shareWithGroup(w http.ResponseWriter, r *http.Request) {
var req dto.SlurmClusterConfigGroupSharingRequest
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
share, err := h.svc.ShareWithGroup(r.Context(), r.PathValue("slurmClusterConfigId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, share)
}

func (h *SlurmClusterConfigSharingController) updateGroupShare(w http.ResponseWriter, r *http.Request) {
var req dto.SlurmClusterConfigSharingUpdate
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
share, err := h.svc.UpdateGroupShare(r.Context(), r.PathValue("slurmClusterConfigId"), r.PathValue("sharingId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, share)
}

func (h *SlurmClusterConfigSharingController) revokeGroupShare(w http.ResponseWriter, r *http.Request) {
if err := h.svc.RevokeGroupShare(r.Context(), r.PathValue("slurmClusterConfigId"), r.PathValue("sharingId")); err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusNoContent, nil)
}

func (h *SlurmClusterConfigSharingController) listUserShares(w http.ResponseWriter, r *http.Request) {
shares, err := h.svc.ListUserShares(r.Context(), r.PathValue("slurmClusterConfigId"))
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, shares)
}

func (h *SlurmClusterConfigSharingController) shareWithUser(w http.ResponseWriter, r *http.Request) {
var req dto.SlurmClusterConfigUserSharingRequest
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
share, err := h.svc.ShareWithUser(r.Context(), r.PathValue("slurmClusterConfigId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, share)
}

func (h *SlurmClusterConfigSharingController) updateUserShare(w http.ResponseWriter, r *http.Request) {
var req dto.SlurmClusterConfigSharingUpdate
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
share, err := h.svc.UpdateUserShare(r.Context(), r.PathValue("slurmClusterConfigId"), r.PathValue("sharingId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, share)
}

func (h *SlurmClusterConfigSharingController) revokeUserShare(w http.ResponseWriter, r *http.Request) {
if err := h.svc.RevokeUserShare(r.Context(), r.PathValue("slurmClusterConfigId"), r.PathValue("sharingId")); err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusNoContent, nil)
}
114 changes: 0 additions & 114 deletions api/compute/dto/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,117 +124,3 @@ func ToSlurmClusterConfigResponses(in []model.SlurmClusterConfig) []SlurmCluster
}
return out
}

// SlurmClusterConfigGroupSharingRequest shares a config with a group.
type SlurmClusterConfigGroupSharingRequest struct {
GroupID string `json:"groupId"`
Permission *model.ClusterPermission `json:"permission"`
}

// Validate implements httpx.Validator.
func (r *SlurmClusterConfigGroupSharingRequest) Validate() []httpx.FieldError {
var c httpx.Constraints
c.NotBlank("groupId", "Group id cannot be blank", r.GroupID)
validateClusterPermission(&c, r.Permission)
return c.Fields()
}

// Grant returns the permission to store, defaulting to READ.
func (r *SlurmClusterConfigGroupSharingRequest) Grant() model.ClusterPermission {
return clusterGrantOrRead(r.Permission)
}

// SlurmClusterConfigUserSharingRequest shares a config with one user.
type SlurmClusterConfigUserSharingRequest struct {
UserID string `json:"userId"`
Permission *model.ClusterPermission `json:"permission"`
}

// Validate implements httpx.Validator.
func (r *SlurmClusterConfigUserSharingRequest) Validate() []httpx.FieldError {
var c httpx.Constraints
c.NotBlank("userId", "User id cannot be blank", r.UserID)
validateClusterPermission(&c, r.Permission)
return c.Fields()
}

// Grant returns the permission to store, defaulting to READ.
func (r *SlurmClusterConfigUserSharingRequest) Grant() model.ClusterPermission {
return clusterGrantOrRead(r.Permission)
}

// SlurmClusterConfigSharingUpdate changes what an existing config share grants.
type SlurmClusterConfigSharingUpdate struct {
Permission *model.ClusterPermission `json:"permission"`
}

// Validate implements httpx.Validator.
func (r *SlurmClusterConfigSharingUpdate) Validate() []httpx.FieldError {
var c httpx.Constraints
c.NotNil("permission", "Permission cannot be null", r.Permission)
validateClusterPermission(&c, r.Permission)
return c.Fields()
}

// SlurmClusterConfigGroupSharingResponse is the read model for a group share.
type SlurmClusterConfigGroupSharingResponse struct {
SharingID string `json:"slurmClusterConfigGroupSharingId"`
SlurmClusterConfigID string `json:"slurmClusterConfigId"`
GroupID string `json:"groupId"`
Permission model.ClusterPermission `json:"permission"`
}

func ToSlurmClusterConfigGroupSharingResponse(s *model.SlurmClusterConfigGroupSharing) SlurmClusterConfigGroupSharingResponse {
return SlurmClusterConfigGroupSharingResponse{
SharingID: s.ID,
SlurmClusterConfigID: s.SlurmClusterConfigID,
GroupID: s.GroupID,
Permission: s.Permission,
}
}

func ToSlurmClusterConfigGroupSharingResponses(in []model.SlurmClusterConfigGroupSharing) []SlurmClusterConfigGroupSharingResponse {
out := make([]SlurmClusterConfigGroupSharingResponse, 0, len(in))
for i := range in {
out = append(out, ToSlurmClusterConfigGroupSharingResponse(&in[i]))
}
return out
}

// SlurmClusterConfigUserSharingResponse is the read model for a user share.
type SlurmClusterConfigUserSharingResponse struct {
SharingID string `json:"slurmClusterConfigUserSharingId"`
SlurmClusterConfigID string `json:"slurmClusterConfigId"`
UserID string `json:"userId"`
Permission model.ClusterPermission `json:"permission"`
}

func ToSlurmClusterConfigUserSharingResponse(s *model.SlurmClusterConfigUserSharing) SlurmClusterConfigUserSharingResponse {
return SlurmClusterConfigUserSharingResponse{
SharingID: s.ID,
SlurmClusterConfigID: s.SlurmClusterConfigID,
UserID: s.UserID,
Permission: s.Permission,
}
}

func ToSlurmClusterConfigUserSharingResponses(in []model.SlurmClusterConfigUserSharing) []SlurmClusterConfigUserSharingResponse {
out := make([]SlurmClusterConfigUserSharingResponse, 0, len(in))
for i := range in {
out = append(out, ToSlurmClusterConfigUserSharingResponse(&in[i]))
}
return out
}

func validateClusterPermission(c *httpx.Constraints, p *model.ClusterPermission) {
if p != nil && !p.Valid() {
c.Add("permission", "Permission must be one of READ, WRITE")
}
}

func clusterGrantOrRead(p *model.ClusterPermission) model.ClusterPermission {
if p == nil {
return model.ClusterPermissionRead
}
return *p
}
69 changes: 0 additions & 69 deletions api/compute/model/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,6 @@ import (
"gorm.io/gorm"
)

// ClusterPermission is the access level a cluster-config sharing row grants.
type ClusterPermission string

const (
ClusterPermissionRead ClusterPermission = "READ"
ClusterPermissionWrite ClusterPermission = "WRITE"
)

// Valid reports whether p is one of the declared permissions.
func (p ClusterPermission) Valid() bool {
switch p {
case ClusterPermissionRead, ClusterPermissionWrite:
return true
}
return false
}

// SlurmCluster is a Slurm cluster Airavata can submit to.
//
// It describes the machine and nothing about who reaches it: the head node to submit
Expand Down Expand Up @@ -135,55 +118,3 @@ func (c *SlurmClusterConfig) BeforeCreate(*gorm.DB) error {
}
return nil
}

// SlurmClusterConfigUserSharing grants one named user access to one cluster config.
type SlurmClusterConfigUserSharing struct {
ID string `gorm:"column:slurm_cluster_config_user_sharing_id;primaryKey;type:varchar(36)" json:"slurmClusterConfigUserSharingId"`

SlurmClusterConfigID string `gorm:"column:slurm_cluster_config_id;type:varchar(36);index" json:"slurmClusterConfigId"`
SlurmClusterConfig *SlurmClusterConfig `gorm:"references:ID;constraint:OnDelete:RESTRICT,OnUpdate:CASCADE" json:"-"`

UserID string `gorm:"column:user_id;type:varchar(255);not null;index" json:"userId"`
User *iammodel.User `gorm:"references:ID;constraint:OnDelete:RESTRICT,OnUpdate:CASCADE" json:"-"`

Permission ClusterPermission `gorm:"column:permission;type:varchar(10);not null" json:"permission"`
}

// TableName returns the table backing SlurmClusterConfigUserSharing.
func (SlurmClusterConfigUserSharing) TableName() string {
return "slurm_cluster_config_user_sharings"
}

// BeforeCreate assigns a UUID when none was supplied.
func (s *SlurmClusterConfigUserSharing) BeforeCreate(*gorm.DB) error {
if s.ID == "" {
s.ID = uuid.NewString()
}
return nil
}

// SlurmClusterConfigGroupSharing grants a group access to one cluster config.
type SlurmClusterConfigGroupSharing struct {
ID string `gorm:"column:slurm_cluster_config_group_sharing_id;primaryKey;type:varchar(36)" json:"slurmClusterConfigGroupSharingId"`

SlurmClusterConfigID string `gorm:"column:slurm_cluster_config_id;type:varchar(36);index" json:"slurmClusterConfigId"`
SlurmClusterConfig *SlurmClusterConfig `gorm:"references:ID;constraint:OnDelete:RESTRICT,OnUpdate:CASCADE" json:"-"`

GroupID string `gorm:"column:group_id;type:varchar(255);not null;index" json:"groupId"`
Group *iammodel.Group `gorm:"references:ID;constraint:OnDelete:RESTRICT,OnUpdate:CASCADE" json:"-"`

Permission ClusterPermission `gorm:"column:permission;type:varchar(10);not null" json:"permission"`
}

// TableName returns the table backing SlurmClusterConfigGroupSharing.
func (SlurmClusterConfigGroupSharing) TableName() string {
return "slurm_cluster_config_group_sharings"
}

// BeforeCreate assigns a UUID when none was supplied.
func (s *SlurmClusterConfigGroupSharing) BeforeCreate(*gorm.DB) error {
if s.ID == "" {
s.ID = uuid.NewString()
}
return nil
}
Loading
Loading