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: