Selaa lähdekoodia

更新配置基线时同步更新环境配置,并支持继承指定版本已有配置

luoshi 2 vuotta sitten
vanhempi
commit
ab449f7d1c

+ 20 - 0
src/main/java/com/qmth/ops/biz/domain/ConfigGroup.java

@@ -33,4 +33,24 @@ public class ConfigGroup {
     public void setAvailable(List<ConfigGroupItem> available) {
         this.available = available;
     }
+
+    public boolean accept(String key, String value) {
+        if (key.startsWith(prefix)) {
+            //有定义允许配置列表
+            if (available != null && !available.isEmpty()) {
+                for (ConfigGroupItem groupItem : available) {
+                    if (groupItem.accept(key, value)) {
+                        return true;
+                    }
+                }
+                //不在允许配置列表内,不能保留
+                return false;
+            }
+            //没有定义允许配置列表,直接保留
+            else {
+                return true;
+            }
+        }
+        return false;
+    }
 }

+ 40 - 0
src/main/java/com/qmth/ops/biz/domain/ConfigGroupItem.java

@@ -1,7 +1,16 @@
 package com.qmth.ops.biz.domain;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public class ConfigGroupItem {
 
+    public static final String KEY_PART_SPLIT = "\\.";
+
+    public static final String FUZZT_REPLACE = "*";
+
+    @JsonIgnore
+    private String[] keyParts;
+
     private String key;
 
     private String description;
@@ -18,6 +27,7 @@ public class ConfigGroupItem {
 
     public void setKey(String key) {
         this.key = key;
+        this.keyParts = key.split(KEY_PART_SPLIT);
     }
 
     public String getDescription() {
@@ -51,4 +61,34 @@ public class ConfigGroupItem {
     public void setOptions(Object[] options) {
         this.options = options;
     }
+
+    public boolean accept(String key, String value) {
+        if (matchKey(key)) {
+            //暂时不增加option校验
+            /*
+            if (options != null && options.length > 0) {
+                return ArrayUtils.contains(options, value);
+            } else {
+                return true;
+            }
+            */
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public boolean matchKey(String key) {
+        String[] parts = key.split(KEY_PART_SPLIT);
+        if (keyParts.length != parts.length) {
+            return false;
+        }
+        for (int i = 0; i < keyParts.length; i++) {
+            if (!keyParts[i].equals(FUZZT_REPLACE) && !keyParts[i].equals(parts[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }

+ 9 - 0
src/main/java/com/qmth/ops/biz/service/ConfigGroupService.java

@@ -39,4 +39,13 @@ public class ConfigGroupService {
     public List<ConfigGroup> getConfigGroupList() {
         return configGroupList;
     }
+
+    public boolean accept(String key, String value) {
+        for (ConfigGroup group : configGroupList) {
+            if (group.accept(key, value)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

+ 71 - 8
src/main/java/com/qmth/ops/biz/service/ConfigService.java

@@ -2,6 +2,7 @@ package com.qmth.ops.biz.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.ops.biz.dao.ConfigItemDao;
@@ -14,18 +15,21 @@ import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
-public class ConfigService {
+public class ConfigService extends ServiceImpl<ConfigItemDao, ConfigItem> {
 
     private static final long BASELINE_ENV_ID = 0L;
 
+    @Resource
+    private EnvService envService;
+
+    @Resource
+    private ConfigGroupService configGroupService;
+
     @Resource
     private ConfigItemDao configItemDao;
 
@@ -54,7 +58,7 @@ public class ConfigService {
         configItemDao.delete(new LambdaUpdateWrapper<ConfigItem>().eq(ConfigItem::getAppId, app.getId())
                 .eq(ConfigItem::getVersionId, version.getId()).eq(ConfigItem::getModuleId, module.getId())
                 .eq(ConfigItem::getEnvId, BASELINE_ENV_ID));
-        Map<String, ConfigItem> baseMap = new HashMap<>();
+        final Map<String, ConfigItem> baseMap = new HashMap<>();
         if (inheritVersion != null) {
             listBaseline(app.getId(), inheritVersion.getId(), module.getId())
                     .forEach(item -> baseMap.put(item.getKey(), item));
@@ -72,9 +76,68 @@ public class ConfigService {
                 item.setMode(base.getMode());
                 item.setComment(base.getComment());
             }
-            configItemDao.insert(item);
         }
-        return listBaseline(app.getId(), version.getId(), module.getId());
+        saveBatch(list);
+        List<ConfigItem> baseline = listBaseline(app.getId(), version.getId(), module.getId());
+        baseMap.clear();
+        baseline.forEach(item -> baseMap.put(item.getKey(), item));
+        List<Env> envList = envService.list(app.getId());
+        for (Env env : envList) {
+            resetEnvConfig(app, version, module, env, inheritVersion, baseMap);
+        }
+        return baseline;
+    }
+
+    /**
+     * 根据指定版本和最新基线,继承环境自定义配置
+     *
+     * @param app
+     * @param version
+     * @param module
+     * @param env
+     * @param inheritVersion
+     * @param baseMap
+     */
+    private void resetEnvConfig(App app, Version version, Module module, Env env, Version inheritVersion,
+            Map<String, ConfigItem> baseMap) {
+        configItemDao.delete(new LambdaUpdateWrapper<ConfigItem>().eq(ConfigItem::getAppId, app.getId())
+                .eq(ConfigItem::getVersionId, version.getId()).eq(ConfigItem::getModuleId, module.getId())
+                .eq(ConfigItem::getEnvId, env.getId()));
+        if (inheritVersion != null) {
+            long time = System.currentTimeMillis();
+            List<ConfigItem> inheritList = listConfigItem(app.getId(), inheritVersion.getId(), module.getId(),
+                    env.getId());
+            List<ConfigItem> saveList = new LinkedList<>();
+            for (ConfigItem item : inheritList) {
+                if (accept(item, baseMap)) {
+                    item.setVersionId(version.getId());
+                    item.setCreateTime(time);
+                    item.setUpdateTime(time);
+                    saveList.add(item);
+                }
+            }
+            saveBatch(saveList);
+        }
+    }
+
+    /**
+     * 继承版本的环境自定义配置,是否可以在当前版本保留
+     *
+     * @param item
+     * @return
+     */
+    private boolean accept(ConfigItem item, Map<String, ConfigItem> baseMap) {
+        //当前基线包含且非只读,可以保留
+        ConfigItem base = baseMap.get(item.getKey());
+        if (base != null && base.getMode() != ConfigMode.READONLY) {
+            return true;
+        }
+        //配置分组判断是否保留
+        if (configGroupService.accept(item.getKey(), item.getValue())) {
+            return true;
+        }
+        //应用自定义且不在基线内,不能保留
+        return false;
     }
 
     @Transactional