2016-08-21 21:06:53 +02:00
|
|
|
/*
|
|
|
|
* Minio Cloud Storage, (C) 2016 Minio, Inc.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2016-10-10 08:03:10 +02:00
|
|
|
"fmt"
|
2016-08-21 21:06:53 +02:00
|
|
|
"net/rpc"
|
2016-10-10 08:03:10 +02:00
|
|
|
"path"
|
|
|
|
"strings"
|
2016-10-07 20:15:55 +02:00
|
|
|
"time"
|
2016-08-21 21:06:53 +02:00
|
|
|
|
|
|
|
router "github.com/gorilla/mux"
|
2016-10-10 08:03:10 +02:00
|
|
|
"github.com/minio/minio-go/pkg/set"
|
2016-08-21 21:06:53 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// Routes paths for "minio control" commands.
|
|
|
|
const (
|
|
|
|
controlPath = "/controller"
|
|
|
|
)
|
|
|
|
|
2016-10-10 08:03:10 +02:00
|
|
|
// Initializes remote controller clients for making remote requests.
|
|
|
|
func initRemoteControllerClients(srvCmdConfig serverCmdConfig) []*AuthRPCClient {
|
|
|
|
if !srvCmdConfig.isDistXL {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
var newExports []string
|
|
|
|
// Initialize auth rpc clients.
|
|
|
|
exports := srvCmdConfig.disks
|
|
|
|
ignoredExports := srvCmdConfig.ignoredDisks
|
|
|
|
remoteHosts := set.NewStringSet()
|
|
|
|
|
|
|
|
// Initialize ignored disks in a new set.
|
|
|
|
ignoredSet := set.NewStringSet()
|
|
|
|
if len(ignoredExports) > 0 {
|
|
|
|
ignoredSet = set.CreateStringSet(ignoredExports...)
|
|
|
|
}
|
|
|
|
var authRPCClients []*AuthRPCClient
|
|
|
|
for _, export := range exports {
|
|
|
|
if ignoredSet.Contains(export) {
|
|
|
|
// Ignore initializing ignored export.
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// Validates if remote disk is local.
|
|
|
|
if isLocalStorage(export) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
newExports = append(newExports, export)
|
|
|
|
}
|
|
|
|
for _, export := range newExports {
|
|
|
|
var host string
|
|
|
|
if idx := strings.LastIndex(export, ":"); idx != -1 {
|
|
|
|
host = export[:idx]
|
|
|
|
}
|
|
|
|
remoteHosts.Add(fmt.Sprintf("%s:%d", host, globalMinioPort))
|
|
|
|
}
|
|
|
|
for host := range remoteHosts {
|
|
|
|
authRPCClients = append(authRPCClients, newAuthClient(&authConfig{
|
|
|
|
accessKey: serverConfig.GetCredential().AccessKeyID,
|
|
|
|
secretKey: serverConfig.GetCredential().SecretAccessKey,
|
|
|
|
secureConn: isSSL(),
|
|
|
|
address: host,
|
|
|
|
path: path.Join(reservedBucket, controlPath),
|
|
|
|
loginMethod: "Controller.LoginHandler",
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
return authRPCClients
|
|
|
|
}
|
|
|
|
|
2016-08-24 19:14:14 +02:00
|
|
|
// Register controller RPC handlers.
|
2016-10-05 21:48:07 +02:00
|
|
|
func registerControllerRPCRouter(mux *router.Router, srvCmdConfig serverCmdConfig) {
|
2016-10-10 08:03:10 +02:00
|
|
|
// Initialize controller.
|
2016-10-05 21:48:07 +02:00
|
|
|
ctrlHandlers := &controllerAPIHandlers{
|
|
|
|
ObjectAPI: newObjectLayerFn,
|
|
|
|
StorageDisks: srvCmdConfig.storageDisks,
|
2016-10-07 20:15:55 +02:00
|
|
|
timestamp: time.Now().UTC(),
|
2016-10-05 21:48:07 +02:00
|
|
|
}
|
|
|
|
|
2016-10-10 08:03:10 +02:00
|
|
|
// Initializes remote controller clients.
|
|
|
|
ctrlHandlers.RemoteControllers = initRemoteControllerClients(srvCmdConfig)
|
|
|
|
|
2016-08-21 21:06:53 +02:00
|
|
|
ctrlRPCServer := rpc.NewServer()
|
2016-08-24 19:14:14 +02:00
|
|
|
ctrlRPCServer.RegisterName("Controller", ctrlHandlers)
|
2016-08-21 21:06:53 +02:00
|
|
|
|
|
|
|
ctrlRouter := mux.NewRoute().PathPrefix(reservedBucket).Subrouter()
|
|
|
|
ctrlRouter.Path(controlPath).Handler(ctrlRPCServer)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handler for object healing.
|
|
|
|
type controllerAPIHandlers struct {
|
2016-10-10 08:03:10 +02:00
|
|
|
ObjectAPI func() ObjectLayer
|
|
|
|
StorageDisks []StorageAPI
|
|
|
|
RemoteControllers []*AuthRPCClient
|
|
|
|
timestamp time.Time
|
2016-08-21 21:06:53 +02:00
|
|
|
}
|