From 2eecabf5e697f574cdf4819d7e361dc4ae919657 Mon Sep 17 00:00:00 2001 From: Prakash Senthil Vel <23444145+prakashsvmx@users.noreply.github.com> Date: Thu, 31 Mar 2022 17:11:01 +0000 Subject: [PATCH] Site replication API (#1773) Site replication API tests in CI/CL environment --- .github/workflows/jobs.yaml | 79 ++- Makefile | 48 ++ models/peer_info.go | 73 +++ models/peer_info_remove.go | 91 ++++ models/peer_site.go | 76 +++ models/peer_site_edit_response.go | 73 +++ models/peer_site_remove_response.go | 70 +++ models/site_replication_add_request.go | 90 ++++ models/site_replication_add_response.go | 76 +++ models/site_replication_info_response.go | 142 ++++++ replication/admin_api_int_replication_test.go | 205 ++++++++ replication/replication_test.go | 136 +++++ restapi/admin_site_replication.go | 232 +++++++++ restapi/admin_site_replication_test.go | 241 +++++++++ restapi/client-admin.go | 62 +++ restapi/configure_console.go | 2 + restapi/embedded_spec.go | 464 ++++++++++++++++++ .../admin_api/get_site_replication_info.go | 88 ++++ .../get_site_replication_info_parameters.go | 63 +++ .../get_site_replication_info_responses.go | 133 +++++ .../get_site_replication_info_urlbuilder.go | 104 ++++ .../admin_api/site_replication_edit.go | 88 ++++ .../site_replication_edit_parameters.go | 102 ++++ .../site_replication_edit_responses.go | 133 +++++ .../site_replication_edit_urlbuilder.go | 104 ++++ .../admin_api/site_replication_info_add.go | 88 ++++ .../site_replication_info_add_parameters.go | 102 ++++ .../site_replication_info_add_responses.go | 133 +++++ .../site_replication_info_add_urlbuilder.go | 104 ++++ .../admin_api/site_replication_remove.go | 88 ++++ .../site_replication_remove_parameters.go | 102 ++++ .../site_replication_remove_responses.go | 133 +++++ .../site_replication_remove_urlbuilder.go | 104 ++++ restapi/operations/console_api.go | 48 ++ swagger-console.yml | 161 ++++++ 35 files changed, 4037 insertions(+), 1 deletion(-) create mode 100644 models/peer_info.go create mode 100644 models/peer_info_remove.go create mode 100644 models/peer_site.go create mode 100644 models/peer_site_edit_response.go create mode 100644 models/peer_site_remove_response.go create mode 100644 models/site_replication_add_request.go create mode 100644 models/site_replication_add_response.go create mode 100644 models/site_replication_info_response.go create mode 100644 replication/admin_api_int_replication_test.go create mode 100644 replication/replication_test.go create mode 100644 restapi/admin_site_replication.go create mode 100644 restapi/admin_site_replication_test.go create mode 100644 restapi/operations/admin_api/get_site_replication_info.go create mode 100644 restapi/operations/admin_api/get_site_replication_info_parameters.go create mode 100644 restapi/operations/admin_api/get_site_replication_info_responses.go create mode 100644 restapi/operations/admin_api/get_site_replication_info_urlbuilder.go create mode 100644 restapi/operations/admin_api/site_replication_edit.go create mode 100644 restapi/operations/admin_api/site_replication_edit_parameters.go create mode 100644 restapi/operations/admin_api/site_replication_edit_responses.go create mode 100644 restapi/operations/admin_api/site_replication_edit_urlbuilder.go create mode 100644 restapi/operations/admin_api/site_replication_info_add.go create mode 100644 restapi/operations/admin_api/site_replication_info_add_parameters.go create mode 100644 restapi/operations/admin_api/site_replication_info_add_responses.go create mode 100644 restapi/operations/admin_api/site_replication_info_add_urlbuilder.go create mode 100644 restapi/operations/admin_api/site_replication_remove.go create mode 100644 restapi/operations/admin_api/site_replication_remove_parameters.go create mode 100644 restapi/operations/admin_api/site_replication_remove_responses.go create mode 100644 restapi/operations/admin_api/site_replication_remove_urlbuilder.go diff --git a/.github/workflows/jobs.yaml b/.github/workflows/jobs.yaml index c2511f31b..f17a49b18 100644 --- a/.github/workflows/jobs.yaml +++ b/.github/workflows/jobs.yaml @@ -16,6 +16,74 @@ concurrency: jobs: + replication: + + name: Site Replication Test + needs: + - lint-job + - no-warnings-and-make-assets + - reuse-golang-dependencies + - vulnerable-dependencies-checks + runs-on: ubuntu-latest + + strategy: + matrix: + go-version: [ 1.17.x ] + + steps: + - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }} + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + # To build minio image, we need to clone the repository first + - name: clone https://github.com/minio/minio + uses: actions/checkout@master + with: + + # Repository name with owner. For example, actions/checkout + # Default: ${{ github.repository }} + repository: minio/minio + + # Relative path under $GITHUB_WORKSPACE to place the repository + # To have two repositories under the same test + path: 'minio_repository' + + - uses: actions/cache@v2 + name: Go Mod Cache + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ github.run_id }} + + - name: Build on ${{ matrix.os }} + run: | + echo "The idea is to build minio image from downloaded repository"; + cd $GITHUB_WORKSPACE/minio_repository; + echo "Get git version to build MinIO Image"; + VERSION=`git rev-parse HEAD`; + echo $VERSION; + echo "Create minio image"; + make docker VERSION=$VERSION; + echo "Jumping back to console repository to run the integration test" + cd $GITHUB_WORKSPACE; + echo "We are going to use the built image on test-integration"; + VERSION="minio/minio:$VERSION"; + echo $VERSION; + make test-replication MINIO_VERSION=$VERSION; + - uses: actions/cache@v2 + id: coverage-cache-replication + name: Coverage Cache Replication + with: + path: | + ./replication/coverage/ + key: ${{ runner.os }}-replication-coverage-2-${{ github.run_id }} + sso-integration: name: SSO Integration Test @@ -981,6 +1049,7 @@ jobs: - c-operator-api-tests - test-pkg-on-go - sso-integration + - replication runs-on: ${{ matrix.os }} strategy: matrix: @@ -1023,6 +1092,14 @@ jobs: ./sso-integration/coverage/ key: ${{ runner.os }}-sso-coverage-2-${{ github.run_id }} + - uses: actions/cache@v2 + id: coverage-cache-replication + name: Coverage Cache Replication + with: + path: | + ./replication/coverage/ + key: ${{ runner.os }}-replication-coverage-2-${{ github.run_id }} + - uses: actions/cache@v2 id: coverage-cache-operator name: Coverage Cache Operator @@ -1058,7 +1135,7 @@ jobs: echo "go build gocoverage.go" go build gocovmerge.go echo "put together the outs for final coverage resolution" - ./gocovmerge ../integration/coverage/system.out ../sso-integration/coverage/sso-system.out ../restapi/coverage/coverage.out ../pkg/coverage/coverage-pkg.out ../operator-integration/coverage/operator-api.out > all.out + ./gocovmerge ../integration/coverage/system.out ../replication/coverage/replication.out ../sso-integration/coverage/sso-system.out ../restapi/coverage/coverage.out ../pkg/coverage/coverage-pkg.out ../operator-integration/coverage/operator-api.out > all.out echo "grep to obtain the result" go tool cover -func=all.out | grep total > tmp2 result=`cat tmp2 | awk 'END {print $3}'` diff --git a/Makefile b/Makefile index b5ea48dbb..902778124 100644 --- a/Makefile +++ b/Makefile @@ -80,6 +80,54 @@ test-integration: @(docker stop minio) @(docker network rm mynet123) +test-replication: + @(docker stop minio || true) + @(docker stop minio1 || true) + @(docker stop minio2 || true) + @(docker network rm mynet123 || true) + @(docker network create mynet123) + @(docker run -v /data1 -v /data2 -v /data3 -v /data4 \ + --net=mynet123 -d \ + --name minio \ + --rm \ + -p 9000:9000 \ + -p 6000:6000 \ + -e MINIO_KMS_SECRET_KEY=my-minio-key:OSMM+vkKUTCvQs9YL/CVMIMt43HFhkUpqJxTmGl6rYw= \ + -e MINIO_ROOT_USER="minioadmin" \ + -e MINIO_ROOT_PASSWORD="minioadmin" \ + $(MINIO_VERSION) server /data{1...4} \ + --address :9000 \ + --console-address :6000) + @(docker run -v /data1 -v /data2 -v /data3 -v /data4 \ + --net=mynet123 -d \ + --name minio1 \ + --rm \ + -p 9001:9001 \ + -p 6001:6001 \ + -e MINIO_KMS_SECRET_KEY=my-minio-key:OSMM+vkKUTCvQs9YL/CVMIMt43HFhkUpqJxTmGl6rYw= \ + -e MINIO_ROOT_USER="minioadmin" \ + -e MINIO_ROOT_PASSWORD="minioadmin" \ + $(MINIO_VERSION) server /data{1...4} \ + --address :9001 \ + --console-address :6001) + @(docker run -v /data1 -v /data2 -v /data3 -v /data4 \ + --net=mynet123 -d \ + --name minio2 \ + --rm \ + -p 9002:9002 \ + -p 6002:6002 \ + -e MINIO_KMS_SECRET_KEY=my-minio-key:OSMM+vkKUTCvQs9YL/CVMIMt43HFhkUpqJxTmGl6rYw= \ + -e MINIO_ROOT_USER="minioadmin" \ + -e MINIO_ROOT_PASSWORD="minioadmin" \ + $(MINIO_VERSION) server /data{1...4} \ + --address :9002 \ + --console-address :6002) + @(cd replication && go test -coverpkg=../restapi -c -tags testrunmain . && mkdir -p coverage && ./replication.test -test.v -test.run "^Test*" -test.coverprofile=coverage/replication.out) + @(docker stop minio || true) + @(docker stop minio1 || true) + @(docker stop minio2 || true) + @(docker network rm mynet123 || true) + test-sso-integration: @echo "create the network in bridge mode to communicate all containers" @(docker network create my-net) diff --git a/models/peer_info.go b/models/peer_info.go new file mode 100644 index 000000000..b68b20181 --- /dev/null +++ b/models/peer_info.go @@ -0,0 +1,73 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// PeerInfo peer info +// +// swagger:model peerInfo +type PeerInfo struct { + + // deployment ID + DeploymentID string `json:"deploymentID,omitempty"` + + // endpoint + Endpoint string `json:"endpoint,omitempty"` + + // name + Name string `json:"name,omitempty"` +} + +// Validate validates this peer info +func (m *PeerInfo) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this peer info based on context it is used +func (m *PeerInfo) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *PeerInfo) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *PeerInfo) UnmarshalBinary(b []byte) error { + var res PeerInfo + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/peer_info_remove.go b/models/peer_info_remove.go new file mode 100644 index 000000000..9fe447d13 --- /dev/null +++ b/models/peer_info_remove.go @@ -0,0 +1,91 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" + "github.com/go-openapi/validate" +) + +// PeerInfoRemove peer info remove +// +// swagger:model peerInfoRemove +type PeerInfoRemove struct { + + // all + All bool `json:"all,omitempty"` + + // sites + // Required: true + Sites []string `json:"sites"` +} + +// Validate validates this peer info remove +func (m *PeerInfoRemove) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateSites(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *PeerInfoRemove) validateSites(formats strfmt.Registry) error { + + if err := validate.Required("sites", "body", m.Sites); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this peer info remove based on context it is used +func (m *PeerInfoRemove) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *PeerInfoRemove) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *PeerInfoRemove) UnmarshalBinary(b []byte) error { + var res PeerInfoRemove + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/peer_site.go b/models/peer_site.go new file mode 100644 index 000000000..4e9d59e42 --- /dev/null +++ b/models/peer_site.go @@ -0,0 +1,76 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// PeerSite peer site +// +// swagger:model peerSite +type PeerSite struct { + + // access key + AccessKey string `json:"accessKey,omitempty"` + + // endpoint + Endpoint string `json:"endpoint,omitempty"` + + // name + Name string `json:"name,omitempty"` + + // secret key + SecretKey string `json:"secretKey,omitempty"` +} + +// Validate validates this peer site +func (m *PeerSite) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this peer site based on context it is used +func (m *PeerSite) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *PeerSite) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *PeerSite) UnmarshalBinary(b []byte) error { + var res PeerSite + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/peer_site_edit_response.go b/models/peer_site_edit_response.go new file mode 100644 index 000000000..225282449 --- /dev/null +++ b/models/peer_site_edit_response.go @@ -0,0 +1,73 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// PeerSiteEditResponse peer site edit response +// +// swagger:model peerSiteEditResponse +type PeerSiteEditResponse struct { + + // error detail + ErrorDetail string `json:"errorDetail,omitempty"` + + // status + Status string `json:"status,omitempty"` + + // success + Success bool `json:"success,omitempty"` +} + +// Validate validates this peer site edit response +func (m *PeerSiteEditResponse) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this peer site edit response based on context it is used +func (m *PeerSiteEditResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *PeerSiteEditResponse) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *PeerSiteEditResponse) UnmarshalBinary(b []byte) error { + var res PeerSiteEditResponse + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/peer_site_remove_response.go b/models/peer_site_remove_response.go new file mode 100644 index 000000000..98cf77f1a --- /dev/null +++ b/models/peer_site_remove_response.go @@ -0,0 +1,70 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// PeerSiteRemoveResponse peer site remove response +// +// swagger:model peerSiteRemoveResponse +type PeerSiteRemoveResponse struct { + + // error detail + ErrorDetail string `json:"errorDetail,omitempty"` + + // status + Status string `json:"status,omitempty"` +} + +// Validate validates this peer site remove response +func (m *PeerSiteRemoveResponse) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this peer site remove response based on context it is used +func (m *PeerSiteRemoveResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *PeerSiteRemoveResponse) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *PeerSiteRemoveResponse) UnmarshalBinary(b []byte) error { + var res PeerSiteRemoveResponse + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/site_replication_add_request.go b/models/site_replication_add_request.go new file mode 100644 index 000000000..72940b91d --- /dev/null +++ b/models/site_replication_add_request.go @@ -0,0 +1,90 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// SiteReplicationAddRequest site replication add request +// +// swagger:model siteReplicationAddRequest +type SiteReplicationAddRequest []*PeerSite + +// Validate validates this site replication add request +func (m SiteReplicationAddRequest) Validate(formats strfmt.Registry) error { + var res []error + + for i := 0; i < len(m); i++ { + if swag.IsZero(m[i]) { // not required + continue + } + + if m[i] != nil { + if err := m[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName(strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName(strconv.Itoa(i)) + } + return err + } + } + + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +// ContextValidate validate this site replication add request based on the context it is used +func (m SiteReplicationAddRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + for i := 0; i < len(m); i++ { + + if m[i] != nil { + if err := m[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName(strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName(strconv.Itoa(i)) + } + return err + } + } + + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/models/site_replication_add_response.go b/models/site_replication_add_response.go new file mode 100644 index 000000000..4cdd6e280 --- /dev/null +++ b/models/site_replication_add_response.go @@ -0,0 +1,76 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// SiteReplicationAddResponse site replication add response +// +// swagger:model siteReplicationAddResponse +type SiteReplicationAddResponse struct { + + // error detail + ErrorDetail string `json:"errorDetail,omitempty"` + + // initial sync error message + InitialSyncErrorMessage string `json:"initialSyncErrorMessage,omitempty"` + + // status + Status string `json:"status,omitempty"` + + // success + Success bool `json:"success,omitempty"` +} + +// Validate validates this site replication add response +func (m *SiteReplicationAddResponse) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this site replication add response based on context it is used +func (m *SiteReplicationAddResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *SiteReplicationAddResponse) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *SiteReplicationAddResponse) UnmarshalBinary(b []byte) error { + var res SiteReplicationAddResponse + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/models/site_replication_info_response.go b/models/site_replication_info_response.go new file mode 100644 index 000000000..bb975b23b --- /dev/null +++ b/models/site_replication_info_response.go @@ -0,0 +1,142 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" +) + +// SiteReplicationInfoResponse site replication info response +// +// swagger:model siteReplicationInfoResponse +type SiteReplicationInfoResponse struct { + + // enabled + Enabled bool `json:"enabled,omitempty"` + + // name + Name string `json:"name,omitempty"` + + // service account access key + ServiceAccountAccessKey string `json:"serviceAccountAccessKey,omitempty"` + + // sites + Sites []*PeerInfo `json:"sites"` +} + +// Validate validates this site replication info response +func (m *SiteReplicationInfoResponse) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateSites(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *SiteReplicationInfoResponse) validateSites(formats strfmt.Registry) error { + if swag.IsZero(m.Sites) { // not required + return nil + } + + for i := 0; i < len(m.Sites); i++ { + if swag.IsZero(m.Sites[i]) { // not required + continue + } + + if m.Sites[i] != nil { + if err := m.Sites[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("sites" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("sites" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this site replication info response based on the context it is used +func (m *SiteReplicationInfoResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateSites(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *SiteReplicationInfoResponse) contextValidateSites(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Sites); i++ { + + if m.Sites[i] != nil { + if err := m.Sites[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("sites" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("sites" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *SiteReplicationInfoResponse) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *SiteReplicationInfoResponse) UnmarshalBinary(b []byte) error { + var res SiteReplicationInfoResponse + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/replication/admin_api_int_replication_test.go b/replication/admin_api_int_replication_test.go new file mode 100644 index 000000000..e8b708ff8 --- /dev/null +++ b/replication/admin_api_int_replication_test.go @@ -0,0 +1,205 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 . + +// These tests are for AdminAPI Tag based on swagger-console.yml + +package replication + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "testing" + "time" + + "github.com/minio/console/models" + "github.com/stretchr/testify/assert" +) + +const apiURL = "http://localhost:9090/api/v1/admin/site-replication" + +func makeExecuteReq(method string, body io.Reader) (*http.Response, error) { + + client := &http.Client{ + Timeout: 10 * time.Second, + } + + request, err := http.NewRequest( + method, + apiURL, + body, + ) + + if err != nil { + return nil, err + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + response, err := client.Do(request) + + if err != nil { + return nil, err + } + + return response, nil +} + +func AddSiteReplicationInfo() (*http.Response, error) { + + sites := make([]map[string]interface{}, 2) + sites[0] = map[string]interface{}{ + "accessKey": "minioadmin", + "endpoint": "http://localhost:9000", + "secretKey": "minioadmin", + "name": "sitellhost9000", + } + sites[1] = map[string]interface{}{ + "accessKey": "minioadmin", + "endpoint": "http://minio1:9001", + "secretKey": "minioadmin", + "name": "sitellhost9001", + } + + requestDataJSON, _ := json.Marshal(sites) + requestDataBody := bytes.NewReader(requestDataJSON) + + return makeExecuteReq("POST", requestDataBody) + +} + +func EditSiteReplicationInfo() (*http.Response, error) { + + getResponse, err := makeExecuteReq("GET", nil) + //defer response.Body.Close() + + if err != nil { + return nil, err + } + + getResObj := &models.SiteReplicationInfoResponse{} + json.NewDecoder(getResponse.Body).Decode(getResObj) + + //fmt.Println("Edit Got::", getResObj, getResObj.Sites[0], getResObj.Sites[1]) + var secondDeploymentID string + if getResObj != nil { + if len(getResObj.Sites) > 0 { + secondDeploymentID = getResObj.Sites[1].DeploymentID + } + } else { + return nil, nil + } + + fmt.Println("Editing::", getResObj.Sites[1]) + fmt.Println("Editing::", secondDeploymentID) + pSiteInfo := map[string]interface{}{ + "deploymentID": secondDeploymentID, + "endpoint": "http://minio2:9002", + "name": "sitellhost9002", + } + + requestDataJSON, _ := json.Marshal(pSiteInfo) + requestDataBody := bytes.NewReader(requestDataJSON) + return makeExecuteReq("PUT", requestDataBody) + +} + +func DeleteSiteReplicationInfo() (*http.Response, error) { + + delReq := map[string]interface{}{ + "all": true, + "sites": []string{ + "sitellhost9000", + "sitellhost9001", + "sitellhost9002", + }, + } + requestDataJSON, _ := json.Marshal(delReq) + requestDataBody := bytes.NewReader(requestDataJSON) + + return makeExecuteReq("DELETE", requestDataBody) + +} + +func TestGetSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + + response, err := makeExecuteReq("GET", nil) + //defer response.Body.Close() + + tgt := &models.SiteReplicationInfoResponse{} + json.NewDecoder(response.Body).Decode(tgt) + + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(200, response.StatusCode, "Status Code is incorrect") + } + +} + +func TestAddSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + + fmt.Println("Add Site Replication") + response, err := AddSiteReplicationInfo() + + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(200, response.StatusCode, "Status Code is incorrect") + } + fmt.Println("TestAddSiteReplicationInfo: ", response.StatusCode) + +} + +func TestEditSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + + response, err := EditSiteReplicationInfo() + + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.NotEmpty(response) + assert.Equal(200, response.StatusCode, "Status Code is incorrect") + } + +} + +func TestDeleteSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + + fmt.Println("Delete Site Replication") + response, err := DeleteSiteReplicationInfo() + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(204, response.StatusCode, "Status Code is incorrect") + } + fmt.Println("TestDeleteReplicationInfo: ", response.StatusCode) + +} diff --git a/replication/replication_test.go b/replication/replication_test.go new file mode 100644 index 000000000..4d5c0577d --- /dev/null +++ b/replication/replication_test.go @@ -0,0 +1,136 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 replication + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "strconv" + "testing" + "time" + + "github.com/go-openapi/loads" + "github.com/minio/console/restapi" + "github.com/minio/console/restapi/operations" +) + +var token string + +func initConsoleServer() (*restapi.Server, error) { + + //os.Setenv("CONSOLE_MINIO_SERVER", "localhost:9000") + + swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON) + if err != nil { + return nil, err + } + + noLog := func(string, ...interface{}) { + // nothing to log + } + + // Initialize MinIO loggers + restapi.LogInfo = noLog + restapi.LogError = noLog + + api := operations.NewConsoleAPI(swaggerSpec) + api.Logger = noLog + + server := restapi.NewServer(api) + // register all APIs + server.ConfigureAPI() + + //restapi.GlobalRootCAs, restapi.GlobalPublicCerts, restapi.GlobalTLSCertsManager = globalRootCAs, globalPublicCerts, globalTLSCerts + + consolePort, _ := strconv.Atoi("9090") + + server.Host = "0.0.0.0" + server.Port = consolePort + restapi.Port = "9090" + restapi.Hostname = "0.0.0.0" + + return server, nil +} + +func TestMain(m *testing.M) { + + // start console server + go func() { + fmt.Println("start server") + srv, err := initConsoleServer() + if err != nil { + log.Println(err) + log.Println("init fail") + return + } + srv.Serve() + + }() + + fmt.Println("sleeping") + time.Sleep(2 * time.Second) + + client := &http.Client{ + Timeout: 2 * time.Second, + } + // get login credentials + + requestData := map[string]string{ + "accessKey": "minioadmin", + "secretKey": "minioadmin", + } + + requestDataJSON, _ := json.Marshal(requestData) + + requestDataBody := bytes.NewReader(requestDataJSON) + + request, err := http.NewRequest("POST", "http://localhost:9090/api/v1/login", requestDataBody) + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Content-Type", "application/json") + + response, err := client.Do(request) + + if err != nil { + log.Println(err) + return + } + + if response != nil { + for _, cookie := range response.Cookies() { + if cookie.Name == "token" { + token = cookie.Value + break + } + } + } + + if token == "" { + log.Println("authentication token not found in cookies response") + return + } + + code := m.Run() + os.Exit(code) +} diff --git a/restapi/admin_site_replication.go b/restapi/admin_site_replication.go new file mode 100644 index 000000000..7f1e0283f --- /dev/null +++ b/restapi/admin_site_replication.go @@ -0,0 +1,232 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2022 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" + + "github.com/go-openapi/runtime/middleware" + "github.com/minio/console/models" + "github.com/minio/console/restapi/operations" + "github.com/minio/console/restapi/operations/admin_api" + "github.com/minio/madmin-go" +) + +func registerSiteReplicationHandler(api *operations.ConsoleAPI) { + + api.AdminAPIGetSiteReplicationInfoHandler = admin_api.GetSiteReplicationInfoHandlerFunc(func(params admin_api.GetSiteReplicationInfoParams, session *models.Principal) middleware.Responder { + rInfo, err := getSRInfoResponse(session) + if err != nil { + return admin_api.NewGetSiteReplicationInfoDefault(500).WithPayload(prepareError(err)) + } + return admin_api.NewGetSiteReplicationInfoOK().WithPayload(rInfo) + + }) + + api.AdminAPISiteReplicationInfoAddHandler = admin_api.SiteReplicationInfoAddHandlerFunc(func(params admin_api.SiteReplicationInfoAddParams, session *models.Principal) middleware.Responder { + eInfo, err := getSRAddResponse(session, ¶ms) + if err != nil { + return admin_api.NewSiteReplicationInfoAddDefault(500).WithPayload(err) + } + return admin_api.NewSiteReplicationInfoAddOK().WithPayload(eInfo) + }) + + api.AdminAPISiteReplicationRemoveHandler = admin_api.SiteReplicationRemoveHandlerFunc(func(params admin_api.SiteReplicationRemoveParams, session *models.Principal) middleware.Responder { + remRes, err := getSRRemoveResponse(session, ¶ms) + if err != nil { + return admin_api.NewSiteReplicationRemoveDefault(500).WithPayload(err) + } + return admin_api.NewSiteReplicationRemoveNoContent().WithPayload(remRes) + }) + + api.AdminAPISiteReplicationEditHandler = admin_api.SiteReplicationEditHandlerFunc(func(params admin_api.SiteReplicationEditParams, session *models.Principal) middleware.Responder { + + eInfo, err := getSREditResponse(session, ¶ms) + if err != nil { + return admin_api.NewSiteReplicationRemoveDefault(500).WithPayload(err) + } + + return admin_api.NewSiteReplicationEditOK().WithPayload(eInfo) + }) + +} + +func getSRInfoResponse(session *models.Principal) (info *models.SiteReplicationInfoResponse, err error) { + mAdmin, err := NewMinioAdminClient(session) + if err != nil { + return nil, err + } + adminClient := AdminClient{Client: mAdmin} + ctx := context.Background() + + res, err := getSRConfig(ctx, adminClient) + + if err != nil { + return nil, err + } + return res, nil + +} +func getSRAddResponse(session *models.Principal, params *admin_api.SiteReplicationInfoAddParams) (*models.SiteReplicationAddResponse, *models.Error) { + + mAdmin, err := NewMinioAdminClient(session) + if err != nil { + return nil, prepareError(err) + } + adminClient := AdminClient{Client: mAdmin} + ctx := context.Background() + + res, err := addSiteReplication(ctx, adminClient, params) + if err != nil { + return nil, prepareError(err) + } + return res, nil + +} +func getSREditResponse(session *models.Principal, params *admin_api.SiteReplicationEditParams) (*models.PeerSiteEditResponse, *models.Error) { + mAdmin, err := NewMinioAdminClient(session) + if err != nil { + return nil, prepareError(err) + } + adminClient := AdminClient{Client: mAdmin} + ctx := context.Background() + eRes, err := editSiteReplication(ctx, adminClient, params) + + if err != nil { + return nil, prepareError(err) + } + + return eRes, nil + +} +func getSRRemoveResponse(session *models.Principal, params *admin_api.SiteReplicationRemoveParams) (*models.PeerSiteRemoveResponse, *models.Error) { + mAdmin, err := NewMinioAdminClient(session) + if err != nil { + return nil, prepareError(err) + } + adminClient := AdminClient{Client: mAdmin} + + ctx := context.Background() + rRes, err := removeSiteReplication(ctx, adminClient, params) + if err != nil { + return nil, prepareError(err) + } + return rRes, nil +} + +func getSRConfig(ctx context.Context, client MinioAdmin) (info *models.SiteReplicationInfoResponse, err error) { + srInfo, err := client.getSiteReplicationInfo(ctx) + + if err != nil { + return nil, err + } + var sites []*models.PeerInfo + + if len(srInfo.Sites) > 0 { + for _, s := range srInfo.Sites { + var pInfo = &models.PeerInfo{ + DeploymentID: s.DeploymentID, + Endpoint: s.Endpoint, + Name: s.Name, + } + sites = append(sites, pInfo) + } + } + res := &models.SiteReplicationInfoResponse{ + Enabled: srInfo.Enabled, + Name: srInfo.Name, + ServiceAccountAccessKey: srInfo.ServiceAccountAccessKey, + Sites: sites, + } + return res, nil + +} +func addSiteReplication(ctx context.Context, client MinioAdmin, params *admin_api.SiteReplicationInfoAddParams) (info *models.SiteReplicationAddResponse, err error) { + var rSites []madmin.PeerSite + + if len(params.Body) > 0 { + for _, aSite := range params.Body { + var pInfo = &madmin.PeerSite{ + AccessKey: aSite.AccessKey, + Name: aSite.Name, + SecretKey: aSite.SecretKey, + Endpoint: aSite.Endpoint, + } + rSites = append(rSites, *pInfo) + } + } + cc, err := client.addSiteReplicationInfo(ctx, rSites) + + if err != nil { + return nil, err + } + + res := &models.SiteReplicationAddResponse{ + ErrorDetail: cc.ErrDetail, + InitialSyncErrorMessage: cc.InitialSyncErrorMessage, + Status: cc.Status, + Success: cc.Success, + } + + return res, nil +} +func editSiteReplication(ctx context.Context, client MinioAdmin, params *admin_api.SiteReplicationEditParams) (info *models.PeerSiteEditResponse, err error) { + + peerSiteInfo := &madmin.PeerInfo{ + Endpoint: params.Body.Endpoint, //only endpoint can be edited. + Name: params.Body.Name, //does not get updated. + DeploymentID: params.Body.DeploymentID, //readonly + } + eRes, err := client.editSiteReplicationInfo(ctx, *peerSiteInfo) + if err != nil { + return nil, err + } + + editRes := &models.PeerSiteEditResponse{ + ErrorDetail: eRes.ErrDetail, + Status: eRes.Status, + Success: eRes.Success, + } + return editRes, nil +} +func removeSiteReplication(ctx context.Context, client MinioAdmin, params *admin_api.SiteReplicationRemoveParams) (info *models.PeerSiteRemoveResponse, err error) { + delAll := params.Body.All + siteNames := params.Body.Sites + + var req *madmin.SRRemoveReq + if delAll { + req = &madmin.SRRemoveReq{ + RemoveAll: delAll, + } + } else { + req = &madmin.SRRemoveReq{ + SiteNames: siteNames, + RemoveAll: delAll, + } + } + + rRes, err := client.deleteSiteReplicationInfo(ctx, *req) + if err != nil { + return nil, err + } + + removeRes := &models.PeerSiteRemoveResponse{ + ErrorDetail: rRes.ErrDetail, + Status: rRes.Status, + } + return removeRes, nil +} diff --git a/restapi/admin_site_replication_test.go b/restapi/admin_site_replication_test.go new file mode 100644 index 000000000..68f60569e --- /dev/null +++ b/restapi/admin_site_replication_test.go @@ -0,0 +1,241 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 . + +// These tests are for AdminAPI Tag based on swagger-console.yml + +package restapi + +import ( + "context" + "fmt" + "testing" + + "github.com/minio/madmin-go" + "github.com/stretchr/testify/assert" +) + +// assigning mock at runtime instead of compile time +var getSiteReplicationInfo func(ctx context.Context) (*madmin.SiteReplicationInfo, error) + +func (ac adminClientMock) getSiteReplicationInfo(ctx context.Context) (*madmin.SiteReplicationInfo, error) { + return getSiteReplicationInfo(ctx) +} + +var addSiteReplicationInfo func(ctx context.Context, sites []madmin.PeerSite) (*madmin.ReplicateAddStatus, error) + +func (ac adminClientMock) addSiteReplicationInfo(ctx context.Context, sites []madmin.PeerSite) (*madmin.ReplicateAddStatus, error) { + return addSiteReplicationInfo(ctx, sites) +} + +var editSiteReplicationInfo func(ctx context.Context, site madmin.PeerInfo) (*madmin.ReplicateEditStatus, error) + +func (ac adminClientMock) editSiteReplicationInfo(ctx context.Context, site madmin.PeerInfo) (*madmin.ReplicateEditStatus, error) { + return editSiteReplicationInfo(ctx, site) +} + +var deleteSiteReplicationInfoMock func(ctx context.Context, removeReq madmin.SRRemoveReq) (*madmin.ReplicateRemoveStatus, error) + +func (ac adminClientMock) deleteSiteReplicationInfo(ctx context.Context, removeReq madmin.SRRemoveReq) (*madmin.ReplicateRemoveStatus, error) { + return deleteSiteReplicationInfoMock(ctx, removeReq) +} + +func TestGetSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + // mock minIO client + adminClient := adminClientMock{} + + function := "getSiteReplicationInfo()" + ctx := context.Background() + + retValueMock := madmin.SiteReplicationInfo{ + Enabled: true, + Name: "site1", + Sites: []madmin.PeerInfo{ + madmin.PeerInfo{ + Endpoint: "http://localhost:9000", + Name: "site1", + DeploymentID: "12345", + }, + madmin.PeerInfo{ + Endpoint: "http://localhost:9001", + Name: "site2", + DeploymentID: "123456", + }, + }, + ServiceAccountAccessKey: "test-key", + } + + expValueMock := &madmin.SiteReplicationInfo{ + Enabled: true, + Name: "site1", + Sites: []madmin.PeerInfo{ + madmin.PeerInfo{ + Endpoint: "http://localhost:9000", + Name: "site1", + DeploymentID: "12345", + }, + madmin.PeerInfo{ + Endpoint: "http://localhost:9001", + Name: "site2", + DeploymentID: "123456", + }, + }, + ServiceAccountAccessKey: "test-key", + } + + getSiteReplicationInfo = func(ctx context.Context) (info *madmin.SiteReplicationInfo, err error) { + return &retValueMock, nil + } + + srInfo, err := adminClient.getSiteReplicationInfo(ctx) + + if err != nil { + + } + + assert.Equal(expValueMock, srInfo, fmt.Sprintf("Failed on %s: length of lists is not the same", function)) + +} + +func TestAddSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + // mock minIO client + adminClient := adminClientMock{} + + function := "addSiteReplicationInfo()" + ctx := context.Background() + + retValueMock := &madmin.ReplicateAddStatus{ + Success: true, + Status: "success", + ErrDetail: "", + InitialSyncErrorMessage: "", + } + + expValueMock := &madmin.ReplicateAddStatus{ + Success: true, + Status: "success", + ErrDetail: "", + InitialSyncErrorMessage: "", + } + + addSiteReplicationInfo = func(ctx context.Context, sites []madmin.PeerSite) (res *madmin.ReplicateAddStatus, err error) { + return retValueMock, nil + } + + sites := []madmin.PeerSite{ + madmin.PeerSite{ + Name: "site1", + Endpoint: "http://localhost:9000", + AccessKey: "test", + SecretKey: "test", + }, + madmin.PeerSite{ + Name: "site2", + Endpoint: "http://localhost:9001", + AccessKey: "test", + SecretKey: "test", + }, + } + + srInfo, err := adminClient.addSiteReplicationInfo(ctx, sites) + + if err != nil { + + } + + assert.Equal(expValueMock, srInfo, fmt.Sprintf("Failed on %s: length of lists is not the same", function)) + +} + +func TestEditSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + // mock minIO client + adminClient := adminClientMock{} + + function := "editSiteReplicationInfo()" + ctx := context.Background() + + retValueMock := &madmin.ReplicateEditStatus{ + Success: true, + Status: "success", + ErrDetail: "", + } + + expValueMock := &madmin.ReplicateEditStatus{ + Success: true, + Status: "success", + ErrDetail: "", + } + + editSiteReplicationInfo = func(ctx context.Context, site madmin.PeerInfo) (res *madmin.ReplicateEditStatus, err error) { + return retValueMock, nil + } + + site := madmin.PeerInfo{ + Name: "", + Endpoint: "", + DeploymentID: "12345", + } + + srInfo, err := adminClient.editSiteReplicationInfo(ctx, site) + + if err != nil { + + } + + assert.Equal(expValueMock, srInfo, fmt.Sprintf("Failed on %s: length of lists is not the same", function)) + +} + +func TestDeleteSiteReplicationInfo(t *testing.T) { + assert := assert.New(t) + // mock minIO client + adminClient := adminClientMock{} + + function := "deleteSiteReplicationInfo()" + ctx := context.Background() + + retValueMock := &madmin.ReplicateRemoveStatus{ + Status: "success", + ErrDetail: "", + } + + expValueMock := &madmin.ReplicateRemoveStatus{ + Status: "success", + ErrDetail: "", + } + + deleteSiteReplicationInfoMock = func(ctx context.Context, removeReq madmin.SRRemoveReq) (res *madmin.ReplicateRemoveStatus, err error) { + return retValueMock, nil + } + + remReq := madmin.SRRemoveReq{ + SiteNames: []string{ + "test1", + }, + RemoveAll: false, + } + + srInfo, err := adminClient.deleteSiteReplicationInfo(ctx, remReq) + + if err != nil { + + } + + assert.Equal(expValueMock, srInfo, fmt.Sprintf("Failed on %s: length of lists is not the same", function)) + +} diff --git a/restapi/client-admin.go b/restapi/client-admin.go index 39b3289dd..254dc1fec 100644 --- a/restapi/client-admin.go +++ b/restapi/client-admin.go @@ -112,6 +112,11 @@ type MinioAdmin interface { editTierCreds(ctx context.Context, tierName string, creds madmin.TierCreds) error // Speedtest speedtest(ctx context.Context, opts madmin.SpeedtestOpts) (chan madmin.SpeedTestResult, error) + // Site Relication + getSiteReplicationInfo(ctx context.Context) (*madmin.SiteReplicationInfo, error) + addSiteReplicationInfo(ctx context.Context, sites []madmin.PeerSite) (*madmin.ReplicateAddStatus, error) + editSiteReplicationInfo(ctx context.Context, site madmin.PeerInfo) (*madmin.ReplicateEditStatus, error) + deleteSiteReplicationInfo(ctx context.Context, removeReq madmin.SRRemoveReq) (*madmin.ReplicateRemoveStatus, error) } // Interface implementation @@ -477,3 +482,60 @@ func GetConsoleHTTPClient() *http.Client { func (ac AdminClient) speedtest(ctx context.Context, opts madmin.SpeedtestOpts) (chan madmin.SpeedTestResult, error) { return ac.Client.Speedtest(ctx, opts) } + +//Site Replication +func (ac AdminClient) getSiteReplicationInfo(ctx context.Context) (*madmin.SiteReplicationInfo, error) { + + res, err := ac.Client.SiteReplicationInfo(ctx) + + if err != nil { + return nil, err + } + return &madmin.SiteReplicationInfo{ + Enabled: res.Enabled, + Name: res.Name, + Sites: res.Sites, + ServiceAccountAccessKey: res.ServiceAccountAccessKey, + }, nil +} + +func (ac AdminClient) addSiteReplicationInfo(ctx context.Context, sites []madmin.PeerSite) (*madmin.ReplicateAddStatus, error) { + + res, err := ac.Client.SiteReplicationAdd(ctx, sites) + + if err != nil { + return nil, err + } + + return &madmin.ReplicateAddStatus{ + Success: res.Success, + Status: res.Status, + ErrDetail: res.ErrDetail, + InitialSyncErrorMessage: res.InitialSyncErrorMessage, + }, nil +} + +func (ac AdminClient) editSiteReplicationInfo(ctx context.Context, site madmin.PeerInfo) (*madmin.ReplicateEditStatus, error) { + + res, err := ac.Client.SiteReplicationEdit(ctx, site) + if err != nil { + return nil, err + } + return &madmin.ReplicateEditStatus{ + Success: res.Success, + Status: res.Status, + ErrDetail: res.ErrDetail, + }, nil +} + +func (ac AdminClient) deleteSiteReplicationInfo(ctx context.Context, removeReq madmin.SRRemoveReq) (*madmin.ReplicateRemoveStatus, error) { + + res, err := ac.Client.SiteReplicationRemove(ctx, removeReq) + if err != nil { + return nil, err + } + return &madmin.ReplicateRemoveStatus{ + Status: res.Status, + ErrDetail: res.ErrDetail, + }, nil +} diff --git a/restapi/configure_console.go b/restapi/configure_console.go index 44d918b45..8f74eb4d2 100644 --- a/restapi/configure_console.go +++ b/restapi/configure_console.go @@ -129,6 +129,8 @@ func configureAPI(api *operations.ConsoleAPI) http.Handler { //Register Inspect Handler registerInspectHandler(api) + registerSiteReplicationHandler(api) + // Operator Console // Register Object's Handlers diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 3bd164f5b..10a49d2b3 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -313,6 +313,122 @@ func init() { } } }, + "/admin/site-replication": { + "get": { + "tags": [ + "AdminAPI" + ], + "summary": "Get list of Replication Sites", + "operationId": "GetSiteReplicationInfo", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/siteReplicationInfoResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "put": { + "tags": [ + "AdminAPI" + ], + "summary": "Edit a Replication Site", + "operationId": "SiteReplicationEdit", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/peerInfo" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/peerSiteEditResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "post": { + "tags": [ + "AdminAPI" + ], + "summary": "Add a Replication Site", + "operationId": "SiteReplicationInfoAdd", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/siteReplicationAddRequest" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/siteReplicationAddResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "delete": { + "tags": [ + "AdminAPI" + ], + "summary": "Remove a Replication Site", + "operationId": "SiteReplicationRemove", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/peerInfoRemove" + } + } + ], + "responses": { + "204": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/peerSiteRemoveResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/admin/tiers": { "get": { "tags": [ @@ -5499,6 +5615,79 @@ func init() { "years" ] }, + "peerInfo": { + "type": "object", + "properties": { + "deploymentID": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "peerInfoRemove": { + "type": "object", + "required": [ + "sites" + ], + "properties": { + "all": { + "type": "boolean" + }, + "sites": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "peerSite": { + "type": "object", + "properties": { + "accessKey": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secretKey": { + "type": "string" + } + } + }, + "peerSiteEditResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "status": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "peerSiteRemoveResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "policy": { "type": "object", "properties": { @@ -6053,6 +6242,49 @@ func init() { } } }, + "siteReplicationAddRequest": { + "type": "array", + "items": { + "$ref": "#/definitions/peerSite" + } + }, + "siteReplicationAddResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "initialSyncErrorMessage": { + "type": "string" + }, + "status": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "siteReplicationInfoResponse": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "serviceAccountAccessKey": { + "type": "string" + }, + "sites": { + "type": "array", + "items": { + "$ref": "#/definitions/peerInfo" + } + } + } + }, "startProfilingItem": { "type": "object", "properties": { @@ -6849,6 +7081,122 @@ func init() { } } }, + "/admin/site-replication": { + "get": { + "tags": [ + "AdminAPI" + ], + "summary": "Get list of Replication Sites", + "operationId": "GetSiteReplicationInfo", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/siteReplicationInfoResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "put": { + "tags": [ + "AdminAPI" + ], + "summary": "Edit a Replication Site", + "operationId": "SiteReplicationEdit", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/peerInfo" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/peerSiteEditResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "post": { + "tags": [ + "AdminAPI" + ], + "summary": "Add a Replication Site", + "operationId": "SiteReplicationInfoAdd", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/siteReplicationAddRequest" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/siteReplicationAddResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + }, + "delete": { + "tags": [ + "AdminAPI" + ], + "summary": "Remove a Replication Site", + "operationId": "SiteReplicationRemove", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/peerInfoRemove" + } + } + ], + "responses": { + "204": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/peerSiteRemoveResponse" + } + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/admin/tiers": { "get": { "tags": [ @@ -12161,6 +12509,79 @@ func init() { "years" ] }, + "peerInfo": { + "type": "object", + "properties": { + "deploymentID": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "peerInfoRemove": { + "type": "object", + "required": [ + "sites" + ], + "properties": { + "all": { + "type": "boolean" + }, + "sites": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "peerSite": { + "type": "object", + "properties": { + "accessKey": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secretKey": { + "type": "string" + } + } + }, + "peerSiteEditResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "status": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "peerSiteRemoveResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "policy": { "type": "object", "properties": { @@ -12715,6 +13136,49 @@ func init() { } } }, + "siteReplicationAddRequest": { + "type": "array", + "items": { + "$ref": "#/definitions/peerSite" + } + }, + "siteReplicationAddResponse": { + "type": "object", + "properties": { + "errorDetail": { + "type": "string" + }, + "initialSyncErrorMessage": { + "type": "string" + }, + "status": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "siteReplicationInfoResponse": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "serviceAccountAccessKey": { + "type": "string" + }, + "sites": { + "type": "array", + "items": { + "$ref": "#/definitions/peerInfo" + } + } + } + }, "startProfilingItem": { "type": "object", "properties": { diff --git a/restapi/operations/admin_api/get_site_replication_info.go b/restapi/operations/admin_api/get_site_replication_info.go new file mode 100644 index 000000000..3b3bfa838 --- /dev/null +++ b/restapi/operations/admin_api/get_site_replication_info.go @@ -0,0 +1,88 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// GetSiteReplicationInfoHandlerFunc turns a function with the right signature into a get site replication info handler +type GetSiteReplicationInfoHandlerFunc func(GetSiteReplicationInfoParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn GetSiteReplicationInfoHandlerFunc) Handle(params GetSiteReplicationInfoParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// GetSiteReplicationInfoHandler interface for that can handle valid get site replication info params +type GetSiteReplicationInfoHandler interface { + Handle(GetSiteReplicationInfoParams, *models.Principal) middleware.Responder +} + +// NewGetSiteReplicationInfo creates a new http.Handler for the get site replication info operation +func NewGetSiteReplicationInfo(ctx *middleware.Context, handler GetSiteReplicationInfoHandler) *GetSiteReplicationInfo { + return &GetSiteReplicationInfo{Context: ctx, Handler: handler} +} + +/* GetSiteReplicationInfo swagger:route GET /admin/site-replication AdminAPI getSiteReplicationInfo + +Get list of Replication Sites + +*/ +type GetSiteReplicationInfo struct { + Context *middleware.Context + Handler GetSiteReplicationInfoHandler +} + +func (o *GetSiteReplicationInfo) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewGetSiteReplicationInfoParams() + 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/admin_api/get_site_replication_info_parameters.go b/restapi/operations/admin_api/get_site_replication_info_parameters.go new file mode 100644 index 000000000..d4b999c19 --- /dev/null +++ b/restapi/operations/admin_api/get_site_replication_info_parameters.go @@ -0,0 +1,63 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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/middleware" +) + +// NewGetSiteReplicationInfoParams creates a new GetSiteReplicationInfoParams object +// +// There are no default values defined in the spec. +func NewGetSiteReplicationInfoParams() GetSiteReplicationInfoParams { + + return GetSiteReplicationInfoParams{} +} + +// GetSiteReplicationInfoParams contains all the bound params for the get site replication info operation +// typically these are obtained from a http.Request +// +// swagger:parameters GetSiteReplicationInfo +type GetSiteReplicationInfoParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` +} + +// 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 NewGetSiteReplicationInfoParams() beforehand. +func (o *GetSiteReplicationInfoParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/restapi/operations/admin_api/get_site_replication_info_responses.go b/restapi/operations/admin_api/get_site_replication_info_responses.go new file mode 100644 index 000000000..172ed97f9 --- /dev/null +++ b/restapi/operations/admin_api/get_site_replication_info_responses.go @@ -0,0 +1,133 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// GetSiteReplicationInfoOKCode is the HTTP code returned for type GetSiteReplicationInfoOK +const GetSiteReplicationInfoOKCode int = 200 + +/*GetSiteReplicationInfoOK A successful response. + +swagger:response getSiteReplicationInfoOK +*/ +type GetSiteReplicationInfoOK struct { + + /* + In: Body + */ + Payload *models.SiteReplicationInfoResponse `json:"body,omitempty"` +} + +// NewGetSiteReplicationInfoOK creates GetSiteReplicationInfoOK with default headers values +func NewGetSiteReplicationInfoOK() *GetSiteReplicationInfoOK { + + return &GetSiteReplicationInfoOK{} +} + +// WithPayload adds the payload to the get site replication info o k response +func (o *GetSiteReplicationInfoOK) WithPayload(payload *models.SiteReplicationInfoResponse) *GetSiteReplicationInfoOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get site replication info o k response +func (o *GetSiteReplicationInfoOK) SetPayload(payload *models.SiteReplicationInfoResponse) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetSiteReplicationInfoOK) 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 + } + } +} + +/*GetSiteReplicationInfoDefault Generic error response. + +swagger:response getSiteReplicationInfoDefault +*/ +type GetSiteReplicationInfoDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetSiteReplicationInfoDefault creates GetSiteReplicationInfoDefault with default headers values +func NewGetSiteReplicationInfoDefault(code int) *GetSiteReplicationInfoDefault { + if code <= 0 { + code = 500 + } + + return &GetSiteReplicationInfoDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the get site replication info default response +func (o *GetSiteReplicationInfoDefault) WithStatusCode(code int) *GetSiteReplicationInfoDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the get site replication info default response +func (o *GetSiteReplicationInfoDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the get site replication info default response +func (o *GetSiteReplicationInfoDefault) WithPayload(payload *models.Error) *GetSiteReplicationInfoDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get site replication info default response +func (o *GetSiteReplicationInfoDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetSiteReplicationInfoDefault) 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/admin_api/get_site_replication_info_urlbuilder.go b/restapi/operations/admin_api/get_site_replication_info_urlbuilder.go new file mode 100644 index 000000000..737cfa66e --- /dev/null +++ b/restapi/operations/admin_api/get_site_replication_info_urlbuilder.go @@ -0,0 +1,104 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// GetSiteReplicationInfoURL generates an URL for the get site replication info operation +type GetSiteReplicationInfoURL struct { + _basePath string +} + +// 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 *GetSiteReplicationInfoURL) WithBasePath(bp string) *GetSiteReplicationInfoURL { + 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 *GetSiteReplicationInfoURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *GetSiteReplicationInfoURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/admin/site-replication" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *GetSiteReplicationInfoURL) 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 *GetSiteReplicationInfoURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *GetSiteReplicationInfoURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on GetSiteReplicationInfoURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on GetSiteReplicationInfoURL") + } + + 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 *GetSiteReplicationInfoURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/restapi/operations/admin_api/site_replication_edit.go b/restapi/operations/admin_api/site_replication_edit.go new file mode 100644 index 000000000..02b538fd8 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_edit.go @@ -0,0 +1,88 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationEditHandlerFunc turns a function with the right signature into a site replication edit handler +type SiteReplicationEditHandlerFunc func(SiteReplicationEditParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn SiteReplicationEditHandlerFunc) Handle(params SiteReplicationEditParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// SiteReplicationEditHandler interface for that can handle valid site replication edit params +type SiteReplicationEditHandler interface { + Handle(SiteReplicationEditParams, *models.Principal) middleware.Responder +} + +// NewSiteReplicationEdit creates a new http.Handler for the site replication edit operation +func NewSiteReplicationEdit(ctx *middleware.Context, handler SiteReplicationEditHandler) *SiteReplicationEdit { + return &SiteReplicationEdit{Context: ctx, Handler: handler} +} + +/* SiteReplicationEdit swagger:route PUT /admin/site-replication AdminAPI siteReplicationEdit + +Edit a Replication Site + +*/ +type SiteReplicationEdit struct { + Context *middleware.Context + Handler SiteReplicationEditHandler +} + +func (o *SiteReplicationEdit) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewSiteReplicationEditParams() + 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/admin_api/site_replication_edit_parameters.go b/restapi/operations/admin_api/site_replication_edit_parameters.go new file mode 100644 index 000000000..0115f95cf --- /dev/null +++ b/restapi/operations/admin_api/site_replication_edit_parameters.go @@ -0,0 +1,102 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/validate" + + "github.com/minio/console/models" +) + +// NewSiteReplicationEditParams creates a new SiteReplicationEditParams object +// +// There are no default values defined in the spec. +func NewSiteReplicationEditParams() SiteReplicationEditParams { + + return SiteReplicationEditParams{} +} + +// SiteReplicationEditParams contains all the bound params for the site replication edit operation +// typically these are obtained from a http.Request +// +// swagger:parameters SiteReplicationEdit +type SiteReplicationEditParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` + + /* + Required: true + In: body + */ + Body *models.PeerInfo +} + +// 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 NewSiteReplicationEditParams() beforehand. +func (o *SiteReplicationEditParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + if runtime.HasBody(r) { + defer r.Body.Close() + var body models.PeerInfo + if err := route.Consumer.Consume(r.Body, &body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("body", "body", "")) + } else { + res = append(res, errors.NewParseError("body", "body", "", err)) + } + } else { + // validate body object + if err := body.Validate(route.Formats); err != nil { + res = append(res, err) + } + + ctx := validate.WithOperationRequest(context.Background()) + if err := body.ContextValidate(ctx, route.Formats); err != nil { + res = append(res, err) + } + + if len(res) == 0 { + o.Body = &body + } + } + } else { + res = append(res, errors.Required("body", "body", "")) + } + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/restapi/operations/admin_api/site_replication_edit_responses.go b/restapi/operations/admin_api/site_replication_edit_responses.go new file mode 100644 index 000000000..bd1cc2238 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_edit_responses.go @@ -0,0 +1,133 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationEditOKCode is the HTTP code returned for type SiteReplicationEditOK +const SiteReplicationEditOKCode int = 200 + +/*SiteReplicationEditOK A successful response. + +swagger:response siteReplicationEditOK +*/ +type SiteReplicationEditOK struct { + + /* + In: Body + */ + Payload *models.PeerSiteEditResponse `json:"body,omitempty"` +} + +// NewSiteReplicationEditOK creates SiteReplicationEditOK with default headers values +func NewSiteReplicationEditOK() *SiteReplicationEditOK { + + return &SiteReplicationEditOK{} +} + +// WithPayload adds the payload to the site replication edit o k response +func (o *SiteReplicationEditOK) WithPayload(payload *models.PeerSiteEditResponse) *SiteReplicationEditOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication edit o k response +func (o *SiteReplicationEditOK) SetPayload(payload *models.PeerSiteEditResponse) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationEditOK) 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 + } + } +} + +/*SiteReplicationEditDefault Generic error response. + +swagger:response siteReplicationEditDefault +*/ +type SiteReplicationEditDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewSiteReplicationEditDefault creates SiteReplicationEditDefault with default headers values +func NewSiteReplicationEditDefault(code int) *SiteReplicationEditDefault { + if code <= 0 { + code = 500 + } + + return &SiteReplicationEditDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the site replication edit default response +func (o *SiteReplicationEditDefault) WithStatusCode(code int) *SiteReplicationEditDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the site replication edit default response +func (o *SiteReplicationEditDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the site replication edit default response +func (o *SiteReplicationEditDefault) WithPayload(payload *models.Error) *SiteReplicationEditDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication edit default response +func (o *SiteReplicationEditDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationEditDefault) 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/admin_api/site_replication_edit_urlbuilder.go b/restapi/operations/admin_api/site_replication_edit_urlbuilder.go new file mode 100644 index 000000000..9b9130734 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_edit_urlbuilder.go @@ -0,0 +1,104 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationEditURL generates an URL for the site replication edit operation +type SiteReplicationEditURL struct { + _basePath string +} + +// 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 *SiteReplicationEditURL) WithBasePath(bp string) *SiteReplicationEditURL { + 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 *SiteReplicationEditURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *SiteReplicationEditURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/admin/site-replication" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *SiteReplicationEditURL) 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 *SiteReplicationEditURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *SiteReplicationEditURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on SiteReplicationEditURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on SiteReplicationEditURL") + } + + 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 *SiteReplicationEditURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/restapi/operations/admin_api/site_replication_info_add.go b/restapi/operations/admin_api/site_replication_info_add.go new file mode 100644 index 000000000..edef1ce22 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_info_add.go @@ -0,0 +1,88 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationInfoAddHandlerFunc turns a function with the right signature into a site replication info add handler +type SiteReplicationInfoAddHandlerFunc func(SiteReplicationInfoAddParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn SiteReplicationInfoAddHandlerFunc) Handle(params SiteReplicationInfoAddParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// SiteReplicationInfoAddHandler interface for that can handle valid site replication info add params +type SiteReplicationInfoAddHandler interface { + Handle(SiteReplicationInfoAddParams, *models.Principal) middleware.Responder +} + +// NewSiteReplicationInfoAdd creates a new http.Handler for the site replication info add operation +func NewSiteReplicationInfoAdd(ctx *middleware.Context, handler SiteReplicationInfoAddHandler) *SiteReplicationInfoAdd { + return &SiteReplicationInfoAdd{Context: ctx, Handler: handler} +} + +/* SiteReplicationInfoAdd swagger:route POST /admin/site-replication AdminAPI siteReplicationInfoAdd + +Add a Replication Site + +*/ +type SiteReplicationInfoAdd struct { + Context *middleware.Context + Handler SiteReplicationInfoAddHandler +} + +func (o *SiteReplicationInfoAdd) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewSiteReplicationInfoAddParams() + 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/admin_api/site_replication_info_add_parameters.go b/restapi/operations/admin_api/site_replication_info_add_parameters.go new file mode 100644 index 000000000..a18aea49a --- /dev/null +++ b/restapi/operations/admin_api/site_replication_info_add_parameters.go @@ -0,0 +1,102 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/validate" + + "github.com/minio/console/models" +) + +// NewSiteReplicationInfoAddParams creates a new SiteReplicationInfoAddParams object +// +// There are no default values defined in the spec. +func NewSiteReplicationInfoAddParams() SiteReplicationInfoAddParams { + + return SiteReplicationInfoAddParams{} +} + +// SiteReplicationInfoAddParams contains all the bound params for the site replication info add operation +// typically these are obtained from a http.Request +// +// swagger:parameters SiteReplicationInfoAdd +type SiteReplicationInfoAddParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` + + /* + Required: true + In: body + */ + Body models.SiteReplicationAddRequest +} + +// 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 NewSiteReplicationInfoAddParams() beforehand. +func (o *SiteReplicationInfoAddParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + if runtime.HasBody(r) { + defer r.Body.Close() + var body models.SiteReplicationAddRequest + if err := route.Consumer.Consume(r.Body, &body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("body", "body", "")) + } else { + res = append(res, errors.NewParseError("body", "body", "", err)) + } + } else { + // validate body object + if err := body.Validate(route.Formats); err != nil { + res = append(res, err) + } + + ctx := validate.WithOperationRequest(context.Background()) + if err := body.ContextValidate(ctx, route.Formats); err != nil { + res = append(res, err) + } + + if len(res) == 0 { + o.Body = body + } + } + } else { + res = append(res, errors.Required("body", "body", "")) + } + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/restapi/operations/admin_api/site_replication_info_add_responses.go b/restapi/operations/admin_api/site_replication_info_add_responses.go new file mode 100644 index 000000000..971dc67ac --- /dev/null +++ b/restapi/operations/admin_api/site_replication_info_add_responses.go @@ -0,0 +1,133 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationInfoAddOKCode is the HTTP code returned for type SiteReplicationInfoAddOK +const SiteReplicationInfoAddOKCode int = 200 + +/*SiteReplicationInfoAddOK A successful response. + +swagger:response siteReplicationInfoAddOK +*/ +type SiteReplicationInfoAddOK struct { + + /* + In: Body + */ + Payload *models.SiteReplicationAddResponse `json:"body,omitempty"` +} + +// NewSiteReplicationInfoAddOK creates SiteReplicationInfoAddOK with default headers values +func NewSiteReplicationInfoAddOK() *SiteReplicationInfoAddOK { + + return &SiteReplicationInfoAddOK{} +} + +// WithPayload adds the payload to the site replication info add o k response +func (o *SiteReplicationInfoAddOK) WithPayload(payload *models.SiteReplicationAddResponse) *SiteReplicationInfoAddOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication info add o k response +func (o *SiteReplicationInfoAddOK) SetPayload(payload *models.SiteReplicationAddResponse) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationInfoAddOK) 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 + } + } +} + +/*SiteReplicationInfoAddDefault Generic error response. + +swagger:response siteReplicationInfoAddDefault +*/ +type SiteReplicationInfoAddDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewSiteReplicationInfoAddDefault creates SiteReplicationInfoAddDefault with default headers values +func NewSiteReplicationInfoAddDefault(code int) *SiteReplicationInfoAddDefault { + if code <= 0 { + code = 500 + } + + return &SiteReplicationInfoAddDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the site replication info add default response +func (o *SiteReplicationInfoAddDefault) WithStatusCode(code int) *SiteReplicationInfoAddDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the site replication info add default response +func (o *SiteReplicationInfoAddDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the site replication info add default response +func (o *SiteReplicationInfoAddDefault) WithPayload(payload *models.Error) *SiteReplicationInfoAddDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication info add default response +func (o *SiteReplicationInfoAddDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationInfoAddDefault) 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/admin_api/site_replication_info_add_urlbuilder.go b/restapi/operations/admin_api/site_replication_info_add_urlbuilder.go new file mode 100644 index 000000000..a80fba8c0 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_info_add_urlbuilder.go @@ -0,0 +1,104 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationInfoAddURL generates an URL for the site replication info add operation +type SiteReplicationInfoAddURL struct { + _basePath string +} + +// 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 *SiteReplicationInfoAddURL) WithBasePath(bp string) *SiteReplicationInfoAddURL { + 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 *SiteReplicationInfoAddURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *SiteReplicationInfoAddURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/admin/site-replication" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *SiteReplicationInfoAddURL) 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 *SiteReplicationInfoAddURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *SiteReplicationInfoAddURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on SiteReplicationInfoAddURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on SiteReplicationInfoAddURL") + } + + 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 *SiteReplicationInfoAddURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/restapi/operations/admin_api/site_replication_remove.go b/restapi/operations/admin_api/site_replication_remove.go new file mode 100644 index 000000000..6ab87a010 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_remove.go @@ -0,0 +1,88 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationRemoveHandlerFunc turns a function with the right signature into a site replication remove handler +type SiteReplicationRemoveHandlerFunc func(SiteReplicationRemoveParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn SiteReplicationRemoveHandlerFunc) Handle(params SiteReplicationRemoveParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// SiteReplicationRemoveHandler interface for that can handle valid site replication remove params +type SiteReplicationRemoveHandler interface { + Handle(SiteReplicationRemoveParams, *models.Principal) middleware.Responder +} + +// NewSiteReplicationRemove creates a new http.Handler for the site replication remove operation +func NewSiteReplicationRemove(ctx *middleware.Context, handler SiteReplicationRemoveHandler) *SiteReplicationRemove { + return &SiteReplicationRemove{Context: ctx, Handler: handler} +} + +/* SiteReplicationRemove swagger:route DELETE /admin/site-replication AdminAPI siteReplicationRemove + +Remove a Replication Site + +*/ +type SiteReplicationRemove struct { + Context *middleware.Context + Handler SiteReplicationRemoveHandler +} + +func (o *SiteReplicationRemove) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewSiteReplicationRemoveParams() + 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/admin_api/site_replication_remove_parameters.go b/restapi/operations/admin_api/site_replication_remove_parameters.go new file mode 100644 index 000000000..470aa35bf --- /dev/null +++ b/restapi/operations/admin_api/site_replication_remove_parameters.go @@ -0,0 +1,102 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/validate" + + "github.com/minio/console/models" +) + +// NewSiteReplicationRemoveParams creates a new SiteReplicationRemoveParams object +// +// There are no default values defined in the spec. +func NewSiteReplicationRemoveParams() SiteReplicationRemoveParams { + + return SiteReplicationRemoveParams{} +} + +// SiteReplicationRemoveParams contains all the bound params for the site replication remove operation +// typically these are obtained from a http.Request +// +// swagger:parameters SiteReplicationRemove +type SiteReplicationRemoveParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` + + /* + Required: true + In: body + */ + Body *models.PeerInfoRemove +} + +// 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 NewSiteReplicationRemoveParams() beforehand. +func (o *SiteReplicationRemoveParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + if runtime.HasBody(r) { + defer r.Body.Close() + var body models.PeerInfoRemove + if err := route.Consumer.Consume(r.Body, &body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("body", "body", "")) + } else { + res = append(res, errors.NewParseError("body", "body", "", err)) + } + } else { + // validate body object + if err := body.Validate(route.Formats); err != nil { + res = append(res, err) + } + + ctx := validate.WithOperationRequest(context.Background()) + if err := body.ContextValidate(ctx, route.Formats); err != nil { + res = append(res, err) + } + + if len(res) == 0 { + o.Body = &body + } + } + } else { + res = append(res, errors.Required("body", "body", "")) + } + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/restapi/operations/admin_api/site_replication_remove_responses.go b/restapi/operations/admin_api/site_replication_remove_responses.go new file mode 100644 index 000000000..8fc804a48 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_remove_responses.go @@ -0,0 +1,133 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationRemoveNoContentCode is the HTTP code returned for type SiteReplicationRemoveNoContent +const SiteReplicationRemoveNoContentCode int = 204 + +/*SiteReplicationRemoveNoContent A successful response. + +swagger:response siteReplicationRemoveNoContent +*/ +type SiteReplicationRemoveNoContent struct { + + /* + In: Body + */ + Payload *models.PeerSiteRemoveResponse `json:"body,omitempty"` +} + +// NewSiteReplicationRemoveNoContent creates SiteReplicationRemoveNoContent with default headers values +func NewSiteReplicationRemoveNoContent() *SiteReplicationRemoveNoContent { + + return &SiteReplicationRemoveNoContent{} +} + +// WithPayload adds the payload to the site replication remove no content response +func (o *SiteReplicationRemoveNoContent) WithPayload(payload *models.PeerSiteRemoveResponse) *SiteReplicationRemoveNoContent { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication remove no content response +func (o *SiteReplicationRemoveNoContent) SetPayload(payload *models.PeerSiteRemoveResponse) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationRemoveNoContent) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(204) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +/*SiteReplicationRemoveDefault Generic error response. + +swagger:response siteReplicationRemoveDefault +*/ +type SiteReplicationRemoveDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewSiteReplicationRemoveDefault creates SiteReplicationRemoveDefault with default headers values +func NewSiteReplicationRemoveDefault(code int) *SiteReplicationRemoveDefault { + if code <= 0 { + code = 500 + } + + return &SiteReplicationRemoveDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the site replication remove default response +func (o *SiteReplicationRemoveDefault) WithStatusCode(code int) *SiteReplicationRemoveDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the site replication remove default response +func (o *SiteReplicationRemoveDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the site replication remove default response +func (o *SiteReplicationRemoveDefault) WithPayload(payload *models.Error) *SiteReplicationRemoveDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the site replication remove default response +func (o *SiteReplicationRemoveDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *SiteReplicationRemoveDefault) 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/admin_api/site_replication_remove_urlbuilder.go b/restapi/operations/admin_api/site_replication_remove_urlbuilder.go new file mode 100644 index 000000000..19ec2c0f4 --- /dev/null +++ b/restapi/operations/admin_api/site_replication_remove_urlbuilder.go @@ -0,0 +1,104 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 admin_api + +// 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" +) + +// SiteReplicationRemoveURL generates an URL for the site replication remove operation +type SiteReplicationRemoveURL struct { + _basePath string +} + +// 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 *SiteReplicationRemoveURL) WithBasePath(bp string) *SiteReplicationRemoveURL { + 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 *SiteReplicationRemoveURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *SiteReplicationRemoveURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/admin/site-replication" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *SiteReplicationRemoveURL) 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 *SiteReplicationRemoveURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *SiteReplicationRemoveURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on SiteReplicationRemoveURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on SiteReplicationRemoveURL") + } + + 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 *SiteReplicationRemoveURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/restapi/operations/console_api.go b/restapi/operations/console_api.go index 4e82550b1..ff46f6bf3 100644 --- a/restapi/operations/console_api.go +++ b/restapi/operations/console_api.go @@ -222,6 +222,9 @@ func NewConsoleAPI(spec *loads.Document) *ConsoleAPI { UserAPIGetServiceAccountPolicyHandler: user_api.GetServiceAccountPolicyHandlerFunc(func(params user_api.GetServiceAccountPolicyParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation user_api.GetServiceAccountPolicy has not yet been implemented") }), + AdminAPIGetSiteReplicationInfoHandler: admin_api.GetSiteReplicationInfoHandlerFunc(func(params admin_api.GetSiteReplicationInfoParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation admin_api.GetSiteReplicationInfo has not yet been implemented") + }), AdminAPIGetTierHandler: admin_api.GetTierHandlerFunc(func(params admin_api.GetTierParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation admin_api.GetTier has not yet been implemented") }), @@ -381,6 +384,15 @@ func NewConsoleAPI(spec *loads.Document) *ConsoleAPI { UserAPIShareObjectHandler: user_api.ShareObjectHandlerFunc(func(params user_api.ShareObjectParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation user_api.ShareObject has not yet been implemented") }), + AdminAPISiteReplicationEditHandler: admin_api.SiteReplicationEditHandlerFunc(func(params admin_api.SiteReplicationEditParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation admin_api.SiteReplicationEdit has not yet been implemented") + }), + AdminAPISiteReplicationInfoAddHandler: admin_api.SiteReplicationInfoAddHandlerFunc(func(params admin_api.SiteReplicationInfoAddParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation admin_api.SiteReplicationInfoAdd has not yet been implemented") + }), + AdminAPISiteReplicationRemoveHandler: admin_api.SiteReplicationRemoveHandlerFunc(func(params admin_api.SiteReplicationRemoveParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation admin_api.SiteReplicationRemove has not yet been implemented") + }), AdminAPISubnetInfoHandler: admin_api.SubnetInfoHandlerFunc(func(params admin_api.SubnetInfoParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation admin_api.SubnetInfo has not yet been implemented") }), @@ -574,6 +586,8 @@ type ConsoleAPI struct { UserAPIGetObjectMetadataHandler user_api.GetObjectMetadataHandler // UserAPIGetServiceAccountPolicyHandler sets the operation handler for the get service account policy operation UserAPIGetServiceAccountPolicyHandler user_api.GetServiceAccountPolicyHandler + // AdminAPIGetSiteReplicationInfoHandler sets the operation handler for the get site replication info operation + AdminAPIGetSiteReplicationInfoHandler admin_api.GetSiteReplicationInfoHandler // AdminAPIGetTierHandler sets the operation handler for the get tier operation AdminAPIGetTierHandler admin_api.GetTierHandler // AdminAPIGetUserInfoHandler sets the operation handler for the get user info operation @@ -680,6 +694,12 @@ type ConsoleAPI struct { UserAPISetServiceAccountPolicyHandler user_api.SetServiceAccountPolicyHandler // UserAPIShareObjectHandler sets the operation handler for the share object operation UserAPIShareObjectHandler user_api.ShareObjectHandler + // AdminAPISiteReplicationEditHandler sets the operation handler for the site replication edit operation + AdminAPISiteReplicationEditHandler admin_api.SiteReplicationEditHandler + // AdminAPISiteReplicationInfoAddHandler sets the operation handler for the site replication info add operation + AdminAPISiteReplicationInfoAddHandler admin_api.SiteReplicationInfoAddHandler + // AdminAPISiteReplicationRemoveHandler sets the operation handler for the site replication remove operation + AdminAPISiteReplicationRemoveHandler admin_api.SiteReplicationRemoveHandler // AdminAPISubnetInfoHandler sets the operation handler for the subnet info operation AdminAPISubnetInfoHandler admin_api.SubnetInfoHandler // AdminAPISubnetLoginHandler sets the operation handler for the subnet login operation @@ -945,6 +965,9 @@ func (o *ConsoleAPI) Validate() error { if o.UserAPIGetServiceAccountPolicyHandler == nil { unregistered = append(unregistered, "user_api.GetServiceAccountPolicyHandler") } + if o.AdminAPIGetSiteReplicationInfoHandler == nil { + unregistered = append(unregistered, "admin_api.GetSiteReplicationInfoHandler") + } if o.AdminAPIGetTierHandler == nil { unregistered = append(unregistered, "admin_api.GetTierHandler") } @@ -1104,6 +1127,15 @@ func (o *ConsoleAPI) Validate() error { if o.UserAPIShareObjectHandler == nil { unregistered = append(unregistered, "user_api.ShareObjectHandler") } + if o.AdminAPISiteReplicationEditHandler == nil { + unregistered = append(unregistered, "admin_api.SiteReplicationEditHandler") + } + if o.AdminAPISiteReplicationInfoAddHandler == nil { + unregistered = append(unregistered, "admin_api.SiteReplicationInfoAddHandler") + } + if o.AdminAPISiteReplicationRemoveHandler == nil { + unregistered = append(unregistered, "admin_api.SiteReplicationRemoveHandler") + } if o.AdminAPISubnetInfoHandler == nil { unregistered = append(unregistered, "admin_api.SubnetInfoHandler") } @@ -1448,6 +1480,10 @@ func (o *ConsoleAPI) initHandlerCache() { if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) } + o.handlers["GET"]["/admin/site-replication"] = admin_api.NewGetSiteReplicationInfo(o.context, o.AdminAPIGetSiteReplicationInfoHandler) + if o.handlers["GET"] == nil { + o.handlers["GET"] = make(map[string]http.Handler) + } o.handlers["GET"]["/admin/tiers/{type}/{name}"] = admin_api.NewGetTier(o.context, o.AdminAPIGetTierHandler) if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) @@ -1657,6 +1693,18 @@ func (o *ConsoleAPI) initHandlerCache() { o.handlers["GET"] = make(map[string]http.Handler) } o.handlers["GET"]["/buckets/{bucket_name}/objects/share"] = user_api.NewShareObject(o.context, o.UserAPIShareObjectHandler) + if o.handlers["PUT"] == nil { + o.handlers["PUT"] = make(map[string]http.Handler) + } + o.handlers["PUT"]["/admin/site-replication"] = admin_api.NewSiteReplicationEdit(o.context, o.AdminAPISiteReplicationEditHandler) + if o.handlers["POST"] == nil { + o.handlers["POST"] = make(map[string]http.Handler) + } + o.handlers["POST"]["/admin/site-replication"] = admin_api.NewSiteReplicationInfoAdd(o.context, o.AdminAPISiteReplicationInfoAddHandler) + if o.handlers["DELETE"] == nil { + o.handlers["DELETE"] = make(map[string]http.Handler) + } + o.handlers["DELETE"]["/admin/site-replication"] = admin_api.NewSiteReplicationRemove(o.context, o.AdminAPISiteReplicationRemoveHandler) if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) } diff --git a/swagger-console.yml b/swagger-console.yml index 9baabb810..d43ee9c94 100644 --- a/swagger-console.yml +++ b/swagger-console.yml @@ -2428,6 +2428,83 @@ paths: tags: - AdminAPI + /admin/site-replication: + get: + summary: Get list of Replication Sites + operationId: GetSiteReplicationInfo + responses: + 200: + description: A successful response. + schema: + $ref: "#/definitions/siteReplicationInfoResponse" + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - AdminAPI + post: + summary: Add a Replication Site + operationId: SiteReplicationInfoAdd + parameters: + - name: body + in: body + required: true + schema: + $ref: "#/definitions/siteReplicationAddRequest" + responses: + 200: + description: A successful response. + schema: + $ref: "#/definitions/siteReplicationAddResponse" + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - AdminAPI + put: + summary: Edit a Replication Site + operationId: SiteReplicationEdit + parameters: + - name: body + in: body + required: true + schema: + $ref: "#/definitions/peerInfo" + responses: + 200: + description: A successful response. + schema: + $ref: "#/definitions/peerSiteEditResponse" + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - AdminAPI + delete: + summary: Remove a Replication Site + operationId: SiteReplicationRemove + parameters: + - name: body + in: body + required: true + schema: + $ref: "#/definitions/peerInfoRemove" + responses: + 204: + description: A successful response. + schema: + $ref: "#/definitions/peerSiteRemoveResponse" + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - AdminAPI + + /admin/tiers: get: summary: Returns a list of tiers for ilm @@ -3744,6 +3821,90 @@ definitions: type: array items: $ref: "#/definitions/notificationEndpointItem" + + peerSiteRemoveResponse: + type: object + properties: + status: + type : string + errorDetail: + type : string + + peerSiteEditResponse: + type: object + properties: + success: + type: boolean + status: + type: string + errorDetail: + type: string + + peerSite: + type: object + properties: + name: + type : string + endpoint: + type : string + accessKey: + type: string + secretKey: + type: string + + peerInfo: + type: object + properties: + endpoint: + type : string + name: + type: string + deploymentID: + type: string + + peerInfoRemove: + type: object + required: + - sites + properties: + all: + type: boolean + sites: + type : array + items: + type: string + + siteReplicationAddRequest: + type: array + items: + $ref: "#/definitions/peerSite" + + siteReplicationAddResponse: + type: object + properties: + success: + type: boolean + status: + type: string + errorDetail: + type: string + initialSyncErrorMessage: + type: string + + siteReplicationInfoResponse: + type: object + properties: + enabled: + type: boolean + name: + type: string + sites : + type: array + items: + $ref: "#/definitions/peerInfo" + serviceAccountAccessKey: + type: string + updateUser: type: object required: