Skip to content

Commit 6217b0f

Browse files
author
Likitha Shetty
committed
CLOUDSTACK-2600. Fix CS AWSAPI to add the below filters that are missing in DescribeImages API-
architecture description image-id image-type is-public name owner-id state tag-key tag-value tag:key hypervisor
1 parent 218d26b commit 6217b0f

6 files changed

Lines changed: 290 additions & 36 deletions

File tree

awsapi/src/com/cloud/bridge/service/EC2RestServlet.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
import com.cloud.bridge.service.core.ec2.EC2Filter;
136136
import com.cloud.bridge.service.core.ec2.EC2GroupFilterSet;
137137
import com.cloud.bridge.service.core.ec2.EC2Image;
138+
import com.cloud.bridge.service.core.ec2.EC2ImageFilterSet;
138139
import com.cloud.bridge.service.core.ec2.EC2ImageAttributes.ImageAttribute;
139140
import com.cloud.bridge.service.core.ec2.EC2ImageLaunchPermission;
140141
import com.cloud.bridge.service.core.ec2.EC2ImportKeyPair;
@@ -1380,6 +1381,15 @@ private void describeImages( HttpServletRequest request, HttpServletResponse res
13801381
if (null != value && 0 < value.length) EC2request.addImageSet( value[0] );
13811382
}
13821383
}
1384+
// add filters
1385+
EC2Filter[] filterSet = extractFilters( request );
1386+
if ( filterSet != null ) {
1387+
EC2ImageFilterSet ifs = new EC2ImageFilterSet();
1388+
for( int i=0; i < filterSet.length; i++ ) {
1389+
ifs.addFilter(filterSet[i]);
1390+
}
1391+
EC2request.setFilterSet( ifs );
1392+
}
13831393
// -> execute the request
13841394
EC2Engine engine = ServiceProvider.getInstance().getEC2Engine();
13851395
DescribeImagesResponse EC2response = EC2SoapServiceImpl.toDescribeImagesResponse( engine.describeImages( EC2request ));

awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.cloud.bridge.service.core.ec2.EC2DescribeInstancesResponse;
5252
import com.cloud.bridge.service.core.ec2.EC2DescribeKeyPairs;
5353
import com.cloud.bridge.service.core.ec2.EC2DescribeKeyPairsResponse;
54+
import com.cloud.bridge.service.core.ec2.EC2ImageFilterSet;
5455
import com.cloud.bridge.service.core.ec2.EC2ImageLaunchPermission;
5556
import com.cloud.bridge.service.core.ec2.EC2ResourceTag;
5657
import com.cloud.bridge.service.core.ec2.EC2DescribeSecurityGroups;
@@ -407,7 +408,10 @@ public DescribeImagesResponse describeImages(DescribeImages describeImages) {
407408
for( int i=0; i < items3.length; i++ ) request.addOwnersSet( items3[i].getOwner());
408409
}
409410
}
410-
411+
FilterSetType fst = dit.getFilterSet();
412+
if ( fst != null) {
413+
request.setFilterSet(toImageFilterSet(fst));
414+
}
411415
return toDescribeImagesResponse( engine.describeImages( request ));
412416
}
413417

