GitHub user sudhansu7 opened a pull request:

    https://github.com/apache/cloudstack/pull/1850

    CLOUDSTACK-9694: Unable to limit the Public IPs in VPC

    
    
    Unable to limit the Public IPs in VPC.
    In VPC network, while acquiring the IP addresses, in the resource_count 
table, count for the domain is getting increased. However, when the resource 
count is updated at Domain level, resource count is getting reverted to only 
non-vpc ip count.
    
    Steps to Reproduce:
    
    1. Create a VPC
    2. Create a VPC tier.
    3. Check resource_count table and note the ip address count. (say 1)
    4. Keep acquiring the IP addresses, (say 4 IP addresses). Now new ip 
address count resource_count table is 5.
    5. update the resource count at domain level.
    6. the resource_count is updated back 1
    
    Root Cause: Update resource count command recalculates the resource count. 
While computing public IP we are not considering the ips allocated to VPC.
    
    ResourceLimitManagerImpl.java -> calculatePublicIpForAccount() -> 
IPAddressDaoImpl.countAllocatedIPsForAccount()
    
    Currently we have below query builder. Which does not consider vpc_id 
column.
    ```
            AllocatedIpCountForAccount = createSearchBuilder(Long.class);
            AllocatedIpCountForAccount.select(null, Func.COUNT, 
AllocatedIpCountForAccount.entity().getAddress());
            AllocatedIpCountForAccount.and("account", 
AllocatedIpCountForAccount.entity().getAllocatedToAccountId(), Op.EQ);
            AllocatedIpCountForAccount.and("allocated", 
AllocatedIpCountForAccount.entity().getAllocatedTime(), Op.NNULL);
            AllocatedIpCountForAccount.and("network", 
AllocatedIpCountForAccount.entity().getAssociatedWithNetworkId(), Op.NNULL);
            AllocatedIpCountForAccount.done();
    ```
    it generates below sql query
    ```
    SELECT COUNT(user_ip_address.public_ip_address) FROM user_ip_address WHERE 
user_ip_address.account_id = 6  AND user_ip_address.allocated IS NOT NULL  AND 
user_ip_address.network_id IS NOT NULL  AND user_ip_address.removed IS NULL
    ```
    Fix:
    Add vpc_id check in query.
    ```
            AllocatedIpCountForAccount = createSearchBuilder(Long.class);
            AllocatedIpCountForAccount.select(null, Func.COUNT, 
AllocatedIpCountForAccount.entity().getAddress());
            AllocatedIpCountForAccount.and("account", 
AllocatedIpCountForAccount.entity().getAllocatedToAccountId(), Op.EQ);
            AllocatedIpCountForAccount.and("allocated", 
AllocatedIpCountForAccount.entity().getAllocatedTime(), Op.NNULL);
            AllocatedIpCountForAccount.and().op("network", 
AllocatedIpCountForAccount.entity().getAssociatedWithNetworkId(), Op.NNULL);
            AllocatedIpCountForAccount.or("vpc", 
AllocatedIpCountForAccount.entity().getVpcId(), Op.NNULL);
            AllocatedIpCountForAccount.cp();
            AllocatedIpCountForAccount.done();
    ```
    SQL:
    ```
    SELECT COUNT(user_ip_address.public_ip_address) FROM user_ip_address WHERE 
user_ip_address.account_id = 6  AND user_ip_address.allocated IS NOT NULL  AND 
( user_ip_address.network_id IS NOT NULL or user_ip_address.vpc_id IS NOT NULL) 
AND user_ip_address.removed IS NULL
    ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/sudhansu7/cloudstack CLOUDSTACK-9694

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/cloudstack/pull/1850.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1850
    
----
commit 24837f655033583388bb608f63039f8e341c16d3
Author: Sudhansu <sudhansu.s...@accelerite.com>
Date:   2016-12-21T18:24:01Z

    CLOUDSTACK-9694: Unable to limit the Public IPs in VPC
    
    Added missing clause to check for vpc_id

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

Reply via email to