From 6fbb4b568bc12bb32b34779d13a32f2551836d45 Mon Sep 17 00:00:00 2001 From: Javier Adriel Date: Thu, 9 Feb 2023 14:49:07 -0600 Subject: [PATCH] Add handlers that will communicate with release service (#2651) --- models/release_info.go | 85 ++++++++++ models/release_list_response.go | 133 ++++++++++++++++ restapi/admin_releases.go | 99 ++++++++++++ restapi/admin_releases_test.go | 104 ++++++++++++ restapi/configure_console.go | 2 + restapi/embedded_spec.go | 150 ++++++++++++++++++ restapi/operations/console_api.go | 13 ++ restapi/operations/release/list_releases.go | 88 ++++++++++ .../release/list_releases_parameters.go | 126 +++++++++++++++ .../release/list_releases_responses.go | 135 ++++++++++++++++ .../release/list_releases_urlbuilder.go | 126 +++++++++++++++ swagger-console.yml | 49 ++++++ 12 files changed, 1110 insertions(+) create mode 100644 models/release_info.go create mode 100644 models/release_list_response.go create mode 100644 restapi/admin_releases.go create mode 100644 restapi/admin_releases_test.go create mode 100644 restapi/operations/release/list_releases.go create mode 100644 restapi/operations/release/list_releases_parameters.go create mode 100644 restapi/operations/release/list_releases_responses.go create mode 100644 restapi/operations/release/list_releases_urlbuilder.go diff --git a/models/release_info.go b/models/release_info.go new file mode 100644 index 000000000..8d5f7a31e --- /dev/null +++ b/models/release_info.go @@ -0,0 +1,85 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// ReleaseInfo release info +// +// swagger:model releaseInfo +type ReleaseInfo struct { + + // breaking changes content + BreakingChangesContent string `json:"breakingChangesContent,omitempty"` + + // context content + ContextContent string `json:"contextContent,omitempty"` + + // name + Name string `json:"name,omitempty"` + + // new features content + NewFeaturesContent string `json:"newFeaturesContent,omitempty"` + + // notes content + NotesContent string `json:"notesContent,omitempty"` + + // security content + SecurityContent string `json:"securityContent,omitempty"` + + // tag + Tag string `json:"tag,omitempty"` +} + +// Validate validates this release info +func (m *ReleaseInfo) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this release info based on context it is used +func (m *ReleaseInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *ReleaseInfo) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *ReleaseInfo) UnmarshalBinary(b []byte) error { + var res ReleaseInfo + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/release_list_response.go b/models/release_list_response.go new file mode 100644 index 000000000..9f5d59b5c --- /dev/null +++ b/models/release_list_response.go @@ -0,0 +1,133 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// ReleaseListResponse release list response +// +// swagger:model releaseListResponse +type ReleaseListResponse struct { + + // results + Results []*ReleaseInfo `json:"results"` +} + +// Validate validates this release list response +func (m *ReleaseListResponse) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateResults(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *ReleaseListResponse) validateResults(formats strfmt.Registry) error { + if swag.IsZero(m.Results) { // not required + return nil + } + + for i := 0; i < len(m.Results); i++ { + if swag.IsZero(m.Results[i]) { // not required + continue + } + + if m.Results[i] != nil { + if err := m.Results[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("results" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("results" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this release list response based on the context it is used +func (m *ReleaseListResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateResults(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *ReleaseListResponse) contextValidateResults(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Results); i++ { + + if m.Results[i] != nil { + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("results" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("results" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *ReleaseListResponse) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *ReleaseListResponse) UnmarshalBinary(b []byte) error { + var res ReleaseListResponse + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/restapi/admin_releases.go b/restapi/admin_releases.go new file mode 100644 index 000000000..ebe0d75a5 --- /dev/null +++ b/restapi/admin_releases.go @@ -0,0 +1,99 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package restapi + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "time" + + "github.com/go-openapi/runtime/middleware" + "github.com/minio/console/models" + "github.com/minio/console/restapi/operations" + release "github.com/minio/console/restapi/operations/release" + "github.com/minio/pkg/env" +) + +var ( + releaseServiceHostEnvVar = "RELEASE_SERVICE_HOST" + defaultReleaseServiceHost = "https://release-service.apps.min.dev" +) + +func registerReleasesHandlers(api *operations.ConsoleAPI) { + api.ReleaseListReleasesHandler = release.ListReleasesHandlerFunc(func(params release.ListReleasesParams, session *models.Principal) middleware.Responder { + resp, err := GetReleaseListResponse(session, params) + if err != nil { + return release.NewListReleasesDefault(int(err.Code)).WithPayload(err) + } + return release.NewListReleasesOK().WithPayload(resp) + }) +} + +func GetReleaseListResponse(session *models.Principal, params release.ListReleasesParams) (*models.ReleaseListResponse, *models.Error) { + ctx, cancel := context.WithCancel(params.HTTPRequest.Context()) + defer cancel() + repo := params.Repo + currentRelease := "" + if params.Current != nil { + currentRelease = *params.Current + } + return releaseList(ctx, repo, currentRelease) +} + +func releaseList(ctx context.Context, repo, currentRelease string) (*models.ReleaseListResponse, *models.Error) { + serviceURL := getReleaseServiceURL() + releases, err := getReleases(serviceURL, repo, currentRelease) + if err != nil { + return nil, ErrorWithContext(ctx, err) + } + return &models.ReleaseListResponse{ + Results: releases, + }, nil +} + +func getReleaseServiceURL() string { + host := env.Get(releaseServiceHostEnvVar, defaultReleaseServiceHost) + return fmt.Sprintf("%s/releases", host) +} + +func getReleases(url, repo, currentRelease string) ([]*models.ReleaseInfo, error) { + client := &http.Client{Timeout: time.Second * 5} + req, err := http.NewRequest("GET", url, nil) + q := req.URL.Query() + q.Add("repo", repo) + q.Add("current", currentRelease) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("error getting releases: %s", resp.Status) + } + var releases []*models.ReleaseInfo + err = json.NewDecoder(resp.Body).Decode(&releases) + if err != nil { + return nil, err + } + return releases, nil +} diff --git a/restapi/admin_releases_test.go b/restapi/admin_releases_test.go new file mode 100644 index 000000000..ea3f8a379 --- /dev/null +++ b/restapi/admin_releases_test.go @@ -0,0 +1,104 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package restapi + +import ( + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/minio/console/models" + "github.com/minio/console/restapi/operations" + release "github.com/minio/console/restapi/operations/release" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type ReleasesTestSuite struct { + suite.Suite + assert *assert.Assertions + currentServer string + isServerSet bool + getServer *httptest.Server + withError bool +} + +func (suite *ReleasesTestSuite) SetupSuite() { + suite.assert = assert.New(suite.T()) + suite.getServer = httptest.NewServer(http.HandlerFunc(suite.getHandler)) + suite.currentServer, suite.isServerSet = os.LookupEnv(releaseServiceHostEnvVar) + os.Setenv(releaseServiceHostEnvVar, suite.getServer.URL) +} + +func (suite *ReleasesTestSuite) TearDownSuite() { + if suite.isServerSet { + os.Setenv(releaseServiceHostEnvVar, suite.currentServer) + } else { + os.Unsetenv(releaseServiceHostEnvVar) + } +} + +func (suite *ReleasesTestSuite) getHandler( + w http.ResponseWriter, r *http.Request, +) { + if suite.withError { + w.WriteHeader(400) + } else { + w.WriteHeader(200) + response := []*models.ReleaseListResponse{{}} + bytes, _ := json.Marshal(response) + fmt.Fprint(w, string(bytes)) + } +} + +func (suite *ReleasesTestSuite) TestRegisterReleasesHandlers() { + api := &operations.ConsoleAPI{} + suite.assert.Nil(api.ReleaseListReleasesHandler) + registerReleasesHandlers(api) + suite.assert.NotNil(api.ReleaseListReleasesHandler) +} + +func (suite *ReleasesTestSuite) TestGetReleasesWithError() { + api := &operations.ConsoleAPI{} + current := "mock" + registerReleasesHandlers(api) + params := release.NewListReleasesParams() + params.Current = ¤t + params.HTTPRequest = &http.Request{} + suite.withError = true + response := api.ReleaseListReleasesHandler.Handle(params, &models.Principal{}) + _, ok := response.(*release.ListReleasesDefault) + suite.assert.True(ok) +} + +func (suite *ReleasesTestSuite) TestGetReleasesWithoutError() { + api := &operations.ConsoleAPI{} + registerReleasesHandlers(api) + params := release.NewListReleasesParams() + params.HTTPRequest = &http.Request{} + suite.withError = false + response := api.ReleaseListReleasesHandler.Handle(params, &models.Principal{}) + _, ok := response.(*release.ListReleasesOK) + suite.assert.True(ok) +} + +func TestReleases(t *testing.T) { + suite.Run(t, new(ReleasesTestSuite)) +} diff --git a/restapi/configure_console.go b/restapi/configure_console.go index dd780bc81..a8e933063 100644 --- a/restapi/configure_console.go +++ b/restapi/configure_console.go @@ -166,6 +166,8 @@ func configureAPI(api *operations.ConsoleAPI) http.Handler { // Register Account handlers registerAccountHandlers(api) + registerReleasesHandlers(api) + api.PreServerShutdown = func() {} api.ServerShutdown = func() {} diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index ba2f7c4dd..d9c63b57a 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -4056,6 +4056,44 @@ func init() { } } }, + "/releases/": { + "get": { + "tags": [ + "release" + ], + "summary": "Get repo releases for a given version", + "operationId": "ListReleases", + "parameters": [ + { + "type": "string", + "description": "repo name", + "name": "repo", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Current Release", + "name": "current", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/releaseListResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/remote-buckets": { "get": { "tags": [ @@ -7372,6 +7410,43 @@ func init() { } } }, + "releaseInfo": { + "type": "object", + "properties": { + "breakingChangesContent": { + "type": "string" + }, + "contextContent": { + "type": "string" + }, + "name": { + "type": "string" + }, + "newFeaturesContent": { + "type": "string" + }, + "notesContent": { + "type": "string" + }, + "securityContent": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "releaseListResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/releaseInfo" + } + } + } + }, "remoteBucket": { "type": "object", "required": [ @@ -12539,6 +12614,44 @@ func init() { } } }, + "/releases/": { + "get": { + "tags": [ + "release" + ], + "summary": "Get repo releases for a given version", + "operationId": "ListReleases", + "parameters": [ + { + "type": "string", + "description": "repo name", + "name": "repo", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Current Release", + "name": "current", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/releaseListResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/remote-buckets": { "get": { "tags": [ @@ -15981,6 +16094,43 @@ func init() { } } }, + "releaseInfo": { + "type": "object", + "properties": { + "breakingChangesContent": { + "type": "string" + }, + "contextContent": { + "type": "string" + }, + "name": { + "type": "string" + }, + "newFeaturesContent": { + "type": "string" + }, + "notesContent": { + "type": "string" + }, + "securityContent": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "releaseListResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/releaseInfo" + } + } + } + }, "remoteBucket": { "type": "object", "required": [ diff --git a/restapi/operations/console_api.go b/restapi/operations/console_api.go index 7a869dad1..129acb428 100644 --- a/restapi/operations/console_api.go +++ b/restapi/operations/console_api.go @@ -50,6 +50,7 @@ import ( "github.com/minio/console/restapi/operations/object" "github.com/minio/console/restapi/operations/policy" "github.com/minio/console/restapi/operations/profile" + "github.com/minio/console/restapi/operations/release" "github.com/minio/console/restapi/operations/service" "github.com/minio/console/restapi/operations/service_account" "github.com/minio/console/restapi/operations/site_replication" @@ -371,6 +372,9 @@ func NewConsoleAPI(spec *loads.Document) *ConsoleAPI { BucketListPoliciesWithBucketHandler: bucket.ListPoliciesWithBucketHandlerFunc(func(params bucket.ListPoliciesWithBucketParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation bucket.ListPoliciesWithBucket has not yet been implemented") }), + ReleaseListReleasesHandler: release.ListReleasesHandlerFunc(func(params release.ListReleasesParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation release.ListReleases has not yet been implemented") + }), BucketListRemoteBucketsHandler: bucket.ListRemoteBucketsHandlerFunc(func(params bucket.ListRemoteBucketsParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation bucket.ListRemoteBuckets has not yet been implemented") }), @@ -789,6 +793,8 @@ type ConsoleAPI struct { PolicyListPoliciesHandler policy.ListPoliciesHandler // BucketListPoliciesWithBucketHandler sets the operation handler for the list policies with bucket operation BucketListPoliciesWithBucketHandler bucket.ListPoliciesWithBucketHandler + // ReleaseListReleasesHandler sets the operation handler for the list releases operation + ReleaseListReleasesHandler release.ListReleasesHandler // BucketListRemoteBucketsHandler sets the operation handler for the list remote buckets operation BucketListRemoteBucketsHandler bucket.ListRemoteBucketsHandler // ServiceAccountListUserServiceAccountsHandler sets the operation handler for the list user service accounts operation @@ -1275,6 +1281,9 @@ func (o *ConsoleAPI) Validate() error { if o.BucketListPoliciesWithBucketHandler == nil { unregistered = append(unregistered, "bucket.ListPoliciesWithBucketHandler") } + if o.ReleaseListReleasesHandler == nil { + unregistered = append(unregistered, "release.ListReleasesHandler") + } if o.BucketListRemoteBucketsHandler == nil { unregistered = append(unregistered, "bucket.ListRemoteBucketsHandler") } @@ -1930,6 +1939,10 @@ func (o *ConsoleAPI) initHandlerCache() { if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) } + o.handlers["GET"]["/releases"] = release.NewListReleases(o.context, o.ReleaseListReleasesHandler) + if o.handlers["GET"] == nil { + o.handlers["GET"] = make(map[string]http.Handler) + } o.handlers["GET"]["/remote-buckets"] = bucket.NewListRemoteBuckets(o.context, o.BucketListRemoteBucketsHandler) if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) diff --git a/restapi/operations/release/list_releases.go b/restapi/operations/release/list_releases.go new file mode 100644 index 000000000..bbdaef2b6 --- /dev/null +++ b/restapi/operations/release/list_releases.go @@ -0,0 +1,88 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package release + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime/middleware" + + "github.com/minio/console/models" +) + +// ListReleasesHandlerFunc turns a function with the right signature into a list releases handler +type ListReleasesHandlerFunc func(ListReleasesParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn ListReleasesHandlerFunc) Handle(params ListReleasesParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// ListReleasesHandler interface for that can handle valid list releases params +type ListReleasesHandler interface { + Handle(ListReleasesParams, *models.Principal) middleware.Responder +} + +// NewListReleases creates a new http.Handler for the list releases operation +func NewListReleases(ctx *middleware.Context, handler ListReleasesHandler) *ListReleases { + return &ListReleases{Context: ctx, Handler: handler} +} + +/* + ListReleases swagger:route GET /releases/ release listReleases + +Get repo releases for a given version +*/ +type ListReleases struct { + Context *middleware.Context + Handler ListReleasesHandler +} + +func (o *ListReleases) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewListReleasesParams() + uprinc, aCtx, err := o.Context.Authorize(r, route) + if err != nil { + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + if aCtx != nil { + *r = *aCtx + } + var principal *models.Principal + if uprinc != nil { + principal = uprinc.(*models.Principal) // this is really a models.Principal, I promise + } + + if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + + res := o.Handler.Handle(Params, principal) // actually handle the request + o.Context.Respond(rw, r, route.Produces, route, res) + +} diff --git a/restapi/operations/release/list_releases_parameters.go b/restapi/operations/release/list_releases_parameters.go new file mode 100644 index 000000000..3d3e9e335 --- /dev/null +++ b/restapi/operations/release/list_releases_parameters.go @@ -0,0 +1,126 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package release + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/validate" +) + +// NewListReleasesParams creates a new ListReleasesParams object +// +// There are no default values defined in the spec. +func NewListReleasesParams() ListReleasesParams { + + return ListReleasesParams{} +} + +// ListReleasesParams contains all the bound params for the list releases operation +// typically these are obtained from a http.Request +// +// swagger:parameters ListReleases +type ListReleasesParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` + + /*Current Release + In: query + */ + Current *string + /*repo name + Required: true + In: query + */ + Repo string +} + +// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls. +// +// To ensure default values, the struct must have been initialized with NewListReleasesParams() beforehand. +func (o *ListReleasesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + qs := runtime.Values(r.URL.Query()) + + qCurrent, qhkCurrent, _ := qs.GetOK("current") + if err := o.bindCurrent(qCurrent, qhkCurrent, route.Formats); err != nil { + res = append(res, err) + } + + qRepo, qhkRepo, _ := qs.GetOK("repo") + if err := o.bindRepo(qRepo, qhkRepo, route.Formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +// bindCurrent binds and validates parameter Current from query. +func (o *ListReleasesParams) bindCurrent(rawData []string, hasKey bool, formats strfmt.Registry) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + // Required: false + // AllowEmptyValue: false + + if raw == "" { // empty values pass all other validations + return nil + } + o.Current = &raw + + return nil +} + +// bindRepo binds and validates parameter Repo from query. +func (o *ListReleasesParams) bindRepo(rawData []string, hasKey bool, formats strfmt.Registry) error { + if !hasKey { + return errors.Required("repo", "query", rawData) + } + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + // Required: true + // AllowEmptyValue: false + + if err := validate.RequiredString("repo", "query", raw); err != nil { + return err + } + o.Repo = raw + + return nil +} diff --git a/restapi/operations/release/list_releases_responses.go b/restapi/operations/release/list_releases_responses.go new file mode 100644 index 000000000..27276f38e --- /dev/null +++ b/restapi/operations/release/list_releases_responses.go @@ -0,0 +1,135 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package release + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime" + + "github.com/minio/console/models" +) + +// ListReleasesOKCode is the HTTP code returned for type ListReleasesOK +const ListReleasesOKCode int = 200 + +/* +ListReleasesOK A successful response. + +swagger:response listReleasesOK +*/ +type ListReleasesOK struct { + + /* + In: Body + */ + Payload *models.ReleaseListResponse `json:"body,omitempty"` +} + +// NewListReleasesOK creates ListReleasesOK with default headers values +func NewListReleasesOK() *ListReleasesOK { + + return &ListReleasesOK{} +} + +// WithPayload adds the payload to the list releases o k response +func (o *ListReleasesOK) WithPayload(payload *models.ReleaseListResponse) *ListReleasesOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the list releases o k response +func (o *ListReleasesOK) SetPayload(payload *models.ReleaseListResponse) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *ListReleasesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(200) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +/* +ListReleasesDefault Generic error response. + +swagger:response listReleasesDefault +*/ +type ListReleasesDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewListReleasesDefault creates ListReleasesDefault with default headers values +func NewListReleasesDefault(code int) *ListReleasesDefault { + if code <= 0 { + code = 500 + } + + return &ListReleasesDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the list releases default response +func (o *ListReleasesDefault) WithStatusCode(code int) *ListReleasesDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the list releases default response +func (o *ListReleasesDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the list releases default response +func (o *ListReleasesDefault) WithPayload(payload *models.Error) *ListReleasesDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the list releases default response +func (o *ListReleasesDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *ListReleasesDefault) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(o._statusCode) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} diff --git a/restapi/operations/release/list_releases_urlbuilder.go b/restapi/operations/release/list_releases_urlbuilder.go new file mode 100644 index 000000000..6f56f4816 --- /dev/null +++ b/restapi/operations/release/list_releases_urlbuilder.go @@ -0,0 +1,126 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package release + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "errors" + "net/url" + golangswaggerpaths "path" +) + +// ListReleasesURL generates an URL for the list releases operation +type ListReleasesURL struct { + Current *string + Repo string + + _basePath string + // avoid unkeyed usage + _ struct{} +} + +// WithBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *ListReleasesURL) WithBasePath(bp string) *ListReleasesURL { + o.SetBasePath(bp) + return o +} + +// SetBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *ListReleasesURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *ListReleasesURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/releases/" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + qs := make(url.Values) + + var currentQ string + if o.Current != nil { + currentQ = *o.Current + } + if currentQ != "" { + qs.Set("current", currentQ) + } + + repoQ := o.Repo + if repoQ != "" { + qs.Set("repo", repoQ) + } + + _result.RawQuery = qs.Encode() + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *ListReleasesURL) Must(u *url.URL, err error) *url.URL { + if err != nil { + panic(err) + } + if u == nil { + panic("url can't be nil") + } + return u +} + +// String returns the string representation of the path with query string +func (o *ListReleasesURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *ListReleasesURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on ListReleasesURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on ListReleasesURL") + } + + base, err := o.Build() + if err != nil { + return nil, err + } + + base.Scheme = scheme + base.Host = host + return base, nil +} + +// StringFull returns the string representation of a complete url +func (o *ListReleasesURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/swagger-console.yml b/swagger-console.yml index 208c2a909..f8e7c044b 100644 --- a/swagger-console.yml +++ b/swagger-console.yml @@ -3418,6 +3418,31 @@ paths: $ref: "#/definitions/error" tags: - idp + /releases: + get: + summary: Get repo releases for a given version + operationId: ListReleases + parameters: + - name: repo + description: repo name + in: query + type: string + required: true + - name: current + description: Current Release + in: query + type: string + responses: + 200: + description: A successful response. + schema: + $ref: "#/definitions/releaseListResponse" + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - release definitions: accountChangePasswordRequest: @@ -5798,3 +5823,27 @@ definitions: properties: restart: type: boolean + releaseListResponse: + type: object + properties: + results: + type: array + items: + $ref: "#/definitions/releaseInfo" + releaseInfo: + type: object + properties: + tag: + type: string + name: + type: string + notesContent: + type: string + securityContent: + type: string + breakingChangesContent: + type: string + contextContent: + type: string + newFeaturesContent: + type: string