Allow etcd, cache setup to exit when starting gateway mode (#9842)
- Initialize etcd once per call - Fail etcd, cache setup pro-actively for gateway setups - Support deleting/updating bucket notification, tagging, lifecycle, sse-encryption
This commit is contained in:
@@ -47,7 +47,7 @@ import (
|
|||||||
const (
|
const (
|
||||||
getBucketVersioningResponse = `<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>`
|
getBucketVersioningResponse = `<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>`
|
||||||
objectLockConfig = "object-lock.xml"
|
objectLockConfig = "object-lock.xml"
|
||||||
bucketTaggingConfigFile = "tagging.xml"
|
bucketTaggingConfig = "tagging.xml"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Check if there are buckets on server without corresponding entry in etcd backend and
|
// Check if there are buckets on server without corresponding entry in etcd backend and
|
||||||
@@ -1123,7 +1123,7 @@ func (api objectAPIHandlers) PutBucketTaggingHandler(w http.ResponseWriter, r *h
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = globalBucketMetadataSys.Update(bucket, bucketTaggingConfigFile, configData); err != nil {
|
if err = globalBucketMetadataSys.Update(bucket, bucketTaggingConfig, configData); err != nil {
|
||||||
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1191,7 +1191,7 @@ func (api objectAPIHandlers) DeleteBucketTaggingHandler(w http.ResponseWriter, r
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := globalBucketMetadataSys.Update(bucket, bucketTaggingConfigFile, nil); err != nil {
|
if err := globalBucketMetadataSys.Update(bucket, bucketTaggingConfig, nil); err != nil {
|
||||||
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,44 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat
|
|||||||
|
|
||||||
if globalIsGateway {
|
if globalIsGateway {
|
||||||
// This code is needed only for gateway implementations.
|
// This code is needed only for gateway implementations.
|
||||||
if configFile == bucketPolicyConfig {
|
switch configFile {
|
||||||
|
case bucketSSEConfig:
|
||||||
|
if globalGatewayName == "nas" {
|
||||||
|
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
meta.EncryptionConfigXML = configData
|
||||||
|
return meta.Save(GlobalContext, objAPI)
|
||||||
|
}
|
||||||
|
case bucketLifecycleConfig:
|
||||||
|
if globalGatewayName == "nas" {
|
||||||
|
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
meta.LifecycleConfigXML = configData
|
||||||
|
return meta.Save(GlobalContext, objAPI)
|
||||||
|
}
|
||||||
|
case bucketTaggingConfig:
|
||||||
|
if globalGatewayName == "nas" {
|
||||||
|
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
meta.TaggingConfigXML = configData
|
||||||
|
return meta.Save(GlobalContext, objAPI)
|
||||||
|
}
|
||||||
|
case bucketNotificationConfig:
|
||||||
|
if globalGatewayName == "nas" {
|
||||||
|
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
meta.NotificationConfigXML = configData
|
||||||
|
return meta.Save(GlobalContext, objAPI)
|
||||||
|
}
|
||||||
|
case bucketPolicyConfig:
|
||||||
if configData == nil {
|
if configData == nil {
|
||||||
return objAPI.DeleteBucketPolicy(GlobalContext, bucket)
|
return objAPI.DeleteBucketPolicy(GlobalContext, bucket)
|
||||||
}
|
}
|
||||||
@@ -107,7 +144,7 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat
|
|||||||
meta.LifecycleConfigXML = configData
|
meta.LifecycleConfigXML = configData
|
||||||
case bucketSSEConfig:
|
case bucketSSEConfig:
|
||||||
meta.EncryptionConfigXML = configData
|
meta.EncryptionConfigXML = configData
|
||||||
case bucketTaggingConfigFile:
|
case bucketTaggingConfig:
|
||||||
meta.TaggingConfigXML = configData
|
meta.TaggingConfigXML = configData
|
||||||
case objectLockConfig:
|
case objectLockConfig:
|
||||||
meta.ObjectLockConfigXML = configData
|
meta.ObjectLockConfigXML = configData
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj
|
|||||||
bucketLifecycleConfig,
|
bucketLifecycleConfig,
|
||||||
bucketQuotaConfigFile,
|
bucketQuotaConfigFile,
|
||||||
bucketSSEConfig,
|
bucketSSEConfig,
|
||||||
bucketTaggingConfigFile,
|
bucketTaggingConfig,
|
||||||
objectLockConfig,
|
objectLockConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj
|
|||||||
b.LifecycleConfigXML = configData
|
b.LifecycleConfigXML = configData
|
||||||
case bucketSSEConfig:
|
case bucketSSEConfig:
|
||||||
b.EncryptionConfigXML = configData
|
b.EncryptionConfigXML = configData
|
||||||
case bucketTaggingConfigFile:
|
case bucketTaggingConfig:
|
||||||
b.TaggingConfigXML = configData
|
b.TaggingConfigXML = configData
|
||||||
case objectLockConfig:
|
case objectLockConfig:
|
||||||
b.ObjectLockConfigXML = configData
|
b.ObjectLockConfigXML = configData
|
||||||
|
|||||||
@@ -311,6 +311,8 @@ func validateConfig(s config.Config) error {
|
|||||||
globalNotificationSys.ConfiguredTargetIDs())
|
globalNotificationSys.ConfiguredTargetIDs())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var syncEtcdOnce sync.Once
|
||||||
|
|
||||||
func lookupConfigs(s config.Config) {
|
func lookupConfigs(s config.Config) {
|
||||||
ctx := GlobalContext
|
ctx := GlobalContext
|
||||||
|
|
||||||
@@ -325,14 +327,24 @@ func lookupConfigs(s config.Config) {
|
|||||||
|
|
||||||
etcdCfg, err := etcd.LookupConfig(s[config.EtcdSubSys][config.Default], globalRootCAs)
|
etcdCfg, err := etcd.LookupConfig(s[config.EtcdSubSys][config.Default], globalRootCAs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
|
if globalIsGateway {
|
||||||
|
logger.FatalIf(err, "Unable to initialize etcd config")
|
||||||
|
} else {
|
||||||
|
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if etcdCfg.Enabled {
|
if etcdCfg.Enabled {
|
||||||
globalEtcdClient, err = etcd.New(etcdCfg)
|
syncEtcdOnce.Do(func() {
|
||||||
if err != nil {
|
globalEtcdClient, err = etcd.New(etcdCfg)
|
||||||
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
|
if err != nil {
|
||||||
}
|
if globalIsGateway {
|
||||||
|
logger.FatalIf(err, "Unable to initialize etcd config")
|
||||||
|
} else {
|
||||||
|
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bucket federation is 'true' only when IAM assets are not namespaced
|
// Bucket federation is 'true' only when IAM assets are not namespaced
|
||||||
@@ -377,7 +389,11 @@ func lookupConfigs(s config.Config) {
|
|||||||
|
|
||||||
globalCacheConfig, err = cache.LookupConfig(s[config.CacheSubSys][config.Default])
|
globalCacheConfig, err = cache.LookupConfig(s[config.CacheSubSys][config.Default])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.LogIf(ctx, fmt.Errorf("Unable to setup cache: %w", err))
|
if globalIsGateway {
|
||||||
|
logger.FatalIf(err, "Unable to setup cache")
|
||||||
|
} else {
|
||||||
|
logger.LogIf(ctx, fmt.Errorf("Unable to setup cache: %w", err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if globalCacheConfig.Enabled {
|
if globalCacheConfig.Enabled {
|
||||||
|
|||||||
Reference in New Issue
Block a user