Search in sources :

Example 1 with SameConfigPolicy

use of com.alibaba.nacos.config.server.model.SameConfigPolicy in project nacos by alibaba.

the class ConfigController method cloneConfig.

/**
 * Execute clone config operation.
 *
 * @param request         http servlet request .
 * @param srcUser         src user string value.
 * @param namespace       namespace string value.
 * @param configBeansList config beans list.
 * @param policy          config policy model.
 * @return RestResult for map.
 * @throws NacosException NacosException.
 */
@PostMapping(params = "clone=true")
@Secured(action = ActionTypes.WRITE, signType = SignType.CONFIG)
public RestResult<Map<String, Object>> cloneConfig(HttpServletRequest request, @RequestParam(value = "src_user", required = false) String srcUser, @RequestParam(value = "tenant") String namespace, @RequestBody List<SameNamespaceCloneConfigBean> configBeansList, @RequestParam(value = "policy", defaultValue = "ABORT") SameConfigPolicy policy) throws NacosException {
    Map<String, Object> failedData = new HashMap<>(4);
    if (CollectionUtils.isEmpty(configBeansList)) {
        failedData.put("succCount", 0);
        return RestResultUtils.buildResult(ResultCodeEnum.NO_SELECTED_CONFIG, failedData);
    }
    configBeansList.removeAll(Collections.singleton(null));
    namespace = NamespaceUtil.processNamespaceParameter(namespace);
    if (StringUtils.isNotBlank(namespace) && persistService.tenantInfoCountByTenantId(namespace) <= 0) {
        failedData.put("succCount", 0);
        return RestResultUtils.buildResult(ResultCodeEnum.NAMESPACE_NOT_EXIST, failedData);
    }
    List<Long> idList = new ArrayList<>(configBeansList.size());
    Map<Long, SameNamespaceCloneConfigBean> configBeansMap = configBeansList.stream().collect(Collectors.toMap(SameNamespaceCloneConfigBean::getCfgId, cfg -> {
        idList.add(cfg.getCfgId());
        return cfg;
    }, (k1, k2) -> k1));
    List<ConfigAllInfo> queryedDataList = persistService.findAllConfigInfo4Export(null, null, null, null, idList);
    if (queryedDataList == null || queryedDataList.isEmpty()) {
        failedData.put("succCount", 0);
        return RestResultUtils.buildResult(ResultCodeEnum.DATA_EMPTY, failedData);
    }
    List<ConfigAllInfo> configInfoList4Clone = new ArrayList<>(queryedDataList.size());
    for (ConfigAllInfo ci : queryedDataList) {
        SameNamespaceCloneConfigBean paramBean = configBeansMap.get(ci.getId());
        ConfigAllInfo ci4save = new ConfigAllInfo();
        ci4save.setTenant(namespace);
        ci4save.setType(ci.getType());
        ci4save.setGroup((paramBean != null && StringUtils.isNotBlank(paramBean.getGroup())) ? paramBean.getGroup() : ci.getGroup());
        ci4save.setDataId((paramBean != null && StringUtils.isNotBlank(paramBean.getDataId())) ? paramBean.getDataId() : ci.getDataId());
        ci4save.setContent(ci.getContent());
        if (StringUtils.isNotBlank(ci.getAppName())) {
            ci4save.setAppName(ci.getAppName());
        }
        ci4save.setDesc(ci.getDesc());
        ci4save.setEncryptedDataKey(ci.getEncryptedDataKey() == null ? StringUtils.EMPTY : ci.getEncryptedDataKey());
        configInfoList4Clone.add(ci4save);
    }
    final String srcIp = RequestUtil.getRemoteIp(request);
    String requestIpApp = RequestUtil.getAppName(request);
    final Timestamp time = TimeUtils.getCurrentTime();
    Map<String, Object> saveResult = persistService.batchInsertOrUpdate(configInfoList4Clone, srcUser, srcIp, null, time, false, policy);
    for (ConfigInfo configInfo : configInfoList4Clone) {
        ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent(false, configInfo.getDataId(), configInfo.getGroup(), configInfo.getTenant(), time.getTime()));
        ConfigTraceService.logPersistenceEvent(configInfo.getDataId(), configInfo.getGroup(), configInfo.getTenant(), requestIpApp, time.getTime(), InetUtils.getSelfIP(), ConfigTraceService.PERSISTENCE_EVENT_PUB, configInfo.getContent());
    }
    return RestResultUtils.success("Clone Completed Successfully", saveResult);
}
Also used : SameNamespaceCloneConfigBean(com.alibaba.nacos.config.server.controller.parameters.SameNamespaceCloneConfigBean) ConfigType(com.alibaba.nacos.api.config.ConfigType) ConfigMetadata(com.alibaba.nacos.config.server.model.ConfigMetadata) RequestParam(org.springframework.web.bind.annotation.RequestParam) URLDecoder(java.net.URLDecoder) Pair(com.alibaba.nacos.common.utils.Pair) ServletException(javax.servlet.ServletException) Date(java.util.Date) LoggerFactory(org.slf4j.LoggerFactory) Constants(com.alibaba.nacos.config.server.constant.Constants) MapUtil(com.alibaba.nacos.common.utils.MapUtil) ResultCodeEnum(com.alibaba.nacos.config.server.result.code.ResultCodeEnum) Map(java.util.Map) GroupkeyListenserStatus(com.alibaba.nacos.config.server.model.GroupkeyListenserStatus) YamlParserUtil(com.alibaba.nacos.config.server.utils.YamlParserUtil) SameNamespaceCloneConfigBean(com.alibaba.nacos.config.server.controller.parameters.SameNamespaceCloneConfigBean) DeleteMapping(org.springframework.web.bind.annotation.DeleteMapping) RestResult(com.alibaba.nacos.common.model.RestResult) PostMapping(org.springframework.web.bind.annotation.PostMapping) TimeUtils(com.alibaba.nacos.config.server.utils.TimeUtils) HttpHeaders(org.springframework.http.HttpHeaders) Timestamp(java.sql.Timestamp) InetUtils(com.alibaba.nacos.sys.utils.InetUtils) Set(java.util.Set) RestController(org.springframework.web.bind.annotation.RestController) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) List(java.util.List) StringUtils(com.alibaba.nacos.common.utils.StringUtils) ConfigInfo(com.alibaba.nacos.config.server.model.ConfigInfo) CollectionUtils(org.springframework.util.CollectionUtils) RestResultUtils(com.alibaba.nacos.common.model.RestResultUtils) ActionTypes(com.alibaba.nacos.plugin.auth.constant.ActionTypes) Secured(com.alibaba.nacos.auth.annotation.Secured) DateFormatUtils(com.alibaba.nacos.common.utils.DateFormatUtils) ConfigDataChangeEvent(com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent) ConfigTraceService(com.alibaba.nacos.config.server.service.trace.ConfigTraceService) SignType(com.alibaba.nacos.plugin.auth.constant.SignType) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) HashMap(java.util.HashMap) NamespaceUtil(com.alibaba.nacos.common.utils.NamespaceUtil) RequestUtil(com.alibaba.nacos.config.server.utils.RequestUtil) ConfigAllInfo(com.alibaba.nacos.config.server.model.ConfigAllInfo) PersistService(com.alibaba.nacos.config.server.service.repository.PersistService) ArrayList(java.util.ArrayList) RequestBody(org.springframework.web.bind.annotation.RequestBody) HttpServletRequest(javax.servlet.http.HttpServletRequest) ZipUtils(com.alibaba.nacos.config.server.utils.ZipUtils) ConfigInfo4Beta(com.alibaba.nacos.config.server.model.ConfigInfo4Beta) EncryptionHandler(com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler) NacosException(com.alibaba.nacos.api.exception.NacosException) ConfigAdvanceInfo(com.alibaba.nacos.config.server.model.ConfigAdvanceInfo) GetMapping(org.springframework.web.bind.annotation.GetMapping) Page(com.alibaba.nacos.config.server.model.Page) SameConfigPolicy(com.alibaba.nacos.config.server.model.SameConfigPolicy) ParamUtils(com.alibaba.nacos.config.server.utils.ParamUtils) Logger(org.slf4j.Logger) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) GroupKey(com.alibaba.nacos.config.server.utils.GroupKey) ConfigSubService(com.alibaba.nacos.config.server.service.ConfigSubService) HttpStatus(org.springframework.http.HttpStatus) AggrWhitelist(com.alibaba.nacos.config.server.service.AggrWhitelist) MD5Util(com.alibaba.nacos.config.server.utils.MD5Util) ConfigChangePublisher(com.alibaba.nacos.config.server.service.ConfigChangePublisher) SampleResult(com.alibaba.nacos.config.server.model.SampleResult) MultipartFile(org.springframework.web.multipart.MultipartFile) ResponseEntity(org.springframework.http.ResponseEntity) Collections(java.util.Collections) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ConfigInfo(com.alibaba.nacos.config.server.model.ConfigInfo) Timestamp(java.sql.Timestamp) ConfigAllInfo(com.alibaba.nacos.config.server.model.ConfigAllInfo) ConfigDataChangeEvent(com.alibaba.nacos.config.server.model.event.ConfigDataChangeEvent) PostMapping(org.springframework.web.bind.annotation.PostMapping) Secured(com.alibaba.nacos.auth.annotation.Secured)

