CLOUDSTACK-4704: 41-42 db upgrade - populate vpc_service_map table with the services/providers supported by VPC

(cherry picked from commit 798f34a49cbfbb3a475f3dadf62d1ac1b8dfa510)

Signed-off-by: Wei Zhou <w.zhou@leaseweb.com>
This commit is contained in:
Alena Prokharchyk 2013-09-19 13:08:38 -07:00 committed by Wei Zhou
parent 9055e5bd71
commit 2fa5a5ae97
6 changed files with 77 additions and 24 deletions

View File

@ -40,8 +40,8 @@ public interface VpcDao extends GenericDao<VpcVO, Long>{
long countByAccountId(long accountId);
VpcVO persist(VpcVO vpc, Map<String, String> serviceProviderMap);
VpcVO persist(VpcVO vpc, Map<String, List<String>> serviceProviderMap);
void persistVpcServiceProviders(long vpcId,
Map<String, String> serviceProviderMap);
Map<String, List<String>> serviceProviderMap);
}

View File

@ -128,7 +128,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
@Override
@DB
public VpcVO persist(VpcVO vpc, Map<String, String> serviceProviderMap) {
public VpcVO persist(VpcVO vpc, Map<String, List<String>> serviceProviderMap) {
Transaction txn = Transaction.currentTxn();
txn.start();
VpcVO newVpc = super.persist(vpc);
@ -139,12 +139,14 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
@Override
@DB
public void persistVpcServiceProviders(long vpcId, Map<String, String> serviceProviderMap) {
public void persistVpcServiceProviders(long vpcId, Map<String, List<String>> 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();
}

View File

@ -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) {
}
}
}
}

View File

@ -670,18 +670,11 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
return vpc;
}
private Map<String, String> finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) {
Map<String, String> svcProviders = new HashMap<String, String>();
Map<String, List<String>> providerSvcs = new HashMap<String, List<String>>();
private Map<String, List<String>> finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) {
Map<String, List<String>> svcProviders = new HashMap<String, List<String>>();
List<VpcOfferingServiceMapVO> 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<String> l = providerSvcs.get(provider);
if (l == null) {
providerSvcs.put(provider, l = new ArrayList<String>());
List<String> providers = null;
if (svcProviders.get(service) == null) {
providers = new ArrayList<String>();
} else {
providers = svcProviders.get(service);
}
l.add(service);
providers.add(provider);
svcProviders.put(service, providers);
}
return svcProviders;

View File

@ -86,12 +86,12 @@ public class MockVpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDa
}
@Override
public VpcVO persist(VpcVO vpc, Map<String, String> serviceProviderMap) {
public VpcVO persist(VpcVO vpc, Map<String, List<String>> serviceProviderMap) {
return null;
}
@Override
public void persistVpcServiceProviders(long vpcId, Map<String, String> serviceProviderMap) {
public void persistVpcServiceProviders(long vpcId, Map<String, List<String>> serviceProviderMap) {
return;
}

View File

@ -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` (