diff --git a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AddressFilterSet.java b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AddressFilterSet.java index cb21fb2c0ae..1823b26218c 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AddressFilterSet.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2AddressFilterSet.java @@ -63,22 +63,21 @@ public class EC2AddressFilterSet { } - public EC2DescribeAddressesResponse evaluate( List addresses) throws ParseException { + public EC2DescribeAddressesResponse evaluate( EC2DescribeAddressesResponse response) throws ParseException { EC2DescribeAddressesResponse resultList = new EC2DescribeAddressesResponse(); boolean matched; + EC2Address[] addresses = response.getAddressSet(); EC2Filter[] filterSet = getFilterSet(); for ( EC2Address address : addresses ) { matched = true; - if (filterSet != null) { - for (EC2Filter filter : filterSet) { - if (!filterMatched(address, filter)) { - matched = false; - break; - } - } - } + for (EC2Filter filter : filterSet) { + if (!filterMatched(address, filter)) { + matched = false; + break; + } + } if (matched == true) resultList.addAddress(address); 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 6f54d384acc..17752afdbd4 100644 --- a/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java +++ b/awsapi/src/com/cloud/bridge/service/core/ec2/EC2Engine.java @@ -812,24 +812,13 @@ public class EC2Engine { */ public EC2DescribeAddressesResponse describeAddresses( EC2DescribeAddresses request ) { try { - List addrList = getApi().listPublicIpAddresses(null, null, null, null, null, null, null, null, null); + EC2DescribeAddressesResponse response = listAddresses(request.getPublicIpsSet()); + EC2AddressFilterSet afs = request.getFilterSet(); - EC2AddressFilterSet filterSet = request.getFilterSet(); - List addressList = new ArrayList(); - if (addrList != null && addrList.size() > 0) { - for (CloudStackIpAddress addr: addrList) { - // remember, if no filters are set, request.inPublicIpSet always returns true - if (request.inPublicIpSet(addr.getIpAddress())) { - EC2Address ec2Address = new EC2Address(); - ec2Address.setIpAddress(addr.getIpAddress()); - if (addr.getVirtualMachineId() != null) - ec2Address.setAssociatedInstanceId(addr.getVirtualMachineId().toString()); - addressList.add(ec2Address); - } - } - } - - return filterSet.evaluate(addressList); + if (afs ==null) + return response; + else + return afs.evaluate(response); } catch(Exception e) { logger.error("EC2 DescribeAddresses - ", e); throw new EC2ServiceException(ServerError.InternalError, e.getMessage()); @@ -2079,6 +2068,39 @@ public class EC2Engine { } } + private EC2DescribeAddressesResponse listAddresses(String[] addressNames) throws Exception { + try { + EC2DescribeAddressesResponse addressSet = new EC2DescribeAddressesResponse(); + + List addresses = getApi().listPublicIpAddresses(null, null, null, null, null, null, null, null, null); + if (addresses != null && addresses.size() > 0) { + for (CloudStackIpAddress address : addresses) { + boolean matched = false; + if ( addressNames.length > 0) { + for (String addressName : addressNames) { + if (address.getIpAddress().equalsIgnoreCase(addressName)) { + matched = true; + break; + } + } + } else matched = true; + + if (!matched) continue ; + + EC2Address ec2Address = new EC2Address(); + ec2Address.setIpAddress(address.getIpAddress()); + if (address.getVirtualMachineId() != null) + ec2Address.setAssociatedInstanceId(address.getVirtualMachineId().toString()); + addressSet.addAddress(ec2Address); + } + } + return addressSet; + } catch(Exception e) { + logger.error( "List Addresses - ", e); + throw new EC2ServiceException(ServerError.InternalError, e.getMessage()); + } + } + /** * Convert ingress rule to EC2IpPermission records *