From 14e6c5ec08ee30f0404facf7297005b089a9b458 Mon Sep 17 00:00:00 2001 From: Krishna Srinivas Date: Wed, 29 Nov 2017 13:12:47 -0800 Subject: [PATCH] Simplify the steps to make changes to config.json (#5186) This change introduces following simplified steps to follow during config migration. ``` // Steps to move from version N to version N+1 // 1. Add new struct serverConfigVN+1 in config-versions.go // 2. Set configCurrentVersion to "N+1" // 3. Set serverConfigCurrent to serverConfigVN+1 // 4. Add new migration function (ex. func migrateVNToVN+1()) in config-migrate.go // 5. Call migrateVNToVN+1() from migrateConfig() in config-migrate.go // 6. Make changes in config-current_test.go for any test change ``` --- cmd/admin-handlers.go | 10 +- cmd/admin-handlers_test.go | 18 ++-- cmd/admin-rpc-client.go | 8 +- cmd/admin-rpc-server.go | 6 +- cmd/admin-rpc-server_test.go | 8 +- cmd/api-headers.go | 2 +- cmd/auth-handler_test.go | 8 +- cmd/auth-rpc-server_test.go | 2 +- cmd/browser-peer-rpc.go | 8 +- cmd/bucket-handlers-listobjects.go | 4 +- cmd/bucket-handlers.go | 16 ++-- cmd/bucket-notification-datatypes.go | 2 +- cmd/bucket-notification-handlers.go | 8 +- cmd/bucket-notification-utils.go | 22 ++--- cmd/bucket-policy-handlers.go | 6 +- cmd/common-main.go | 6 +- cmd/{config-v20.go => config-current.go} | 91 +++++++++---------- ...fig-v20_test.go => config-current_test.go} | 72 +++++++-------- cmd/config-migrate.go | 2 +- cmd/config-migrate_test.go | 14 +-- cmd/{config-old.go => config-versions.go} | 19 ++++ cmd/event-notifier.go | 24 ++--- cmd/event-notifier_test.go | 16 ++-- cmd/gateway-azure.go | 2 +- cmd/gateway-b2.go | 2 +- cmd/gateway-handlers.go | 26 +++--- cmd/gateway-s3.go | 2 +- cmd/gateway-startup-msg.go | 2 +- cmd/handler-utils.go | 4 +- cmd/handler-utils_test.go | 2 +- cmd/jwt.go | 8 +- cmd/jwt_test.go | 8 +- cmd/lock-rpc-server.go | 2 +- cmd/lock-rpc-server_test.go | 2 +- cmd/namespace-lock.go | 2 +- cmd/notifiers.go | 18 ++-- cmd/notify-amqp.go | 2 +- cmd/notify-elasticsearch.go | 2 +- cmd/notify-kafka.go | 2 +- cmd/notify-mqtt.go | 2 +- cmd/notify-mysql.go | 2 +- cmd/notify-nats.go | 2 +- cmd/notify-postgresql.go | 2 +- cmd/notify-redis.go | 2 +- cmd/notify-webhook.go | 2 +- cmd/notify-webhook_test.go | 6 +- cmd/object-handlers.go | 22 ++--- cmd/post-policy_test.go | 4 +- cmd/s3-peer-client.go | 2 +- cmd/server-startup-msg.go | 6 +- cmd/signature-v2.go | 10 +- cmd/signature-v2_test.go | 8 +- cmd/signature-v4.go | 8 +- cmd/signature-v4_test.go | 8 +- cmd/storage-rpc-client.go | 2 +- cmd/storage-rpc-server_test.go | 2 +- cmd/streaming-signature-v4.go | 6 +- cmd/test-utils_test.go | 28 +++--- cmd/web-handlers.go | 16 ++-- cmd/web-handlers_test.go | 40 ++++---- 60 files changed, 324 insertions(+), 314 deletions(-) rename cmd/{config-v20.go => config-current.go} (79%) rename cmd/{config-v20_test.go => config-current_test.go} (85%) rename cmd/{config-old.go => config-versions.go} (96%) diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index 27b7a8a06..cc25a7cc4 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -183,12 +183,12 @@ func (adminAPI adminAPIHandlers) ServiceCredentialsHandler(w http.ResponseWriter } // Update local credentials in memory. - prevCred := serverConfig.SetCredential(creds) + prevCred := globalServerConfig.SetCredential(creds) // Save credentials to config file - if err = serverConfig.Save(); err != nil { + if err = globalServerConfig.Save(); err != nil { // Save the current creds when failed to update. - serverConfig.SetCredential(prevCred) + globalServerConfig.SetCredential(prevCred) errorIf(err, "Unable to update the config with new credentials.") writeErrorResponse(w, ErrInternalError, r.URL) @@ -985,7 +985,7 @@ func (adminAPI adminAPIHandlers) SetConfigHandler(w http.ResponseWriter, r *http return } - var config serverConfigV20 + var config serverConfig err = json.Unmarshal(configBytes, &config) if err != nil { @@ -995,7 +995,7 @@ func (adminAPI adminAPIHandlers) SetConfigHandler(w http.ResponseWriter, r *http } if globalIsEnvCreds { - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() if config.Credential.AccessKey != creds.AccessKey || config.Credential.SecretKey != creds.SecretKey { writeErrorResponse(w, ErrAdminCredentialsMismatch, r.URL) diff --git a/cmd/admin-handlers_test.go b/cmd/admin-handlers_test.go index ea87551ce..35a544033 100644 --- a/cmd/admin-handlers_test.go +++ b/cmd/admin-handlers_test.go @@ -307,7 +307,7 @@ func testServicesCmdHandler(cmd cmdType, t *testing.T) { if cmd == restartCmd { go testServiceSignalReceiver(cmd, t) } - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() var body []byte req, err := getServiceCmdRequest(cmd, credentials, body) @@ -362,7 +362,7 @@ func TestServiceSetCreds(t *testing.T) { globalMinioAddr = "127.0.0.1:9000" initGlobalAdminPeers(mustGetNewEndpointList("http://127.0.0.1:9000/d1")) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() var body []byte testCases := []struct { @@ -411,7 +411,7 @@ func TestServiceSetCreds(t *testing.T) { // If we got 200 OK, check if new credentials are really set if rec.Code == http.StatusOK { - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() if cred.AccessKey != testCase.Username { t.Errorf("Test %d: Wrong access key, expected = %s, found = %s", i+1, testCase.Username, cred.AccessKey) } @@ -488,7 +488,7 @@ func TestListLocksHandler(t *testing.T) { } req.Header.Set(minioAdminOpHeader, "list") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { t.Fatalf("Test %d - Failed to sign list locks request - %v", i+1, err) @@ -556,7 +556,7 @@ func TestClearLocksHandler(t *testing.T) { } req.Header.Set(minioAdminOpHeader, "clear") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { t.Fatalf("Test %d - Failed to sign clear locks request - %v", i+1, err) @@ -841,7 +841,7 @@ func TestListObjectsHealHandler(t *testing.T) { } req.Header.Set(minioAdminOpHeader, "list-objects") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { t.Fatalf("Test %d - Failed to sign list objects needing heal request - %v", i+1, err) @@ -912,7 +912,7 @@ func TestHealBucketHandler(t *testing.T) { req.Header.Set(minioAdminOpHeader, "bucket") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { t.Fatalf("Test %d - Failed to sign heal bucket request - %v", @@ -1015,7 +1015,7 @@ func TestHealObjectHandler(t *testing.T) { req.Header.Set(minioAdminOpHeader, "object") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { t.Fatalf("Test %d - Failed to sign heal object request - %v", i+1, err) @@ -1039,7 +1039,7 @@ func buildAdminRequest(queryVal url.Values, opHdr, method string, req.Header.Set(minioAdminOpHeader, opHdr) - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() err = signRequestV4(req, cred.AccessKey, cred.SecretKey) if err != nil { return nil, errors.Trace(err) diff --git a/cmd/admin-rpc-client.go b/cmd/admin-rpc-client.go index 57af8e032..6d22b85a0 100644 --- a/cmd/admin-rpc-client.go +++ b/cmd/admin-rpc-client.go @@ -139,7 +139,7 @@ func (lc localAdminClient) ServerInfoData() (sid ServerInfoData, e error) { Version: Version, CommitID: CommitID, SQSARN: arns, - Region: serverConfig.GetRegion(), + Region: globalServerConfig.GetRegion(), }, }, nil } @@ -158,11 +158,11 @@ func (rc remoteAdminClient) ServerInfoData() (sid ServerInfoData, e error) { // GetConfig - returns config.json of the local server. func (lc localAdminClient) GetConfig() ([]byte, error) { - if serverConfig == nil { + if globalServerConfig == nil { return nil, fmt.Errorf("config not present") } - return json.Marshal(serverConfig) + return json.Marshal(globalServerConfig) } // GetConfig - returns config.json of the remote server. @@ -246,7 +246,7 @@ func makeAdminPeers(endpoints EndpointList) (adminPeerList adminPeers) { }) hostSet := set.CreateStringSet(globalMinioAddr) - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() serviceEndpoint := path.Join(minioReservedBucketPath, adminPath) for _, host := range GetRemotePeers(endpoints) { if hostSet.Contains(host) { diff --git a/cmd/admin-rpc-server.go b/cmd/admin-rpc-server.go index 1204b936f..d3838d8b6 100644 --- a/cmd/admin-rpc-server.go +++ b/cmd/admin-rpc-server.go @@ -148,7 +148,7 @@ func (s *adminCmd) ServerInfoData(args *AuthRPCArgs, reply *ServerInfoDataReply) Uptime: UTCNow().Sub(globalBootTime), Version: Version, CommitID: CommitID, - Region: serverConfig.GetRegion(), + Region: globalServerConfig.GetRegion(), SQSARN: arns, }, StorageInfo: storageInfo, @@ -165,11 +165,11 @@ func (s *adminCmd) GetConfig(args *AuthRPCArgs, reply *ConfigReply) error { return err } - if serverConfig == nil { + if globalServerConfig == nil { return fmt.Errorf("config not present") } - jsonBytes, err := json.Marshal(serverConfig) + jsonBytes, err := json.Marshal(globalServerConfig) if err != nil { return err } diff --git a/cmd/admin-rpc-server_test.go b/cmd/admin-rpc-server_test.go index 36c46398d..16747dc98 100644 --- a/cmd/admin-rpc-server_test.go +++ b/cmd/admin-rpc-server_test.go @@ -33,7 +33,7 @@ func testAdminCmd(cmd cmdType, t *testing.T) { } defer os.RemoveAll(rootPath) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatal(err) @@ -95,7 +95,7 @@ func TestReInitDisks(t *testing.T) { globalIsXL = true adminServer := adminCmd{} - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatal(err) @@ -163,7 +163,7 @@ func TestGetConfig(t *testing.T) { defer os.RemoveAll(rootPath) adminServer := adminCmd{} - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { @@ -212,7 +212,7 @@ func TestWriteAndCommitConfig(t *testing.T) { defer os.RemoveAll(rootPath) adminServer := adminCmd{} - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatal(err) diff --git a/cmd/api-headers.go b/cmd/api-headers.go index 2a0517bcf..8d1889d9a 100644 --- a/cmd/api-headers.go +++ b/cmd/api-headers.go @@ -38,7 +38,7 @@ func setCommonHeaders(w http.ResponseWriter) { w.Header().Set("Server", globalServerUserAgent) // Set `x-amz-bucket-region` only if region is set on the server // by default minio uses an empty region. - if region := serverConfig.GetRegion(); region != "" { + if region := globalServerConfig.GetRegion(); region != "" { w.Header().Set("X-Amz-Bucket-Region", region) } w.Header().Set("Accept-Ranges", "bytes") diff --git a/cmd/auth-handler_test.go b/cmd/auth-handler_test.go index c378d2154..d9d7babfb 100644 --- a/cmd/auth-handler_test.go +++ b/cmd/auth-handler_test.go @@ -304,7 +304,7 @@ func mustNewRequest(method string, urlStr string, contentLength int64, body io.R // is signed with AWS Signature V4, fails if not able to do so. func mustNewSignedRequest(method string, urlStr string, contentLength int64, body io.ReadSeeker, t *testing.T) *http.Request { req := mustNewRequest(method, urlStr, contentLength, body, t) - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() if err := signRequestV4(req, cred.AccessKey, cred.SecretKey); err != nil { t.Fatalf("Unable to inititalized new signed http request %s", err) } @@ -314,7 +314,7 @@ func mustNewSignedRequest(method string, urlStr string, contentLength int64, bod func mustNewSignedBadMD5Request(method string, urlStr string, contentLength int64, body io.ReadSeeker, t *testing.T) *http.Request { req := mustNewRequest(method, urlStr, contentLength, body, t) req.Header.Set("Content-Md5", "YWFhYWFhYWFhYWFhYWFhCg==") - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() if err := signRequestV4(req, cred.AccessKey, cred.SecretKey); err != nil { t.Fatalf("Unable to initialized new signed http request %s", err) } @@ -334,7 +334,7 @@ func TestIsReqAuthenticated(t *testing.T) { t.Fatalf("unable create credential, %s", err) } - serverConfig.SetCredential(creds) + globalServerConfig.SetCredential(creds) // List of test cases for validating http request authentication. testCases := []struct { @@ -353,7 +353,7 @@ func TestIsReqAuthenticated(t *testing.T) { // Validates all testcases. for _, testCase := range testCases { - if s3Error := isReqAuthenticated(testCase.req, serverConfig.GetRegion()); s3Error != testCase.s3Error { + if s3Error := isReqAuthenticated(testCase.req, globalServerConfig.GetRegion()); s3Error != testCase.s3Error { t.Fatalf("Unexpected s3error returned wanted %d, got %d", testCase.s3Error, s3Error) } } diff --git a/cmd/auth-rpc-server_test.go b/cmd/auth-rpc-server_test.go index fbd853952..1627d2d75 100644 --- a/cmd/auth-rpc-server_test.go +++ b/cmd/auth-rpc-server_test.go @@ -28,7 +28,7 @@ func TestLogin(t *testing.T) { t.Fatalf("Failed to create test config - %v", err) } defer os.RemoveAll(rootPath) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatal(err) diff --git a/cmd/browser-peer-rpc.go b/cmd/browser-peer-rpc.go index daace2eff..0000e6539 100644 --- a/cmd/browser-peer-rpc.go +++ b/cmd/browser-peer-rpc.go @@ -51,12 +51,12 @@ func (br *browserPeerAPIHandlers) SetAuthPeer(args SetAuthPeerArgs, reply *AuthR } // Update credentials in memory - prevCred := serverConfig.SetCredential(args.Creds) + prevCred := globalServerConfig.SetCredential(args.Creds) // Save credentials to config file - if err := serverConfig.Save(); err != nil { + if err := globalServerConfig.Save(); err != nil { // Save the current creds when failed to update. - serverConfig.SetCredential(prevCred) + globalServerConfig.SetCredential(prevCred) errorIf(err, "Unable to update the config with new credentials sent from browser RPC.") return err @@ -77,7 +77,7 @@ func updateCredsOnPeers(creds auth.Credentials) map[string]error { errs := make([]error, len(peers)) var wg sync.WaitGroup - serverCred := serverConfig.GetCredential() + serverCred := globalServerConfig.GetCredential() // Launch go routines to send request to each peer in parallel. for ix := range peers { wg.Add(1) diff --git a/cmd/bucket-handlers-listobjects.go b/cmd/bucket-handlers-listobjects.go index 6389d3034..ea1b98b24 100644 --- a/cmd/bucket-handlers-listobjects.go +++ b/cmd/bucket-handlers-listobjects.go @@ -89,7 +89,7 @@ func (api objectAPIHandlers) ListObjectsV2Handler(w http.ResponseWriter, r *http return } - if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -142,7 +142,7 @@ func (api objectAPIHandlers) ListObjectsV1Handler(w http.ResponseWriter, r *http return } - if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } diff --git a/cmd/bucket-handlers.go b/cmd/bucket-handlers.go index 5ccc0aa4b..c6799084f 100644 --- a/cmd/bucket-handlers.go +++ b/cmd/bucket-handlers.go @@ -120,7 +120,7 @@ func (api objectAPIHandlers) GetBucketLocationHandler(w http.ResponseWriter, r * s3Error := checkRequestAuthType(r, bucket, "s3:GetBucketLocation", globalMinioDefaultRegion) if s3Error == ErrInvalidRegion { // Clients like boto3 send getBucketLocation() call signed with region that is configured. - s3Error = checkRequestAuthType(r, "", "s3:GetBucketLocation", serverConfig.GetRegion()) + s3Error = checkRequestAuthType(r, "", "s3:GetBucketLocation", globalServerConfig.GetRegion()) } if s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) @@ -136,7 +136,7 @@ func (api objectAPIHandlers) GetBucketLocationHandler(w http.ResponseWriter, r * // Generate response. encodedSuccessResponse := encodeResponse(LocationResponse{}) // Get current region. - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() if region != globalMinioDefaultRegion { encodedSuccessResponse = encodeResponse(LocationResponse{ Location: region, @@ -165,7 +165,7 @@ func (api objectAPIHandlers) ListMultipartUploadsHandler(w http.ResponseWriter, return } - if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucketMultipartUploads", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucketMultipartUploads", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -212,7 +212,7 @@ func (api objectAPIHandlers) ListBucketsHandler(w http.ResponseWriter, r *http.R s3Error := checkRequestAuthType(r, "", "", globalMinioDefaultRegion) if s3Error == ErrInvalidRegion { // Clients like boto3 send listBuckets() call signed with region that is configured. - s3Error = checkRequestAuthType(r, "", "", serverConfig.GetRegion()) + s3Error = checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()) } if s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) @@ -246,7 +246,7 @@ func (api objectAPIHandlers) DeleteMultipleObjectsHandler(w http.ResponseWriter, } var authError APIErrorCode - if authError = checkRequestAuthType(r, bucket, "s3:DeleteObject", serverConfig.GetRegion()); authError != ErrNone { + if authError = checkRequestAuthType(r, bucket, "s3:DeleteObject", globalServerConfig.GetRegion()); authError != ErrNone { // In the event access is denied, a 200 response should still be returned // http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html if authError != ErrAccessDenied { @@ -385,7 +385,7 @@ func (api objectAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Req } // PutBucket does not have any bucket action. - s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()) + s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()) if s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return @@ -649,7 +649,7 @@ func (api objectAPIHandlers) HeadBucketHandler(w http.ResponseWriter, r *http.Re return } - if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:ListBucket", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponseHeadersOnly(w, s3Error) return } @@ -679,7 +679,7 @@ func (api objectAPIHandlers) DeleteBucketHandler(w http.ResponseWriter, r *http. } // DeleteBucket does not have any bucket action. - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } diff --git a/cmd/bucket-notification-datatypes.go b/cmd/bucket-notification-datatypes.go index 547e838c5..4529bc437 100644 --- a/cmd/bucket-notification-datatypes.go +++ b/cmd/bucket-notification-datatypes.go @@ -209,5 +209,5 @@ type arnSQS struct { // Stringer for constructing AWS ARN compatible string. func (m arnSQS) String() string { - return minioSqs + serverConfig.GetRegion() + ":" + m.AccountID + ":" + m.Type + return minioSqs + globalServerConfig.GetRegion() + ":" + m.AccountID + ":" + m.Type } diff --git a/cmd/bucket-notification-handlers.go b/cmd/bucket-notification-handlers.go index a7d9f88d6..6d47c4fac 100644 --- a/cmd/bucket-notification-handlers.go +++ b/cmd/bucket-notification-handlers.go @@ -49,7 +49,7 @@ func (api objectAPIHandlers) GetBucketNotificationHandler(w http.ResponseWriter, return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -103,7 +103,7 @@ func (api objectAPIHandlers) PutBucketNotificationHandler(w http.ResponseWriter, return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -297,7 +297,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -338,7 +338,7 @@ func (api objectAPIHandlers) ListenBucketNotificationHandler(w http.ResponseWrit accountARN := fmt.Sprintf( "%s:%s:%s:%s-%s", minioTopic, - serverConfig.GetRegion(), + globalServerConfig.GetRegion(), accountID, snsTypeMinio, targetServer, diff --git a/cmd/bucket-notification-utils.go b/cmd/bucket-notification-utils.go index 020807e3a..005c7823a 100644 --- a/cmd/bucket-notification-utils.go +++ b/cmd/bucket-notification-utils.go @@ -120,7 +120,7 @@ func checkARN(arn, arnType string) APIErrorCode { // Server region is allowed to be empty by default, // in such a scenario ARN region is not validating // allowing all regions. - if sregion := serverConfig.GetRegion(); sregion != "" { + if sregion := globalServerConfig.GetRegion(); sregion != "" { region := strs[3] if region != sregion { return ErrRegionNotification @@ -146,34 +146,34 @@ func isValidQueueID(queueARN string) bool { // Is Queue identifier valid?. if isAMQPQueue(sqsARN) { // AMQP eueue. - amqpN := serverConfig.Notify.GetAMQPByID(sqsARN.AccountID) + amqpN := globalServerConfig.Notify.GetAMQPByID(sqsARN.AccountID) return amqpN.Enable && amqpN.URL != "" } else if isMQTTQueue(sqsARN) { - mqttN := serverConfig.Notify.GetMQTTByID(sqsARN.AccountID) + mqttN := globalServerConfig.Notify.GetMQTTByID(sqsARN.AccountID) return mqttN.Enable && mqttN.Broker != "" } else if isNATSQueue(sqsARN) { - natsN := serverConfig.Notify.GetNATSByID(sqsARN.AccountID) + natsN := globalServerConfig.Notify.GetNATSByID(sqsARN.AccountID) return natsN.Enable && natsN.Address != "" } else if isElasticQueue(sqsARN) { // Elastic queue. - elasticN := serverConfig.Notify.GetElasticSearchByID(sqsARN.AccountID) + elasticN := globalServerConfig.Notify.GetElasticSearchByID(sqsARN.AccountID) return elasticN.Enable && elasticN.URL != "" } else if isRedisQueue(sqsARN) { // Redis queue. - redisN := serverConfig.Notify.GetRedisByID(sqsARN.AccountID) + redisN := globalServerConfig.Notify.GetRedisByID(sqsARN.AccountID) return redisN.Enable && redisN.Addr != "" } else if isPostgreSQLQueue(sqsARN) { - pgN := serverConfig.Notify.GetPostgreSQLByID(sqsARN.AccountID) + pgN := globalServerConfig.Notify.GetPostgreSQLByID(sqsARN.AccountID) // Postgres can work with only default conn. info. return pgN.Enable } else if isMySQLQueue(sqsARN) { - msqlN := serverConfig.Notify.GetMySQLByID(sqsARN.AccountID) + msqlN := globalServerConfig.Notify.GetMySQLByID(sqsARN.AccountID) // Mysql can work with only default conn. info. return msqlN.Enable } else if isKafkaQueue(sqsARN) { - kafkaN := serverConfig.Notify.GetKafkaByID(sqsARN.AccountID) + kafkaN := globalServerConfig.Notify.GetKafkaByID(sqsARN.AccountID) return (kafkaN.Enable && len(kafkaN.Brokers) > 0 && kafkaN.Topic != "") } else if isWebhookQueue(sqsARN) { - webhookN := serverConfig.Notify.GetWebhookByID(sqsARN.AccountID) + webhookN := globalServerConfig.Notify.GetWebhookByID(sqsARN.AccountID) return webhookN.Enable && webhookN.Endpoint != "" } return false @@ -281,7 +281,7 @@ func unmarshalSqsARN(queueARN string) (mSqs arnSQS) { // Server region is allowed to be empty by default, // in such a scenario ARN region is not validating // allowing all regions. - if sregion := serverConfig.GetRegion(); sregion != "" { + if sregion := globalServerConfig.GetRegion(); sregion != "" { region := strs[3] if region != sregion { return diff --git a/cmd/bucket-policy-handlers.go b/cmd/bucket-policy-handlers.go index b731320c4..c5033a39a 100644 --- a/cmd/bucket-policy-handlers.go +++ b/cmd/bucket-policy-handlers.go @@ -225,7 +225,7 @@ func (api objectAPIHandlers) PutBucketPolicyHandler(w http.ResponseWriter, r *ht return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -284,7 +284,7 @@ func (api objectAPIHandlers) DeleteBucketPolicyHandler(w http.ResponseWriter, r return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -325,7 +325,7 @@ func (api objectAPIHandlers) GetBucketPolicyHandler(w http.ResponseWriter, r *ht return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } diff --git a/cmd/common-main.go b/cmd/common-main.go index 9717da555..1dd2af65a 100644 --- a/cmd/common-main.go +++ b/cmd/common-main.go @@ -38,14 +38,14 @@ func checkUpdate(mode string) { } func enableLoggers() { - fileLogTarget := serverConfig.Logger.GetFile() + fileLogTarget := globalServerConfig.Logger.GetFile() if fileLogTarget.Enable { err := InitFileLogger(&fileLogTarget) fatalIf(err, "Unable to initialize file logger") log.AddTarget(fileLogTarget) } - consoleLogTarget := serverConfig.Logger.GetConsole() + consoleLogTarget := globalServerConfig.Logger.GetConsole() if consoleLogTarget.Enable { InitConsoleLogger(&consoleLogTarget) } @@ -57,7 +57,7 @@ func initConfig() { // Config file does not exist, we create it fresh and return upon success. if isFile(getConfigFile()) { fatalIf(migrateConfig(), "Config migration failed.") - fatalIf(loadConfig(), "Unable to load config version: '%s'.", v20) + fatalIf(loadConfig(), "Unable to load config version: '%s'.", serverConfigVersion) } else { fatalIf(newConfig(), "Unable to initialize minio config for the first time.") log.Println("Created minio configuration file successfully at " + getConfigDir()) diff --git a/cmd/config-v20.go b/cmd/config-current.go similarity index 79% rename from cmd/config-v20.go rename to cmd/config-current.go index c8aaa112a..3dfc90501 100644 --- a/cmd/config-v20.go +++ b/cmd/config-current.go @@ -27,36 +27,27 @@ import ( "github.com/tidwall/gjson" ) +// Steps to move from version N to version N+1 +// 1. Add new struct serverConfigVN+1 in config-versions.go +// 2. Set configCurrentVersion to "N+1" +// 3. Set serverConfigCurrent to serverConfigVN+1 +// 4. Add new migration function (ex. func migrateVNToVN+1()) in config-migrate.go +// 5. Call migrateVNToVN+1() from migrateConfig() in config-migrate.go +// 6. Make changes in config-current_test.go for any test change + // Config version -const v20 = "20" +const serverConfigVersion = "20" + +type serverConfig = serverConfigV20 var ( - // serverConfig server config. - serverConfig *serverConfigV20 - serverConfigMu sync.RWMutex + // globalServerConfig server config. + globalServerConfig *serverConfig + globalServerConfigMu sync.RWMutex ) -// serverConfigV20 server configuration version '20' which is like -// version '19' except it adds support for VirtualHostDomain -type serverConfigV20 struct { - sync.RWMutex - Version string `json:"version"` - - // S3 API configuration. - Credential auth.Credentials `json:"credential"` - Region string `json:"region"` - Browser BrowserFlag `json:"browser"` - Domain string `json:"domain"` - - // Additional error logging configuration. - Logger *loggers `json:"logger"` - - // Notification queue configuration. - Notify *notifier `json:"notify"` -} - // GetVersion get current config version. -func (s *serverConfigV20) GetVersion() string { +func (s *serverConfig) GetVersion() string { s.RLock() defer s.RUnlock() @@ -64,7 +55,7 @@ func (s *serverConfigV20) GetVersion() string { } // SetRegion set a new region. -func (s *serverConfigV20) SetRegion(region string) { +func (s *serverConfig) SetRegion(region string) { s.Lock() defer s.Unlock() @@ -73,7 +64,7 @@ func (s *serverConfigV20) SetRegion(region string) { } // GetRegion get current region. -func (s *serverConfigV20) GetRegion() string { +func (s *serverConfig) GetRegion() string { s.RLock() defer s.RUnlock() @@ -81,7 +72,7 @@ func (s *serverConfigV20) GetRegion() string { } // SetCredentials set new credentials. SetCredential returns the previous credential. -func (s *serverConfigV20) SetCredential(creds auth.Credentials) (prevCred auth.Credentials) { +func (s *serverConfig) SetCredential(creds auth.Credentials) (prevCred auth.Credentials) { s.Lock() defer s.Unlock() @@ -96,7 +87,7 @@ func (s *serverConfigV20) SetCredential(creds auth.Credentials) (prevCred auth.C } // GetCredentials get current credentials. -func (s *serverConfigV20) GetCredential() auth.Credentials { +func (s *serverConfig) GetCredential() auth.Credentials { s.RLock() defer s.RUnlock() @@ -104,7 +95,7 @@ func (s *serverConfigV20) GetCredential() auth.Credentials { } // SetBrowser set if browser is enabled. -func (s *serverConfigV20) SetBrowser(b bool) { +func (s *serverConfig) SetBrowser(b bool) { s.Lock() defer s.Unlock() @@ -113,7 +104,7 @@ func (s *serverConfigV20) SetBrowser(b bool) { } // GetCredentials get current credentials. -func (s *serverConfigV20) GetBrowser() bool { +func (s *serverConfig) GetBrowser() bool { s.RLock() defer s.RUnlock() @@ -121,7 +112,7 @@ func (s *serverConfigV20) GetBrowser() bool { } // Save config. -func (s *serverConfigV20) Save() error { +func (s *serverConfig) Save() error { s.RLock() defer s.RUnlock() @@ -129,9 +120,9 @@ func (s *serverConfigV20) Save() error { return quick.Save(getConfigFile(), s) } -func newServerConfigV20() *serverConfigV20 { - srvCfg := &serverConfigV20{ - Version: v20, +func newServerConfig() *serverConfig { + srvCfg := &serverConfig{ + Version: serverConfigVersion, Credential: auth.MustGetNewCredentials(), Region: globalMinioDefaultRegion, Browser: true, @@ -169,7 +160,7 @@ func newServerConfigV20() *serverConfigV20 { // found, otherwise use default parameters func newConfig() error { // Initialize server config. - srvCfg := newServerConfigV20() + srvCfg := newServerConfig() // If env is set override the credentials from config file. if globalIsEnvCreds { @@ -191,12 +182,12 @@ func newConfig() error { // hold the mutex lock before a new config is assigned. // Save the new config globally. // unlock the mutex. - serverConfigMu.Lock() - serverConfig = srvCfg - serverConfigMu.Unlock() + globalServerConfigMu.Lock() + globalServerConfig = srvCfg + globalServerConfigMu.Unlock() // Save config into file. - return serverConfig.Save() + return globalServerConfig.Save() } // doCheckDupJSONKeys recursively detects duplicate json keys @@ -251,8 +242,8 @@ func checkDupJSONKeys(json string) error { } // getValidConfig - returns valid server configuration -func getValidConfig() (*serverConfigV20, error) { - srvCfg := &serverConfigV20{ +func getValidConfig() (*serverConfig, error) { + srvCfg := &serverConfig{ Region: globalMinioDefaultRegion, Browser: true, } @@ -262,8 +253,8 @@ func getValidConfig() (*serverConfigV20, error) { return nil, err } - if srvCfg.Version != v20 { - return nil, fmt.Errorf("configuration version mismatch. Expected: ‘%s’, Got: ‘%s’", v20, srvCfg.Version) + if srvCfg.Version != serverConfigVersion { + return nil, fmt.Errorf("configuration version mismatch. Expected: ‘%s’, Got: ‘%s’", serverConfigVersion, srvCfg.Version) } // Load config file json and check for duplication json keys @@ -322,21 +313,21 @@ func loadConfig() error { } // hold the mutex lock before a new config is assigned. - serverConfigMu.Lock() - serverConfig = srvCfg + globalServerConfigMu.Lock() + globalServerConfig = srvCfg if !globalIsEnvCreds { - globalActiveCred = serverConfig.GetCredential() + globalActiveCred = globalServerConfig.GetCredential() } if !globalIsEnvBrowser { - globalIsBrowserEnabled = serverConfig.GetBrowser() + globalIsBrowserEnabled = globalServerConfig.GetBrowser() } if !globalIsEnvRegion { - globalServerRegion = serverConfig.GetRegion() + globalServerRegion = globalServerConfig.GetRegion() } if !globalIsEnvDomainName { - globalDomainName = serverConfig.Domain + globalDomainName = globalServerConfig.Domain } - serverConfigMu.Unlock() + globalServerConfigMu.Unlock() return nil } diff --git a/cmd/config-v20_test.go b/cmd/config-current_test.go similarity index 85% rename from cmd/config-v20_test.go rename to cmd/config-current_test.go index c0bc1347a..f5a6cd223 100644 --- a/cmd/config-v20_test.go +++ b/cmd/config-current_test.go @@ -34,95 +34,95 @@ func TestServerConfig(t *testing.T) { // remove the root directory after the test ends. defer os.RemoveAll(rootPath) - if serverConfig.GetRegion() != globalMinioDefaultRegion { - t.Errorf("Expecting region `us-east-1` found %s", serverConfig.GetRegion()) + if globalServerConfig.GetRegion() != globalMinioDefaultRegion { + t.Errorf("Expecting region `us-east-1` found %s", globalServerConfig.GetRegion()) } // Set new region and verify. - serverConfig.SetRegion("us-west-1") - if serverConfig.GetRegion() != "us-west-1" { - t.Errorf("Expecting region `us-west-1` found %s", serverConfig.GetRegion()) + globalServerConfig.SetRegion("us-west-1") + if globalServerConfig.GetRegion() != "us-west-1" { + t.Errorf("Expecting region `us-west-1` found %s", globalServerConfig.GetRegion()) } // Set new amqp notification id. - serverConfig.Notify.SetAMQPByID("2", amqpNotify{}) - savedNotifyCfg1 := serverConfig.Notify.GetAMQPByID("2") + globalServerConfig.Notify.SetAMQPByID("2", amqpNotify{}) + savedNotifyCfg1 := globalServerConfig.Notify.GetAMQPByID("2") if !reflect.DeepEqual(savedNotifyCfg1, amqpNotify{}) { t.Errorf("Expecting AMQP config %#v found %#v", amqpNotify{}, savedNotifyCfg1) } // Set new elastic search notification id. - serverConfig.Notify.SetElasticSearchByID("2", elasticSearchNotify{}) - savedNotifyCfg2 := serverConfig.Notify.GetElasticSearchByID("2") + globalServerConfig.Notify.SetElasticSearchByID("2", elasticSearchNotify{}) + savedNotifyCfg2 := globalServerConfig.Notify.GetElasticSearchByID("2") if !reflect.DeepEqual(savedNotifyCfg2, elasticSearchNotify{}) { t.Errorf("Expecting Elasticsearch config %#v found %#v", elasticSearchNotify{}, savedNotifyCfg2) } // Set new redis notification id. - serverConfig.Notify.SetRedisByID("2", redisNotify{}) - savedNotifyCfg3 := serverConfig.Notify.GetRedisByID("2") + globalServerConfig.Notify.SetRedisByID("2", redisNotify{}) + savedNotifyCfg3 := globalServerConfig.Notify.GetRedisByID("2") if !reflect.DeepEqual(savedNotifyCfg3, redisNotify{}) { t.Errorf("Expecting Redis config %#v found %#v", redisNotify{}, savedNotifyCfg3) } // Set new kafka notification id. - serverConfig.Notify.SetKafkaByID("2", kafkaNotify{}) - savedNotifyCfg4 := serverConfig.Notify.GetKafkaByID("2") + globalServerConfig.Notify.SetKafkaByID("2", kafkaNotify{}) + savedNotifyCfg4 := globalServerConfig.Notify.GetKafkaByID("2") if !reflect.DeepEqual(savedNotifyCfg4, kafkaNotify{}) { t.Errorf("Expecting Kafka config %#v found %#v", kafkaNotify{}, savedNotifyCfg4) } // Set new Webhook notification id. - serverConfig.Notify.SetWebhookByID("2", webhookNotify{}) - savedNotifyCfg5 := serverConfig.Notify.GetWebhookByID("2") + globalServerConfig.Notify.SetWebhookByID("2", webhookNotify{}) + savedNotifyCfg5 := globalServerConfig.Notify.GetWebhookByID("2") if !reflect.DeepEqual(savedNotifyCfg5, webhookNotify{}) { t.Errorf("Expecting Webhook config %#v found %#v", webhookNotify{}, savedNotifyCfg5) } // Set new console logger. // Set new MySQL notification id. - serverConfig.Notify.SetMySQLByID("2", mySQLNotify{}) - savedNotifyCfg6 := serverConfig.Notify.GetMySQLByID("2") + globalServerConfig.Notify.SetMySQLByID("2", mySQLNotify{}) + savedNotifyCfg6 := globalServerConfig.Notify.GetMySQLByID("2") if !reflect.DeepEqual(savedNotifyCfg6, mySQLNotify{}) { t.Errorf("Expecting Webhook config %#v found %#v", mySQLNotify{}, savedNotifyCfg6) } // Set new console logger. // Set new MQTT notification id. - serverConfig.Notify.SetMQTTByID("2", mqttNotify{}) - savedNotifyCfg7 := serverConfig.Notify.GetMQTTByID("2") + globalServerConfig.Notify.SetMQTTByID("2", mqttNotify{}) + savedNotifyCfg7 := globalServerConfig.Notify.GetMQTTByID("2") if !reflect.DeepEqual(savedNotifyCfg7, mqttNotify{}) { t.Errorf("Expecting Webhook config %#v found %#v", mqttNotify{}, savedNotifyCfg7) } consoleLogger := NewConsoleLogger() - serverConfig.Logger.SetConsole(consoleLogger) - consoleCfg := serverConfig.Logger.GetConsole() + globalServerConfig.Logger.SetConsole(consoleLogger) + consoleCfg := globalServerConfig.Logger.GetConsole() if !reflect.DeepEqual(consoleCfg, consoleLogger) { t.Errorf("Expecting console logger config %#v found %#v", consoleLogger, consoleCfg) } // Set new console logger. consoleLogger.Enable = false - serverConfig.Logger.SetConsole(consoleLogger) + globalServerConfig.Logger.SetConsole(consoleLogger) // Set new file logger. fileLogger := NewFileLogger("test-log-file") - serverConfig.Logger.SetFile(fileLogger) - fileCfg := serverConfig.Logger.GetFile() + globalServerConfig.Logger.SetFile(fileLogger) + fileCfg := globalServerConfig.Logger.GetFile() if !reflect.DeepEqual(fileCfg, fileLogger) { t.Errorf("Expecting file logger config %#v found %#v", fileLogger, fileCfg) } // Set new file logger. fileLogger.Enable = false - serverConfig.Logger.SetFile(fileLogger) + globalServerConfig.Logger.SetFile(fileLogger) // Match version. - if serverConfig.GetVersion() != v20 { - t.Errorf("Expecting version %s found %s", serverConfig.GetVersion(), v20) + if globalServerConfig.GetVersion() != serverConfigVersion { + t.Errorf("Expecting version %s found %s", globalServerConfig.GetVersion(), serverConfigVersion) } // Attempt to save. - if err := serverConfig.Save(); err != nil { + if err := globalServerConfig.Save(); err != nil { t.Fatalf("Unable to save updated config file %s", err) } @@ -172,17 +172,17 @@ func TestServerConfigWithEnvs(t *testing.T) { defer os.RemoveAll(rootPath) // Check if serverConfig has - if serverConfig.GetBrowser() { - t.Errorf("Expecting browser is set to false found %v", serverConfig.GetBrowser()) + if globalServerConfig.GetBrowser() { + t.Errorf("Expecting browser is set to false found %v", globalServerConfig.GetBrowser()) } // Check if serverConfig has - if serverConfig.GetRegion() != "us-west-1" { - t.Errorf("Expecting region to be \"us-west-1\" found %v", serverConfig.GetRegion()) + if globalServerConfig.GetRegion() != "us-west-1" { + t.Errorf("Expecting region to be \"us-west-1\" found %v", globalServerConfig.GetRegion()) } // Check if serverConfig has - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() if cred.AccessKey != "minio" { t.Errorf("Expecting access key to be `minio` found %s", cred.AccessKey) @@ -192,8 +192,8 @@ func TestServerConfigWithEnvs(t *testing.T) { t.Errorf("Expecting access key to be `minio123` found %s", cred.SecretKey) } - if serverConfig.Domain != "domain.com" { - t.Errorf("Expecting Domain to be `domain.com` found " + serverConfig.Domain) + if globalServerConfig.Domain != "domain.com" { + t.Errorf("Expecting Domain to be `domain.com` found " + globalServerConfig.Domain) } } @@ -237,7 +237,7 @@ func TestValidateConfig(t *testing.T) { configPath := filepath.Join(rootPath, minioConfigFile) - v := v20 + v := serverConfigVersion testCases := []struct { configData string diff --git a/cmd/config-migrate.go b/cmd/config-migrate.go index 947b1438b..13a2dc8e0 100644 --- a/cmd/config-migrate.go +++ b/cmd/config-migrate.go @@ -1500,7 +1500,7 @@ func migrateV19ToV20() error { } // Copy over fields from V19 into V20 config struct - srvConfig := &serverConfigV20{ + srvConfig := &serverConfig{ Logger: &loggers{}, Notify: ¬ifier{}, } diff --git a/cmd/config-migrate_test.go b/cmd/config-migrate_test.go index 1f0004874..8fee20fc8 100644 --- a/cmd/config-migrate_test.go +++ b/cmd/config-migrate_test.go @@ -169,17 +169,17 @@ func TestServerConfigMigrateV2toV19(t *testing.T) { } // Check the version number in the upgraded config file - expectedVersion := v20 - if serverConfig.Version != expectedVersion { - t.Fatalf("Expect version "+expectedVersion+", found: %v", serverConfig.Version) + expectedVersion := serverConfigVersion + if globalServerConfig.Version != expectedVersion { + t.Fatalf("Expect version "+expectedVersion+", found: %v", globalServerConfig.Version) } // Check if accessKey and secretKey are not altered during migration - if serverConfig.Credential.AccessKey != accessKey { - t.Fatalf("Access key lost during migration, expected: %v, found:%v", accessKey, serverConfig.Credential.AccessKey) + if globalServerConfig.Credential.AccessKey != accessKey { + t.Fatalf("Access key lost during migration, expected: %v, found:%v", accessKey, globalServerConfig.Credential.AccessKey) } - if serverConfig.Credential.SecretKey != secretKey { - t.Fatalf("Secret key lost during migration, expected: %v, found: %v", secretKey, serverConfig.Credential.SecretKey) + if globalServerConfig.Credential.SecretKey != secretKey { + t.Fatalf("Secret key lost during migration, expected: %v, found: %v", secretKey, globalServerConfig.Credential.SecretKey) } } diff --git a/cmd/config-old.go b/cmd/config-versions.go similarity index 96% rename from cmd/config-old.go rename to cmd/config-versions.go index 53abaee3f..5c33794e8 100644 --- a/cmd/config-old.go +++ b/cmd/config-versions.go @@ -490,3 +490,22 @@ type serverConfigV19 struct { // Notification queue configuration. Notify *notifier `json:"notify"` } + +// serverConfigV20 server configuration version '20' which is like +// version '19' except it adds support for VirtualHostDomain +type serverConfigV20 struct { + sync.RWMutex + Version string `json:"version"` + + // S3 API configuration. + Credential auth.Credentials `json:"credential"` + Region string `json:"region"` + Browser BrowserFlag `json:"browser"` + Domain string `json:"domain"` + + // Additional error logging configuration. + Logger *loggers `json:"logger"` + + // Notification queue configuration. + Notify *notifier `json:"notify"` +} diff --git a/cmd/event-notifier.go b/cmd/event-notifier.go index 9c7039d09..42fb6f25a 100644 --- a/cmd/event-notifier.go +++ b/cmd/event-notifier.go @@ -107,10 +107,10 @@ func newNotificationEvent(event eventData) NotificationEvent { } // Fetch the region. - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() // Fetch the credentials. - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() // Time when Minio finished processing the request. eventTime := UTCNow() @@ -596,7 +596,7 @@ func addQueueTarget(queueTargets map[string]*logrus.Logger, newTargetFunc func(string) (*logrus.Logger, error)) (string, error) { // Construct the queue ARN for AMQP. - queueARN := minioSqs + serverConfig.GetRegion() + ":" + accountID + ":" + queueType + queueARN := minioSqs + globalServerConfig.GetRegion() + ":" + accountID + ":" + queueType // Queue target if already initialized we move to the next ARN. if _, ok := queueTargets[queueARN]; ok { @@ -619,7 +619,7 @@ func addQueueTarget(queueTargets map[string]*logrus.Logger, func loadAllQueueTargets() (map[string]*logrus.Logger, error) { queueTargets := make(map[string]*logrus.Logger) // Load all amqp targets, initialize their respective loggers. - for accountID, amqpN := range serverConfig.Notify.GetAMQP() { + for accountID, amqpN := range globalServerConfig.Notify.GetAMQP() { if !amqpN.Enable { continue } @@ -638,7 +638,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load all mqtt targets, initialize their respective loggers. - for accountID, mqttN := range serverConfig.Notify.GetMQTT() { + for accountID, mqttN := range globalServerConfig.Notify.GetMQTT() { if !mqttN.Enable { continue } @@ -657,7 +657,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load all nats targets, initialize their respective loggers. - for accountID, natsN := range serverConfig.Notify.GetNATS() { + for accountID, natsN := range globalServerConfig.Notify.GetNATS() { if !natsN.Enable { continue } @@ -676,7 +676,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load redis targets, initialize their respective loggers. - for accountID, redisN := range serverConfig.Notify.GetRedis() { + for accountID, redisN := range globalServerConfig.Notify.GetRedis() { if !redisN.Enable { continue } @@ -695,7 +695,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load Webhook targets, initialize their respective loggers. - for accountID, webhookN := range serverConfig.Notify.GetWebhook() { + for accountID, webhookN := range globalServerConfig.Notify.GetWebhook() { if !webhookN.Enable { continue } @@ -705,7 +705,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load elastic targets, initialize their respective loggers. - for accountID, elasticN := range serverConfig.Notify.GetElasticSearch() { + for accountID, elasticN := range globalServerConfig.Notify.GetElasticSearch() { if !elasticN.Enable { continue } @@ -724,7 +724,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load PostgreSQL targets, initialize their respective loggers. - for accountID, pgN := range serverConfig.Notify.GetPostgreSQL() { + for accountID, pgN := range globalServerConfig.Notify.GetPostgreSQL() { if !pgN.Enable { continue } @@ -743,7 +743,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load MySQL targets, initialize their respective loggers. - for accountID, msqlN := range serverConfig.Notify.GetMySQL() { + for accountID, msqlN := range globalServerConfig.Notify.GetMySQL() { if !msqlN.Enable { continue } @@ -762,7 +762,7 @@ func loadAllQueueTargets() (map[string]*logrus.Logger, error) { } // Load Kafka targets, initialize their respective loggers. - for accountID, kafkaN := range serverConfig.Notify.GetKafka() { + for accountID, kafkaN := range globalServerConfig.Notify.GetKafka() { if !kafkaN.Enable { continue } diff --git a/cmd/event-notifier_test.go b/cmd/event-notifier_test.go index 775b82ced..7decbb98b 100644 --- a/cmd/event-notifier_test.go +++ b/cmd/event-notifier_test.go @@ -100,7 +100,7 @@ func TestInitEventNotifierWithPostgreSQL(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetPostgreSQLByID("1", postgreSQLNotify{Enable: true}) + globalServerConfig.Notify.SetPostgreSQLByID("1", postgreSQLNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("PostgreSQL config didn't fail.") } @@ -127,7 +127,7 @@ func TestInitEventNotifierWithNATS(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetNATSByID("1", natsNotify{Enable: true}) + globalServerConfig.Notify.SetNATSByID("1", natsNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("NATS config didn't fail.") } @@ -154,7 +154,7 @@ func TestInitEventNotifierWithWebHook(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetWebhookByID("1", webhookNotify{Enable: true}) + globalServerConfig.Notify.SetWebhookByID("1", webhookNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("WebHook config didn't fail.") } @@ -181,7 +181,7 @@ func TestInitEventNotifierWithAMQP(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetAMQPByID("1", amqpNotify{Enable: true}) + globalServerConfig.Notify.SetAMQPByID("1", amqpNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("AMQP config didn't fail.") } @@ -208,7 +208,7 @@ func TestInitEventNotifierWithElasticSearch(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetElasticSearchByID("1", elasticSearchNotify{Enable: true}) + globalServerConfig.Notify.SetElasticSearchByID("1", elasticSearchNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("ElasticSearch config didn't fail.") } @@ -235,7 +235,7 @@ func TestInitEventNotifierWithRedis(t *testing.T) { t.Fatal("Unable to initialize FS backend.", err) } - serverConfig.Notify.SetRedisByID("1", redisNotify{Enable: true}) + globalServerConfig.Notify.SetRedisByID("1", redisNotify{Enable: true}) if err := initEventNotifier(fs); err == nil { t.Fatal("Redis config didn't fail.") } @@ -417,7 +417,7 @@ func TestListenBucketNotification(t *testing.T) { listenARN := fmt.Sprintf("%s:%s:1:%s-%s", minioTopic, - serverConfig.GetRegion(), + globalServerConfig.GetRegion(), snsTypeMinio, s.testServer.Server.Listener.Addr(), ) @@ -525,7 +525,7 @@ func TestAddRemoveBucketListenerConfig(t *testing.T) { accountID := fmt.Sprintf("%d", UTCNow().UnixNano()) accountARN := fmt.Sprintf( "arn:minio:sqs:%s:%s:listen-%s", - serverConfig.GetRegion(), + globalServerConfig.GetRegion(), accountID, globalMinioAddr, ) diff --git a/cmd/gateway-azure.go b/cmd/gateway-azure.go index 5db25048f..edcb45d1c 100644 --- a/cmd/gateway-azure.go +++ b/cmd/gateway-azure.go @@ -374,7 +374,7 @@ func newAzureLayer(host string) (GatewayLayer, error) { } } - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() c, err := storage.NewClient(creds.AccessKey, creds.SecretKey, endpoint, globalAzureAPIVersion, secure) if err != nil { return &azureObjects{}, err diff --git a/cmd/gateway-b2.go b/cmd/gateway-b2.go index ae1a63bb9..933d78063 100644 --- a/cmd/gateway-b2.go +++ b/cmd/gateway-b2.go @@ -112,7 +112,7 @@ type b2Objects struct { // newB2GatewayLayer returns b2 gateway layer. func newB2GatewayLayer() (GatewayLayer, error) { ctx := context.Background() - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() client, err := b2.AuthorizeAccount(ctx, creds.AccessKey, creds.SecretKey, b2.Transport(newCustomHTTPTransport())) if err != nil { diff --git a/cmd/gateway-handlers.go b/cmd/gateway-handlers.go index edbfb90e0..d86ec327d 100644 --- a/cmd/gateway-handlers.go +++ b/cmd/gateway-handlers.go @@ -61,7 +61,7 @@ func (api gatewayAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Re return } case authTypeSigned, authTypePresigned: - s3Error := isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error := isReqAuthenticated(r, globalServerConfig.GetRegion()) if s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) @@ -286,7 +286,7 @@ func (api gatewayAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Re return } case authTypePresigned, authTypeSigned: - if s3Error := reqSignatureV4Verify(r, serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := reqSignatureV4Verify(r, globalServerConfig.GetRegion()); s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) return @@ -357,7 +357,7 @@ func (api gatewayAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.R return } case authTypeSigned, authTypePresigned: - s3Error := isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error := isReqAuthenticated(r, globalServerConfig.GetRegion()) if s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) @@ -429,7 +429,7 @@ func (api gatewayAPIHandlers) PutBucketPolicyHandler(w http.ResponseWriter, r *h return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -492,7 +492,7 @@ func (api gatewayAPIHandlers) DeleteBucketPolicyHandler(w http.ResponseWriter, r return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -526,7 +526,7 @@ func (api gatewayAPIHandlers) GetBucketPolicyHandler(w http.ResponseWriter, r *h return } - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -596,7 +596,7 @@ func (api gatewayAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Re } // PutBucket does not have any bucket action. - s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()) + s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()) if s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return @@ -643,7 +643,7 @@ func (api gatewayAPIHandlers) DeleteBucketHandler(w http.ResponseWriter, r *http } // DeleteBucket does not have any bucket action. - if s3Error := checkRequestAuthType(r, "", "", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, "", "", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -690,7 +690,7 @@ func (api gatewayAPIHandlers) ListObjectsV1Handler(w http.ResponseWriter, r *htt return } case authTypeSigned, authTypePresigned: - s3Error := isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error := isReqAuthenticated(r, globalServerConfig.GetRegion()) if s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) @@ -764,7 +764,7 @@ func (api gatewayAPIHandlers) ListObjectsV2Handler(w http.ResponseWriter, r *htt return } case authTypeSigned, authTypePresigned: - s3Error := isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error := isReqAuthenticated(r, globalServerConfig.GetRegion()) if s3Error != ErrNone { errorIf(errSignatureMismatch, dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) @@ -843,7 +843,7 @@ func (api gatewayAPIHandlers) HeadBucketHandler(w http.ResponseWriter, r *http.R return } case authTypeSigned, authTypePresigned: - s3Error := isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error := isReqAuthenticated(r, globalServerConfig.GetRegion()) if s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) @@ -898,7 +898,7 @@ func (api gatewayAPIHandlers) GetBucketLocationHandler(w http.ResponseWriter, r s3Error := isReqAuthenticated(r, globalMinioDefaultRegion) if s3Error == ErrInvalidRegion { // Clients like boto3 send getBucketLocation() call signed with region that is configured. - s3Error = isReqAuthenticated(r, serverConfig.GetRegion()) + s3Error = isReqAuthenticated(r, globalServerConfig.GetRegion()) } if s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) @@ -927,7 +927,7 @@ func (api gatewayAPIHandlers) GetBucketLocationHandler(w http.ResponseWriter, r // Generate response. encodedSuccessResponse := encodeResponse(LocationResponse{}) // Get current region. - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() if region != globalMinioDefaultRegion { encodedSuccessResponse = encodeResponse(LocationResponse{ Location: region, diff --git a/cmd/gateway-s3.go b/cmd/gateway-s3.go index 31f3a4e70..32a886d40 100644 --- a/cmd/gateway-s3.go +++ b/cmd/gateway-s3.go @@ -195,7 +195,7 @@ func newS3GatewayLayer(host string) (GatewayLayer, error) { endpoint = "s3.amazonaws.com" } - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() // Initialize minio client object. client, err := minio.NewCore(endpoint, creds.AccessKey, creds.SecretKey, secure) diff --git a/cmd/gateway-startup-msg.go b/cmd/gateway-startup-msg.go index 4ade58d32..4ad3d4330 100644 --- a/cmd/gateway-startup-msg.go +++ b/cmd/gateway-startup-msg.go @@ -45,7 +45,7 @@ func printGatewayStartupMessage(apiEndPoints []string, backendType string) { // Prints common server startup message. Prints credential, region and browser access. func printGatewayCommonMsg(apiEndpoints []string) { // Get saved credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() apiEndpointStr := strings.Join(apiEndpoints, " ") // Colorize the message and print. diff --git a/cmd/handler-utils.go b/cmd/handler-utils.go index facfb0d5f..1a7d7f80f 100644 --- a/cmd/handler-utils.go +++ b/cmd/handler-utils.go @@ -43,7 +43,7 @@ func parseLocationConstraint(r *http.Request) (location string, s3Error APIError } // else for both err as nil or io.EOF location = locationConstraint.Location if location == "" { - location = serverConfig.GetRegion() + location = globalServerConfig.GetRegion() } return location, ErrNone } @@ -51,7 +51,7 @@ func parseLocationConstraint(r *http.Request) (location string, s3Error APIError // Validates input location is same as configured region // of Minio server. func isValidLocation(location string) bool { - return serverConfig.GetRegion() == "" || serverConfig.GetRegion() == location + return globalServerConfig.GetRegion() == "" || globalServerConfig.GetRegion() == location } // Supported headers that needs to be extracted. diff --git a/cmd/handler-utils_test.go b/cmd/handler-utils_test.go index f7ef852a3..0e9e84151 100644 --- a/cmd/handler-utils_test.go +++ b/cmd/handler-utils_test.go @@ -77,7 +77,7 @@ func TestIsValidLocationContraint(t *testing.T) { if e != nil { t.Fatalf("Test %d: Failed to Marshal bucket configuration", i+1) } - serverConfig.SetRegion(testCase.serverConfigRegion) + globalServerConfig.SetRegion(testCase.serverConfigRegion) _, actualCode := parseLocationConstraint(inputRequest) if testCase.expectedCode != actualCode { t.Errorf("Test %d: Expected the APIErrCode to be %d, but instead found %d", i+1, testCase.expectedCode, actualCode) diff --git a/cmd/jwt.go b/cmd/jwt.go index 06617d448..e8da488dc 100644 --- a/cmd/jwt.go +++ b/cmd/jwt.go @@ -53,7 +53,7 @@ func authenticateJWT(accessKey, secretKey string, expiry time.Duration) (string, return "", err } - serverCred := serverConfig.GetCredential() + serverCred := globalServerConfig.GetCredential() if serverCred.AccessKey != passedCredential.AccessKey { return "", errInvalidAccessKeyID @@ -90,7 +90,7 @@ func keyFuncCallback(jwtToken *jwtgo.Token) (interface{}, error) { return nil, fmt.Errorf("Unexpected signing method: %v", jwtToken.Header["alg"]) } - return []byte(serverConfig.GetCredential().SecretKey), nil + return []byte(globalServerConfig.GetCredential().SecretKey), nil } func isAuthTokenValid(tokenString string) bool { @@ -107,7 +107,7 @@ func isAuthTokenValid(tokenString string) bool { errorIf(err, "Invalid claims in JWT token string") return false } - return jwtToken.Valid && claims.Subject == serverConfig.GetCredential().AccessKey + return jwtToken.Valid && claims.Subject == globalServerConfig.GetCredential().AccessKey } func isHTTPRequestValid(req *http.Request) bool { @@ -129,7 +129,7 @@ func webRequestAuthenticate(req *http.Request) error { if err = claims.Valid(); err != nil { return err } - if claims.Subject != serverConfig.GetCredential().AccessKey { + if claims.Subject != globalServerConfig.GetCredential().AccessKey { return errInvalidAccessKeyID } if !jwtToken.Valid { diff --git a/cmd/jwt_test.go b/cmd/jwt_test.go index e612deaed..a54e18a3c 100644 --- a/cmd/jwt_test.go +++ b/cmd/jwt_test.go @@ -31,7 +31,7 @@ func testAuthenticate(authType string, t *testing.T) { } defer os.RemoveAll(testPath) cred := auth.MustGetNewCredentials() - serverConfig.SetCredential(cred) + globalServerConfig.SetCredential(cred) // Define test cases. testCases := []struct { @@ -95,7 +95,7 @@ func TestWebRequestAuthenticate(t *testing.T) { } defer os.RemoveAll(testPath) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := getTokenString(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatalf("unable get token %s", err) @@ -146,7 +146,7 @@ func BenchmarkAuthenticateNode(b *testing.B) { } defer os.RemoveAll(testPath) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { @@ -161,7 +161,7 @@ func BenchmarkAuthenticateWeb(b *testing.B) { } defer os.RemoveAll(testPath) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { diff --git a/cmd/lock-rpc-server.go b/cmd/lock-rpc-server.go index b2ad1b504..77c738f32 100644 --- a/cmd/lock-rpc-server.go +++ b/cmd/lock-rpc-server.go @@ -310,7 +310,7 @@ func (l *lockServer) lockMaintenance(interval time.Duration) { nlripLongLived := getLongLivedLocks(l.ll.lockMap, interval) l.ll.mutex.Unlock() - serverCred := serverConfig.GetCredential() + serverCred := globalServerConfig.GetCredential() // Validate if long lived locks are indeed clean. for _, nlrip := range nlripLongLived { // Initialize client based on the long live locks. diff --git a/cmd/lock-rpc-server_test.go b/cmd/lock-rpc-server_test.go index 31ff8c42b..0f4dfb2e3 100644 --- a/cmd/lock-rpc-server_test.go +++ b/cmd/lock-rpc-server_test.go @@ -57,7 +57,7 @@ func createLockTestServer(t *testing.T) (string, *lockServer, string) { lockMap: make(map[string][]lockRequesterInfo), }, } - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateNode(creds.AccessKey, creds.SecretKey) if err != nil { t.Fatal(err) diff --git a/cmd/namespace-lock.go b/cmd/namespace-lock.go index 8193a0b32..ae608777e 100644 --- a/cmd/namespace-lock.go +++ b/cmd/namespace-lock.go @@ -53,7 +53,7 @@ type RWLockerSync interface { // Initialize distributed locking only in case of distributed setup. // Returns lock clients and the node index for the current server. func newDsyncNodes(endpoints EndpointList) (clnts []dsync.NetLocker, myNode int) { - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() clnts = make([]dsync.NetLocker, len(endpoints)) myNode = -1 for index, endpoint := range endpoints { diff --git a/cmd/notifiers.go b/cmd/notifiers.go index f0086dd94..a9c669bac 100644 --- a/cmd/notifiers.go +++ b/cmd/notifiers.go @@ -68,7 +68,7 @@ func isAMQPQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeAMQP { return false } - amqpL := serverConfig.Notify.GetAMQPByID(sqsArn.AccountID) + amqpL := globalServerConfig.Notify.GetAMQPByID(sqsArn.AccountID) if !amqpL.Enable { return false } @@ -87,7 +87,7 @@ func isMQTTQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeMQTT { return false } - mqttL := serverConfig.Notify.GetMQTTByID(sqsArn.AccountID) + mqttL := globalServerConfig.Notify.GetMQTTByID(sqsArn.AccountID) if !mqttL.Enable { return false } @@ -106,7 +106,7 @@ func isNATSQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeNATS { return false } - natsL := serverConfig.Notify.GetNATSByID(sqsArn.AccountID) + natsL := globalServerConfig.Notify.GetNATSByID(sqsArn.AccountID) if !natsL.Enable { return false } @@ -125,7 +125,7 @@ func isWebhookQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeWebhook { return false } - rNotify := serverConfig.Notify.GetWebhookByID(sqsArn.AccountID) + rNotify := globalServerConfig.Notify.GetWebhookByID(sqsArn.AccountID) return rNotify.Enable } @@ -134,7 +134,7 @@ func isRedisQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeRedis { return false } - rNotify := serverConfig.Notify.GetRedisByID(sqsArn.AccountID) + rNotify := globalServerConfig.Notify.GetRedisByID(sqsArn.AccountID) if !rNotify.Enable { return false } @@ -153,7 +153,7 @@ func isElasticQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeElastic { return false } - esNotify := serverConfig.Notify.GetElasticSearchByID(sqsArn.AccountID) + esNotify := globalServerConfig.Notify.GetElasticSearchByID(sqsArn.AccountID) if !esNotify.Enable { return false } @@ -171,7 +171,7 @@ func isPostgreSQLQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypePostgreSQL { return false } - pgNotify := serverConfig.Notify.GetPostgreSQLByID(sqsArn.AccountID) + pgNotify := globalServerConfig.Notify.GetPostgreSQLByID(sqsArn.AccountID) if !pgNotify.Enable { return false } @@ -189,7 +189,7 @@ func isMySQLQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeMySQL { return false } - msqlNotify := serverConfig.Notify.GetMySQLByID(sqsArn.AccountID) + msqlNotify := globalServerConfig.Notify.GetMySQLByID(sqsArn.AccountID) if !msqlNotify.Enable { return false } @@ -207,7 +207,7 @@ func isKafkaQueue(sqsArn arnSQS) bool { if sqsArn.Type != queueTypeKafka { return false } - kafkaNotifyCfg := serverConfig.Notify.GetKafkaByID(sqsArn.AccountID) + kafkaNotifyCfg := globalServerConfig.Notify.GetKafkaByID(sqsArn.AccountID) if !kafkaNotifyCfg.Enable { return false } diff --git a/cmd/notify-amqp.go b/cmd/notify-amqp.go index 3334d51f1..2b89409ab 100644 --- a/cmd/notify-amqp.go +++ b/cmd/notify-amqp.go @@ -78,7 +78,7 @@ func dialAMQP(amqpL amqpNotify) (*amqpConn, error) { } func newAMQPNotify(accountID string) (*logrus.Logger, error) { - amqpL := serverConfig.Notify.GetAMQPByID(accountID) + amqpL := globalServerConfig.Notify.GetAMQPByID(accountID) // Connect to amqp server. amqpC, err := dialAMQP(amqpL) diff --git a/cmd/notify-elasticsearch.go b/cmd/notify-elasticsearch.go index e9ef5f76c..82b48844c 100644 --- a/cmd/notify-elasticsearch.go +++ b/cmd/notify-elasticsearch.go @@ -75,7 +75,7 @@ func dialElastic(esNotify elasticSearchNotify) (*elastic.Client, error) { } func newElasticNotify(accountID string) (*logrus.Logger, error) { - esNotify := serverConfig.Notify.GetElasticSearchByID(accountID) + esNotify := globalServerConfig.Notify.GetElasticSearchByID(accountID) // Dial to elastic search. client, err := dialElastic(esNotify) diff --git a/cmd/notify-kafka.go b/cmd/notify-kafka.go index 02f6384aa..028cff4e7 100644 --- a/cmd/notify-kafka.go +++ b/cmd/notify-kafka.go @@ -92,7 +92,7 @@ func dialKafka(kn kafkaNotify) (kc kafkaConn, e error) { } func newKafkaNotify(accountID string) (*logrus.Logger, error) { - kafkaNotifyCfg := serverConfig.Notify.GetKafkaByID(accountID) + kafkaNotifyCfg := globalServerConfig.Notify.GetKafkaByID(accountID) // Try connecting to the configured Kafka broker(s). kc, err := dialKafka(kafkaNotifyCfg) diff --git a/cmd/notify-mqtt.go b/cmd/notify-mqtt.go index cfc132705..fa925e9d1 100644 --- a/cmd/notify-mqtt.go +++ b/cmd/notify-mqtt.go @@ -72,7 +72,7 @@ func dialMQTT(mqttL mqttNotify) (mc mqttConn, e error) { } func newMQTTNotify(accountID string) (*logrus.Logger, error) { - mqttL := serverConfig.Notify.GetMQTTByID(accountID) + mqttL := globalServerConfig.Notify.GetMQTTByID(accountID) //connect to MQTT Server mqttC, err := dialMQTT(mqttL) diff --git a/cmd/notify-mysql.go b/cmd/notify-mysql.go index 2d55f7d95..7ce9f2b33 100644 --- a/cmd/notify-mysql.go +++ b/cmd/notify-mysql.go @@ -227,7 +227,7 @@ func dialMySQL(msql mySQLNotify) (mc mySQLConn, e error) { } func newMySQLNotify(accountID string) (*logrus.Logger, error) { - mysqlNotify := serverConfig.Notify.GetMySQLByID(accountID) + mysqlNotify := globalServerConfig.Notify.GetMySQLByID(accountID) // Dial mysql myC, err := dialMySQL(mysqlNotify) diff --git a/cmd/notify-nats.go b/cmd/notify-nats.go index 18de99379..715bf808e 100644 --- a/cmd/notify-nats.go +++ b/cmd/notify-nats.go @@ -138,7 +138,7 @@ func closeNATS(conn natsIOConn) { } func newNATSNotify(accountID string) (*logrus.Logger, error) { - natsL := serverConfig.Notify.GetNATSByID(accountID) + natsL := globalServerConfig.Notify.GetNATSByID(accountID) // Connect to nats server. natsC, err := dialNATS(natsL, false) diff --git a/cmd/notify-postgresql.go b/cmd/notify-postgresql.go index d6739681c..2f814ef33 100644 --- a/cmd/notify-postgresql.go +++ b/cmd/notify-postgresql.go @@ -242,7 +242,7 @@ func dialPostgreSQL(pgN postgreSQLNotify) (pc pgConn, e error) { } func newPostgreSQLNotify(accountID string) (*logrus.Logger, error) { - pgNotify := serverConfig.Notify.GetPostgreSQLByID(accountID) + pgNotify := globalServerConfig.Notify.GetPostgreSQLByID(accountID) // Dial postgres pgC, err := dialPostgreSQL(pgNotify) diff --git a/cmd/notify-redis.go b/cmd/notify-redis.go index 664760bfd..afb1ea3d3 100644 --- a/cmd/notify-redis.go +++ b/cmd/notify-redis.go @@ -128,7 +128,7 @@ func dialRedis(rNotify redisNotify) (*redis.Pool, error) { } func newRedisNotify(accountID string) (*logrus.Logger, error) { - rNotify := serverConfig.Notify.GetRedisByID(accountID) + rNotify := globalServerConfig.Notify.GetRedisByID(accountID) // Dial redis. rPool, err := dialRedis(rNotify) diff --git a/cmd/notify-webhook.go b/cmd/notify-webhook.go index 00b79de45..097171da9 100644 --- a/cmd/notify-webhook.go +++ b/cmd/notify-webhook.go @@ -130,7 +130,7 @@ func lookupEndpoint(urlStr string) error { // Initializes new webhook logrus notifier. func newWebhookNotify(accountID string) (*logrus.Logger, error) { - rNotify := serverConfig.Notify.GetWebhookByID(accountID) + rNotify := globalServerConfig.Notify.GetWebhookByID(accountID) if rNotify.Endpoint == "" { return nil, errInvalidArgument } diff --git a/cmd/notify-webhook_test.go b/cmd/notify-webhook_test.go index 55899464d..54e423276 100644 --- a/cmd/notify-webhook_test.go +++ b/cmd/notify-webhook_test.go @@ -59,13 +59,13 @@ func TestNewWebHookNotify(t *testing.T) { t.Fatal("Unexpected should fail") } - serverConfig.Notify.SetWebhookByID("10", webhookNotify{Enable: true, Endpoint: "http://127.0.0.1:80"}) + globalServerConfig.Notify.SetWebhookByID("10", webhookNotify{Enable: true, Endpoint: "http://127.0.0.1:80"}) _, err = newWebhookNotify("10") if err != nil { t.Fatal("Unexpected should not fail with lookupEndpoint", err) } - serverConfig.Notify.SetWebhookByID("15", webhookNotify{Enable: true, Endpoint: "http://%"}) + globalServerConfig.Notify.SetWebhookByID("15", webhookNotify{Enable: true, Endpoint: "http://%"}) _, err = newWebhookNotify("15") if err == nil { t.Fatal("Unexpected should fail with invalid URL escape") @@ -74,7 +74,7 @@ func TestNewWebHookNotify(t *testing.T) { server := httptest.NewServer(postHandler{}) defer server.Close() - serverConfig.Notify.SetWebhookByID("20", webhookNotify{Enable: true, Endpoint: server.URL}) + globalServerConfig.Notify.SetWebhookByID("20", webhookNotify{Enable: true, Endpoint: server.URL}) webhook, err := newWebhookNotify("20") if err != nil { t.Fatal("Unexpected shouldn't fail", err) diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index 1fd3474fe..664a24175 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -102,7 +102,7 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req return } - if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -230,7 +230,7 @@ func (api objectAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.Re return } - if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponseHeadersOnly(w, s3Error) return } @@ -332,7 +332,7 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re return } - if s3Error := checkRequestAuthType(r, dstBucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, dstBucket, "s3:PutObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -578,7 +578,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req return } case authTypePresigned, authTypeSigned: - if s3Err = reqSignatureV4Verify(r, serverConfig.GetRegion()); s3Err != ErrNone { + if s3Err = reqSignatureV4Verify(r, globalServerConfig.GetRegion()); s3Err != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Err, r.URL) return @@ -654,7 +654,7 @@ func (api objectAPIHandlers) NewMultipartUploadHandler(w http.ResponseWriter, r return } - if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -699,7 +699,7 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt return } - if s3Error := checkRequestAuthType(r, dstBucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, dstBucket, "s3:PutObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -909,7 +909,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http return } case authTypePresigned, authTypeSigned: - if s3Error := reqSignatureV4Verify(r, serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := reqSignatureV4Verify(r, globalServerConfig.GetRegion()); s3Error != ErrNone { errorIf(errSignatureMismatch, "%s", dumpRequest(r)) writeErrorResponse(w, s3Error, r.URL) return @@ -954,7 +954,7 @@ func (api objectAPIHandlers) AbortMultipartUploadHandler(w http.ResponseWriter, return } - if s3Error := checkRequestAuthType(r, bucket, "s3:AbortMultipartUpload", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:AbortMultipartUpload", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -980,7 +980,7 @@ func (api objectAPIHandlers) ListObjectPartsHandler(w http.ResponseWriter, r *ht return } - if s3Error := checkRequestAuthType(r, bucket, "s3:ListMultipartUploadParts", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:ListMultipartUploadParts", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -1019,7 +1019,7 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite return } - if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } @@ -1127,7 +1127,7 @@ func (api objectAPIHandlers) DeleteObjectHandler(w http.ResponseWriter, r *http. return } - if s3Error := checkRequestAuthType(r, bucket, "s3:DeleteObject", serverConfig.GetRegion()); s3Error != ErrNone { + if s3Error := checkRequestAuthType(r, bucket, "s3:DeleteObject", globalServerConfig.GetRegion()); s3Error != ErrNone { writeErrorResponse(w, s3Error, r.URL) return } diff --git a/cmd/post-policy_test.go b/cmd/post-policy_test.go index 11e908b62..2475a2392 100644 --- a/cmd/post-policy_test.go +++ b/cmd/post-policy_test.go @@ -135,7 +135,7 @@ func testPostPolicyBucketHandler(obj ObjectLayer, instanceType string, t TestErr // Register the API end points with XL/FS object layer. apiRouter := initTestAPIEndPoints(obj, []string{"PostPolicy"}) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() curTime := UTCNow() curTimePlus5Min := curTime.Add(time.Minute * 5) @@ -455,7 +455,7 @@ func testPostPolicyBucketHandlerRedirect(obj ObjectLayer, instanceType string, t // Register the API end points with XL/FS object layer. apiRouter := initTestAPIEndPoints(obj, []string{"PostPolicy"}) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() curTime := UTCNow() curTimePlus5Min := curTime.Add(time.Minute * 5) diff --git a/cmd/s3-peer-client.go b/cmd/s3-peer-client.go index 307c017da..74d333a5d 100644 --- a/cmd/s3-peer-client.go +++ b/cmd/s3-peer-client.go @@ -48,7 +48,7 @@ func makeS3Peers(endpoints EndpointList) (s3PeerList s3Peers) { }) hostSet := set.CreateStringSet(localAddr) - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() serviceEndpoint := path.Join(minioReservedBucketPath, s3Path) for _, host := range GetRemotePeers(endpoints) { if hostSet.Contains(host) { diff --git a/cmd/server-startup-msg.go b/cmd/server-startup-msg.go index 17ef1ee71..7176d62dd 100644 --- a/cmd/server-startup-msg.go +++ b/cmd/server-startup-msg.go @@ -101,10 +101,10 @@ func stripStandardPorts(apiEndpoints []string) (newAPIEndpoints []string) { // Prints common server startup message. Prints credential, region and browser access. func printServerCommonMsg(apiEndpoints []string) { // Get saved credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Get saved region. - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() apiEndpointStr := strings.Join(apiEndpoints, " ") @@ -143,7 +143,7 @@ func printEventNotifiers() { // and custom platform specific message. func printCLIAccessMsg(endPoint string, alias string) { // Get saved credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Configure 'mc', following block prints platform specific information for minio client. log.Println(colorBlue("\nCommand-line Access: ") + mcQuickStartGuide) diff --git a/cmd/signature-v2.go b/cmd/signature-v2.go index de17525ab..12edd3bdd 100644 --- a/cmd/signature-v2.go +++ b/cmd/signature-v2.go @@ -64,7 +64,7 @@ var resourceList = []string{ } func doesPolicySignatureV2Match(formValues http.Header) APIErrorCode { - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() accessKey := formValues.Get("AWSAccessKeyId") if accessKey != cred.AccessKey { return ErrInvalidAccessKeyID @@ -96,7 +96,7 @@ func unescapeQueries(encodedQuery string) (unescapedQueries []string, err error) // returns ErrNone if matches. S3 errors otherwise. func doesPresignV2SignatureMatch(r *http.Request) APIErrorCode { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // r.RequestURI will have raw encoded URI as sent by the client. tokens := strings.SplitN(r.RequestURI, "?", 2) @@ -213,7 +213,7 @@ func validateV2AuthHeader(v2Auth string) APIErrorCode { } // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() if keySignFields[0] != cred.AccessKey { return ErrInvalidAccessKeyID } @@ -263,14 +263,14 @@ func calculateSignatureV2(stringToSign string, secret string) string { // Return signature-v2 for the presigned request. func preSignatureV2(method string, encodedResource string, encodedQuery string, headers http.Header, expires string) string { - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() stringToSign := getStringToSignV2(method, encodedResource, encodedQuery, headers, expires) return calculateSignatureV2(stringToSign, cred.SecretKey) } // Return signature-v2 authrization header. func signatureV2(method string, encodedResource string, encodedQuery string, headers http.Header) string { - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() stringToSign := getStringToSignV2(method, encodedResource, encodedQuery, headers, "") signature := calculateSignatureV2(stringToSign, cred.SecretKey) return fmt.Sprintf("%s %s:%s", signV2Algorithm, cred.AccessKey, signature) diff --git a/cmd/signature-v2_test.go b/cmd/signature-v2_test.go index 7c8ab234f..1e400f831 100644 --- a/cmd/signature-v2_test.go +++ b/cmd/signature-v2_test.go @@ -49,8 +49,8 @@ func TestDoesPresignedV2SignatureMatch(t *testing.T) { now := UTCNow() var ( - accessKey = serverConfig.GetCredential().AccessKey - secretKey = serverConfig.GetCredential().SecretKey + accessKey = globalServerConfig.GetCredential().AccessKey + secretKey = globalServerConfig.GetCredential().SecretKey ) testCases := []struct { queryParams map[string]string @@ -163,7 +163,7 @@ func TestValidateV2AuthHeader(t *testing.T) { } defer os.RemoveAll(root) - accessID := serverConfig.GetCredential().AccessKey + accessID := globalServerConfig.GetCredential().AccessKey testCases := []struct { authString string expectedError APIErrorCode @@ -233,7 +233,7 @@ func TestDoesPolicySignatureV2Match(t *testing.T) { t.Fatal("Unable to initialize test config.") } defer os.RemoveAll(root) - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() policy := "policy" testCases := []struct { accessKey string diff --git a/cmd/signature-v4.go b/cmd/signature-v4.go index 007a66922..c765235d0 100644 --- a/cmd/signature-v4.go +++ b/cmd/signature-v4.go @@ -151,10 +151,10 @@ func doesPolicySignatureMatch(formValues http.Header) APIErrorCode { // returns ErrNone if the signature matches. func doesPolicySignatureV4Match(formValues http.Header) APIErrorCode { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Server region. - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() // Parse credential tag. credHeader, err := parseCredentialHeader("Credential=" + formValues.Get("X-Amz-Credential")) @@ -193,7 +193,7 @@ func doesPolicySignatureV4Match(formValues http.Header) APIErrorCode { // returns ErrNone if the signature matches. func doesPresignedSignatureMatch(hashedPayload string, r *http.Request, region string) APIErrorCode { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Copy request req := *r @@ -312,7 +312,7 @@ func doesPresignedSignatureMatch(hashedPayload string, r *http.Request, region s // returns ErrNone if signature matches. func doesSignatureMatch(hashedPayload string, r *http.Request, region string) APIErrorCode { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Copy request. req := *r diff --git a/cmd/signature-v4_test.go b/cmd/signature-v4_test.go index 422f0dfcc..b7e7f95cb 100644 --- a/cmd/signature-v4_test.go +++ b/cmd/signature-v4_test.go @@ -37,7 +37,7 @@ func niceError(code APIErrorCode) string { func TestDoesPolicySignatureMatch(t *testing.T) { credentialTemplate := "%s/%s/%s/s3/aws4_request" now := UTCNow() - accessKey := serverConfig.GetCredential().AccessKey + accessKey := globalServerConfig.GetCredential().AccessKey testCases := []struct { form http.Header @@ -73,7 +73,7 @@ func TestDoesPolicySignatureMatch(t *testing.T) { }, "X-Amz-Date": []string{now.Format(iso8601Format)}, "X-Amz-Signature": []string{ - getSignature(getSigningKey(serverConfig.GetCredential().SecretKey, now, + getSignature(getSigningKey(globalServerConfig.GetCredential().SecretKey, now, globalMinioDefaultRegion), "policy"), }, "Policy": []string{"policy"}, @@ -103,8 +103,8 @@ func TestDoesPresignedSignatureMatch(t *testing.T) { now := UTCNow() credentialTemplate := "%s/%s/%s/s3/aws4_request" - region := serverConfig.GetRegion() - accessKeyID := serverConfig.GetCredential().AccessKey + region := globalServerConfig.GetRegion() + accessKeyID := globalServerConfig.GetCredential().AccessKey testCases := []struct { queryParams map[string]string headers map[string]string diff --git a/cmd/storage-rpc-client.go b/cmd/storage-rpc-client.go index b39f11481..26209c307 100644 --- a/cmd/storage-rpc-client.go +++ b/cmd/storage-rpc-client.go @@ -97,7 +97,7 @@ func toStorageErr(err error) error { func newStorageRPC(endpoint Endpoint) StorageAPI { // Dial minio rpc storage http path. rpcPath := path.Join(minioReservedBucketPath, storageRPCPath, endpoint.Path) - serverCred := serverConfig.GetCredential() + serverCred := globalServerConfig.GetCredential() return &networkStorage{ rpcClient: newAuthRPCClient(authConfig{ diff --git a/cmd/storage-rpc-server_test.go b/cmd/storage-rpc-server_test.go index c55aee4bf..ebe777c24 100644 --- a/cmd/storage-rpc-server_test.go +++ b/cmd/storage-rpc-server_test.go @@ -38,7 +38,7 @@ func createTestStorageServer(t *testing.T) *testStorageRPCServer { t.Fatalf("unable initialize config file, %s", err) } - serverCred := serverConfig.GetCredential() + serverCred := globalServerConfig.GetCredential() token, err := authenticateNode(serverCred.AccessKey, serverCred.SecretKey) if err != nil { t.Fatalf("unable for JWT to generate token, %s", err) diff --git a/cmd/streaming-signature-v4.go b/cmd/streaming-signature-v4.go index 9f33ec48a..0309a62a3 100644 --- a/cmd/streaming-signature-v4.go +++ b/cmd/streaming-signature-v4.go @@ -43,7 +43,7 @@ const ( // getChunkSignature - get chunk signature. func getChunkSignature(seedSignature string, region string, date time.Time, hashedChunk string) string { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Calculate string to sign. stringToSign := signV4ChunkedAlgorithm + "\n" + @@ -68,10 +68,10 @@ func getChunkSignature(seedSignature string, region string, date time.Time, hash // error while parsing and validating. func calculateSeedSignature(r *http.Request) (signature string, region string, date time.Time, errCode APIErrorCode) { // Access credentials. - cred := serverConfig.GetCredential() + cred := globalServerConfig.GetCredential() // Configured region. - confRegion := serverConfig.GetRegion() + confRegion := globalServerConfig.GetRegion() // Copy request. req := *r diff --git a/cmd/test-utils_test.go b/cmd/test-utils_test.go index cd2239571..a9944645a 100644 --- a/cmd/test-utils_test.go +++ b/cmd/test-utils_test.go @@ -287,7 +287,7 @@ func UnstartedTestServer(t TestErrHandler, instanceType string) TestServer { // Test Server needs to start before formatting of disks. // Get credential. - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() testServer.Obj = objLayer testServer.Disks = mustGetNewEndpointList(disks...) @@ -377,7 +377,7 @@ func StartTestStorageRPCServer(t TestErrHandler, instanceType string, diskN int) // Create an instance of TestServer. testRPCServer := TestServer{} // Get credential. - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() endpoints := mustGetNewEndpointList(disks...) testRPCServer.Root = root @@ -407,7 +407,7 @@ func StartTestPeersRPCServer(t TestErrHandler, instanceType string) TestServer { // create an instance of TestServer. testRPCServer := TestServer{} // Get credential. - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() endpoints := mustGetNewEndpointList(disks...) testRPCServer.Root = root @@ -459,10 +459,10 @@ func resetGlobalObjectAPI() { // set it to `nil`. func resetGlobalConfig() { // hold the mutex lock before a new config is assigned. - serverConfigMu.Lock() + globalServerConfigMu.Lock() // Save the loaded config globally. - serverConfig = nil - serverConfigMu.Unlock() + globalServerConfig = nil + globalServerConfigMu.Unlock() } // reset global NSLock. @@ -529,10 +529,10 @@ func newTestConfig(bucketLocation string) (rootPath string, err error) { } // Set a default region. - serverConfig.SetRegion(bucketLocation) + globalServerConfig.SetRegion(bucketLocation) // Save config. - if err = serverConfig.Save(); err != nil { + if err = globalServerConfig.Save(); err != nil { return "", err } @@ -766,7 +766,7 @@ func newTestStreamingRequest(method, urlStr string, dataLength, chunkSize int64, func assembleStreamingChunks(req *http.Request, body io.ReadSeeker, chunkSize int64, secretKey, signature string, currTime time.Time) (*http.Request, error) { - regionStr := serverConfig.GetRegion() + regionStr := globalServerConfig.GetRegion() var stream []byte var buffer []byte body.Seek(0, 0) @@ -874,7 +874,7 @@ func preSignV4(req *http.Request, accessKeyID, secretAccessKey string, expires i return errors.New("Presign cannot be generated without access and secret keys") } - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() date := UTCNow() scope := getScope(date, region) credential := fmt.Sprintf("%s/%s", accessKeyID, scope) @@ -1002,7 +1002,7 @@ func signRequestV4(req *http.Request, accessKey, secretKey string) error { } sort.Strings(headers) - region := serverConfig.GetRegion() + region := globalServerConfig.GetRegion() // Get canonical headers. var buf bytes.Buffer @@ -1943,7 +1943,7 @@ func ExecObjectLayerAPITest(t *testing.T, objAPITest objAPITestType, endpoints [ if err != nil { t.Fatalf("Initialzation of API handler tests failed: %s", err) } - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() // Executing the object layer tests for single node setup. objAPITest(objLayer, FSTestStr, bucketFS, fsAPIRouter, credentials, t) @@ -2191,7 +2191,7 @@ func StartTestBrowserPeerRPCServer(t TestErrHandler, instanceType string) TestSe testRPCServer := TestServer{} // Fetch credentials for the test server. - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() testRPCServer.Root = root testRPCServer.AccessKey = credentials.AccessKey @@ -2212,7 +2212,7 @@ func StartTestS3PeerRPCServer(t TestErrHandler) (TestServer, []string) { testRPCServer := TestServer{} // Fetch credentials for the test server. - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() testRPCServer.Root = root testRPCServer.AccessKey = credentials.AccessKey diff --git a/cmd/web-handlers.go b/cmd/web-handlers.go index 95a652fbf..d328d6fbd 100644 --- a/cmd/web-handlers.go +++ b/cmd/web-handlers.go @@ -137,7 +137,7 @@ func (web *webAPIHandlers) MakeBucket(r *http.Request, args *MakeBucketArgs, rep } defer bucketLock.Unlock() - if err := objectAPI.MakeBucketWithLocation(args.BucketName, serverConfig.GetRegion()); err != nil { + if err := objectAPI.MakeBucketWithLocation(args.BucketName, globalServerConfig.GetRegion()); err != nil { return toJSONError(err, args.BucketName) } @@ -409,12 +409,12 @@ func (web *webAPIHandlers) SetAuth(r *http.Request, args *SetAuthArgs, reply *Se errsMap := updateCredsOnPeers(creds) // Update local credentials - prevCred := serverConfig.SetCredential(creds) + prevCred := globalServerConfig.SetCredential(creds) // Persist updated credentials. - if err = serverConfig.Save(); err != nil { + if err = globalServerConfig.Save(); err != nil { // Save the current creds when failed to update. - serverConfig.SetCredential(prevCred) + globalServerConfig.SetCredential(prevCred) errsMap[globalMinioAddr] = err } @@ -467,7 +467,7 @@ func (web *webAPIHandlers) GetAuth(r *http.Request, args *WebGenericArgs, reply if !isHTTPRequestValid(r) { return toJSONError(errAuthentication) } - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() reply.AccessKey = creds.AccessKey reply.SecretKey = creds.SecretKey reply.UIVersion = browser.UIVersion @@ -486,7 +486,7 @@ func (web *webAPIHandlers) CreateURLToken(r *http.Request, args *WebGenericArgs, return toJSONError(errAuthentication) } - creds := serverConfig.GetCredential() + creds := globalServerConfig.GetCredential() token, err := authenticateURL(creds.AccessKey, creds.SecretKey) if err != nil { @@ -925,8 +925,8 @@ func (web *webAPIHandlers) PresignedGet(r *http.Request, args *PresignedGetArgs, // Returns presigned url for GET method. func presignedGet(host, bucket, object string, expiry int64) string { - cred := serverConfig.GetCredential() - region := serverConfig.GetRegion() + cred := globalServerConfig.GetCredential() + region := globalServerConfig.GetRegion() accessKey := cred.AccessKey secretKey := cred.SecretKey diff --git a/cmd/web-handlers_test.go b/cmd/web-handlers_test.go index 7c6b4896c..d3787ee76 100644 --- a/cmd/web-handlers_test.go +++ b/cmd/web-handlers_test.go @@ -143,7 +143,7 @@ func TestWebHandlerLogin(t *testing.T) { func testLoginWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() // test cases with sample input and expected output. testCases := []struct { @@ -183,7 +183,7 @@ func testStorageInfoWebHandler(obj ObjectLayer, instanceType string, t TestErrHa // get random bucket name. // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -220,7 +220,7 @@ func TestWebHandlerServerInfo(t *testing.T) { func testServerInfoWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -261,7 +261,7 @@ func TestWebHandlerMakeBucket(t *testing.T) { func testMakeBucketWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -314,7 +314,7 @@ func TestWebHandlerListBuckets(t *testing.T) { func testListBucketsWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -362,7 +362,7 @@ func TestWebHandlerListObjects(t *testing.T) { func testListObjectsWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() rec := httptest.NewRecorder() @@ -457,7 +457,7 @@ func TestWebHandlerRemoveObject(t *testing.T) { func testRemoveObjectWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() rec := httptest.NewRecorder() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) @@ -548,7 +548,7 @@ func TestWebHandlerGenerateAuth(t *testing.T) { func testGenerateAuthWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() rec := httptest.NewRecorder() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) @@ -585,7 +585,7 @@ func TestWebHandlerSetAuth(t *testing.T) { func testSetAuthWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() rec := httptest.NewRecorder() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) @@ -637,7 +637,7 @@ func TestWebHandlerGetAuth(t *testing.T) { func testGetAuthWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() rec := httptest.NewRecorder() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) @@ -680,7 +680,7 @@ func getTokenString(accessKey, secretKey string) (string, error) { func testCreateURLToken(obj ObjectLayer, instanceType string, t TestErrHandler) { apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -737,7 +737,7 @@ func TestWebHandlerUpload(t *testing.T) { func testUploadWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() content := []byte("temporary file's content") authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) @@ -830,7 +830,7 @@ func TestWebHandlerDownload(t *testing.T) { func testDownloadWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -939,7 +939,7 @@ func TestWebHandlerDownloadZip(t *testing.T) { func testWebHandlerDownloadZip(obj ObjectLayer, instanceType string, t TestErrHandler) { apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := authenticateURL(credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -1023,7 +1023,7 @@ func TestWebHandlerPresignedGetHandler(t *testing.T) { func testWebPresignedGetHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -1128,7 +1128,7 @@ func TestWebHandlerGetBucketPolicyHandler(t *testing.T) { func testWebGetBucketPolicyHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -1206,7 +1206,7 @@ func TestWebHandlerListAllBucketPoliciesHandler(t *testing.T) { func testWebListAllBucketPoliciesHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -1303,7 +1303,7 @@ func TestWebHandlerSetBucketPolicyHandler(t *testing.T) { func testWebSetBucketPolicyHandler(obj ObjectLayer, instanceType string, t TestErrHandler) { // Register the API end points with XL/FS object layer. apiRouter := initTestWebRPCEndPoint(obj) - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { @@ -1465,7 +1465,7 @@ func TestWebObjectLayerNotReady(t *testing.T) { rec := httptest.NewRecorder() - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { t.Fatal("Cannot authenticate", err) @@ -1575,7 +1575,7 @@ func TestWebObjectLayerFaultyDisks(t *testing.T) { rec := httptest.NewRecorder() - credentials := serverConfig.GetCredential() + credentials := globalServerConfig.GetCredential() authorization, err := getWebRPCToken(apiRouter, credentials.AccessKey, credentials.SecretKey) if err != nil { t.Fatal("Cannot authenticate", err)