diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcDao.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcDao.java index 5a33217c028..57a26214028 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/VpcDao.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcDao.java @@ -40,8 +40,8 @@ public interface VpcDao extends GenericDao{ long countByAccountId(long accountId); - VpcVO persist(VpcVO vpc, Map serviceProviderMap); + VpcVO persist(VpcVO vpc, Map> serviceProviderMap); void persistVpcServiceProviders(long vpcId, - Map serviceProviderMap); + Map> serviceProviderMap); } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java index 6560b90ce7d..12868fef8ba 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java @@ -128,7 +128,7 @@ public class VpcDaoImpl extends GenericDaoBase implements VpcDao{ @Override @DB - public VpcVO persist(VpcVO vpc, Map serviceProviderMap) { + public VpcVO persist(VpcVO vpc, Map> serviceProviderMap) { Transaction txn = Transaction.currentTxn(); txn.start(); VpcVO newVpc = super.persist(vpc); @@ -139,12 +139,14 @@ public class VpcDaoImpl extends GenericDaoBase implements VpcDao{ @Override @DB - public void persistVpcServiceProviders(long vpcId, Map serviceProviderMap) { + public void persistVpcServiceProviders(long vpcId, Map> serviceProviderMap) { Transaction txn = Transaction.currentTxn(); txn.start(); for (String service : serviceProviderMap.keySet()) { - VpcServiceMapVO serviceMap = new VpcServiceMapVO(vpcId, Network.Service.getService(service), Network.Provider.getProvider(serviceProviderMap.get(service))); - _vpcSvcMap.persist(serviceMap); + for (String provider : serviceProviderMap.get(service)) { + VpcServiceMapVO serviceMap = new VpcServiceMapVO(vpcId, Network.Service.getService(service), Network.Provider.getProvider(provider)); + _vpcSvcMap.persist(serviceMap); + } } txn.commit(); } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java index 9bd61161d05..cd624672ca2 100755 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java @@ -115,6 +115,7 @@ public class Upgrade410to420 implements DbUpgrade { setRAWformatForRBDVolumes(conn); migrateVolumeOnSecondaryStorage(conn); createFullCloneFlag(conn); + upgradeVpcServiceMap(conn); } private void createFullCloneFlag(Connection conn) { @@ -2953,4 +2954,59 @@ public class Upgrade410to420 implements DbUpgrade { throw new CloudRuntimeException("Failed to update volume format to RAW for volumes on RBD pools due to exception ", e); } } + + + private void upgradeVpcServiceMap(Connection conn){ + s_logger.debug("Upgrading VPC service Map"); + PreparedStatement listVpc = null; + PreparedStatement listServiceProviders = null; + PreparedStatement insertProviders = null; + ResultSet rs = null; + ResultSet rs1 = null; + try { + //Get all vpc Ids along with vpc offering Id + listVpc = conn.prepareStatement("SELECT id, vpc_offering_id FROM `cloud`.`vpc` where removed is NULL"); + rs = listVpc.executeQuery(); + while (rs.next()) { + long vpc_id = rs.getLong(1); + long offering_id = rs.getLong(2); + //list all services and providers in offering + listServiceProviders = conn.prepareStatement("SELECT service, provider FROM `cloud`.`vpc_offering_service_map` where vpc_offering_id = ?"); + listServiceProviders.setLong(1, offering_id); + rs1 = listServiceProviders.executeQuery(); + //Insert entries in vpc_service_map + while (rs1.next()) { + String service = rs1.getString(1); + String provider = rs1.getString(2); + insertProviders = conn.prepareStatement("INSERT INTO `cloud`.`vpc_service_map` (`vpc_id`, `service`, `provider`, `created`) VALUES (?, ?, ?, now());"); + insertProviders.setLong(1, vpc_id); + insertProviders.setString(2, service); + insertProviders.setString(3, provider); + insertProviders.executeUpdate(); + } + s_logger.debug("Upgraded service map for VPC: "+vpc_id); + } + }catch (SQLException e) { + throw new CloudRuntimeException("Error during VPC service map upgrade", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (rs1 != null) { + rs1.close(); + } + if (listVpc != null) { + listVpc.close(); + } + if (listServiceProviders != null) { + listServiceProviders.close(); + } + if (insertProviders != null) { + insertProviders.close(); + } + } catch (SQLException e) { + } + } + } } diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index a07b9efaf89..73b3aea66a2 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -670,18 +670,11 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis return vpc; } - private Map finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) { - Map svcProviders = new HashMap(); - Map> providerSvcs = new HashMap>(); + private Map> finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) { + Map> svcProviders = new HashMap>(); List servicesMap = _vpcOffSvcMapDao.listByVpcOffId(offeringId); for (VpcOfferingServiceMapVO serviceMap : servicesMap) { - if (svcProviders.containsKey(serviceMap.getService())) { - // FIXME - right now we pick up the first provider from the list, need to add more logic based on - // provider load, etc - continue; - } - String service = serviceMap.getService(); String provider = serviceMap.getProvider(); @@ -695,13 +688,15 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis throw new InvalidParameterValueException("Provider " + provider + " should be enabled in at least one physical network of the zone specified"); } - - svcProviders.put(service, provider); - List l = providerSvcs.get(provider); - if (l == null) { - providerSvcs.put(provider, l = new ArrayList()); + + List providers = null; + if (svcProviders.get(service) == null) { + providers = new ArrayList(); + } else { + providers = svcProviders.get(service); } - l.add(service); + providers.add(provider); + svcProviders.put(service, providers); } return svcProviders; diff --git a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java index 562d67dc207..5e1c2ecef56 100644 --- a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java +++ b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java @@ -86,12 +86,12 @@ public class MockVpcDaoImpl extends GenericDaoBase implements VpcDa } @Override - public VpcVO persist(VpcVO vpc, Map serviceProviderMap) { + public VpcVO persist(VpcVO vpc, Map> serviceProviderMap) { return null; } @Override - public void persistVpcServiceProviders(long vpcId, Map serviceProviderMap) { + public void persistVpcServiceProviders(long vpcId, Map> serviceProviderMap) { return; } diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 768183bef59..e7d9f4423be 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -265,7 +265,7 @@ CREATE TABLE `vpc_service_map` ( `created` datetime COMMENT 'date created', PRIMARY KEY (`id`), CONSTRAINT `fk_vpc_service_map__vpc_id` FOREIGN KEY(`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, - UNIQUE (`vpc_id`, `service`) + UNIQUE (`vpc_id`, `service`, `provider`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`load_balancer_healthcheck_policies` (