- Refactor internal/worker and internal/queue packages - Update cmd/tui for monitoring interface - Update test configurations
642 lines
23 KiB
Go
642 lines
23 KiB
Go
// Package api provides primitives to interact with the openapi HTTP API.
|
|
//
|
|
// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT.
|
|
package api
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/getkin/kin-openapi/openapi3"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/oapi-codegen/runtime"
|
|
)
|
|
|
|
const (
|
|
ApiKeyAuthScopes = "ApiKeyAuth.Scopes"
|
|
)
|
|
|
|
// Defines values for ErrorResponseCode.
|
|
const (
|
|
BADREQUEST ErrorResponseCode = "BAD_REQUEST"
|
|
CONFLICT ErrorResponseCode = "CONFLICT"
|
|
FORBIDDEN ErrorResponseCode = "FORBIDDEN"
|
|
INTERNALERROR ErrorResponseCode = "INTERNAL_ERROR"
|
|
NOTFOUND ErrorResponseCode = "NOT_FOUND"
|
|
RATELIMITED ErrorResponseCode = "RATE_LIMITED"
|
|
SERVICEUNAVAILABLE ErrorResponseCode = "SERVICE_UNAVAILABLE"
|
|
UNAUTHORIZED ErrorResponseCode = "UNAUTHORIZED"
|
|
VALIDATIONERROR ErrorResponseCode = "VALIDATION_ERROR"
|
|
)
|
|
|
|
// Defines values for ExperimentStatus.
|
|
const (
|
|
Active ExperimentStatus = "active"
|
|
Archived ExperimentStatus = "archived"
|
|
Deleted ExperimentStatus = "deleted"
|
|
)
|
|
|
|
// Defines values for HealthResponseStatus.
|
|
const (
|
|
Degraded HealthResponseStatus = "degraded"
|
|
Healthy HealthResponseStatus = "healthy"
|
|
Unhealthy HealthResponseStatus = "unhealthy"
|
|
)
|
|
|
|
// Defines values for JupyterServiceStatus.
|
|
const (
|
|
JupyterServiceStatusError JupyterServiceStatus = "error"
|
|
JupyterServiceStatusRunning JupyterServiceStatus = "running"
|
|
JupyterServiceStatusStarting JupyterServiceStatus = "starting"
|
|
JupyterServiceStatusStopped JupyterServiceStatus = "stopped"
|
|
JupyterServiceStatusStopping JupyterServiceStatus = "stopping"
|
|
)
|
|
|
|
// Defines values for TaskStatus.
|
|
const (
|
|
TaskStatusCollecting TaskStatus = "collecting"
|
|
TaskStatusCompleted TaskStatus = "completed"
|
|
TaskStatusFailed TaskStatus = "failed"
|
|
TaskStatusPreparing TaskStatus = "preparing"
|
|
TaskStatusQueued TaskStatus = "queued"
|
|
TaskStatusRunning TaskStatus = "running"
|
|
)
|
|
|
|
// Defines values for GetV1TasksParamsStatus.
|
|
const (
|
|
Completed GetV1TasksParamsStatus = "completed"
|
|
Failed GetV1TasksParamsStatus = "failed"
|
|
Queued GetV1TasksParamsStatus = "queued"
|
|
Running GetV1TasksParamsStatus = "running"
|
|
)
|
|
|
|
// CreateExperimentRequest defines model for CreateExperimentRequest.
|
|
type CreateExperimentRequest struct {
|
|
Description *string `json:"description,omitempty"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// CreateTaskRequest defines model for CreateTaskRequest.
|
|
type CreateTaskRequest struct {
|
|
// Args Command-line arguments for the training script
|
|
Args *string `json:"args,omitempty"`
|
|
|
|
// Cpu CPU cores requested
|
|
Cpu *int `json:"cpu,omitempty"`
|
|
DatasetSpecs *[]DatasetSpec `json:"dataset_specs,omitempty"`
|
|
Datasets *[]string `json:"datasets,omitempty"`
|
|
|
|
// Gpu GPUs requested
|
|
Gpu *int `json:"gpu,omitempty"`
|
|
|
|
// JobName Unique identifier for the job
|
|
JobName string `json:"job_name"`
|
|
|
|
// MemoryGb Memory (GB) requested
|
|
MemoryGb *int `json:"memory_gb,omitempty"`
|
|
Metadata *map[string]string `json:"metadata,omitempty"`
|
|
Priority *int `json:"priority,omitempty"`
|
|
|
|
// SnapshotId Reference to experiment snapshot
|
|
SnapshotId *string `json:"snapshot_id,omitempty"`
|
|
}
|
|
|
|
// DatasetSpec defines model for DatasetSpec.
|
|
type DatasetSpec struct {
|
|
MountPath *string `json:"mount_path,omitempty"`
|
|
Name *string `json:"name,omitempty"`
|
|
Sha256 *string `json:"sha256,omitempty"`
|
|
Source *string `json:"source,omitempty"`
|
|
}
|
|
|
|
// ErrorResponse defines model for ErrorResponse.
|
|
type ErrorResponse struct {
|
|
Code ErrorResponseCode `json:"code"`
|
|
|
|
// Error Sanitized error message
|
|
Error string `json:"error"`
|
|
|
|
// TraceId Support correlation ID
|
|
TraceId string `json:"trace_id"`
|
|
}
|
|
|
|
// ErrorResponseCode defines model for ErrorResponse.Code.
|
|
type ErrorResponseCode string
|
|
|
|
// Experiment defines model for Experiment.
|
|
type Experiment struct {
|
|
CommitId *string `json:"commit_id,omitempty"`
|
|
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
Id *string `json:"id,omitempty"`
|
|
Name *string `json:"name,omitempty"`
|
|
Status *ExperimentStatus `json:"status,omitempty"`
|
|
}
|
|
|
|
// ExperimentStatus defines model for Experiment.Status.
|
|
type ExperimentStatus string
|
|
|
|
// HealthResponse defines model for HealthResponse.
|
|
type HealthResponse struct {
|
|
Status *HealthResponseStatus `json:"status,omitempty"`
|
|
Timestamp *time.Time `json:"timestamp,omitempty"`
|
|
Version *string `json:"version,omitempty"`
|
|
}
|
|
|
|
// HealthResponseStatus defines model for HealthResponse.Status.
|
|
type HealthResponseStatus string
|
|
|
|
// JupyterService defines model for JupyterService.
|
|
type JupyterService struct {
|
|
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
Id *string `json:"id,omitempty"`
|
|
Name *string `json:"name,omitempty"`
|
|
Status *JupyterServiceStatus `json:"status,omitempty"`
|
|
Token *string `json:"token,omitempty"`
|
|
Url *string `json:"url,omitempty"`
|
|
}
|
|
|
|
// JupyterServiceStatus defines model for JupyterService.Status.
|
|
type JupyterServiceStatus string
|
|
|
|
// QueueStats defines model for QueueStats.
|
|
type QueueStats struct {
|
|
// Completed Tasks completed today
|
|
Completed *int `json:"completed,omitempty"`
|
|
|
|
// Failed Tasks failed today
|
|
Failed *int `json:"failed,omitempty"`
|
|
|
|
// Queued Tasks waiting to run
|
|
Queued *int `json:"queued,omitempty"`
|
|
|
|
// Running Tasks currently executing
|
|
Running *int `json:"running,omitempty"`
|
|
|
|
// Workers Active workers
|
|
Workers *int `json:"workers,omitempty"`
|
|
}
|
|
|
|
// StartJupyterRequest defines model for StartJupyterRequest.
|
|
type StartJupyterRequest struct {
|
|
Image *string `json:"image,omitempty"`
|
|
Name string `json:"name"`
|
|
Workspace *string `json:"workspace,omitempty"`
|
|
}
|
|
|
|
// Task defines model for Task.
|
|
type Task struct {
|
|
Cpu *int `json:"cpu,omitempty"`
|
|
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
Datasets *[]string `json:"datasets,omitempty"`
|
|
EndedAt *time.Time `json:"ended_at,omitempty"`
|
|
Error *string `json:"error,omitempty"`
|
|
Gpu *int `json:"gpu,omitempty"`
|
|
|
|
// Id Unique task identifier
|
|
Id *string `json:"id,omitempty"`
|
|
JobName *string `json:"job_name,omitempty"`
|
|
MaxRetries *int `json:"max_retries,omitempty"`
|
|
MemoryGb *int `json:"memory_gb,omitempty"`
|
|
Output *string `json:"output,omitempty"`
|
|
Priority *int `json:"priority,omitempty"`
|
|
RetryCount *int `json:"retry_count,omitempty"`
|
|
SnapshotId *string `json:"snapshot_id,omitempty"`
|
|
StartedAt *time.Time `json:"started_at,omitempty"`
|
|
Status *TaskStatus `json:"status,omitempty"`
|
|
UserId *string `json:"user_id,omitempty"`
|
|
WorkerId *string `json:"worker_id,omitempty"`
|
|
}
|
|
|
|
// TaskStatus defines model for Task.Status.
|
|
type TaskStatus string
|
|
|
|
// TaskList defines model for TaskList.
|
|
type TaskList struct {
|
|
Limit *int `json:"limit,omitempty"`
|
|
Offset *int `json:"offset,omitempty"`
|
|
Tasks *[]Task `json:"tasks,omitempty"`
|
|
Total *int `json:"total,omitempty"`
|
|
}
|
|
|
|
// BadRequest defines model for BadRequest.
|
|
type BadRequest = ErrorResponse
|
|
|
|
// NotFound defines model for NotFound.
|
|
type NotFound = ErrorResponse
|
|
|
|
// RateLimited defines model for RateLimited.
|
|
type RateLimited = ErrorResponse
|
|
|
|
// Unauthorized defines model for Unauthorized.
|
|
type Unauthorized = ErrorResponse
|
|
|
|
// ValidationError defines model for ValidationError.
|
|
type ValidationError = ErrorResponse
|
|
|
|
// GetV1TasksParams defines parameters for GetV1Tasks.
|
|
type GetV1TasksParams struct {
|
|
Status *GetV1TasksParamsStatus `form:"status,omitempty" json:"status,omitempty"`
|
|
Limit *int `form:"limit,omitempty" json:"limit,omitempty"`
|
|
Offset *int `form:"offset,omitempty" json:"offset,omitempty"`
|
|
}
|
|
|
|
// GetV1TasksParamsStatus defines parameters for GetV1Tasks.
|
|
type GetV1TasksParamsStatus string
|
|
|
|
// PostV1ExperimentsJSONRequestBody defines body for PostV1Experiments for application/json ContentType.
|
|
type PostV1ExperimentsJSONRequestBody = CreateExperimentRequest
|
|
|
|
// PostV1JupyterServicesJSONRequestBody defines body for PostV1JupyterServices for application/json ContentType.
|
|
type PostV1JupyterServicesJSONRequestBody = StartJupyterRequest
|
|
|
|
// PostV1TasksJSONRequestBody defines body for PostV1Tasks for application/json ContentType.
|
|
type PostV1TasksJSONRequestBody = CreateTaskRequest
|
|
|
|
// ServerInterface represents all server handlers.
|
|
type ServerInterface interface {
|
|
// Health check
|
|
// (GET /health)
|
|
GetHealth(ctx echo.Context) error
|
|
// List experiments
|
|
// (GET /v1/experiments)
|
|
GetV1Experiments(ctx echo.Context) error
|
|
// Create experiment
|
|
// (POST /v1/experiments)
|
|
PostV1Experiments(ctx echo.Context) error
|
|
// List Jupyter services
|
|
// (GET /v1/jupyter/services)
|
|
GetV1JupyterServices(ctx echo.Context) error
|
|
// Start Jupyter service
|
|
// (POST /v1/jupyter/services)
|
|
PostV1JupyterServices(ctx echo.Context) error
|
|
// Stop Jupyter service
|
|
// (DELETE /v1/jupyter/services/{serviceId})
|
|
DeleteV1JupyterServicesServiceId(ctx echo.Context, serviceId string) error
|
|
// Queue status
|
|
// (GET /v1/queue)
|
|
GetV1Queue(ctx echo.Context) error
|
|
// List tasks
|
|
// (GET /v1/tasks)
|
|
GetV1Tasks(ctx echo.Context, params GetV1TasksParams) error
|
|
// Create task
|
|
// (POST /v1/tasks)
|
|
PostV1Tasks(ctx echo.Context) error
|
|
// Cancel/delete task
|
|
// (DELETE /v1/tasks/{taskId})
|
|
DeleteV1TasksTaskId(ctx echo.Context, taskId string) error
|
|
// Get task details
|
|
// (GET /v1/tasks/{taskId})
|
|
GetV1TasksTaskId(ctx echo.Context, taskId string) error
|
|
// WebSocket connection
|
|
// (GET /ws)
|
|
GetWs(ctx echo.Context) error
|
|
}
|
|
|
|
// ServerInterfaceWrapper converts echo contexts to parameters.
|
|
type ServerInterfaceWrapper struct {
|
|
Handler ServerInterface
|
|
}
|
|
|
|
// GetHealth converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetHealth(ctx echo.Context) error {
|
|
var err error
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetHealth(ctx)
|
|
return err
|
|
}
|
|
|
|
// GetV1Experiments converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetV1Experiments(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetV1Experiments(ctx)
|
|
return err
|
|
}
|
|
|
|
// PostV1Experiments converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) PostV1Experiments(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.PostV1Experiments(ctx)
|
|
return err
|
|
}
|
|
|
|
// GetV1JupyterServices converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetV1JupyterServices(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetV1JupyterServices(ctx)
|
|
return err
|
|
}
|
|
|
|
// PostV1JupyterServices converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) PostV1JupyterServices(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.PostV1JupyterServices(ctx)
|
|
return err
|
|
}
|
|
|
|
// DeleteV1JupyterServicesServiceId converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) DeleteV1JupyterServicesServiceId(ctx echo.Context) error {
|
|
var err error
|
|
// ------------- Path parameter "serviceId" -------------
|
|
var serviceId string
|
|
|
|
err = runtime.BindStyledParameterWithOptions("simple", "serviceId", ctx.Param("serviceId"), &serviceId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter serviceId: %s", err))
|
|
}
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.DeleteV1JupyterServicesServiceId(ctx, serviceId)
|
|
return err
|
|
}
|
|
|
|
// GetV1Queue converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetV1Queue(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetV1Queue(ctx)
|
|
return err
|
|
}
|
|
|
|
// GetV1Tasks converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetV1Tasks(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Parameter object where we will unmarshal all parameters from the context
|
|
var params GetV1TasksParams
|
|
// ------------- Optional query parameter "status" -------------
|
|
|
|
err = runtime.BindQueryParameter("form", true, false, "status", ctx.QueryParams(), ¶ms.Status)
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter status: %s", err))
|
|
}
|
|
|
|
// ------------- Optional query parameter "limit" -------------
|
|
|
|
err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit)
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err))
|
|
}
|
|
|
|
// ------------- Optional query parameter "offset" -------------
|
|
|
|
err = runtime.BindQueryParameter("form", true, false, "offset", ctx.QueryParams(), ¶ms.Offset)
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter offset: %s", err))
|
|
}
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetV1Tasks(ctx, params)
|
|
return err
|
|
}
|
|
|
|
// PostV1Tasks converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) PostV1Tasks(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.PostV1Tasks(ctx)
|
|
return err
|
|
}
|
|
|
|
// DeleteV1TasksTaskId converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) DeleteV1TasksTaskId(ctx echo.Context) error {
|
|
var err error
|
|
// ------------- Path parameter "taskId" -------------
|
|
var taskId string
|
|
|
|
err = runtime.BindStyledParameterWithOptions("simple", "taskId", ctx.Param("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter taskId: %s", err))
|
|
}
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.DeleteV1TasksTaskId(ctx, taskId)
|
|
return err
|
|
}
|
|
|
|
// GetV1TasksTaskId converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetV1TasksTaskId(ctx echo.Context) error {
|
|
var err error
|
|
// ------------- Path parameter "taskId" -------------
|
|
var taskId string
|
|
|
|
err = runtime.BindStyledParameterWithOptions("simple", "taskId", ctx.Param("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true})
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter taskId: %s", err))
|
|
}
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetV1TasksTaskId(ctx, taskId)
|
|
return err
|
|
}
|
|
|
|
// GetWs converts echo context to params.
|
|
func (w *ServerInterfaceWrapper) GetWs(ctx echo.Context) error {
|
|
var err error
|
|
|
|
ctx.Set(ApiKeyAuthScopes, []string{})
|
|
|
|
// Invoke the callback with all the unmarshaled arguments
|
|
err = w.Handler.GetWs(ctx)
|
|
return err
|
|
}
|
|
|
|
// This is a simple interface which specifies echo.Route addition functions which
|
|
// are present on both echo.Echo and echo.Group, since we want to allow using
|
|
// either of them for path registration
|
|
type EchoRouter interface {
|
|
CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route
|
|
}
|
|
|
|
// RegisterHandlers adds each server route to the EchoRouter.
|
|
func RegisterHandlers(router EchoRouter, si ServerInterface) {
|
|
RegisterHandlersWithBaseURL(router, si, "")
|
|
}
|
|
|
|
// Registers handlers, and prepends BaseURL to the paths, so that the paths
|
|
// can be served under a prefix.
|
|
func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) {
|
|
|
|
wrapper := ServerInterfaceWrapper{
|
|
Handler: si,
|
|
}
|
|
|
|
router.GET(baseURL+"/health", wrapper.GetHealth)
|
|
router.GET(baseURL+"/v1/experiments", wrapper.GetV1Experiments)
|
|
router.POST(baseURL+"/v1/experiments", wrapper.PostV1Experiments)
|
|
router.GET(baseURL+"/v1/jupyter/services", wrapper.GetV1JupyterServices)
|
|
router.POST(baseURL+"/v1/jupyter/services", wrapper.PostV1JupyterServices)
|
|
router.DELETE(baseURL+"/v1/jupyter/services/:serviceId", wrapper.DeleteV1JupyterServicesServiceId)
|
|
router.GET(baseURL+"/v1/queue", wrapper.GetV1Queue)
|
|
router.GET(baseURL+"/v1/tasks", wrapper.GetV1Tasks)
|
|
router.POST(baseURL+"/v1/tasks", wrapper.PostV1Tasks)
|
|
router.DELETE(baseURL+"/v1/tasks/:taskId", wrapper.DeleteV1TasksTaskId)
|
|
router.GET(baseURL+"/v1/tasks/:taskId", wrapper.GetV1TasksTaskId)
|
|
router.GET(baseURL+"/ws", wrapper.GetWs)
|
|
|
|
}
|
|
|
|
// Base64 encoded, gzipped, json marshaled Swagger object
|
|
var swaggerSpec = []string{
|
|
|
|
"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",
|
|
}
|
|
|
|
// GetSwagger returns the content of the embedded swagger specification file
|
|
// or error if failed to decode
|
|
func decodeSpec() ([]byte, error) {
|
|
zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, ""))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error base64 decoding spec: %w", err)
|
|
}
|
|
zr, err := gzip.NewReader(bytes.NewReader(zipped))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decompressing spec: %w", err)
|
|
}
|
|
var buf bytes.Buffer
|
|
_, err = buf.ReadFrom(zr)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decompressing spec: %w", err)
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
var rawSpec = decodeSpecCached()
|
|
|
|
// a naive cached of a decoded swagger spec
|
|
func decodeSpecCached() func() ([]byte, error) {
|
|
data, err := decodeSpec()
|
|
return func() ([]byte, error) {
|
|
return data, err
|
|
}
|
|
}
|
|
|
|
// Constructs a synthetic filesystem for resolving external references when loading openapi specifications.
|
|
func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) {
|
|
res := make(map[string]func() ([]byte, error))
|
|
if len(pathToFile) > 0 {
|
|
res[pathToFile] = rawSpec
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
// GetSwagger returns the Swagger specification corresponding to the generated code
|
|
// in this file. The external references of Swagger specification are resolved.
|
|
// The logic of resolving external references is tightly connected to "import-mapping" feature.
|
|
// Externally referenced files must be embedded in the corresponding golang packages.
|
|
// Urls can be supported but this task was out of the scope.
|
|
func GetSwagger() (swagger *openapi3.T, err error) {
|
|
resolvePath := PathToRawSpec("")
|
|
|
|
loader := openapi3.NewLoader()
|
|
loader.IsExternalRefsAllowed = true
|
|
loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) {
|
|
pathToFile := url.String()
|
|
pathToFile = path.Clean(pathToFile)
|
|
getSpec, ok := resolvePath[pathToFile]
|
|
if !ok {
|
|
err1 := fmt.Errorf("path not found: %s", pathToFile)
|
|
return nil, err1
|
|
}
|
|
return getSpec()
|
|
}
|
|
var specData []byte
|
|
specData, err = rawSpec()
|
|
if err != nil {
|
|
return
|
|
}
|
|
swagger, err = loader.LoadFromData(specData)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|