Repository: cloudstack
Updated Branches:
  refs/heads/4.4-forward 3af2f6d14 -> 3852afa71


CLOUDSTACK-6231: network acl item cidrs loaded from a seperate table


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3852afa7
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3852afa7
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3852afa7

Branch: refs/heads/4.4-forward
Commit: 3852afa717dc147ef9dc19d7b3801c341f321e77
Parents: 3af2f6d
Author: Daan Hoogland <d...@onecht.net>
Authored: Wed Feb 19 15:39:12 2014 +0100
Committer: Daan Hoogland <d...@onecht.net>
Committed: Wed Apr 30 14:55:56 2014 +0200

----------------------------------------------------------------------
 .../network/vpc/NetworkACLItemCidrsDao.java     | 39 ++++++++
 .../network/vpc/NetworkACLItemCidrsVO.java      | 78 ++++++++++++++++
 .../cloud/network/vpc/NetworkACLItemDao.java    |  2 +
 .../com/cloud/network/vpc/NetworkACLItemVO.java |  5 ++
 .../vpc/dao/NetworkACLItemCidrsDaoImpl.java     | 94 ++++++++++++++++++++
 .../network/vpc/dao/NetworkACLItemDaoImpl.java  | 51 ++++++++++-
 .../com/cloud/upgrade/dao/Upgrade430to440.java  | 52 +++++++++++
 setup/db/db/schema-430to440-cleanup.sql         |  2 +-
 setup/db/db/schema-430to440.sql                 |  8 ++
 9 files changed, 328 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsDao.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsDao.java 
