You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cloudstack.apache.org by Likitha Shetty <li...@citrix.com> on 2012/06/04 13:10:50 UTC
[PATCH] CS-15122. Provide filter support for ec2-describe-availability-zones. Component: awsapi.
Signed-off-by: Likitha Shetty <li...@citrix.com>
---
.../cloud/bridge/service/EC2SoapServiceImpl.java | 30 ++++++
.../core/ec2/EC2AvailabilityZonesFilterSet.java | 99 ++++++++++++++++++++
.../core/ec2/EC2DescribeAvailabilityZones.java | 10 ++
.../cloud/bridge/service/core/ec2/EC2Engine.java | 14 ++-
4 files changed, 149 insertions(+), 4 deletions(-)
create mode 100644 awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesFilterSet.java
diff --git a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java
index a70d930..de3dcd4 100644
--- a/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java
+++ b/awsapi/src/com/cloud/bridge/service/EC2SoapServiceImpl.java
@@ -27,6 +27,7 @@ import com.cloud.bridge.service.core.ec2.EC2Address;
import com.cloud.bridge.service.core.ec2.EC2AddressFilterSet;
import com.cloud.bridge.service.core.ec2.EC2AssociateAddress;
import com.cloud.bridge.service.core.ec2.EC2AuthorizeRevokeSecurityGroup;
+import com.cloud.bridge.service.core.ec2.EC2AvailabilityZonesFilterSet;
import com.cloud.bridge.service.core.ec2.EC2CreateImage;
import com.cloud.bridge.service.core.ec2.EC2CreateImageResponse;
import com.cloud.bridge.service.core.ec2.EC2CreateKeyPair;
@@ -232,6 +233,12 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface {
if (null != items) { // -> can be empty
for( int i=0; i < items.length; i++ ) request.addZone( items[i].getZoneName());
}
+
+ FilterSetType fst = dazt.getFilterSet();
+ if (fst != null) {
+ request.setFilterSet( toAvailabiltyZonesFilterSet(fst));
+ }
+
return toDescribeAvailabilityZonesResponse( engine.handleRequest( request ));
}
@@ -1065,6 +1072,29 @@ public class EC2SoapServiceImpl implements AmazonEC2SkeletonInterface {
return ifs;
}
+
+ private EC2AvailabilityZonesFilterSet toAvailabiltyZonesFilterSet( FilterSetType fst ) {
+ EC2AvailabilityZonesFilterSet azfs = new EC2AvailabilityZonesFilterSet();
+
+ FilterType[] items = fst.getItem();
+ if (items != null) {
+ for (FilterType item : items) {
+ EC2Filter oneFilter = new EC2Filter();
+ String filterName = item.getName();
+ oneFilter.setName( filterName );
+
+ ValueSetType vft = item.getValueSet();
+ ValueType[] valueItems = vft.getItem();
+ for (ValueType valueItem : valueItems) {
+ oneFilter.addValueEncoded( valueItem.getValue());
+ }
+ azfs.addFilter( oneFilter );
+ }
+ }
+ return azfs;
+ }
+
+
// toMethods
public static DescribeVolumesResponse toDescribeVolumesResponse( EC2DescribeVolumesResponse engineResponse )
{
diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesFilterSet.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesFilterSet.java
new file mode 100644
index 0000000..c8d9c7d
--- /dev/null
+++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesFilterSet.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved.
+ *
+ * Licensed 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 com.cloud.bridge.service.core.ec2;
+
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+import com.cloud.bridge.service.exception.EC2ServiceException;
+
+
+public class EC2AvailabilityZonesFilterSet {
+ protected List<EC2Filter> filterSet = new ArrayList<EC2Filter>();
+
+ private Map<String,String> filterTypes = new HashMap<String,String>();
+
+ public EC2AvailabilityZonesFilterSet() {
+ // -> use these values to check that the proper filter is passed to this type of filter set
+ filterTypes.put( "zone-name", "String" );
+ }
+
+ public void addFilter( EC2Filter param ) {
+ String filterName = param.getName();
+ String value = (String) filterTypes.get( filterName );
+
+ if (null == value)
+ throw new EC2ServiceException( "Unsupported filter [" + filterName + "]", 501 );
+
+ if (null != value && value.equalsIgnoreCase( "null" ))
+ throw new EC2ServiceException( "Unsupported filter [" + filterName + "]", 501 );
+
+ filterSet.add( param );
+ }
+
+ public EC2Filter[] getFilterSet() {
+ return filterSet.toArray(new EC2Filter[0]);
+ }
+
+ public List<String> evaluate( EC2DescribeAvailabilityZonesResponse availabilityZones) throws ParseException {
+ List<String> resultList = new ArrayList<String>();
+
+ boolean matched;
+
+ EC2Filter[] filterSet = getFilterSet();
+ for ( String availableZone : availabilityZones.getZoneSet() ) {
+ matched = true;
+ if (filterSet != null) {
+ for (EC2Filter filter : filterSet) {
+ if (!filterMatched(availableZone, filter)) {
+ matched = false;
+ break;
+ }
+ }
+ }
+ if (matched == true)
+ resultList.add(availableZone);
+ }
+ return resultList;
+ }
+
+ private boolean filterMatched( String availableZone, EC2Filter filter ) throws ParseException {
+ String filterName = filter.getName();
+ String[] valueSet = filter.getValueSet();
+
+ if ( filterName.equalsIgnoreCase("zone-name")) {
+ return containsString(availableZone, valueSet);
+ }
+ return false;
+ }
+
+ private boolean containsString( String lookingFor, String[] set ){
+ if (lookingFor == null)
+ return false;
+
+ for (String filter: set) {
+ if (lookingFor.matches( filter )) return true;
+ }
+ return false;
+ }
+
+}
diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2DescribeAvailabilityZones.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2DescribeAvailabilityZones.java
index ba44567..9da2fc4 100644
--- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2DescribeAvailabilityZones.java
+++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2DescribeAvailabilityZones.java
@@ -21,6 +21,7 @@ import java.util.List;
public class EC2DescribeAvailabilityZones {
private List<String> zoneSet = new ArrayList<String>(); // a list of strings identifying zones
+ private EC2AvailabilityZonesFilterSet azfs = null;
public EC2DescribeAvailabilityZones() {
}
@@ -32,4 +33,13 @@ public class EC2DescribeAvailabilityZones {
public String[] getZoneSet() {
return zoneSet.toArray(new String[0]);
}
+
+ public EC2AvailabilityZonesFilterSet getFilterSet() {
+ return azfs;
+ }
+
+ public void setFilterSet( EC2AvailabilityZonesFilterSet param ) {
+ azfs = param;
+ }
+
}
diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java
index b21940d..3c14b89 100644
--- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java
+++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java
@@ -1120,10 +1120,16 @@ public class EC2Engine {
*/
public EC2DescribeAvailabilityZonesResponse handleRequest(EC2DescribeAvailabilityZones request) {
try {
- CloudStackAccount caller = getCurrentAccount();
-
- return listZones(request.getZoneSet(), null);
-
+ EC2DescribeAvailabilityZonesResponse availableZones = listZones(request.getZoneSet(), null);
+ EC2AvailabilityZonesFilterSet azfs = request.getFilterSet();
+ if ( null == azfs )
+ return availableZones;
+ else {
+ List<String> matchedAvailableZones = azfs.evaluate(availableZones);
+ if (matchedAvailableZones.isEmpty())
+ return new EC2DescribeAvailabilityZonesResponse();
+ return listZones(matchedAvailableZones.toArray(new String[0]), null);
+ }
} catch( EC2ServiceException error ) {
logger.error( "EC2 DescribeAvailabilityZones - ", error);
throw error;
--
1.7.5.4
RE: [PATCH] CS-15122. Provide filter support for
ec2-describe-availability-zones. Component: awsapi.
Posted by Kishan Kavala <Ki...@citrix.com>.
> -----Original Message-----
> From: Likitha Shetty [mailto:likitha.shetty@citrix.com]
> Sent: Monday, 4 June 2012 4:41 PM
> To: cloudstack-dev@incubator.apache.org
> Cc: Likitha Shetty
> Subject: [PATCH] CS-15122. Provide filter support for ec2-describe-
> availability-zones. Component: awsapi.
>
>
> new file mode 100644
> index 0000000..c8d9c7d
> --- /dev/null
> +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesF
> +++ ilterSet.java
> @@ -0,0 +1,99 @@
> +/*
> + * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved.
> + *
> + * Licensed 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.
> + */
Header in in new files should conform with ASF guidelines [1].
See David's commit [2] for reference. Commit: e293fb887a01e62442deaab9cbcc68d553580453
~kishan
[1] http://www.apache.org/legal/src-headers.html#headers
[2] http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/e293fb88