Skip to content

Commit 4580bf8

Browse files
shwstpprharikrishna-patnala
authored andcommitted
api,server,ui: support tags for domains (apache#11964)
* api,server,ui: support tags for domains Fixes apache#11608 Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * address copilot comment Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * fix import Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * Added tags support to listDomains API --------- Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> Co-authored-by: Harikrishna Patnala <harikrishna.patnala@gmail.com>
1 parent eacccef commit 4580bf8

6 files changed

Lines changed: 79 additions & 31 deletions

File tree

api/src/main/java/com/cloud/server/ResourceTag.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
// under the License.
1717
package com.cloud.server;
1818

19-
import org.apache.cloudstack.acl.ControlledEntity;
20-
import org.apache.cloudstack.api.Identity;
21-
import org.apache.cloudstack.api.InternalIdentity;
22-
2319
import java.util.HashMap;
2420
import java.util.Locale;
2521
import java.util.Map;
2622

23+
import org.apache.cloudstack.acl.ControlledEntity;
24+
import org.apache.cloudstack.api.Identity;
25+
import org.apache.cloudstack.api.InternalIdentity;
26+
2727
public interface ResourceTag extends ControlledEntity, Identity, InternalIdentity {
2828

2929
// FIXME - extract enum to another interface as its used both by resourceTags and resourceMetaData code

api/src/main/java/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.apache.cloudstack.api.APICommand;
2424
import org.apache.cloudstack.api.ApiConstants;
2525
import org.apache.cloudstack.api.ApiConstants.DomainDetails;
26-
import org.apache.cloudstack.api.BaseListCmd;
26+
import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
2727
import org.apache.cloudstack.api.Parameter;
2828
import org.apache.cloudstack.api.ResponseObject.ResponseView;
2929
import org.apache.cloudstack.api.command.user.UserCmd;
@@ -39,7 +39,7 @@
3939

4040
@APICommand(name = "listDomains", description = "Lists domains and provides detailed information for listed domains", responseObject = DomainResponse.class, responseView = ResponseView.Restricted, entityType = {Domain.class},
4141
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
42-
public class ListDomainsCmd extends BaseListCmd implements UserCmd {
42+
public class ListDomainsCmd extends BaseListTaggedResourcesCmd implements UserCmd {
4343

4444
private static final String s_name = "listdomainsresponse";
4545

api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.response;
1818

19-
import com.google.gson.annotations.SerializedName;
19+
import java.util.Date;
20+
import java.util.List;
21+
import java.util.Map;
22+
import java.util.Set;
2023

2124
import org.apache.cloudstack.api.ApiConstants;
22-
import org.apache.cloudstack.api.BaseResponseWithAnnotations;
25+
import org.apache.cloudstack.api.BaseResponseWithTagInformation;
2326
import org.apache.cloudstack.api.EntityReference;
2427

2528
import com.cloud.domain.Domain;
2629
import com.cloud.serializer.Param;
27-
28-
import java.util.Date;
29-
import java.util.List;
30-
import java.util.Map;
30+
import com.google.gson.annotations.SerializedName;
3131

3232
@EntityReference(value = Domain.class)
33-
public class DomainResponse extends BaseResponseWithAnnotations implements ResourceLimitAndCountResponse, SetResourceIconResponse {
33+
public class DomainResponse extends BaseResponseWithTagInformation implements ResourceLimitAndCountResponse, SetResourceIconResponse {
3434
@SerializedName(ApiConstants.ID)
3535
@Param(description = "The ID of the domain")
3636
private String id;
@@ -589,4 +589,8 @@ public void setDetails(Map<String, String> details) {
589589
public void setTaggedResourceLimitsAndCounts(List<TaggedResourceLimitAndCountResponse> taggedResourceLimitsAndCounts) {
590590
this.taggedResources = taggedResourceLimitsAndCounts;
591591
}
592+
593+
public void setTags(Set<ResourceTagResponse> tags) {
594+
this.tags = tags;
595+
}
592596
}

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,6 @@
3939

4040
import javax.inject.Inject;
4141

42-
import com.cloud.bgp.ASNumber;
43-
import com.cloud.bgp.ASNumberRange;
44-
import com.cloud.configuration.ConfigurationService;
45-
import com.cloud.dc.ASNumberRangeVO;
46-
import com.cloud.dc.ASNumberVO;
47-
import com.cloud.dc.VlanDetailsVO;
48-
import com.cloud.dc.dao.ASNumberDao;
49-
import com.cloud.dc.dao.ASNumberRangeDao;
50-
import com.cloud.dc.dao.VlanDetailsDao;
51-
import com.cloud.hypervisor.Hypervisor;
52-
import com.cloud.network.vpc.VpcGateway;
53-
import com.cloud.network.vpn.Site2SiteVpnManager;
54-
import com.cloud.storage.BucketVO;
5542
import org.apache.cloudstack.acl.ControlledEntity;
5643
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
5744
import org.apache.cloudstack.affinity.AffinityGroup;
@@ -278,14 +265,19 @@
278265
import com.cloud.api.query.vo.VolumeJoinVO;
279266
import com.cloud.api.query.vo.VpcOfferingJoinVO;
280267
import com.cloud.api.response.ApiResponseSerializer;
268+
import com.cloud.bgp.ASNumber;
269+
import com.cloud.bgp.ASNumberRange;
281270
import com.cloud.capacity.Capacity;
282271
import com.cloud.capacity.CapacityVO;
283272
import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
284273
import com.cloud.configuration.ConfigurationManager;
274+
import com.cloud.configuration.ConfigurationService;
285275
import com.cloud.configuration.Resource.ResourceOwnerType;
286276
import com.cloud.configuration.Resource.ResourceType;
287277
import com.cloud.configuration.ResourceCount;
288278
import com.cloud.configuration.ResourceLimit;
279+
import com.cloud.dc.ASNumberRangeVO;
280+
import com.cloud.dc.ASNumberVO;
289281
import com.cloud.dc.ClusterDetailsDao;
290282
import com.cloud.dc.ClusterVO;
291283
import com.cloud.dc.DataCenter;
@@ -296,7 +288,11 @@
296288
import com.cloud.dc.StorageNetworkIpRange;
297289
import com.cloud.dc.Vlan;
298290
import com.cloud.dc.Vlan.VlanType;
291+
import com.cloud.dc.VlanDetailsVO;
299292
import com.cloud.dc.VlanVO;
293+
import com.cloud.dc.dao.ASNumberDao;
294+
import com.cloud.dc.dao.ASNumberRangeDao;
295+
import com.cloud.dc.dao.VlanDetailsDao;
300296
import com.cloud.domain.Domain;
301297
import com.cloud.domain.DomainVO;
302298
import com.cloud.event.Event;
@@ -305,6 +301,7 @@
305301
import com.cloud.host.ControlState;
306302
import com.cloud.host.Host;
307303
import com.cloud.host.HostVO;
304+
import com.cloud.hypervisor.Hypervisor;
308305
import com.cloud.hypervisor.HypervisorCapabilities;
309306
import com.cloud.network.GuestVlan;
310307
import com.cloud.network.GuestVlanRange;
@@ -368,9 +365,11 @@
368365
import com.cloud.network.vpc.PrivateGateway;
369366
import com.cloud.network.vpc.StaticRoute;
370367
import com.cloud.network.vpc.Vpc;
368+
import com.cloud.network.vpc.VpcGateway;
371369
import com.cloud.network.vpc.VpcOffering;
372370
import com.cloud.network.vpc.VpcVO;
373371
import com.cloud.network.vpc.dao.VpcOfferingDao;
372+
import com.cloud.network.vpn.Site2SiteVpnManager;
374373
import com.cloud.offering.DiskOffering;
375374
import com.cloud.offering.NetworkOffering;
376375
import com.cloud.offering.NetworkOffering.Detail;
@@ -389,6 +388,7 @@
389388
import com.cloud.server.ResourceTag;
390389
import com.cloud.server.ResourceTag.ResourceObjectType;
391390
import com.cloud.service.ServiceOfferingVO;
391+
import com.cloud.storage.BucketVO;
392392
import com.cloud.storage.DataStoreRole;
393393
import com.cloud.storage.DiskOfferingVO;
394394
import com.cloud.storage.GuestOS;
@@ -587,6 +587,7 @@ public DomainResponse createDomainResponse(Domain domain) {
587587
if (domain.getChildCount() > 0) {
588588
domainResponse.setHasChild(true);
589589
}
590+
populateDomainTags(domain.getUuid(), domainResponse);
590591
domainResponse.setObjectName("domain");
591592
return domainResponse;
592593
}
@@ -3057,6 +3058,20 @@ public static void populateOwner(ControlledViewEntityResponse response, Controll
30573058
response.setDomainPath(getPrettyDomainPath(object.getDomainPath()));
30583059
}
30593060

3061+
public static void populateDomainTags(String domainUuid, DomainResponse domainResponse) {
3062+
List<ResourceTagJoinVO> tags = ApiDBUtils.listResourceTagViewByResourceUUID(domainUuid,
3063+
ResourceTag.ResourceObjectType.Domain);
3064+
if (CollectionUtils.isEmpty(tags)) {
3065+
return;
3066+
}
3067+
Set<ResourceTagResponse> tagResponses = new HashSet<>();
3068+
for (ResourceTagJoinVO tag : tags) {
3069+
ResourceTagResponse tagResponse = ApiDBUtils.newResourceTagResponse(tag, true);
3070+
tagResponses.add(tagResponse);
3071+
}
3072+
domainResponse.setTags(tagResponses);
3073+
}
3074+
30603075
private void populateAccount(ControlledEntityResponse response, long accountId) {
30613076
Account account = ApiDBUtils.findAccountById(accountId);
30623077
if (account == null) {

server/src/main/java/com/cloud/api/query/QueryManagerImpl.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2945,6 +2945,7 @@ private Pair<List<Long>, Integer> searchForDomainIdsAndCount(ListDomainsCmd cmd)
29452945
boolean listAll = cmd.listAll();
29462946
boolean isRecursive = false;
29472947
Domain domain = null;
2948+
Map<String, String> tags = cmd.getTags();
29482949

29492950
if (domainId != null) {
29502951
domain = _domainDao.findById(domainId);
@@ -2974,6 +2975,24 @@ private Pair<List<Long>, Integer> searchForDomainIdsAndCount(ListDomainsCmd cmd)
29742975
domainSearchBuilder.and("path", domainSearchBuilder.entity().getPath(), SearchCriteria.Op.LIKE);
29752976
domainSearchBuilder.and("state", domainSearchBuilder.entity().getState(), SearchCriteria.Op.EQ);
29762977

2978+
if (MapUtils.isNotEmpty(tags)) {
2979+
SearchBuilder<ResourceTagVO> resourceTagSearch = resourceTagDao.createSearchBuilder();
2980+
resourceTagSearch.and("resourceType", resourceTagSearch.entity().getResourceType(), Op.EQ);
2981+
resourceTagSearch.and().op();
2982+
for (int count = 0; count < tags.size(); count++) {
2983+
if (count == 0) {
2984+
resourceTagSearch.op("tagKey" + count, resourceTagSearch.entity().getKey(), Op.EQ);
2985+
} else {
2986+
resourceTagSearch.or().op("tagKey" + count, resourceTagSearch.entity().getKey(), Op.EQ);
2987+
}
2988+
resourceTagSearch.and("tagValue" + count, resourceTagSearch.entity().getValue(), Op.EQ);
2989+
resourceTagSearch.cp();
2990+
}
2991+
resourceTagSearch.cp();
2992+
2993+
domainSearchBuilder.join("tags", resourceTagSearch, resourceTagSearch.entity().getResourceId(), domainSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER);
2994+
}
2995+
29772996
if (keyword != null) {
29782997
domainSearchBuilder.and("keywordName", domainSearchBuilder.entity().getName(), SearchCriteria.Op.LIKE);
29792998
}
@@ -3003,6 +3022,16 @@ private Pair<List<Long>, Integer> searchForDomainIdsAndCount(ListDomainsCmd cmd)
30033022
}
30043023
}
30053024

3025+
if (MapUtils.isNotEmpty(tags)) {
3026+
int count = 0;
3027+
sc.setJoinParameters("tags", "resourceType", ResourceObjectType.Domain);
3028+
for (Map.Entry<String, String> entry : tags.entrySet()) {
3029+
sc.setJoinParameters("tags", "tagKey" + count, entry.getKey());
3030+
sc.setJoinParameters("tags", "tagValue" + count, entry.getValue());
3031+
count++;
3032+
}
3033+
}
3034+
30063035
// return only Active domains to the API
30073036
sc.setParameters("state", Domain.State.Active);
30083037

server/src/main/java/com/cloud/api/query/dao/DomainJoinDaoImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
import java.util.EnumSet;
2121
import java.util.List;
2222

23+
import javax.inject.Inject;
2324

24-
import com.cloud.api.ApiResponseHelper;
25-
import com.cloud.configuration.Resource;
26-
import com.cloud.user.AccountManager;
2725
import org.apache.cloudstack.annotation.AnnotationService;
2826
import org.apache.cloudstack.annotation.dao.AnnotationDao;
2927
import org.apache.cloudstack.api.ApiConstants.DomainDetails;
@@ -35,15 +33,16 @@
3533
import org.springframework.stereotype.Component;
3634

3735
import com.cloud.api.ApiDBUtils;
36+
import com.cloud.api.ApiResponseHelper;
3837
import com.cloud.api.query.vo.DomainJoinVO;
38+
import com.cloud.configuration.Resource;
3939
import com.cloud.configuration.Resource.ResourceType;
4040
import com.cloud.domain.Domain;
41+
import com.cloud.user.AccountManager;
4142
import com.cloud.utils.db.GenericDaoBase;
4243
import com.cloud.utils.db.SearchBuilder;
4344
import com.cloud.utils.db.SearchCriteria;
4445

45-
import javax.inject.Inject;
46-
4746
@Component
4847
public class DomainJoinDaoImpl extends GenericDaoBase<DomainJoinVO, Long> implements DomainJoinDao {
4948

@@ -110,6 +109,7 @@ public DomainResponse newDomainResponse(ResponseView view, EnumSet<DomainDetails
110109
}
111110

112111
domainResponse.setDetails(ApiDBUtils.getDomainDetails(domain.getId()));
112+
ApiResponseHelper.populateDomainTags(domain.getUuid(), domainResponse);
113113
domainResponse.setObjectName("domain");
114114

115115
return domainResponse;

0 commit comments

Comments
 (0)