b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsDao.java
new file mode 100644
index 0000000..5e49368
--- /dev/null
+++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsDao.java
@@ -0,0 +1,39 @@
+/**
+ * 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.network.vpc;
+
+import java.util.List;
+
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.GenericDao;
+
+/**
+ * @author daan
+ *
+ */
+public interface NetworkACLItemCidrsDao extends 
GenericDao<NetworkACLItemCidrsVO, Long> {
+
+    void persist(long networkACLItemId, List<String> cidrs);
+
+    List<String> getCidrs(long networkACLItemId);
+
+    @DB
+    List<NetworkACLItemCidrsVO> listByNetworkACLItemId(long networkACLItemId);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsVO.java 
b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsVO.java
new file mode 100644
index 0000000..c366f94
--- /dev/null
+++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemCidrsVO.java
@@ -0,0 +1,78 @@
+/**
+ * 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.network.vpc;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+@Entity
+@Table(name = "network_acl_item_cidrs")
+public class NetworkACLItemCidrsVO implements InternalIdentity {
+    private static final long serialVersionUID = 7805284475485494754L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "network_acl_item_id")
+    private long networkACLItemId;
+
+    @Column(name = "cidr")
+    private String cidrList;
+
+    public NetworkACLItemCidrsVO() {
+    }
+
+    public NetworkACLItemCidrsVO(long networkAclItemId, String cidrList) {
+        this.networkACLItemId = networkAclItemId;
+        this.cidrList = cidrList;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.api.InternalIdentity#getId()
+     */
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public long getNetworkACLItemId() {
+        return networkACLItemId;
+    }
+
+    public String getCidr() {
+        return cidrList;
+    }
+
+    public String getCidrList() {
+        return cidrList;
+    }
+
+    public void setCidrList(String cidrList) {
+        this.cidrList = cidrList;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java 
b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
index e278485..9ab6365 100644
--- a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
+++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemDao.java
@@ -34,4 +34,6 @@ public interface NetworkACLItemDao extends 
GenericDao<NetworkACLItemVO, Long> {
     int getMaxNumberByACL(long aclId);
 
     NetworkACLItemVO findByAclAndNumber(long aclId, int number);
+
+    void loadCidrs(NetworkACLItemVO item);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/NetworkACLItemVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemVO.java 
b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemVO.java
index 8031b00..0d2897d 100644
--- a/engine/schema/src/com/cloud/network/vpc/NetworkACLItemVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLItemVO.java
@@ -37,6 +37,11 @@ import com.cloud.utils.net.NetUtils;
 @Table(name = "network_acl_item")
 public class NetworkACLItemVO implements NetworkACLItem {
 
+    /**
+     *
+     */
+    private static final long serialVersionUID = 2790623532888742060L;
+
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemCidrsDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemCidrsDaoImpl.java 
b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemCidrsDaoImpl.java
new file mode 100644
index 0000000..23c1fa7
--- /dev/null
+++ 
b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemCidrsDaoImpl.java
@@ -0,0 +1,94 @@
+/**
+ * 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.network.vpc.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.network.vpc.NetworkACLItemCidrsDao;
+import com.cloud.network.vpc.NetworkACLItemCidrsVO;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionLegacy;
+
+/**
+ * @author daan
+ *
+ */
+@Component
+@Local(value = NetworkACLItemCidrsDao.class)
+public class NetworkACLItemCidrsDaoImpl extends 
GenericDaoBase<NetworkACLItemCidrsVO, Long> implements NetworkACLItemCidrsDao {
+    private static final Logger s_logger = 
Logger.getLogger(NetworkACLItemCidrsDaoImpl.class);
+    protected final SearchBuilder<NetworkACLItemCidrsVO> cidrsSearch;
+
+    protected NetworkACLItemCidrsDaoImpl() {
+        cidrsSearch = createSearchBuilder();
+        cidrsSearch.and("networkAclItemId", 
cidrsSearch.entity().getNetworkACLItemId(), SearchCriteria.Op.EQ);
+        cidrsSearch.done();
+    }
+
+    /* (non-Javadoc)
+     * @see com.cloud.network.dao.NetworkAclItemCidrsDao#persist(long, 
java.util.List)
+     */
+    @Override
+    public void persist(long networkACLItemId, List<String> cidrs) {
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+
+        txn.start();
+        for (String cidr : cidrs) {
+            NetworkACLItemCidrsVO vo = new 
NetworkACLItemCidrsVO(networkACLItemId, cidr);
+            persist(vo);
+        }
+        txn.commit();
+    }
+
+    /* (non-Javadoc)
+     * @see com.cloud.network.dao.NetworkAclItemCidrsDao#getCidrs(long)
+     */
+    @Override
+    public List<String> getCidrs(long networkACLItemId) {
+        SearchCriteria<NetworkACLItemCidrsVO> sc = cidrsSearch.create();
+        sc.setParameters("firewallRuleId", networkACLItemId);
+
+        List<NetworkACLItemCidrsVO> results = search(sc, null);
+        List<String> cidrs = new ArrayList<String>(results.size());
+        for (NetworkACLItemCidrsVO result : results) {
+            cidrs.add(result.getCidr());
+        }
+
+        return cidrs;
+    }
+
+    @Override
+    public List<NetworkACLItemCidrsVO> listByNetworkACLItemId(long 
networkACLItemId) {
+        SearchCriteria<NetworkACLItemCidrsVO> sc = cidrsSearch.create();
+        sc.setParameters("firewallRuleId", networkACLItemId);
+
+        List<NetworkACLItemCidrsVO> results = search(sc, null);
+
+        return results;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java 
b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
index 31ff6f2..c940247 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLItemDaoImpl.java
@@ -19,10 +19,13 @@ package com.cloud.network.vpc.dao;
 import java.util.List;
 
 import javax.ejb.Local;
+import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.network.vpc.NetworkACLItem.State;
+import com.cloud.network.vpc.NetworkACLItemCidrsDao;
 import com.cloud.network.vpc.NetworkACLItemDao;
 import com.cloud.network.vpc.NetworkACLItemVO;
 import com.cloud.utils.db.DB;
@@ -31,17 +34,22 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = NetworkACLItemDao.class)
 @DB()
 public class NetworkACLItemDaoImpl extends GenericDaoBase<NetworkACLItemVO, 
Long> implements NetworkACLItemDao {
+    private static final Logger s_logger = 
Logger.getLogger(NetworkACLItemDaoImpl.class);
 
     protected final SearchBuilder<NetworkACLItemVO> AllFieldsSearch;
     protected final SearchBuilder<NetworkACLItemVO> NotRevokedSearch;
     protected final SearchBuilder<NetworkACLItemVO> ReleaseSearch;
     protected final GenericSearchBuilder<NetworkACLItemVO, Integer> 
MaxNumberSearch;
 
+    @Inject
+    protected NetworkACLItemCidrsDao _networkACLItemCidrsDao;
+
     protected NetworkACLItemDaoImpl() {
         super();
 
@@ -76,6 +84,13 @@ public class NetworkACLItemDaoImpl extends 
GenericDaoBase<NetworkACLItemVO, Long
     }
 
     @Override
+    public NetworkACLItemVO findById(Long id) {
+        NetworkACLItemVO item = super.findById(id);
+        loadCidrs(item);
+        return item;
+    }
+
+    @Override
     public boolean setStateToAdd(NetworkACLItemVO rule) {
         SearchCriteria<NetworkACLItemVO> sc = AllFieldsSearch.create();
         sc.setParameters("id", rule.getId());
@@ -96,7 +111,10 @@ public class NetworkACLItemDaoImpl extends 
GenericDaoBase<NetworkACLItemVO, Long
     public List<NetworkACLItemVO> listByACL(long aclId) {
         SearchCriteria<NetworkACLItemVO> sc = AllFieldsSearch.create();
         sc.setParameters("aclId", aclId);
-
+        List<NetworkACLItemVO> list = listBy(sc);
+        for(NetworkACLItemVO item :list) {
+            loadCidrs(item);
+        }
         return listBy(sc);
     }
 
@@ -113,6 +131,35 @@ public class NetworkACLItemDaoImpl extends 
GenericDaoBase<NetworkACLItemVO, Long
         SearchCriteria<NetworkACLItemVO> sc = AllFieldsSearch.create();
         sc.setParameters("aclId", aclId);
         sc.setParameters("number", number);
-        return findOneBy(sc);
+        NetworkACLItemVO vo = findOneBy(sc);
+        loadCidrs(vo);
+        return vo;
+    }
+
+    @Override
+    @DB
+    public NetworkACLItemVO persist(NetworkACLItemVO networkAclItem) {
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+        txn.start();
+
+        NetworkACLItemVO dbNetworkACLItem = super.persist(networkAclItem);
+        saveCidrs(networkAclItem, networkAclItem.getSourceCidrList());
+        loadCidrs(dbNetworkACLItem);
+
+        txn.commit();
+        return dbNetworkACLItem;
+    }
+
+    public void saveCidrs(NetworkACLItemVO networkACLItem, List<String> 
cidrList) {
+        if (cidrList == null) {
+            return;
+        }
+        _networkACLItemCidrsDao.persist(networkACLItem.getId(), cidrList);
+    }
+
+    @Override
+    public void loadCidrs(NetworkACLItemVO item) {
+        List<String> cidrs = _networkACLItemCidrsDao.getCidrs(item.getId());
+        item.setSourceCidrList(cidrs);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java 
b/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java
index 922a892..7406c1e 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java
@@ -61,6 +61,7 @@ public class Upgrade430to440 implements DbUpgrade {
     public void performDataMigration(Connection conn) {
         populateIAMGroupAccountMap(conn);
         secondaryIpsAccountAndDomainIdsUpdate(conn);
+        moveCidrsToTheirOwnTable(conn);
     }
 
     // populate iam_group_account_map table for existing accounts
@@ -244,7 +245,58 @@ public class Upgrade430to440 implements DbUpgrade {
     }
 
 
+    private void moveCidrsToTheirOwnTable(Connection conn) {
+        PreparedStatement pstmtItem = null;
+        PreparedStatement pstmtCidr = null;
+        ResultSet rsItems = null;
 
+        String networkAclItemSql = "SELECT id, cidr FROM 
`cloud`.`network_acl_item`";
+
+        s_logger.debug("Moving network acl item cidrs to a row per cidr");
+        try {
+            pstmtItem = conn.prepareStatement(networkAclItemSql);
+            rsItems = pstmtItem.executeQuery();
+
+            // for each network acl item
+            while(rsItems.next()) {
+                long itemId = rsItems.getLong(1);
+                // get the source cidr list
+                String cidrList = rsItems.getString(2);
+                s_logger.debug("Moving '" + cidrList +  "' to a row per cidr");
+                // split it
+                String[] cidrArray = cidrList.split(",");
+                // insert a record per cidr
+                String networkAclItemCidrSql = "INSERT INTO 
`cloud`.`network_acl_item_cidr` (network_acl_item_id, cidr) VALUES (?,?)";
+                for(String cidr: cidrArray)
+                {
+                    pstmtCidr = conn.prepareStatement(networkAclItemCidrSql);
+                    pstmtCidr.setLong(1,itemId);
+                    pstmtCidr.setString(2,cidr);
+                    pstmtCidr.executeUpdate();
+                }
+                pstmtCidr.close();
+            }
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Exception while Moving network 
acl item cidrs to a row per cidr", e);
+        } finally {
+
+            if (pstmtItem != null) {
+                try {
+                    pstmtItem.close();
+
+                } catch (SQLException e) {
+                }
+            }
+            if (pstmtCidr != null) {
+                try {
+                    pstmtCidr.close();
+
+                } catch (SQLException e) {
+                }
+            }
+        }
+        s_logger.debug("Done moving network acl item cidrs to a row per cidr");
+    }
 
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/setup/db/db/schema-430to440-cleanup.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440-cleanup.sql 
b/setup/db/db/schema-430to440-cleanup.sql
index 30df9782..8b1eec4 100644
--- a/setup/db/db/schema-430to440-cleanup.sql
+++ b/setup/db/db/schema-430to440-cleanup.sql
@@ -19,4 +19,4 @@
 -- Schema cleanup from 4.3.0 to 4.4.0;
 --;
 
-
+ALTER TABLE `cloud`.`network_acl_item` DROP COLUMN `cidr`;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3852afa7/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index 262fa37..d49f4d4 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -1653,3 +1653,11 @@ CREATE TABLE 
`cloud`.`op_vpc_distributed_router_sequence_no` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 INSERT INTO `cloud`.`configuration`(category, instance, component, name, 
value, description, default_value) VALUES ('Advanced', 'DEFAULT', 
'NetworkOrchestrationService', 'router.aggregation.command.each.timeout', '3', 
'timeout in seconds for each Virtual Router command being aggregated. The final 
aggregation command timeout would be determined by this timeout * commands 
counts ', '3') ON DUPLICATE KEY UPDATE category='Advanced';
+
+CREATE TABLE `cloud`.`network_acl_item_cidr` (
+  `id` bigint unsigned UNIQUE NOT NULL auto_increment,
+  `network_acl_item_id` bigint unsigned NOT NULL COMMENT 'Network ACL Item id',
+  `cidr` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`),
+  CONSTRAINT `fk_network_acl_item_id` FOREIGN KEY 
`fk_network_acl_item_id`(`network_acl_item_id`) REFERENCES 
`network_acl_item`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Reply via email to