refactor tags

Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
This commit is contained in:
Abhishek Kumar 2026-04-10 13:02:07 +05:30
parent e2aac4110b
commit e5fd64b835
4 changed files with 55 additions and 25 deletions

View File

@ -63,8 +63,12 @@ public interface ResourceTagDao extends GenericDao<ResourceTagVO, Long> {
List<? extends ResourceTag> listByResourceUuid(String resourceUuid);
List<ResourceTagVO> listByResourceTypeKeyAndOwners(ResourceObjectType resourceType, String key,
List<Long> accountIds, List<Long> domainIds, Filter filter);
List<String> listByResourceTypeKeyPrefixAndOwners(ResourceObjectType resourceType, String key,
List<Long> accountIds, List<Long> domainIds,
Filter filter);
ResourceTagVO findByResourceTypeKeyPrefixAndValue(ResourceObjectType resourceType, String key, String value);
List<ResourceTagVO> listByResourceTypeIdAndKeyPrefix(ResourceObjectType resourceType, long resourceId, String key);
ResourceTagVO findByResourceTypeKeyAndValue(ResourceObjectType resourceType, String key, String value);
}

View File

@ -31,6 +31,7 @@ import com.cloud.server.ResourceTag.ResourceObjectType;
import com.cloud.tags.ResourceTagVO;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
@ -124,12 +125,13 @@ public class ResourceTagsDaoImpl extends GenericDaoBase<ResourceTagVO, Long> imp
}
@Override
public List<ResourceTagVO> listByResourceTypeKeyAndOwners(ResourceObjectType resourceType, String key,
List<Long> accountIds, List<Long> domainIds,
Filter filter) {
SearchBuilder<ResourceTagVO> sb = createSearchBuilder();
public List<String> listByResourceTypeKeyPrefixAndOwners(ResourceObjectType resourceType, String key,
List<Long> accountIds, List<Long> domainIds,
Filter filter) {
GenericSearchBuilder<ResourceTagVO, String> sb = createSearchBuilder(String.class);
sb.select(null, SearchCriteria.Func.DISTINCT, sb.entity().getValue());
sb.and("resourceType", sb.entity().getResourceType(), Op.EQ);
sb.and("key", sb.entity().getKey(), Op.EQ);
sb.and("key", sb.entity().getKey(), Op.LIKE);
boolean accountIdsNotEmpty = CollectionUtils.isNotEmpty(accountIds);
boolean domainIdsNotEmpty = CollectionUtils.isNotEmpty(domainIds);
if (accountIdsNotEmpty || domainIdsNotEmpty) {
@ -138,30 +140,45 @@ public class ResourceTagsDaoImpl extends GenericDaoBase<ResourceTagVO, Long> imp
sb.cp();
}
sb.done();
final SearchCriteria<ResourceTagVO> sc = sb.create();
final SearchCriteria<String> sc = sb.create();
sc.setParameters("resourceType", resourceType);
sc.setParameters("key", key);
sc.setParameters("key", key + "%");
if (accountIdsNotEmpty) {
sc.setParameters("account", accountIds.toArray());
}
if (domainIdsNotEmpty) {
sc.setParameters("domain", domainIds.toArray());
}
return listBy(sc, filter);
return customSearch(sc, filter);
}
@Override
public ResourceTagVO findByResourceTypeKeyAndValue(ResourceObjectType resourceType, String key,
public ResourceTagVO findByResourceTypeKeyPrefixAndValue(ResourceObjectType resourceType, String key,
String value) {
SearchBuilder<ResourceTagVO> sb = createSearchBuilder();
sb.and("resourceType", sb.entity().getResourceType(), Op.EQ);
sb.and("key", sb.entity().getKey(), Op.EQ);
sb.and("key", sb.entity().getKey(), Op.LIKE);
sb.and("value", sb.entity().getValue(), Op.EQ);
sb.done();
final SearchCriteria<ResourceTagVO> sc = sb.create();
sc.setParameters("resourceType", resourceType);
sc.setParameters("key", key);
sc.setParameters("key", key + "%");
sc.setParameters("value", value);
return findOneBy(sc);
}
@Override
public List<ResourceTagVO> listByResourceTypeIdAndKeyPrefix(ResourceObjectType resourceType, long resourceId,
String key) {
SearchBuilder<ResourceTagVO> sb = createSearchBuilder();
sb.and("resourceType", sb.entity().getResourceType(), Op.EQ);
sb.and("resourceId", sb.entity().getResourceId(), Op.EQ);
sb.and("key", sb.entity().getKey(), Op.LIKE);
sb.done();
final SearchCriteria<ResourceTagVO> sc = sb.create();
sc.setParameters("resourceType", resourceType);
sc.setParameters("resourceId", resourceId);
sc.setParameters("key", key + "%");
return listBy(sc);
}
}

View File

@ -1186,14 +1186,8 @@ public class ServerAdapter extends ManagerBase {
@ApiAccess(command = ListTagsCmd.class)
protected List<Tag> listTagsByInstanceId(final long instanceId) {
ResourceTag vmResourceTag = resourceTagDao.findByKey(instanceId,
ResourceTag.ResourceObjectType.UserVm, VM_TA_KEY);
List<ResourceTagVO> tags = new ArrayList<>();
if (vmResourceTag instanceof ResourceTagVO) {
tags.add((ResourceTagVO)vmResourceTag);
} else {
tags.add(resourceTagDao.findById(vmResourceTag.getId()));
}
List<ResourceTagVO> tags = resourceTagDao.listByResourceTypeIdAndKeyPrefix(
ResourceTag.ResourceObjectType.UserVm, instanceId, VM_TA_KEY);
return ResourceTagVOToTagConverter.toTags(tags);
}
@ -1759,10 +1753,10 @@ public class ServerAdapter extends ManagerBase {
List<Tag> tags = new ArrayList<>(getDummyTags().values());
Filter filter = new Filter(ResourceTagVO.class, "id", true, offset, limit);
Pair<List<Long>, List<Long>> ownerDetails = getResourceOwnerFiltersWithDomainIds();
List<ResourceTagVO> vmResourceTags = resourceTagDao.listByResourceTypeKeyAndOwners(
List<String> vmResourceTags = resourceTagDao.listByResourceTypeKeyPrefixAndOwners(
ResourceTag.ResourceObjectType.UserVm, VM_TA_KEY, ownerDetails.first(), ownerDetails.second(), filter);
if (CollectionUtils.isNotEmpty(vmResourceTags)) {
tags.addAll(ResourceTagVOToTagConverter.toTags(vmResourceTags));
tags.addAll(ResourceTagVOToTagConverter.toTagsFromValues(vmResourceTags));
}
return tags;
}
@ -1774,7 +1768,7 @@ public class ServerAdapter extends ManagerBase {
}
Tag tag = getDummyTags().get(uuid);
if (tag == null) {
ResourceTagVO resourceTagVO = resourceTagDao.findByResourceTypeKeyAndValue(
ResourceTagVO resourceTagVO = resourceTagDao.findByResourceTypeKeyPrefixAndValue(
ResourceTag.ResourceObjectType.UserVm, VM_TA_KEY, uuid);
accountService.checkAccess(CallContext.current().getCallingAccount(), null, false,
resourceTagVO);

View File

@ -61,7 +61,22 @@ public class ResourceTagVOToTagConverter {
return tag;
}
public static Tag toTag(String id) {
String basePath = VeeamControlService.ContextPath.value();
Tag tag = new Tag();
tag.setId(id);
tag.setName(id);
tag.setDescription(String.format("Tag: %s", id));
tag.setHref(basePath + TagsRouteHandler.BASE_ROUTE + "/" + id);
tag.setParent(getRootTagRef());
return tag;
}
public static List<Tag> toTags(List<ResourceTagVO> vos) {
return vos.stream().map(ResourceTagVOToTagConverter::toTag).collect(Collectors.toList());
}
public static List<Tag> toTagsFromValues(List<String> values) {
return values.stream().map(ResourceTagVOToTagConverter::toTag).collect(Collectors.toList());
}
}