Example 2 with SameConfigPolicy

use of com.alibaba.nacos.config.server.model.SameConfigPolicy in project nacos by alibaba.

the class EmbeddedStoragePersistServiceImpl method batchInsertOrUpdate.

@Override
public Map<String, Object> batchInsertOrUpdate(List<ConfigAllInfo> configInfoList, String srcUser, String srcIp, Map<String, Object> configAdvanceInfo, Timestamp time, boolean notify, SameConfigPolicy policy) throws NacosException {
    int succCount = 0;
    int skipCount = 0;
    List<Map<String, String>> failData = null;
    List<Map<String, String>> skipData = null;
    final BiConsumer<Boolean, Throwable> callFinally = (result, t) -> {
        if (t != null) {
            throw new NacosRuntimeException(0, t);
        }
    };
    for (int i = 0; i < configInfoList.size(); i++) {
        ConfigAllInfo configInfo = configInfoList.get(i);
        try {
            ParamUtils.checkParam(configInfo.getDataId(), configInfo.getGroup(), "datumId", configInfo.getContent());
        } catch (Throwable e) {
            DEFAULT_LOG.error("data verification failed", e);
            throw e;
        }
        ConfigInfo configInfo2Save = new ConfigInfo(configInfo.getDataId(), configInfo.getGroup(), configInfo.getTenant(), configInfo.getAppName(), configInfo.getContent());
        configInfo2Save.setEncryptedDataKey(configInfo.getEncryptedDataKey() == null ? "" : configInfo.getEncryptedDataKey());
        String type = configInfo.getType();
        if (StringUtils.isBlank(type)) {
            // simple judgment of file type based on suffix
            if (configInfo.getDataId().contains(SPOT)) {
                String extName = configInfo.getDataId().substring(configInfo.getDataId().lastIndexOf(SPOT) + 1);
                FileTypeEnum fileTypeEnum = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(extName);
                type = fileTypeEnum.getFileType();
            } else {
                type = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(null).getFileType();
            }
        }
        if (configAdvanceInfo == null) {
            configAdvanceInfo = new HashMap<>(16);
        }
        configAdvanceInfo.put("type", type);
        configAdvanceInfo.put("desc", configInfo.getDesc());
        try {
            ConfigInfo foundCfg = findConfigInfo(configInfo2Save.getDataId(), configInfo2Save.getGroup(), configInfo2Save.getTenant());
            if (foundCfg != null) {
                throw new Throwable("DuplicateKeyException: config already exists, should be overridden");
            }
            addConfigInfo(srcIp, srcUser, configInfo2Save, time, configAdvanceInfo, notify, callFinally);
            succCount++;
        } catch (Throwable e) {
            if (!StringUtils.contains(e.toString(), "DuplicateKeyException")) {
                throw new NacosException(NacosException.SERVER_ERROR, e);
            }
            // uniqueness constraint conflict
            if (SameConfigPolicy.ABORT.equals(policy)) {
                failData = new ArrayList<>();
                skipData = new ArrayList<>();
                Map<String, String> faileditem = new HashMap<>(2);
                faileditem.put("dataId", configInfo2Save.getDataId());
                faileditem.put("group", configInfo2Save.getGroup());
                failData.add(faileditem);
                for (int j = (i + 1); j < configInfoList.size(); j++) {
                    ConfigInfo skipConfigInfo = configInfoList.get(j);
                    Map<String, String> skipitem = new HashMap<>(2);
                    skipitem.put("dataId", skipConfigInfo.getDataId());
                    skipitem.put("group", skipConfigInfo.getGroup());
                    skipData.add(skipitem);
                }
                break;
            } else if (SameConfigPolicy.SKIP.equals(policy)) {
                skipCount++;
                if (skipData == null) {
                    skipData = new ArrayList<>();
                }
                Map<String, String> skipitem = new HashMap<>(2);
                skipitem.put("dataId", configInfo2Save.getDataId());
                skipitem.put("group", configInfo2Save.getGroup());
                skipData.add(skipitem);
            } else if (SameConfigPolicy.OVERWRITE.equals(policy)) {
                succCount++;
                updateConfigInfo(configInfo2Save, srcIp, srcUser, time, configAdvanceInfo, notify);
            }
        }
    }
    Map<String, Object> result = new HashMap<>(4);
    result.put("succCount", succCount);
    result.put("skipCount", skipCount);
    if (failData != null && !failData.isEmpty()) {
        result.put("failData", failData);
    }
    if (skipData != null && !skipData.isEmpty()) {
        result.put("skipData", skipData);
    }
    return result;
}
Also used : NotifyCenter(com.alibaba.nacos.common.notify.NotifyCenter) Pair(com.alibaba.nacos.common.utils.Pair) CONFIG_KEY_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_KEY_ROW_MAPPER) Constants(com.alibaba.nacos.config.server.constant.Constants) HISTORY_DETAIL_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.HISTORY_DETAIL_ROW_MAPPER) ConfigInfoBase(com.alibaba.nacos.config.server.model.ConfigInfoBase) MD5Utils(com.alibaba.nacos.common.utils.MD5Utils) CONFIG_INFO_BASE_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_BASE_ROW_MAPPER) HISTORY_LIST_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.HISTORY_LIST_ROW_MAPPER) TENANT_INFO_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.TENANT_INFO_ROW_MAPPER) Map(java.util.Map) CONFIG_INFO_WRAPPER_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_WRAPPER_ROW_MAPPER) CONFIG_INFO_CHANGED_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_CHANGED_ROW_MAPPER) NacosConfigException(com.alibaba.nacos.config.server.exception.NacosConfigException) CONFIG_ADVANCE_INFO_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_ADVANCE_INFO_ROW_MAPPER) SubInfo(com.alibaba.nacos.config.server.model.SubInfo) IdGeneratorManager(com.alibaba.nacos.core.distributed.id.IdGeneratorManager) CONFIG_INFO_TAG_WRAPPER_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_TAG_WRAPPER_ROW_MAPPER) CONFIG_ALL_INFO_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_ALL_INFO_ROW_MAPPER) MAP_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.MAP_ROW_MAPPER) DynamicDataSource(com.alibaba.nacos.config.server.service.datasource.DynamicDataSource) Timestamp(java.sql.Timestamp) CONFIG_INFO_AGGR_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_AGGR_ROW_MAPPER) CONFIG_INFO_BETA_WRAPPER_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_BETA_WRAPPER_ROW_MAPPER) Collectors(java.util.stream.Collectors) CONFIG_INFO_ROW_MAPPER(com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO_ROW_MAPPER) ConfigInfoTagWrapper(com.alibaba.nacos.config.server.model.ConfigInfoTagWrapper) Objects(java.util.Objects) List(java.util.List) DEFAULT_LOG(com.alibaba.nacos.config.server.utils.LogUtil.DEFAULT_LOG) ConfigInfo(com.alibaba.nacos.config.server.model.ConfigInfo) StringUtils(com.alibaba.nacos.common.utils.StringUtils) PostConstruct(javax.annotation.PostConstruct) Entry(java.util.Map.Entry) Optional(java.util.Optional) Conditional(org.springframework.context.annotation.Conditional) TenantInfo(com.alibaba.nacos.config.server.model.TenantInfo) LogUtil(com.alibaba.nacos.config.server.utils.LogUtil) FileTypeEnum(com.alibaba.nacos.config.server.enums.FileTypeEnum) HashMap(java.util.HashMap) ConfigAllInfo(com.alibaba.nacos.config.server.model.ConfigAllInfo) ConfigInfoAggr(com.alibaba.nacos.config.server.model.ConfigInfoAggr) PersistService(com.alibaba.nacos.config.server.service.repository.PersistService) JdbcTemplate(org.springframework.jdbc.core.JdbcTemplate) ArrayList(java.util.ArrayList) CollectionUtils(org.apache.commons.collections.CollectionUtils) EncryptionHandler(com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler) NacosException(com.alibaba.nacos.api.exception.NacosException) EmbeddedStorageContextUtils(com.alibaba.nacos.config.server.service.sql.EmbeddedStorageContextUtils) BiConsumer(java.util.function.BiConsumer) ConfigAdvanceInfo(com.alibaba.nacos.config.server.model.ConfigAdvanceInfo) ConfigHistoryInfo(com.alibaba.nacos.config.server.model.ConfigHistoryInfo) ConfigKey(com.alibaba.nacos.config.server.model.ConfigKey) Page(com.alibaba.nacos.config.server.model.Page) NacosRuntimeException(com.alibaba.nacos.api.exception.runtime.NacosRuntimeException) ConditionOnEmbeddedStorage(com.alibaba.nacos.config.server.configuration.ConditionOnEmbeddedStorage) SameConfigPolicy(com.alibaba.nacos.config.server.model.SameConfigPolicy) ParamUtils(com.alibaba.nacos.config.server.utils.ParamUtils) ConfigInfoWrapper(com.alibaba.nacos.config.server.model.ConfigInfoWrapper) DerbyImportEvent(com.alibaba.nacos.config.server.model.event.DerbyImportEvent) IOException(java.io.IOException) ConfigInfoBetaWrapper(com.alibaba.nacos.config.server.model.ConfigInfoBetaWrapper) ConfigInfoChanged(com.alibaba.nacos.config.server.model.ConfigInfoChanged) PaginationHelper(com.alibaba.nacos.config.server.service.repository.PaginationHelper) Component(org.springframework.stereotype.Component) TransactionTemplate(org.springframework.transaction.support.TransactionTemplate) Collections(java.util.Collections) DataSourceService(com.alibaba.nacos.config.server.service.datasource.DataSourceService) HashMap(java.util.HashMap) FileTypeEnum(com.alibaba.nacos.config.server.enums.FileTypeEnum) ArrayList(java.util.ArrayList) ConfigInfo(com.alibaba.nacos.config.server.model.ConfigInfo) NacosRuntimeException(com.alibaba.nacos.api.exception.runtime.NacosRuntimeException) NacosException(com.alibaba.nacos.api.exception.NacosException) ConfigAllInfo(com.alibaba.nacos.config.server.model.ConfigAllInfo) Map(java.util.Map) HashMap(java.util.HashMap)

