Skip to content

Commit c4084a7

Browse files
author
Alena Prokharchyk
committed
Fixes for resource details code: 1) Fixed the NPE happening when the resource detail couldn't be located by the key passed through API 2) Added ResourceDetails interface, made all resource details VO objects to implement it.
1 parent 52c2bc0 commit c4084a7

File tree

6 files changed

+83
-59
lines changed

6 files changed

+83
-59
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
package org.apache.cloudstack.api;
18+
19+
public interface ResourceDetail {
20+
21+
public long getResourceDetail();
22+
23+
public String getName();
24+
25+
public String getValue();
26+
27+
}

engine/schema/src/com/cloud/dc/DcDetailVO.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616
// under the License.
1717
package com.cloud.dc;
1818

19-
import org.apache.cloudstack.api.InternalIdentity;
20-
2119
import javax.persistence.Column;
2220
import javax.persistence.Entity;
2321
import javax.persistence.GeneratedValue;
2422
import javax.persistence.GenerationType;
2523
import javax.persistence.Id;
2624
import javax.persistence.Table;
2725

26+
import org.apache.cloudstack.api.InternalIdentity;
27+
import org.apache.cloudstack.api.ResourceDetail;
28+
2829
@Entity
2930
@Table(name="data_center_details")
30-
public class DcDetailVO implements InternalIdentity {
31+
public class DcDetailVO implements InternalIdentity, ResourceDetail {
3132
@Id
3233
@GeneratedValue(strategy=GenerationType.IDENTITY)
3334
@Column(name="id")
@@ -70,4 +71,9 @@ public void setValue(String value) {
7071
public long getId() {
7172
return id;
7273
}
74+
75+
@Override
76+
public long getResourceDetail() {
77+
return dcId;
78+
}
7379
}

engine/schema/src/com/cloud/storage/VolumeDetailVO.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616
// under the License.
1717
package com.cloud.storage;
1818

19-
import org.apache.cloudstack.api.InternalIdentity;
20-
2119
import javax.persistence.Column;
2220
import javax.persistence.Entity;
2321
import javax.persistence.GeneratedValue;
2422
import javax.persistence.GenerationType;
2523
import javax.persistence.Id;
2624
import javax.persistence.Table;
2725

26+
import org.apache.cloudstack.api.InternalIdentity;
27+
import org.apache.cloudstack.api.ResourceDetail;
28+
2829
@Entity
2930
@Table(name="volume_details")
30-
public class VolumeDetailVO implements InternalIdentity {
31+
public class VolumeDetailVO implements InternalIdentity, ResourceDetail {
3132
@Id
3233
@GeneratedValue(strategy=GenerationType.IDENTITY)
3334
@Column(name="id")
@@ -82,4 +83,9 @@ public void setValue(String value) {
8283
this.value = value;
8384
}
8485

86+
@Override
87+
public long getResourceDetail() {
88+
return volumeId;
89+
}
90+
8591
}

engine/schema/src/com/cloud/vm/NicDetailVO.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19-
import org.apache.cloudstack.api.InternalIdentity;
20-
2119
import javax.persistence.Column;
2220
import javax.persistence.Entity;
2321
import javax.persistence.GeneratedValue;
2422
import javax.persistence.GenerationType;
2523
import javax.persistence.Id;
2624
import javax.persistence.Table;
2725

26+
import org.apache.cloudstack.api.InternalIdentity;
27+
import org.apache.cloudstack.api.ResourceDetail;
28+
2829
@Entity
2930
@Table(name="nic_details")
30-
public class NicDetailVO implements InternalIdentity {
31+
public class NicDetailVO implements InternalIdentity, ResourceDetail {
3132
@Id
3233
@GeneratedValue(strategy=GenerationType.IDENTITY)
3334
@Column(name="id")
@@ -82,4 +83,9 @@ public void setValue(String value) {
8283
this.value = value;
8384
}
8485

86+
@Override
87+
public long getResourceDetail() {
88+
return nicId;
89+
}
90+
8591
}

engine/schema/src/com/cloud/vm/UserVmDetailVO.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19-
import org.apache.cloudstack.api.InternalIdentity;
20-
2119
import javax.persistence.Column;
2220
import javax.persistence.Entity;
2321
import javax.persistence.GeneratedValue;
2422
import javax.persistence.GenerationType;
2523
import javax.persistence.Id;
2624
import javax.persistence.Table;
2725

26+
import org.apache.cloudstack.api.InternalIdentity;
27+
import org.apache.cloudstack.api.ResourceDetail;
28+
2829
@Entity
2930
@Table(name="user_vm_details")
30-
public class UserVmDetailVO implements InternalIdentity {
31+
public class UserVmDetailVO implements InternalIdentity, ResourceDetail {
3132
@Id
3233
@GeneratedValue(strategy=GenerationType.IDENTITY)
3334
@Column(name="id")
@@ -81,5 +82,10 @@ public void setName(String name) {
8182
public void setValue(String value) {
8283
this.value = value;
8384
}
85+
86+
@Override
87+
public long getResourceDetail() {
88+
return vmId;
89+
}
8490

8591
}

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

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.util.ArrayList;
2020
import java.util.Date;
2121
import java.util.HashSet;
22-
import java.util.LinkedList;
2322
import java.util.List;
2423
import java.util.Map;
2524
import java.util.Set;
@@ -34,6 +33,7 @@
3433
import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
3534
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
3635
import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
36+
import org.apache.cloudstack.api.ResourceDetail;
3737
import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
3838
import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
3939
import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
@@ -128,7 +128,6 @@
128128
import com.cloud.api.query.vo.UserAccountJoinVO;
129129
import com.cloud.api.query.vo.UserVmJoinVO;
130130
import com.cloud.api.query.vo.VolumeJoinVO;
131-
import com.cloud.dc.DcDetailVO;
132131
import com.cloud.dc.DedicatedResourceVO;
133132
import com.cloud.dc.dao.DcDetailsDao;
134133
import com.cloud.dc.dao.DedicatedResourceDao;
@@ -166,7 +165,6 @@
166165
import com.cloud.storage.Storage.TemplateType;
167166
import com.cloud.storage.VMTemplateVO;
168167
import com.cloud.storage.Volume;
169-
import com.cloud.storage.VolumeDetailVO;
170168
import com.cloud.storage.dao.VMTemplateDao;
171169
import com.cloud.storage.dao.VolumeDetailsDao;
172170
import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
@@ -185,8 +183,6 @@
185183
import com.cloud.utils.db.SearchCriteria.Func;
186184
import com.cloud.utils.db.SearchCriteria.Op;
187185
import com.cloud.vm.DomainRouterVO;
188-
import com.cloud.vm.NicDetailVO;
189-
import com.cloud.vm.UserVmDetailVO;
190186
import com.cloud.vm.UserVmVO;
191187
import com.cloud.vm.VirtualMachine;
192188
import com.cloud.vm.dao.DomainRouterDao;
@@ -3226,71 +3222,48 @@ public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd) {
32263222
String resourceId = cmd.getResourceId();
32273223
Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
32283224
List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
3225+
List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();
3226+
ResourceDetail requestedDetail = null;
3227+
32293228

32303229
if (resourceType == ResourceTag.TaggedResourceType.Volume) {
3231-
List<VolumeDetailVO> detailList;
32323230
if (key == null) {
32333231
detailList = _volumeDetailDao.findDetails(id);
32343232
} else {
3235-
VolumeDetailVO volumeDetail = _volumeDetailDao.findDetail(id, key);
3236-
detailList = new LinkedList<VolumeDetailVO>();
3237-
detailList.add(volumeDetail);
3238-
}
3239-
3240-
for (VolumeDetailVO detail : detailList) {
3241-
ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(),
3242-
ResourceTag.TaggedResourceType.Volume);
3243-
responseList.add(detailResponse);
3233+
requestedDetail = _volumeDetailDao.findDetail(id, key);
32443234
}
3245-
32463235
} else if (resourceType == ResourceTag.TaggedResourceType.Nic){
3247-
List<NicDetailVO> detailList;
32483236
if (key == null) {
32493237
detailList = _nicDetailDao.findDetails(id);
32503238
} else {
3251-
NicDetailVO nicDetail = _nicDetailDao.findDetail(id, key);
3252-
detailList = new LinkedList<NicDetailVO>();
3253-
detailList.add(nicDetail);
3254-
}
3255-
3256-
for (NicDetailVO detail : detailList) {
3257-
ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(),
3258-
ResourceTag.TaggedResourceType.Nic);
3259-
responseList.add(detailResponse);
3239+
requestedDetail = _nicDetailDao.findDetail(id, key);
32603240
}
32613241
} else if (resourceType == ResourceTag.TaggedResourceType.UserVm){
3262-
List<UserVmDetailVO> detailList;
32633242
if (key == null) {
32643243
detailList = _userVmDetailDao.findDetailsList(id);
32653244
} else {
3266-
UserVmDetailVO vmDetail = _userVmDetailDao.findDetail(id, key);
3267-
detailList = new LinkedList<UserVmDetailVO>();
3268-
detailList.add(vmDetail);
3269-
}
3270-
for (UserVmDetailVO detail : detailList) {
3271-
ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(),
3272-
ResourceTag.TaggedResourceType.UserVm);
3273-
responseList.add(detailResponse);
3245+
requestedDetail = _userVmDetailDao.findDetail(id, key);
32743246
}
32753247
} else if (resourceType == ResourceTag.TaggedResourceType.Zone){
3276-
3277-
List<DcDetailVO> details;
32783248
if (key == null) {
3279-
details = _dcDetailsDao.findDetailsList(id);
3249+
detailList = _dcDetailsDao.findDetailsList(id);
32803250
} else {
3281-
DcDetailVO zoneDetail = _dcDetailsDao.findDetail(id, key);
3282-
details = new LinkedList<DcDetailVO>();
3283-
details.add(zoneDetail);
3251+
requestedDetail = _dcDetailsDao.findDetail(id, key);
32843252
}
3285-
3286-
List<ResourceDetailResponse> dcDetailResponseList = new ArrayList<ResourceDetailResponse>();
3287-
for (DcDetailVO detail : details) {
3253+
} else {
3254+
throw new UnsupportedServiceException("Resource type " + resourceType + " is not supported by the cloudStack");
3255+
}
3256+
3257+
if (requestedDetail != null) {
3258+
ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, requestedDetail.getName(), requestedDetail.getValue(),
3259+
resourceType);
3260+
responseList.add(detailResponse);
3261+
} else {
3262+
for (ResourceDetail detail : detailList) {
32883263
ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(),
3289-
ResourceTag.TaggedResourceType.Zone);
3264+
resourceType);
32903265
responseList.add(detailResponse);
32913266
}
3292-
} else {
3293-
throw new UnsupportedServiceException("Resource type " + resourceType + " is not supported by the cloudStack");
32943267
}
32953268

32963269
return responseList;

0 commit comments

Comments
 (0)