Skip to content
Closed
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
57 changes: 57 additions & 0 deletions apiserver/controllers/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package controllers

import (
"encoding/json"
"log/slog"
"net/http"

apiParams "github.com/cloudbase/garm/apiserver/params"
"github.com/cloudbase/garm/params"
"github.com/gorilla/mux"
)

func (a *APIController) GetRepository(w http.ResponseWriter, r *http.Request) (params.Repository, bool) {
vars := mux.Vars(r)
owner, hasOwner := vars["owner"]
repo, hasRepo := vars["repo"]
if !(hasOwner && hasRepo) {
w.WriteHeader(http.StatusBadRequest)
if err := json.NewEncoder(w).Encode(apiParams.APIErrorResponse{
Error: "Bad Request",
Details: "No repo ID specified",
}); err != nil {
slog.With(slog.Any("error", err)).ErrorContext(r.Context(), "failed to encode response")
}
return params.Repository{}, false
}
repoObj, err := a.r.ResolveRepository(r.Context(), owner, repo, r.URL.Query().Get("endpointName"))
if err != nil {
slog.With(slog.Any("error", err)).ErrorContext(r.Context(), "resolving repository")
handleError(r.Context(), w, err)
return params.Repository{}, false
}
return repoObj, true
}

func (a *APIController) GetRepositoryID(w http.ResponseWriter, r *http.Request) (string, bool) {
vars := mux.Vars(r)
owner, hasOwner := vars["owner"]
repo, hasRepo := vars["repo"]
if !(hasOwner && hasRepo) {
w.WriteHeader(http.StatusBadRequest)
if err := json.NewEncoder(w).Encode(apiParams.APIErrorResponse{
Error: "Bad Request",
Details: "No repo ID specified",
}); err != nil {
slog.With(slog.Any("error", err)).ErrorContext(r.Context(), "failed to encode response")
}
return "", false
}
repoObj, err := a.r.ResolveRepository(r.Context(), owner, repo, r.URL.Query().Get("endpointName"))
if err != nil {
slog.With(slog.Any("error", err)).ErrorContext(r.Context(), "resolving repository")
handleError(r.Context(), w, err)
return "", false
}
return repoObj.ID, true
}
46 changes: 46 additions & 0 deletions apiserver/controllers/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,52 @@ func (a *APIController) ListRepoInstancesHandler(w http.ResponseWriter, r *http.
}
}

// swagger:route GET /repositories/{owner}/{repo}/instances repositories instances ListRepoInstancesByFriendlyName
//
// List repository instances.
//
// Parameters:
// + name: owner
// description: Repository owner.
// type: string
// in: path
// required: true
//
// + name: repo
// description: Repository name.
// type: string
// in: path
// required: true
//
// + name: endpointName
// description: Repository endpointName.
// type: string
// in: query
//
// Responses:
// 200: Instances
// default: APIErrorResponse
func (a *APIController) ListRepoInstancesByFriendlyNameHandler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

repoID, ok := a.GetRepositoryID(w, r)
if !ok {
return
}

instances, err := a.r.ListRepoInstances(ctx, repoID)
if err != nil {
slog.With(slog.Any("error", err)).ErrorContext(ctx, "listing pools")
handleError(ctx, w, err)
return
}

w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(instances); err != nil {
slog.With(slog.Any("error", err)).ErrorContext(ctx, "failed to encode response")
}
}

// swagger:route GET /organizations/{orgID}/instances organizations instances ListOrgInstances
//
// List organization instances.
Expand Down
Loading