Aggregations

NacosException (com.alibaba.nacos.api.exception.NacosException)2 Pair (com.alibaba.nacos.common.utils.Pair)2 StringUtils (com.alibaba.nacos.common.utils.StringUtils)2 Constants (com.alibaba.nacos.config.server.constant.Constants)2 ConfigAdvanceInfo (com.alibaba.nacos.config.server.model.ConfigAdvanceInfo)2 ConfigAllInfo (com.alibaba.nacos.config.server.model.ConfigAllInfo)2 ConfigInfo (com.alibaba.nacos.config.server.model.ConfigInfo)2 Page (com.alibaba.nacos.config.server.model.Page)2 SameConfigPolicy (com.alibaba.nacos.config.server.model.SameConfigPolicy)2 PersistService (com.alibaba.nacos.config.server.service.repository.PersistService)2 ConfigType (com.alibaba.nacos.api.config.ConfigType)1 NacosRuntimeException (com.alibaba.nacos.api.exception.runtime.NacosRuntimeException)1 Secured (com.alibaba.nacos.auth.annotation.Secured)1 RestResult (com.alibaba.nacos.common.model.RestResult)1 RestResultUtils (com.alibaba.nacos.common.model.RestResultUtils)1 NotifyCenter (com.alibaba.nacos.common.notify.NotifyCenter)1 DateFormatUtils (com.alibaba.nacos.common.utils.DateFormatUtils)1 MD5Utils (com.alibaba.nacos.common.utils.MD5Utils)1 MapUtil (com.alibaba.nacos.common.utils.MapUtil)1 NamespaceUtil (com.alibaba.nacos.common.utils.NamespaceUtil)1