This is an automated email from the ASF dual-hosted git repository. dockerzhang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new 1ba62ecc0b [INLONG-10363][Manager] Support template multi tenant management (#10372) 1ba62ecc0b is described below commit 1ba62ecc0ba1fb5b6ccc188c3ca88cbec34dbf51 Author: fuweng11 <76141879+fuwen...@users.noreply.github.com> AuthorDate: Tue Jun 11 20:51:32 2024 +0800 [INLONG-10363][Manager] Support template multi tenant management (#10372) --- .../manager/common/enums/OperationTarget.java | 4 +- .../manager/dao/entity/TenantTemplateEntity.java} | 44 ++++---- .../dao/mapper/TenantTemplateEntityMapper.java} | 35 +++---- .../resources/mappers/TemplateEntityMapper.xml | 1 + .../mappers/TenantTemplateEntityMapper.xml | 112 +++++++++++++++++++++ .../inlong/manager/pojo/stream/TemplateField.java | 2 +- .../manager/pojo/stream/TenantTemplateInfo.java | 63 ++++++++++++ .../pojo/stream/TenantTemplatePageRequest.java | 48 +++++++++ .../manager/pojo/stream/TenantTemplateRequest.java | 53 ++++++++++ .../service/stream/TemplateServiceImpl.java | 47 +++++++++ .../main/resources/h2/apache_inlong_manager.sql | 18 ++++ .../manager-web/sql/apache_inlong_manager.sql | 21 +++- inlong-manager/manager-web/sql/changes-1.13.0.sql | 19 ++++ .../manager/web/controller/TemplateController.java | 106 +++++++++++++++++++ 14 files changed, 522 insertions(+), 51 deletions(-) diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java index e6c866a0e1..d92fb31b33 100644 --- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java +++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java @@ -44,6 +44,8 @@ public enum OperationTarget { INLONG_ROLE, - TENANT_ROLE + TENANT_ROLE, + + TEMPLATE } diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java similarity index 61% copy from inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java copy to inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java index e6c866a0e1..e1ceb81143 100644 --- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java +++ b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java @@ -15,35 +15,25 @@ * limitations under the License. */ -package org.apache.inlong.manager.common.enums; +package org.apache.inlong.manager.dao.entity; -/** - * Operation target - */ -public enum OperationTarget { - - TENANT, - - GROUP, - - STREAM, - - SOURCE, - - SINK, - - CONSUME, - - WORKFLOW, - - NODE, - - CLUSTER, +import lombok.Data; - TRANSFORM, +import java.io.Serializable; +import java.util.Date; - INLONG_ROLE, +@Data +public class TenantTemplateEntity implements Serializable { - TENANT_ROLE + private static final long serialVersionUID = 1L; -} + private Integer id; + private String tenant; + private String templateName; + private Integer isDeleted; + private String creator; + private String modifier; + private Date createTime; + private Date modifyTime; + private Integer version; +} \ No newline at end of file diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java similarity index 52% copy from inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java copy to inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java index e6c866a0e1..22c037a278 100644 --- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java +++ b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java @@ -15,35 +15,28 @@ * limitations under the License. */ -package org.apache.inlong.manager.common.enums; +package org.apache.inlong.manager.dao.mapper; -/** - * Operation target - */ -public enum OperationTarget { - - TENANT, - - GROUP, - - STREAM, +import org.apache.inlong.manager.dao.entity.TenantTemplateEntity; +import org.apache.inlong.manager.pojo.cluster.TenantClusterTagPageRequest; - SOURCE, +import org.springframework.stereotype.Repository; - SINK, +import java.util.List; - CONSUME, +@Repository +public interface TenantTemplateEntityMapper { - WORKFLOW, + int updateByIdSelective(TenantTemplateEntity record); - NODE, + int insert(TenantTemplateEntity record); - CLUSTER, + TenantTemplateEntity selectByPrimaryKey(Integer id); - TRANSFORM, + TenantTemplateEntity selectByUniqueKey(String templateName, String tenant); - INLONG_ROLE, + List<TenantTemplateEntity> selectByTemplateName(String templateName); - TENANT_ROLE + List<TenantTemplateEntity> selectByCondition(TenantClusterTagPageRequest request); -} +} \ No newline at end of file diff --git a/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml b/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml index 9766c9c9d8..93e020cf64 100644 --- a/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml +++ b/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml @@ -75,6 +75,7 @@ and (t.visible_range = "ALL" or (t.visible_range = "IN_CHARGE" and find_in_set(#{currentUser, jdbcType=VARCHAR}, t.in_charges)) + or (t.visible_range = "TENANT" and #{tenant, jdbcType=VARCHAR} in (select tet.tenant from tenant_template tet where tet.template_name = t.name and tet.is_deleted=0 )) ) <if test="visibleRange != null"> and t.visible_range = #{visibleRange,jdbcType=VARCHAR} diff --git a/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml b/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml new file mode 100644 index 0000000000..025bc963a1 --- /dev/null +++ b/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> + +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.apache.inlong.manager.dao.mapper.TenantTemplateEntityMapper"> + <resultMap id="BaseResultMap" type="org.apache.inlong.manager.dao.entity.TenantTemplateEntity"> + <id column="id" jdbcType="INTEGER" property="id" /> + <result column="tenant" jdbcType="VARCHAR" property="tenant" /> + <result column="template_name" jdbcType="VARCHAR" property="templateName" /> + <result column="is_deleted" jdbcType="INTEGER" property="isDeleted" /> + <result column="creator" jdbcType="VARCHAR" property="creator" /> + <result column="modifier" jdbcType="VARCHAR" property="modifier" /> + <result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> + <result column="modify_time" jdbcType="TIMESTAMP" property="modifyTime" /> + <result column="version" jdbcType="INTEGER" property="version" /> + </resultMap> + <sql id="Base_Column_List"> + id, tenant, template_name, is_deleted, creator, modifier, create_time, modify_time, + version + </sql> + <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap"> + select + <include refid="Base_Column_List" /> + from tenant_template + where id = #{id,jdbcType=INTEGER} + </select> + <select id="selectByUniqueKey" resultMap="BaseResultMap"> + select + <include refid="Base_Column_List" /> + from tenant_template + where tenant = #{tenant,jdbcType=VARCHAR} + and template_name = #{templateName,jdbcType=VARCHAR} + and is_deleted = 0 + </select> + <select id="selectByTemplateName" parameterType="java.lang.String" resultMap="BaseResultMap"> + select + <include refid="Base_Column_List" /> + from tenant_template + where is_deleted = 0 + and template_name = #{templateName,jdbcType=VARCHAR} + </select> + <select id="selectByCondition" parameterType="org.apache.inlong.manager.pojo.stream.TenantTemplatePageRequest" + resultMap="BaseResultMap"> + select + <include refid="Base_Column_List" /> + from tenant_template + <where> + is_deleted = 0 + <if test="tenant != null and tenant != ''"> + and tenant = #{tenant,jdbcType=VARCHAR} + </if> + <if test="keyword != null and keyword != ''"> + and template_name like CONCAT('%', #{keyword}, '%') + </if> + <if test="tenantList != null and tenantList.size() > 0"> + and tenant in + <foreach item="item" index="index" collection="tenantList" open="(" close=")" separator=","> + #{item} + </foreach> + </if> + </where> + group by template_name, tenant + order by modify_time desc + </select> + <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer"> + delete from tenant_template + where id = #{id,jdbcType=INTEGER} + </delete> + <insert id="insert" parameterType="org.apache.inlong.manager.dao.entity.TenantTemplateEntity"> + insert into tenant_template (id, tenant, template_name, + creator, modifier) + values (#{id,jdbcType=INTEGER}, #{tenant,jdbcType=VARCHAR}, #{templateName,jdbcType=VARCHAR}, + #{creator,jdbcType=VARCHAR}, #{modifier,jdbcType=VARCHAR}) + </insert> + <update id="updateByIdSelective" parameterType="org.apache.inlong.manager.dao.entity.TenantTemplateEntity"> + update tenant_template + <set> + <if test="tenant != null"> + tenant = #{tenant,jdbcType=VARCHAR}, + </if> + <if test="templateName != null"> + template_name = #{templateName,jdbcType=VARCHAR}, + </if> + <if test="isDeleted != null"> + is_deleted = #{isDeleted,jdbcType=INTEGER}, + </if> + <if test="modifier != null"> + modifier = #{modifier,jdbcType=VARCHAR}, + </if> + version = #{version,jdbcType=INTEGER} + 1 + </set> + where id = #{id,jdbcType=INTEGER} + and version = #{version,jdbcType=INTEGER} + </update> +</mapper> \ No newline at end of file diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java index 1eef158969..19d7385739 100644 --- a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java @@ -69,7 +69,7 @@ public class TemplateField implements Serializable { @ApiModelProperty(value = "Value expression of predefined field") private String preExpression; - @ApiModelProperty("Is this field a meta field, 0: no, 1: yes, default is 0") + @ApiModelProperty("Is this field a meta field, 0: no, 1: yes") @Builder.Default private Integer isMetaField = 0; diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java new file mode 100644 index 0000000000..0710f14f46 --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java @@ -0,0 +1,63 @@ +/* + * 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 org.apache.inlong.manager.pojo.stream; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * Tenant template response + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("Tenant template tag response") +public class TenantTemplateInfo { + + @ApiModelProperty(value = "Primary key") + private Integer id; + + @ApiModelProperty(value = "Template name") + private String templateName; + + @ApiModelProperty(value = "Tenant") + private String tenant; + + @ApiModelProperty(value = "Name of in creator") + private String creator; + + @ApiModelProperty(value = "Name of in modifier") + private String modifier; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8") + private Date modifyTime; + + @ApiModelProperty(value = "Version number") + private Integer version; +} diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java new file mode 100644 index 0000000000..bf53f44dd2 --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java @@ -0,0 +1,48 @@ +/* + * 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 org.apache.inlong.manager.pojo.stream; + +import org.apache.inlong.manager.pojo.common.PageRequest; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("Template paging query request") +public class TenantTemplatePageRequest extends PageRequest { + + @ApiModelProperty(value = "Inlong tenant list") + private List<String> tenantList; + + @ApiModelProperty(value = "Inlong tenant") + private String tenant; + + @ApiModelProperty(value = "Keywords, used for fuzzy query") + private String keyword; +} diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java new file mode 100644 index 0000000000..702f1c346e --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java @@ -0,0 +1,53 @@ +/* + * 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 org.apache.inlong.manager.pojo.stream; + +import org.apache.inlong.manager.common.validation.SaveValidation; +import org.apache.inlong.manager.common.validation.UpdateValidation; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * Tenant template tag request + */ +@Data +@ApiModel("Tenant template tag request") +public class TenantTemplateRequest { + + @ApiModelProperty(value = "Primary key") + @NotNull(groups = UpdateValidation.class, message = "id cannot be null") + private Integer id; + + @ApiModelProperty(value = "Template name") + private String templateName; + + @ApiModelProperty(value = "Inlong tenant which template") + @NotBlank(groups = SaveValidation.class, message = "tenant cannot be blank") + @Length(min = 1, max = 256, message = "length must be between 1 and 256") + private String tenant; + + @ApiModelProperty(value = "Version number") + @NotNull(groups = UpdateValidation.class, message = "version cannot be null") + private Integer version; +} diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java index f394730f37..4e04ac0bdd 100644 --- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java +++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java @@ -25,13 +25,16 @@ import org.apache.inlong.manager.common.util.CommonBeanUtils; import org.apache.inlong.manager.common.util.Preconditions; import org.apache.inlong.manager.dao.entity.TemplateEntity; import org.apache.inlong.manager.dao.entity.TemplateFieldEntity; +import org.apache.inlong.manager.dao.entity.TenantTemplateEntity; import org.apache.inlong.manager.dao.mapper.TemplateEntityMapper; import org.apache.inlong.manager.dao.mapper.TemplateFieldEntityMapper; +import org.apache.inlong.manager.dao.mapper.TenantTemplateEntityMapper; import org.apache.inlong.manager.pojo.common.PageResult; import org.apache.inlong.manager.pojo.stream.TemplateField; import org.apache.inlong.manager.pojo.stream.TemplateInfo; import org.apache.inlong.manager.pojo.stream.TemplatePageRequest; import org.apache.inlong.manager.pojo.stream.TemplateRequest; +import org.apache.inlong.manager.pojo.stream.TenantTemplateRequest; import org.apache.inlong.manager.pojo.user.LoginUserUtils; import com.github.pagehelper.Page; @@ -48,6 +51,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * Inlong template service layer implementation @@ -61,6 +65,8 @@ public class TemplateServiceImpl implements TemplateService { private TemplateEntityMapper templateEntityMapper; @Autowired private TemplateFieldEntityMapper templateFieldEntityMapper; + @Autowired + private TenantTemplateEntityMapper tenantTemplateEntityMapper; @Transactional(rollbackFor = Throwable.class) @Override @@ -81,6 +87,14 @@ public class TemplateServiceImpl implements TemplateService { request.setId(templateEntity.getId()); saveField(request); + if (CollectionUtils.isNotEmpty(request.getTenantList())) { + TenantTemplateRequest tagRequest = new TenantTemplateRequest(); + tagRequest.setTemplateName(templateName); + request.getTenantList().forEach(tenant -> { + tagRequest.setTenant(tenant); + this.saveTenantTemplate(tagRequest, operator); + }); + } LOGGER.info("success to save inlong stream info for template name={}", templateName); return templateEntity.getId(); } @@ -106,6 +120,16 @@ public class TemplateServiceImpl implements TemplateService { TemplateInfo templateInfo = CommonBeanUtils.copyProperties(templateEntity, TemplateInfo::new); List<TemplateField> templateFields = getTemplateFields(templateEntity.getId()); templateInfo.setFieldList(templateFields); + List<TenantTemplateEntity> tenantTemplateEntities = tenantTemplateEntityMapper.selectByTemplateName( + templateName); + if (Objects.equals(templateEntity.getVisibleRange(), TemplateVisibleRange.TENANT.name()) + && CollectionUtils.isNotEmpty(tenantTemplateEntities)) { + List<String> tenantList = tenantTemplateEntities.stream() + .map(TenantTemplateEntity::getTenant) + .collect(Collectors.toList()); + checkVis(templateEntity, tenantList, operator); + templateInfo.setTenantList(tenantList); + } return templateInfo; } @@ -127,6 +151,12 @@ public class TemplateServiceImpl implements TemplateService { PageResult<TemplateInfo> pageResult = PageResult.fromPage(entityPage) .map(entity -> { TemplateInfo response = CommonBeanUtils.copyProperties(entity, TemplateInfo::new); + + List<String> tenantList = tenantTemplateEntityMapper + .selectByTemplateName(entity.getName()).stream() + .map(TenantTemplateEntity::getTenant) + .collect(Collectors.toList()); + response.setTenantList(tenantList); return response; }); LOGGER.debug("success to list template page, result size {}", pageResult.getList().size()); @@ -284,4 +314,21 @@ public class TemplateServiceImpl implements TemplateService { LOGGER.info("success to update template field"); } + public Integer saveTenantTemplate(TenantTemplateRequest request, String operator) { + LOGGER.debug("begin to save tenant template {}", request); + Preconditions.expectNotNull(request, "tenant cluster request cannot be empty"); + Preconditions.expectNotBlank(request.getTemplateName(), ErrorCodeEnum.INVALID_PARAMETER, + "template name cannot be empty"); + Preconditions.expectNotBlank(request.getTenant(), ErrorCodeEnum.INVALID_PARAMETER, + "tenant cannot be empty"); + + TenantTemplateEntity entity = CommonBeanUtils.copyProperties(request, TenantTemplateEntity::new); + entity.setCreator(operator); + entity.setModifier(operator); + tenantTemplateEntityMapper.insert(entity); + LOGGER.info("success to save tenant tag, tenant={}, template name={}", request.getTenant(), + request.getTemplateName()); + return entity.getId(); + } + } diff --git a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql index 9739482638..3864ffcbe3 100644 --- a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql +++ b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql @@ -942,6 +942,24 @@ CREATE TABLE IF NOT EXISTS `template_field` INDEX `template_field_index` (`template_id`) ); +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) +); + -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/inlong-manager/manager-web/sql/apache_inlong_manager.sql b/inlong-manager/manager-web/sql/apache_inlong_manager.sql index 3184f880e8..cd31161b1c 100644 --- a/inlong-manager/manager-web/sql/apache_inlong_manager.sql +++ b/inlong-manager/manager-web/sql/apache_inlong_manager.sql @@ -969,7 +969,7 @@ CREATE TABLE IF NOT EXISTS `template` `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', PRIMARY KEY (`id`), UNIQUE KEY `unique_template_name` (`name`, `is_deleted`) - ) ENGINE = InnoDB +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'template'; -- ---------------------------- @@ -995,6 +995,25 @@ CREATE TABLE IF NOT EXISTS `template_field` ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='Template field table'; +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) + ) ENGINE = InnoDB +DEFAULT CHARSET = utf8mb4 COMMENT ='Tenant template table'; + -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/inlong-manager/manager-web/sql/changes-1.13.0.sql b/inlong-manager/manager-web/sql/changes-1.13.0.sql index f671e57c86..ecb38b543d 100644 --- a/inlong-manager/manager-web/sql/changes-1.13.0.sql +++ b/inlong-manager/manager-web/sql/changes-1.13.0.sql @@ -69,3 +69,22 @@ CREATE TABLE IF NOT EXISTS `template_field` INDEX `template_field_index` (`template_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='Template field table'; + +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='Tenant template table'; diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java new file mode 100644 index 0000000000..3f3e2fd3c8 --- /dev/null +++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java @@ -0,0 +1,106 @@ +/* + * 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 org.apache.inlong.manager.web.controller; + +import org.apache.inlong.manager.common.enums.OperationTarget; +import org.apache.inlong.manager.common.enums.OperationType; +import org.apache.inlong.manager.common.validation.UpdateValidation; +import org.apache.inlong.manager.pojo.common.PageResult; +import org.apache.inlong.manager.pojo.common.Response; +import org.apache.inlong.manager.pojo.stream.TemplateInfo; +import org.apache.inlong.manager.pojo.stream.TemplatePageRequest; +import org.apache.inlong.manager.pojo.stream.TemplateRequest; +import org.apache.inlong.manager.pojo.user.LoginUserUtils; +import org.apache.inlong.manager.pojo.user.UserRoleCode; +import org.apache.inlong.manager.service.operationlog.OperationLog; +import org.apache.inlong.manager.service.stream.TemplateService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * Inlong Template control layer + */ +@Slf4j +@RestController +@RequestMapping("/api") +@Api(tags = "Inlong-Template-API") +public class TemplateController { + + @Autowired + private TemplateService templateService; + + @RequestMapping(value = "/template/save", method = RequestMethod.POST) + @OperationLog(operation = OperationType.CREATE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Save inlong template") + public Response<Integer> save(@RequestBody TemplateRequest request) { + int result = templateService.save(request, LoginUserUtils.getLoginUser().getName()); + return Response.success(result); + } + + @RequestMapping(value = "/template/exist/{templateName}", method = RequestMethod.GET) + @ApiOperation(value = "Is the inlong template exists") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response<Boolean> exist(@PathVariable String templateName) { + return Response.success(templateService.exist(templateName)); + } + + @RequestMapping(value = "/template/get", method = RequestMethod.GET) + @ApiOperation(value = "Get inlong template") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response<TemplateInfo> get(@RequestParam String templateName) { + return Response.success(templateService.get(templateName, LoginUserUtils.getLoginUser().getName())); + } + + @RequestMapping(value = "/template/list", method = RequestMethod.POST) + @ApiOperation(value = "List inlong template briefs by paginating") + public Response<PageResult<TemplateInfo>> listByCondition(@RequestBody TemplatePageRequest request) { + request.setCurrentUser(LoginUserUtils.getLoginUser().getName()); + request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.TENANT_ADMIN)); + return Response.success(templateService.list(request)); + } + + @RequestMapping(value = "/template/update", method = RequestMethod.POST) + @OperationLog(operation = OperationType.UPDATE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Update inlong templater") + public Response<Boolean> update(@Validated(UpdateValidation.class) @RequestBody TemplateRequest request) { + String username = LoginUserUtils.getLoginUser().getName(); + return Response.success(templateService.update(request, username)); + } + + @Deprecated + @RequestMapping(value = "/template/delete", method = RequestMethod.DELETE) + @OperationLog(operation = OperationType.DELETE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Delete inlong template") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response<Boolean> delete(@RequestParam String templateName) { + String username = LoginUserUtils.getLoginUser().getName(); + return Response.success(templateService.delete(templateName, username)); + } + +}