From: Likitha Shetty <likitha.she...@citrix.com>

Signed-off-by: Likitha Shetty <likitha.she...@citrix.com>
---
 .../cloud/bridge/service/EC2SoapServiceImpl.java   |   30 ++++++
 .../core/ec2/EC2AvailabilityZonesFilterSet.java    |  102 ++++++++++++++++++++
 .../core/ec2/EC2DescribeAvailabilityZones.java     |   10 ++
 .../cloud/bridge/service/core/ec2/EC2Engine.java   |   14 ++-
 4 files changed, 152 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..793af89
--- /dev/null
+++ 
b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AvailabilityZonesFilterSet.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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

Reply via email to