@@ -948,7 +952,7 @@ public static DescribeImagesResponse toDescribeImagesResponse(EC2DescribeImagesR
948952
DescribeImagesResponseItemType param3 = new DescribeImagesResponseItemType();
949953
param3.setImageId( images[i].getId());
950954
param3.setImageLocation( "" );
951-
param3.setImageState( (images[i].getIsReady() ? "available" : "unavailable" ));
955+
param3.setImageState( images[i].getState());
952956
param3.setImageOwnerId(ownerId);
953957
param3.setIsPublic( images[i].getIsPublic());
954958

@@ -960,16 +964,14 @@ public static DescribeImagesResponse toDescribeImagesResponse(EC2DescribeImagesR
960964

961965
String description = images[i].getDescription();
962966
param3.setDescription( (null == description ? "" : description));
963-
964-
if (null == description) param3.setArchitecture( "" );
965-
else if (-1 != description.indexOf( "x86_64" )) param3.setArchitecture( "x86_64" );
966-
else if (-1 != description.indexOf( "i386" )) param3.setArchitecture( "i386" );
967-
else param3.setArchitecture( "" );
968-
969-
param3.setImageType( "machine" );
967+
968+
param3.setArchitecture( images[i].getArchitecture());
969+
970+
param3.setImageType( images[i].getImageType());
970971
param3.setKernelId( "" );
971972
param3.setRamdiskId( "" );
972973
param3.setPlatform( "" );
974+
param3.setHypervisor( images[i].getHypervisor());
973975

974976
StateReasonType param6 = new StateReasonType();
975977
param6.setCode( "" );
@@ -1287,6 +1289,27 @@ private EC2TagsFilterSet toTagsFilterSet( FilterSetType fst ) {
12871289
return tfs;
12881290
}
12891291

1292+
private EC2ImageFilterSet toImageFilterSet( FilterSetType fst ) {
1293+
EC2ImageFilterSet ifs = new EC2ImageFilterSet();
1294+
1295+
FilterType[] items = fst.getItem();
1296+
if (items != null) {
1297+
for (FilterType item : items) {
1298+
EC2Filter oneFilter = new EC2Filter();
1299+
String filterName = item.getName();
1300+
oneFilter.setName( filterName );
1301+
1302+
ValueSetType vft = item.getValueSet();
1303+
ValueType[] valueItems = vft.getItem();
1304+
for (ValueType valueItem : valueItems) {
1305+
oneFilter.addValueEncoded( valueItem.getValue());
1306+
}
1307+
ifs.addFilter( oneFilter );
1308+
}
1309+
}
1310+
return ifs;
1311+
}
1312+
12901313
// toMethods
12911314
public static DescribeVolumesResponse toDescribeVolumesResponse( EC2DescribeVolumesResponse engineResponse )
12921315
{

awsapi/src/com/cloud/bridge/service/core/ec2/EC2DescribeImages.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class EC2DescribeImages {
2424
private List<String> executableBySet = new ArrayList<String>();; // a list of strings identifying users
2525
private List<String> imageSet = new ArrayList<String>(); // a list of AMI id's
2626
private List<String> ownersSet = new ArrayList<String>(); // a list of AMI owner id's
27+
private EC2ImageFilterSet ifs = null;
2728

2829
public EC2DescribeImages() {
2930
}
@@ -51,4 +52,13 @@ public void addOwnersSet( String param ) {
5152
public String[] getOwnersSet() {
5253
return ownersSet.toArray(new String[0]);
5354
}
55+
56+
public EC2ImageFilterSet getFilterSet() {
57+
return ifs;
58+
}
59+
60+
public void setFilterSet( EC2ImageFilterSet param ) {
61+
ifs = param;
62+
}
63+
5464
}

awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -902,15 +902,19 @@ public EC2DescribeImagesResponse describeImages(EC2DescribeImages request)
902902

903903
try {
904904
String[] templateIds = request.getImageSet();
905+
EC2ImageFilterSet ifs = request.getFilterSet();
905906

906-
if ( 0 == templateIds.length ) {
907-
return listTemplates(null, images);
908-
}
909-
for (String s : templateIds) {
910-
images = listTemplates(s, images);
907+
if ( templateIds.length == 0 ) {
908+
images = listTemplates(null, images);
909+
} else {
910+
for (String s : templateIds) {
911+
images = listTemplates(s, images);
912+
}
911913
}
912-
return images;
913-
914+
if (ifs == null)
915+
return images;
916+
else
917+
return ifs.evaluate(images);
914918
} catch( Exception e ) {
915919
logger.error( "EC2 DescribeImages - ", e);
916920
throw new EC2ServiceException(ServerError.InternalError, e.getMessage() != null ? e.getMessage() : "An unexpected error occurred.");
@@ -1951,8 +1955,22 @@ private EC2DescribeImagesResponse listTemplates( String templateId, EC2DescribeI
19511955
ec2Image.setDescription(temp.getDisplayText());
19521956
ec2Image.setOsTypeId(temp.getOsTypeId().toString());
19531957
ec2Image.setIsPublic(temp.getIsPublic());
1954-
ec2Image.setIsReady(temp.getIsReady());
1958+
ec2Image.setState( temp.getIsReady() ? "available" : "pending");
19551959
ec2Image.setDomainId(temp.getDomainId());
1960+
if ( temp.getHyperVisor().equalsIgnoreCase("xenserver"))
1961+
ec2Image.setHypervisor("xen");
1962+
else if ( temp.getHyperVisor().equalsIgnoreCase("ovm"))
1963+
ec2Image.setHypervisor( "ovm"); // valid values for hypervisor is 'ovm' and 'xen'
1964+
else
1965+
ec2Image.setHypervisor("");
1966+
if (temp.getDisplayText() == null)
1967+
ec2Image.setArchitecture("");
1968+
else if (temp.getDisplayText().indexOf( "x86_64" ) != -1)
1969+
ec2Image.setArchitecture("x86_64");
1970+
else if (temp.getDisplayText().indexOf( "i386" ) != -1)
1971+
ec2Image.setArchitecture("i386");
1972+
else
1973+
ec2Image.setArchitecture("");
19561974
List<CloudStackKeyValue> resourceTags = temp.getTags();
19571975
for(CloudStackKeyValue resourceTag : resourceTags) {
19581976
EC2TagKeyValue param = new EC2TagKeyValue();

awsapi/src/com/cloud/bridge/service/core/ec2/EC2Image.java

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ public class EC2Image {
2828
private String name;
2929
private String description;
3030
private String osTypeId;
31-
private boolean isPublic;
32-
private boolean isReady;
31+
private Boolean isPublic;
32+
private String state;
3333
private String accountName;
34-
private String domainId;
34+
private String domainId;
35+
private String hypervisor;
36+
private String architecture;
37+
private String imageType;
3538
private List<EC2TagKeyValue> tagsSet;
3639

3740
public EC2Image() {
@@ -40,9 +43,12 @@ public EC2Image() {
4043
description = null;
4144
osTypeId = null;
4245
isPublic = false;
43-
isReady = false;
46+
state = null;
4447
accountName = null;
45-
domainId = null;
48+
domainId = null;
49+
hypervisor = null;
50+
architecture = null;
51+
imageType = "machine";
4652
tagsSet = new ArrayList<EC2TagKeyValue>();
4753
}
4854

@@ -78,21 +84,21 @@ public String getOsTypeId() {
7884
return this.osTypeId;
7985
}
8086

81-
public void setIsPublic( boolean isPublic ) {
82-
this.isPublic = isPublic;
83-
}
84-
85-
public boolean getIsPublic() {
86-
return this.isPublic;
87-
}
87+
public void setIsPublic( Boolean isPublic ) {
88+
this.isPublic = isPublic;
89+
}
8890

89-
public void setIsReady( boolean isReady ) {
90-
this.isReady = isReady;
91-
}
92-
93-
public boolean getIsReady() {
94-
return this.isReady;
95-
}
91+
public Boolean getIsPublic() {
92+
return this.isPublic;
93+
}
94+
95+
public void setState( String state ) {
96+
this.state = state;
97+
}
98+
99+
public String getState() {
100+
return this.state;
101+
}
96102

97103
public String getAccountName() {
98104
return accountName;
@@ -110,6 +116,25 @@ public void setDomainId(String domainId) {
110116
this.domainId = domainId;
111117
}
112118

119+
public String getHypervisor() {
120+
return hypervisor;
121+
}
122+
123+
public void setHypervisor(String hypervisor) {
124+
this.hypervisor = hypervisor;
125+
}
126+
127+
public String getArchitecture() {
128+
return architecture;
129+
}
130+
131+
public void setArchitecture(String architecture) {
132+
this.architecture = architecture;
133+
}
134+
135+
public String getImageType() {
136+
return imageType;
137+
}
113138

114139
public void addResourceTag( EC2TagKeyValue param ) {
115140
tagsSet.add( param );

0 commit comments

Comments
 (0)