pkg/admin/services/override_service_impl.go (304 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package services import ( "strings" "github.com/dubbogo/gost/encoding/yaml" "github.com/apache/dubbo-admin/pkg/admin/config" "github.com/apache/dubbo-admin/pkg/admin/constant" "github.com/apache/dubbo-admin/pkg/admin/model" "github.com/apache/dubbo-admin/pkg/admin/model/util" util2 "github.com/apache/dubbo-admin/pkg/admin/util" "github.com/apache/dubbo-admin/pkg/logger" ) type OverrideServiceImpl struct{} func (s *OverrideServiceImpl) SaveOverride(dynamicConfig *model.DynamicConfig) error { id := util2.BuildServiceKey(dynamicConfig.Base.Application, dynamicConfig.Base.Service, dynamicConfig.Base.ServiceVersion, dynamicConfig.Base.ServiceGroup) path := GetOverridePath(id) existConfig, err := config.Governance.GetConfig(path) if err != nil { if _, ok := err.(*config.RuleNotFound); !ok { logger.Logger().Error(err.Error()) return err } } existOverride := dynamicConfig.ToOverride() configs := []model.OverrideConfig{} if existConfig != "" { err := yaml.UnmarshalYML([]byte(existConfig), existOverride) if err != nil { logger.Logger().Error(err.Error()) return err } if len(existOverride.Configs) > 0 { for _, c := range existOverride.Configs { if constant.Configs.Contains(c.Type) { configs = append(configs, c) } } } } configs = append(configs, dynamicConfig.Configs...) existOverride.Enabled = dynamicConfig.Enabled existOverride.Configs = configs if b, err := yaml.MarshalYML(existOverride); err != nil { logger.Logger().Error(err.Error()) return err } else { err := config.Governance.SetConfig(path, string(b)) if err != nil { logger.Logger().Error(err.Error()) return err } } // for 2.6 if dynamicConfig.Service != "" { result := dynamicConfig.ToOldOverride() for _, o := range result { url, err := util.OldOverride2URL(o) if err != nil { logger.Logger().Error(err.Error()) return err } err = config.Governance.Register(url) if err != nil { logger.Logger().Error(err.Error()) return err } } } return nil } func (s *OverrideServiceImpl) UpdateOverride(update *model.DynamicConfig) error { id := util2.BuildServiceKey(update.Base.Application, update.Base.Service, update.Base.ServiceVersion, update.Base.ServiceGroup) path := GetOverridePath(id) existConfig, err := config.Governance.GetConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } override := &model.Override{} err = yaml.UnmarshalYML([]byte(existConfig), override) if err != nil { logger.Logger().Error(err.Error()) return err } old := override.ToDynamicConfig() configs := make([]model.OverrideConfig, 0) if len(override.Configs) > 0 { for _, c := range override.Configs { if constant.Configs.Contains(c.Type) { configs = append(configs, c) } } } configs = append(configs, update.Configs...) override.Configs = configs override.Enabled = update.Enabled if b, err := yaml.MarshalYML(override); err != nil { logger.Logger().Error(err.Error()) return err } else { err := config.Governance.SetConfig(path, string(b)) if err != nil { logger.Logger().Error(err.Error()) return err } } // for 2.6 if update.Service != "" { oldOverrides := old.ToOldOverride() updatedOverrides := update.ToOldOverride() for _, o := range oldOverrides { url, err := util.OldOverride2URL(o) if err != nil { return err } config.Governance.UnRegister(url) } for _, o := range updatedOverrides { url, err := util.OldOverride2URL(o) if err != nil { return err } config.Governance.Register(url) } } return nil } func (s *OverrideServiceImpl) DisableOverride(id string) error { path := GetOverridePath(id) conf, err := config.Governance.GetConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } override := &model.Override{} err = yaml.UnmarshalYML([]byte(conf), override) if err != nil { logger.Logger().Error(err.Error()) return err } old := override.ToDynamicConfig() override.Enabled = false if b, err := yaml.MarshalYML(override); err != nil { logger.Logger().Error(err.Error()) return err } else { err := config.Governance.SetConfig(path, string(b)) if err != nil { return err } } // for 2.6 if override.Scope == constant.Service { overrides := old.ToOldOverride() for _, o := range overrides { o.Enabled = true url, err := util.OldOverride2URL(o) if err != nil { logger.Logger().Error(err.Error()) return err } config.Governance.UnRegister(url) o.Enabled = false url, err = util.OldOverride2URL(o) if err != nil { logger.Logger().Error(err.Error()) return err } config.Governance.Register(url) } } return nil } func (s *OverrideServiceImpl) FindOverride(id string) (*model.DynamicConfig, error) { path := GetOverridePath(id) conf, err := config.Governance.GetConfig(path) if err != nil { logger.Logger().Error(err.Error()) return nil, err } if conf != "" { override := &model.Override{} err := yaml.UnmarshalYML([]byte(conf), override) if err != nil { logger.Logger().Error(err.Error()) return nil, err } dynamicConfig := override.ToDynamicConfig() if dynamicConfig != nil { dynamicConfig.ID = id if constant.Service == override.Scope { dynamicConfig.Service = util2.GetInterface(id) dynamicConfig.ServiceGroup = util2.GetGroup(id) dynamicConfig.ServiceVersion = util2.GetVersion(id) } } return dynamicConfig, nil } return nil, nil } func (s *OverrideServiceImpl) EnableOverride(id string) error { path := GetOverridePath(id) conf, err := config.Governance.GetConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } override := &model.Override{} err = yaml.UnmarshalYML([]byte(conf), override) if err != nil { logger.Logger().Error(err.Error()) return err } old := override.ToDynamicConfig() override.Enabled = true if b, err := yaml.MarshalYML(override); err != nil { logger.Logger().Error(err.Error()) return err } else { err := config.Governance.SetConfig(path, string(b)) if err != nil { logger.Logger().Error(err.Error()) return err } } // for 2.6 if override.Scope == constant.Service { overrides := old.ToOldOverride() for _, o := range overrides { o.Enabled = false url, err := util.OldOverride2URL(o) if err != nil { return err } config.Governance.UnRegister(url) o.Enabled = true url, err = util.OldOverride2URL(o) if err != nil { return err } config.Governance.Register(url) } } return nil } func (s *OverrideServiceImpl) DeleteOverride(id string) error { path := GetOverridePath(id) conf, err := config.Governance.GetConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } override := &model.Override{} err = yaml.UnmarshalYML([]byte(conf), override) if err != nil { logger.Logger().Error(err.Error()) return err } old := override.ToDynamicConfig() if len(override.Configs) > 0 { newConfigs := make([]model.OverrideConfig, 0) for _, c := range override.Configs { if constant.Configs.Contains(c.Type) { newConfigs = append(newConfigs, c) } } if len(newConfigs) == 0 { err := config.Governance.DeleteConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } } else { override.Configs = newConfigs if b, err := yaml.MarshalYML(override); err != nil { logger.Logger().Error(err.Error()) return err } else { err := config.Governance.SetConfig(path, string(b)) if err != nil { logger.Logger().Error(err.Error()) return err } } } } else { err := config.Governance.DeleteConfig(path) if err != nil { logger.Logger().Error(err.Error()) return err } } // for 2.6 if override.Scope == constant.Service { overrides := old.ToOldOverride() for _, o := range overrides { url, err := util.OldOverride2URL(o) if err != nil { logger.Logger().Error(err.Error()) return err } config.Governance.UnRegister(url) } } return nil } func GetOverridePath(key string) string { key = strings.Replace(key, "/", "*", -1) return key + constant.ConfiguratorRuleSuffix }