diff --git a/base/constant.go b/base/constant.go index 3a1f5efa..86dca389 100644 --- a/base/constant.go +++ b/base/constant.go @@ -294,6 +294,7 @@ var ErrorInvalidColNamespaceFormat = fmt.Errorf("Invalid CollectionNamespace for var ErrorCAPIDeprecated = errors.New("CAPI replication mode is now deprecated") var ReplicationSpecNotFoundErrorMessage = "requested resource not found" var ReplNotFoundErr = errors.New(ReplicationSpecNotFoundErrorMessage) +var ErrorExplicitMappingEnterpriseOnly = errors.New("Explicit Mapping is supported in Enterprise Edition only") func GetBackfillFatalDataLossError(specId string) error { return fmt.Errorf("%v experienced fatal error when trying to create backfill request. To prevent data loss, the pipeline must restream from the beginning", specId) diff --git a/metadata/replicationSettings_test.go b/metadata/replicationSettings_test.go index 66be890b..35986877 100644 --- a/metadata/replicationSettings_test.go +++ b/metadata/replicationSettings_test.go @@ -168,14 +168,14 @@ func TestValidateSettingExpDelFlagPersist(t *testing.T) { var valArr []string = []string{"true"} var key string = FilterExpKey checkValArr := valArr[0] - retKey, retValArr, err := helper.CheckAndConvertMultiValue(key, valArr) + retKey, retValArr, err := helper.CheckAndConvertMultiValue(key, valArr, false) assert.Equal(base.FilterExpDelKey, retKey) assert.NotEqual(retValArr[0], checkValArr) assert.Nil(err) assert.Equal(retValArr[0], base.FilterExpDelSkipExpiration.String()) key = FilterDelKey valArr[0] = "true" - retKey, retValArr, err = helper.CheckAndConvertMultiValue(key, valArr) + retKey, retValArr, err = helper.CheckAndConvertMultiValue(key, valArr, false) var checkVal base.FilterExpDelType checkVal.SetSkipDeletes(true) checkVal.SetSkipExpiration(true) @@ -192,13 +192,13 @@ func TestMultiValueHelperCheckAndConvert(t *testing.T) { // Assuming user passes in 2 flags, skipDel and skipExp key := FilterExpKey valArr = append(valArr, "true") - key, valArr, err := mvHelper.CheckAndConvertMultiValue(key, valArr) + key, valArr, err := mvHelper.CheckAndConvertMultiValue(key, valArr, false) assert.Nil(err) assert.NotEqual(FilterExpKey, key) assert.NotEqual("true", valArr[0]) key = FilterDelKey valArr[0] = "true" - key, valArr, err = mvHelper.CheckAndConvertMultiValue(key, valArr) + key, valArr, err = mvHelper.CheckAndConvertMultiValue(key, valArr, false) assert.Nil(err) // test export to settingsmap @@ -223,13 +223,13 @@ func TestMultiValueHelperCheckAndConvert(t *testing.T) { mvHelper = NewMultiValueHelper() key = FilterExpKey valArr[0] = "false" - mvHelper.CheckAndConvertMultiValue(key, valArr) + mvHelper.CheckAndConvertMultiValue(key, valArr, false) key = FilterDelKey valArr[0] = "true" - mvHelper.CheckAndConvertMultiValue(key, valArr) + mvHelper.CheckAndConvertMultiValue(key, valArr, false) key = BypassExpiryKey valArr[0] = "false" - mvHelper.CheckAndConvertMultiValue(key, valArr) + mvHelper.CheckAndConvertMultiValue(key, valArr, false) mvHelper.ExportToSettingsMap(settingsMap) assert.Equal(1, len(settingsMap)) replSettings.UpdateSettingsFromMap(settingsMap) diff --git a/metadata/replication_settings.go b/metadata/replication_settings.go index a1a18e78..0c107775 100644 --- a/metadata/replication_settings.go +++ b/metadata/replication_settings.go @@ -261,7 +261,7 @@ func NewMultiValueHelper() *ReplicationMultiValueHelper { } } -func (r *ReplicationMultiValueHelper) CheckAndConvertMultiValue(key string, valArr []string) (restKey string, outValArr []string, err error) { +func (r *ReplicationMultiValueHelper) CheckAndConvertMultiValue(key string, valArr []string, isEnterprise bool) (restKey string, outValArr []string, err error) { var settingsConfigKey string var newVal interface{} for k, v := range MultiValueMap { @@ -297,7 +297,7 @@ func (r *ReplicationMultiValueHelper) CheckAndConvertMultiValue(key string, valA r.activeConfig[settingsConfigKey] = newVal outValArr[0] = newVal.(base.FilterExpDelType).String() case CollectionsMgtMultiKey: - newVal, err = r.handleCollectionsMgtKey(r.activeConfig[settingsConfigKey].(base.CollectionsMgtType), key, valArr[0]) + newVal, err = r.handleCollectionsMgtKey(r.activeConfig[settingsConfigKey].(base.CollectionsMgtType), key, valArr[0], isEnterprise) if err != nil { return } @@ -310,7 +310,7 @@ func (r *ReplicationMultiValueHelper) CheckAndConvertMultiValue(key string, valA return } -func (r *ReplicationMultiValueHelper) handleCollectionsMgtKey(curConfig base.CollectionsMgtType, key, val string) (retVal interface{}, err error) { +func (r *ReplicationMultiValueHelper) handleCollectionsMgtKey(curConfig base.CollectionsMgtType, key, val string, enterprise bool) (retVal interface{}, err error) { boolVal, err := r.parseBoolAndMarkSet(key, val) if err != nil { return @@ -318,10 +318,18 @@ func (r *ReplicationMultiValueHelper) handleCollectionsMgtKey(curConfig base.Col switch key { case CollectionsMgtMappingKey: + if !enterprise && boolVal { + err = base.ErrorExplicitMappingEnterpriseOnly + return + } curConfig.SetExplicitMapping(boolVal) case CollectionsMgtMirrorKey: curConfig.SetMirroring(boolVal) case CollectionsMgtMigrateKey: + if !enterprise && boolVal { + err = base.ErrorColMigrationEnterpriseOnly + return + } curConfig.SetMigration(boolVal) case CollectionsMgtOsoKey: curConfig.SetOSO(boolVal) diff --git a/replication_manager/msg_utils.go b/replication_manager/msg_utils.go index 2fff94b5..5cac0930 100644 --- a/replication_manager/msg_utils.go +++ b/replication_manager/msg_utils.go @@ -859,7 +859,7 @@ func DecodeSettingsFromRequest(request *http.Request, isDefaultSettings bool, is } for key, valArr := range request.Form { - key, valArr, err := mvHelper.CheckAndConvertMultiValue(key, valArr) + key, valArr, err := mvHelper.CheckAndConvertMultiValue(key, valArr, isEnterprise) if err != nil { errorsMap[key] = err continue