From 743187a951c900665d96e4154ff03eb40da97d44 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 13 Sep 2010 17:46:18 -0700 Subject: [PATCH] bug 6163: implementing the search function for zone wide searches for vlans --- core/src/com/cloud/dc/dao/VlanDao.java | 2 + core/src/com/cloud/dc/dao/VlanDaoImpl.java | 40 +++++++++++++++++-- .../com/cloud/server/ManagementServer.java | 1 + .../cloud/server/ManagementServerImpl.java | 5 +++ .../src/com/cloud/vm/UserVmManagerImpl.java | 25 +++++++++++- 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/core/src/com/cloud/dc/dao/VlanDao.java b/core/src/com/cloud/dc/dao/VlanDao.java index 47b0969d86a..f96ff50d859 100644 --- a/core/src/com/cloud/dc/dao/VlanDao.java +++ b/core/src/com/cloud/dc/dao/VlanDao.java @@ -50,4 +50,6 @@ public interface VlanDao extends GenericDao { List listZoneWideVlans(long zoneId, VlanType vlanType, String vlanId); + List searchForZoneWideVlans(long dcId, String vlanType,String vlanId); + } diff --git a/core/src/com/cloud/dc/dao/VlanDaoImpl.java b/core/src/com/cloud/dc/dao/VlanDaoImpl.java index 7358dabc30a..1115cfd24cf 100644 --- a/core/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -18,6 +18,9 @@ package com.cloud.dc.dao; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -35,13 +38,18 @@ import com.cloud.dc.Vlan.VlanType; import com.cloud.network.dao.IPAddressDao; import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; @Local(value={VlanDao.class}) public class VlanDaoImpl extends GenericDaoBase implements VlanDao { + private final String FindZoneWideVlans = "SELECT * FROM vlan WHERE data_center_id=? and vlan_type=? and vlan_id!=? and id not in (select vlan_db_id from account_vlan_map)"; + protected SearchBuilder ZoneVlanIdSearch; protected SearchBuilder ZoneSearch; protected SearchBuilder ZoneTypeSearch; @@ -83,10 +91,6 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao ZoneTypeSearch.and("vlanType", ZoneTypeSearch.entity().getVlanType(), SearchCriteria.Op.EQ); ZoneTypeSearch.done(); - ZoneVlanSearch = createSearchBuilder(); - ZoneVlanSearch.and("vlanType", ZoneVlanSearch.entity().getVlanType(), SearchCriteria.Op.EQ); - ZoneVlanSearch.and("vlanId", ZoneVlanSearch.entity().getVlanId(), SearchCriteria.Op.NEQ); - ZoneVlanSearch.and("zoneId", ZoneTypeSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); } @Override @@ -270,5 +274,33 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao return new Pair(ipAddress, vlan); } + + @Override + @DB + public List searchForZoneWideVlans(long dcId, String vlanType, String vlanId){ + + StringBuilder sql = new StringBuilder(FindZoneWideVlans); + + Transaction txn = Transaction.currentTxn(); + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + pstmt.setLong(1, dcId); + pstmt.setString(2, vlanType); + pstmt.setString(3, vlanId); + + ResultSet rs = pstmt.executeQuery(); + List zoneWideVlans = new ArrayList(); + + while (rs.next()) { + zoneWideVlans.add(toEntityBean(rs, false)); + } + + return zoneWideVlans; + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); + } + + } } diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index c3794a40303..2d0901d61ad 100755 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -2201,4 +2201,5 @@ public interface ManagementServer { VolumeVO getRootVolume(Long instanceId); long getPsMaintenanceCount(long podId); boolean isPoolUp(long instanceId); + List searchForZoneWideVlans(long dcId, String vlanType,String vlanId); } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 951327af0a3..35f2cf9f356 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -8807,5 +8807,10 @@ public class ManagementServerImpl implements ManagementServer { return false; } + + @Override + public List searchForZoneWideVlans(long dcId, String vlanType, String vlanId){ + return _vlanDao.searchForZoneWideVlans(dcId, vlanType, vlanId); + } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 2e116761556..904a718bb30 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -80,10 +80,12 @@ import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; +import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.VlanVO; import com.cloud.dc.Vlan.VlanType; +import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; @@ -169,6 +171,8 @@ import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; @@ -221,12 +225,13 @@ public class UserVmManagerImpl implements UserVmManager { @Inject AsyncJobManager _asyncMgr; @Inject protected StoragePoolHostDao _storagePoolHostDao; @Inject VlanDao _vlanDao; + @Inject AccountVlanMapDao _accountVlanMapDao; @Inject StoragePoolDao _storagePoolDao; @Inject VMTemplateHostDao _vmTemplateHostDao; @Inject NetworkGroupManager _networkGroupManager; @Inject ServiceOfferingDao _serviceOfferingDao; @Inject EventDao _eventDao = null; - + private IpAddrAllocator _IpAllocator; ScheduledExecutorService _executor = null; int _expungeInterval; @@ -1868,6 +1873,7 @@ public class UserVmManagerImpl implements UserVmManager { Enumeration it = ipAllocators.enumeration(); _IpAllocator = it.nextElement(); } + return true; } @@ -2647,15 +2653,30 @@ public class UserVmManagerImpl implements UserVmManager { List vlansForAccount = _vlanDao.listVlansForAccountByType(dc.getId(), account.getId(), VlanType.DirectAttached); boolean forAccount = false; + boolean forZone = false; if (vlansForAccount.size() > 0) { forAccount = true; guestVlan = vlansForAccount.get(0);//FIXME: iterate over all vlans } + else + { + //list zone wide vlans that are direct attached and tagged + //if exists pick random one + //set forZone = true + + //note the dao method below does a NEQ on vlan id, hence passing untagged + List zoneWideVlans = _vlanDao.listZoneWideVlans(dc.getId(),VlanType.DirectAttached,"untagged"); + + if(zoneWideVlans!=null && zoneWideVlans.size()>0){ + forZone = true; + guestVlan = zoneWideVlans.get(0);//FIXME: iterate over all vlans + } + } while ((pod = _agentMgr.findPod(template, offering, dc, account.getId(), avoids)) != null) { if (s_logger.isDebugEnabled()) { s_logger.debug("Attempting to create direct attached vm in pod " + pod.first().getName()); } - if (!forAccount) { + if (!forAccount && !forZone) { List vlansForPod = _vlanDao.listVlansForPodByType(pod.first().getId(), VlanType.DirectAttached); if (vlansForPod.size() < 1) { avoids.add(pod.first().getId());