2018-07-10 10:01:09 +00:00
|
|
|
//
|
|
|
|
// DISCLAIMER
|
|
|
|
//
|
2022-01-10 11:35:49 +00:00
|
|
|
// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany
|
2018-07-10 10:01:09 +00:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
//
|
|
|
|
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
|
|
|
//
|
|
|
|
|
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
// DeploymentReplication is the API implemented by an ArangoDeploymentReplication.
|
|
|
|
type DeploymentReplication interface {
|
|
|
|
Name() string
|
|
|
|
Namespace() string
|
|
|
|
StateColor() StateColor
|
2018-07-10 12:44:18 +00:00
|
|
|
Source() Endpoint
|
|
|
|
Destination() Endpoint
|
2018-07-10 10:01:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeploymentReplicationOperator is the API implemented by the deployment operator.
|
|
|
|
type DeploymentReplicationOperator interface {
|
|
|
|
// GetDeploymentReplications returns basic information for all deployment replications managed by the operator
|
|
|
|
GetDeploymentReplications() ([]DeploymentReplication, error)
|
|
|
|
// GetDeploymentReplication returns detailed information for a deployment replication, managed by the operator, with given name
|
|
|
|
GetDeploymentReplication(name string) (DeploymentReplication, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeploymentReplicationInfo is the information returned per deployment replication.
|
|
|
|
type DeploymentReplicationInfo struct {
|
2018-07-10 12:44:18 +00:00
|
|
|
Name string `json:"name"`
|
|
|
|
Namespace string `json:"namespace"`
|
|
|
|
StateColor StateColor `json:"state_color"`
|
|
|
|
Source EndpointInfo `json:"source"`
|
|
|
|
Destination EndpointInfo `json:"destination"`
|
2018-07-10 10:01:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// newDeploymentReplicationInfo initializes a DeploymentReplicationInfo for the given deployment replication.
|
|
|
|
func newDeploymentReplicationInfo(dr DeploymentReplication) DeploymentReplicationInfo {
|
|
|
|
return DeploymentReplicationInfo{
|
2018-07-10 12:44:18 +00:00
|
|
|
Name: dr.Name(),
|
|
|
|
Namespace: dr.Namespace(),
|
|
|
|
StateColor: dr.StateColor(),
|
|
|
|
Source: newEndpointInfo(dr.Source()),
|
|
|
|
Destination: newEndpointInfo(dr.Destination()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Endpoint is the API implemented by source&destination of the replication
|
|
|
|
type Endpoint interface {
|
|
|
|
DeploymentName() string
|
|
|
|
MasterEndpoint() []string
|
|
|
|
AuthKeyfileSecretName() string
|
|
|
|
AuthUserSecretName() string
|
|
|
|
TLSCACert() string
|
|
|
|
TLSCACertSecretName() string
|
|
|
|
}
|
|
|
|
|
|
|
|
// EndpointInfo is the information returned per source/destination endpoint of the replication.
|
|
|
|
type EndpointInfo struct {
|
|
|
|
DeploymentName string `json:"deployment_name"`
|
|
|
|
MasterEndpoint []string `json:"master_endpoint"`
|
|
|
|
AuthKeyfileSecretName string `json:"auth_keyfile_secret_name"`
|
|
|
|
AuthUserSecretName string `json:"auth_user_secret_name"`
|
|
|
|
TLSCACert string `json:"tls_ca_cert"`
|
|
|
|
TLSCACertSecretName string `json:"tls_ca_cert_secret_name"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// newEndpointInfo initializes an EndpointInfo for the given Endpoint.
|
|
|
|
func newEndpointInfo(ep Endpoint) EndpointInfo {
|
|
|
|
return EndpointInfo{
|
|
|
|
DeploymentName: ep.DeploymentName(),
|
|
|
|
MasterEndpoint: ep.MasterEndpoint(),
|
|
|
|
AuthKeyfileSecretName: ep.AuthKeyfileSecretName(),
|
|
|
|
AuthUserSecretName: ep.AuthUserSecretName(),
|
|
|
|
TLSCACert: ep.TLSCACert(),
|
|
|
|
TLSCACertSecretName: ep.TLSCACertSecretName(),
|
2018-07-10 10:01:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeploymentReplicationInfoDetails is the detailed information returned per deployment replication.
|
|
|
|
type DeploymentReplicationInfoDetails struct {
|
|
|
|
DeploymentReplicationInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
// newDeploymentReplicationInfoDetails initializes a DeploymentReplicationInfoDetails for the given deployment replication.
|
|
|
|
func newDeploymentReplicationInfoDetails(dr DeploymentReplication) DeploymentReplicationInfoDetails {
|
|
|
|
result := DeploymentReplicationInfoDetails{
|
|
|
|
DeploymentReplicationInfo: newDeploymentReplicationInfo(dr),
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle a GET /api/deployment-replication request
|
|
|
|
func (s *Server) handleGetDeploymentReplications(c *gin.Context) {
|
|
|
|
if do := s.deps.Operators.DeploymentReplicationOperator(); do != nil {
|
|
|
|
// Fetch deployment replications
|
|
|
|
repls, err := do.GetDeploymentReplications()
|
|
|
|
if err != nil {
|
|
|
|
sendError(c, err)
|
|
|
|
} else {
|
|
|
|
result := make([]DeploymentReplicationInfo, len(repls))
|
|
|
|
for i, dr := range repls {
|
|
|
|
result[i] = newDeploymentReplicationInfo(dr)
|
|
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
|
|
"replications": result,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle a GET /api/deployment-replication/:name request
|
|
|
|
func (s *Server) handleGetDeploymentReplicationDetails(c *gin.Context) {
|
|
|
|
if do := s.deps.Operators.DeploymentReplicationOperator(); do != nil {
|
|
|
|
// Fetch deployments
|
|
|
|
dr, err := do.GetDeploymentReplication(c.Params.ByName("name"))
|
|
|
|
if err != nil {
|
|
|
|
sendError(c, err)
|
|
|
|
} else {
|
|
|
|
result := newDeploymentReplicationInfoDetails(dr)
|
|
|
|
c.JSON(http.StatusOK, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|