diff --git a/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java b/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java index 55ca92a5dfe..a03e6d9f7df 100644 --- a/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java @@ -25,7 +25,6 @@ import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.AlertResponse; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.log4j.Logger; diff --git a/docs/en-US/delete-event-alerts.xml b/docs/en-US/delete-event-alerts.xml index ef39040c102..5958b721940 100644 --- a/docs/en-US/delete-event-alerts.xml +++ b/docs/en-US/delete-event-alerts.xml @@ -27,7 +27,10 @@ You can delete or archive individual alerts or events either directly by using the Quickview or by using the Details page. If you want to delete multiple alerts or events at the same time, you can use the respective context menu. You can delete alerts or events by category for a time - period. + period. For example, you can select categories such as USER.LOGOUT, VM.DESTROY, VM.AG.UPDATE, CONFIGURATION.VALUE.EDI, and so on. + You can also view the number of events or alerts archived or deleted. In order to support the delete or archive alerts, the following global parameters have been added: diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDao.java b/engine/schema/src/com/cloud/dc/dao/VlanDao.java index 605fb2020df..39fa818e26f 100755 --- a/engine/schema/src/com/cloud/dc/dao/VlanDao.java +++ b/engine/schema/src/com/cloud/dc/dao/VlanDao.java @@ -54,4 +54,6 @@ public interface VlanDao extends GenericDao { List listZoneWideNonDedicatedVlans(long zoneId); List listVlansByNetworkIdAndGateway(long networkid, String gateway); + + List listDedicatedVlans(long accountId); } diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java index e8c68b18a6b..eb3bde9d005 100755 --- a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -58,6 +58,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao protected SearchBuilder PhysicalNetworkVlanSearch; protected SearchBuilder ZoneWideNonDedicatedVlanSearch; protected SearchBuilder VlanGatewaysearch; + protected SearchBuilder DedicatedVlanSearch; protected SearchBuilder AccountVlanMapSearch; @@ -213,6 +214,13 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao ZoneWideNonDedicatedVlanSearch.done(); AccountVlanMapSearch.done(); + DedicatedVlanSearch = createSearchBuilder(); + AccountVlanMapSearch = _accountVlanMapDao.createSearchBuilder(); + AccountVlanMapSearch.and("accountId", AccountVlanMapSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + DedicatedVlanSearch.join("AccountVlanMapSearch", AccountVlanMapSearch, DedicatedVlanSearch.entity().getId(), AccountVlanMapSearch.entity().getVlanDbId(), JoinBuilder.JoinType.LEFTOUTER); + DedicatedVlanSearch.done(); + AccountVlanMapSearch.done(); + return result; } @@ -343,4 +351,11 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao return listBy(sc); } + @Override + public List listDedicatedVlans(long accountId) { + SearchCriteria sc = DedicatedVlanSearch.create(); + sc.setJoinParameters("AccountVlanMapSearch", "accountId", accountId); + return listBy(sc); + } + } diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDao.java b/engine/schema/src/com/cloud/domain/dao/DomainDao.java index afeb0f462f4..cb1c1f2c4be 100644 --- a/engine/schema/src/com/cloud/domain/dao/DomainDao.java +++ b/engine/schema/src/com/cloud/domain/dao/DomainDao.java @@ -26,9 +26,10 @@ public interface DomainDao extends GenericDao { public DomainVO create(DomainVO domain); public DomainVO findDomainByPath(String domainPath); public boolean isChildDomain(Long parentId, Long childId); - DomainVO findImmediateChildForParent(Long parentId); - List findImmediateChildrenForParent(Long parentId); - List findAllChildren(String path, Long parentId); - List findInactiveDomains(); + DomainVO findImmediateChildForParent(Long parentId); + List findImmediateChildrenForParent(Long parentId); + List findAllChildren(String path, Long parentId); + List findInactiveDomains(); Set getDomainParentIds(long domainId); + List getDomainChildrenIds(String path); } diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java index c30ca5ef49a..9460a73dc57 100644 --- a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java +++ b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java @@ -32,6 +32,7 @@ import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @@ -46,6 +47,7 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom protected SearchBuilder DomainPairSearch; protected SearchBuilder ImmediateChildDomainSearch; protected SearchBuilder FindAllChildrenSearch; + protected GenericSearchBuilder FindIdsOfAllChildrenSearch; protected SearchBuilder AllFieldsSearch; public DomainDaoImpl () { @@ -70,7 +72,12 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom FindAllChildrenSearch.and("path", FindAllChildrenSearch.entity().getPath(), SearchCriteria.Op.LIKE); FindAllChildrenSearch.and("id", FindAllChildrenSearch.entity().getId(), SearchCriteria.Op.NEQ); FindAllChildrenSearch.done(); - + + FindIdsOfAllChildrenSearch = createSearchBuilder(Long.class); + FindIdsOfAllChildrenSearch.selectField(FindIdsOfAllChildrenSearch.entity().getId()); + FindIdsOfAllChildrenSearch.and("path", FindIdsOfAllChildrenSearch.entity().getPath(), SearchCriteria.Op.LIKE); + FindIdsOfAllChildrenSearch.done(); + AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ); AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), SearchCriteria.Op.EQ); @@ -221,7 +228,14 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom sc.setParameters("id", parentId); return listBy(sc); } - + + @Override + public List getDomainChildrenIds(String path){ + SearchCriteria sc = FindIdsOfAllChildrenSearch.create(); + sc.setParameters("path", path+"%"); + return customSearch(sc, null); + } + @Override public boolean isChildDomain(Long parentId, Long childId) { if ((parentId == null) || (childId == null)) { diff --git a/engine/schema/src/com/cloud/event/dao/EventDao.java b/engine/schema/src/com/cloud/event/dao/EventDao.java index da5f47a90b4..9454ce717de 100644 --- a/engine/schema/src/com/cloud/event/dao/EventDao.java +++ b/engine/schema/src/com/cloud/event/dao/EventDao.java @@ -31,7 +31,7 @@ public interface EventDao extends GenericDao { EventVO findCompletedEvent(long startId); - public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId); + public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, List accountIds); public void archiveEvents(List events); diff --git a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java index 6ba59c56b0a..0d3d38a0204 100644 --- a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java +++ b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java @@ -49,7 +49,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event ToArchiveOrDeleteEventSearch = createSearchBuilder(); ToArchiveOrDeleteEventSearch.and("id", ToArchiveOrDeleteEventSearch.entity().getId(), Op.IN); ToArchiveOrDeleteEventSearch.and("type", ToArchiveOrDeleteEventSearch.entity().getType(), Op.EQ); - ToArchiveOrDeleteEventSearch.and("accountId", ToArchiveOrDeleteEventSearch.entity().getAccountId(), Op.EQ); + ToArchiveOrDeleteEventSearch.and("accountIds", ToArchiveOrDeleteEventSearch.entity().getAccountId(), Op.IN); ToArchiveOrDeleteEventSearch.and("createDateL", ToArchiveOrDeleteEventSearch.entity().getCreateDate(), Op.LT); ToArchiveOrDeleteEventSearch.done(); } @@ -76,7 +76,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event } @Override - public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, Long accountId) { + public List listToArchiveOrDeleteEvents(List ids, String type, Date olderThan, List accountIds) { SearchCriteria sc = ToArchiveOrDeleteEventSearch.create(); if (ids != null) { sc.setParameters("id", ids.toArray(new Object[ids.size()])); @@ -87,23 +87,24 @@ public class EventDaoImpl extends GenericDaoBase implements Event if (olderThan != null) { sc.setParameters("createDateL", olderThan); } - if (accountId != null) { - sc.setParameters("accountId", accountId); + if (accountIds != null && !accountIds.isEmpty()) { + sc.setParameters("accountIds", accountIds.toArray(new Object[accountIds.size()])); } return search(sc, null); } @Override public void archiveEvents(List events) { - - Transaction txn = Transaction.currentTxn(); - txn.start(); - for (EventVO event : events) { - event = lockRow(event.getId(), true); - event.setArchived(true); - update(event.getId(), event); - txn.commit(); + if (events != null && !events.isEmpty()) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + for (EventVO event : events) { + event = lockRow(event.getId(), true); + event.setArchived(true); + update(event.getId(), event); + txn.commit(); + } + txn.close(); } - txn.close(); } } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDao.java b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDao.java index 02df92e9c67..ff8c26a9571 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDao.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDao.java @@ -70,6 +70,7 @@ public interface PrivateIpDao extends GenericDao{ */ PrivateIpVO findByIpAndVpcId(long vpcId, String ip4Address); - + + PrivateIpVO findByIpAndSourceNetworkIdAndVpcId(long networkId, String ip4Address, long vpcId); } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java index ecab3bb6625..fe435c05175 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java @@ -114,7 +114,16 @@ public class PrivateIpDaoImpl extends GenericDaoBase implemen sc.setParameters("networkId", networkId); return findOneBy(sc); } - + + @Override + public PrivateIpVO findByIpAndSourceNetworkIdAndVpcId(long networkId, String ip4Address, long vpcId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("ip", ip4Address); + sc.setParameters("networkId", networkId); + sc.setParameters("vpcId", vpcId); + return findOneBy(sc); + } + @Override public PrivateIpVO findByIpAndVpcId(long vpcId, String ip4Address) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/engine/schema/src/com/cloud/user/dao/AccountDao.java b/engine/schema/src/com/cloud/user/dao/AccountDao.java index 3b7fa66434e..204da394a69 100644 --- a/engine/schema/src/com/cloud/user/dao/AccountDao.java +++ b/engine/schema/src/com/cloud/user/dao/AccountDao.java @@ -49,4 +49,5 @@ public interface AccountDao extends GenericDao { //returns only non-removed account Account findActiveAccount(String accountName, Long domainId); Account findActiveNonProjectAccount(String accountName, Long domainId); + List getAccountIdsForDomains(List ids); } diff --git a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java index 892fdcd548d..aa67e86bf70 100755 --- a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java +++ b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java @@ -35,8 +35,10 @@ import com.cloud.utils.Pair; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; +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.Transaction; @Component @@ -54,7 +56,8 @@ public class AccountDaoImpl extends GenericDaoBase implements A protected final SearchBuilder CleanupForRemovedAccountsSearch; protected final SearchBuilder CleanupForDisabledAccountsSearch; protected final SearchBuilder NonProjectAccountSearch; - + protected final GenericSearchBuilder AccountIdsSearch; + public AccountDaoImpl() { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("accountName", AllFieldsSearch.entity().getAccountName(), SearchCriteria.Op.EQ); @@ -91,6 +94,11 @@ public class AccountDaoImpl extends GenericDaoBase implements A NonProjectAccountSearch.and("state", NonProjectAccountSearch.entity().getState(), SearchCriteria.Op.EQ); NonProjectAccountSearch.and("type", NonProjectAccountSearch.entity().getType(), SearchCriteria.Op.NEQ); NonProjectAccountSearch.done(); + + AccountIdsSearch = createSearchBuilder(Long.class); + AccountIdsSearch.selectField(AccountIdsSearch.entity().getId()); + AccountIdsSearch.and("ids", AccountIdsSearch.entity().getDomainId(), Op.IN); + AccountIdsSearch.done(); } @Override @@ -263,5 +271,12 @@ public class AccountDaoImpl extends GenericDaoBase implements A } } } - + + @Override + public List getAccountIdsForDomains(List domainIds) { + SearchCriteria sc = AccountIdsSearch.create(); + sc.setParameters("ids", domainIds.toArray(new Object[domainIds.size()])); + return customSearch(sc, null); + } + } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index b8c6f0900b6..01476825b7b 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -3152,6 +3152,8 @@ ServerResource { if (vmTO.getOs().startsWith("Windows")) { clock.setClockOffset(ClockDef.ClockOffset.LOCALTIME); clock.setTimer("rtc", "catchup", null); + } else if (vmTO.getType() != VirtualMachine.Type.User) { + clock.setTimer("kvmclock", "catchup", null); } vm.addComp(clock); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 8f58719e7be..e7e4bbf2c30 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -465,7 +465,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { StoragePool p = conn.storagePoolLookupByName(poolname); LibvirtStoragePoolDef pdef = getStoragePoolDef(conn, p); - if (pdef.getTargetPath().equals(path)) { + String targetPath = pdef.getTargetPath(); + if (targetPath != null && targetPath.equals(path)) { s_logger.debug("Storage pool utilizing path '" + path + "' already exists as pool " + poolname + ", undefining so we can re-define with correct name " + name); if (p.isPersistent() == 1) { diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 7bb25ef81bb..734f72fe01a 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -639,7 +639,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (vmSpec.getLimitCpuUse()) { long utilization = 0; // max CPU cap, default is unlimited utilization = ((long)speed * 100 * vmSpec.getCpus()) / _host.speed ; - vm.addToVCPUsParamsLive(conn, "cap", Long.toString(utilization)); + //vm.addToVCPUsParamsLive(conn, "cap", Long.toString(utilization)); currently xenserver doesnot support Xapi to add VCPUs params live. + callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", Long.toString(utilization), "vmname", vmSpec.getName() ); } //vm.addToVCPUsParamsLive(conn, "weight", Integer.toString(cpuWeight)); callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", Integer.toString(cpuWeight), "vmname", vmSpec.getName() ); @@ -672,6 +673,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe for (VM vm : vms) { VM.Record vmr = vm.getRecord(conn); try { + Map hostParams = new HashMap(); + hostParams = host.getLicenseParams(conn); + if (hostParams.get("restrict_dmc").equalsIgnoreCase("true")) { + throw new CloudRuntimeException("Host "+ _host.uuid + " does not support Dynamic Memory Control, so we cannot scale up the vm"); + } scaleVM(conn, vm, vmSpec, host); } catch (Exception e) { diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java index 96a90a61fff..24cb75cbf93 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java @@ -139,8 +139,17 @@ public class XenServer56FP1Resource extends XenServer56Resource { record.actionsAfterShutdown = Types.OnNormalExit.DESTROY; record.memoryDynamicMax = vmSpec.getMaxRam(); record.memoryDynamicMin = vmSpec.getMinRam(); - record.memoryStaticMax = 8589934592L; //128GB - record.memoryStaticMin = 134217728L; //128MB + Map hostParams = new HashMap(); + hostParams = host.getLicenseParams(conn); + if (hostParams.get("restrict_dmc").equalsIgnoreCase("false")) { + record.memoryStaticMax = 8589934592L; //8GB + record.memoryStaticMin = 134217728L; //128MB + } else { + s_logger.warn("Host "+ _host.uuid + " does not support Dynamic Memory Control, so we cannot scale up the vm"); + record.memoryStaticMax = vmSpec.getMaxRam(); + record.memoryStaticMin = vmSpec.getMinRam(); + } + if (guestOsTypeName.toLowerCase().contains("windows")) { record.VCPUsMax = (long) vmSpec.getCpus(); } else { diff --git a/plugins/hypervisors/xen/test/com/cloud/hypervisor/xen/resource/CitrixResourceBaseTest.java b/plugins/hypervisors/xen/test/com/cloud/hypervisor/xen/resource/CitrixResourceBaseTest.java index 7392cb1d53e..877e3bc5120 100644 --- a/plugins/hypervisors/xen/test/com/cloud/hypervisor/xen/resource/CitrixResourceBaseTest.java +++ b/plugins/hypervisors/xen/test/com/cloud/hypervisor/xen/resource/CitrixResourceBaseTest.java @@ -110,7 +110,7 @@ public class CitrixResourceBaseTest { @Test public void testScaleVMF2() throws Types.XenAPIException, XmlRpcException { - doReturn(null).when(vm).setMemoryDynamicRangeAsync(conn, 536870912L, 536870912L); + doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L); doReturn(1).when(vmSpec).getCpus(); doNothing().when(vm).setVCPUsNumberLive(conn, 1L); doReturn(500).when(vmSpec).getSpeed(); @@ -129,12 +129,12 @@ public class CitrixResourceBaseTest { @Test public void testScaleVMF3() throws Types.XenAPIException, XmlRpcException { - doReturn(null).when(vm).setMemoryDynamicRangeAsync(conn, 536870912L, 536870912L); + doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L); doReturn(1).when(vmSpec).getCpus(); doNothing().when(vm).setVCPUsNumberLive(conn, 1L); doReturn(500).when(vmSpec).getSpeed(); doReturn(true).when(vmSpec).getLimitCpuUse(); - doNothing().when(vm).addToVCPUsParamsLive(conn, "cap", "100"); + doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "100", "vmname", "i-2-3-VM"); Map args = (Map)mock(HashMap.class); when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success"); doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM"); @@ -143,6 +143,6 @@ public class CitrixResourceBaseTest { verify(vmSpec, times(1)).getLimitCpuUse(); verify(_resource, times(1)).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "weight", "value", "253", "vmname", "i-2-3-VM"); - verify(vm, times(1)).addToVCPUsParamsLive(conn, "cap", "100"); + verify(_resource, times(1)).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "100", "vmname", "i-2-3-VM"); } } \ No newline at end of file diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java index c7380ab11d8..0e57cae6ddc 100644 --- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java +++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java @@ -795,7 +795,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection { } private String getNameForPFPortPool(String tenantName, String identifier) { - return "PFPort-" + tenantName + "-" + identifier; + return "PortPool-" + tenantName + "-" + identifier; } private String getDnForPFPortPool(String tenantName, String identifier) { @@ -803,7 +803,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection { } private String getNameForPFIpPool(String tenantName, String identifier) { - return "PFIp-" + tenantName + "-" + identifier; + return "IpPool-" + tenantName + "-" + identifier; } private String getDnForPFIpPool(String tenantName, String identifier) { @@ -1010,8 +1010,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection { xml = replaceXmlValue(xml, "natruledn", getDnForPFRule(tenantName, identifier, policyIdentifier)); xml = replaceXmlValue(xml, "natrulename", getNameForPFRule(tenantName, identifier)); xml = replaceXmlValue(xml, "descr", "PF rule for Tenant VDC " + tenantName); - xml = replaceXmlValue(xml, "ippoolname", getNameForPFIpPool(tenantName, policyIdentifier + "-" + identifier)); - xml = replaceXmlValue(xml, "portpoolname", getNameForPFPortPool(tenantName, policyIdentifier + "-" + identifier)); + xml = replaceXmlValue(xml, "ippoolname", getNameForPFIpPool(tenantName, identifier)); + xml = replaceXmlValue(xml, "portpoolname", getNameForPFPortPool(tenantName, identifier)); xml = replaceXmlValue(xml, "ip", publicIp); xml = replaceXmlValue(xml, "startport", startPort); xml = replaceXmlValue(xml, "endport", endPort); @@ -1088,7 +1088,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection { } private String getNameForDNatIpPool(String tenantName, String identifier) { - return "DNATIp-" + tenantName + "-" + identifier; + return "IpPool-" + tenantName + "-" + identifier; } private String getDnForDNatIpPool(String tenantName, String identifier) { @@ -1135,7 +1135,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection { xml = replaceXmlValue(xml, "natruledn", getDnForDNatRule(tenantName, identifier, policyIdentifier)); xml = replaceXmlValue(xml, "natrulename", getNameForDNatRule(tenantName, identifier)); xml = replaceXmlValue(xml, "descr", "DNAT rule for Tenant VDC " + tenantName); - xml = replaceXmlValue(xml, "ippoolname", getNameForDNatIpPool(tenantName, policyIdentifier + "-" + identifier)); + xml = replaceXmlValue(xml, "ippoolname", getNameForDNatIpPool(tenantName, identifier)); xml = replaceXmlValue(xml, "ip", publicIp); List rules = listChildren(getDnForDNatPolicy(tenantName, policyIdentifier)); diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java index 9c81b2e28a1..176fdc45062 100644 --- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java +++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java @@ -364,7 +364,8 @@ public class CiscoVnmcResource implements ServerResource { } else { String[] externalIpRange = getIpRangeFromCidr(rule.getSourceCidrList().get(0)); if (rule.getTrafficType() == TrafficType.Ingress) { - if (!rule.getProtocol().equalsIgnoreCase("icmp")) { + if (!rule.getProtocol().equalsIgnoreCase("icmp") + && rule.getSrcPortRange() != null) { if (!_connection.createTenantVDCIngressAclRule(tenant, Long.toString(rule.getId()), policyIdentifier, rule.getProtocol().toUpperCase(), externalIpRange[0], externalIpRange[1], @@ -379,7 +380,8 @@ public class CiscoVnmcResource implements ServerResource { } } } else { - if (rule.getProtocol().equalsIgnoreCase("tcp") || rule.getProtocol().equalsIgnoreCase("udp")) { + if ((rule.getProtocol().equalsIgnoreCase("tcp") || rule.getProtocol().equalsIgnoreCase("udp")) + && rule.getSrcPortRange() != null) { if (!_connection.createTenantVDCEgressAclRule(tenant, Long.toString(rule.getId()), policyIdentifier, rule.getProtocol().toUpperCase(), @@ -477,7 +479,7 @@ public class CiscoVnmcResource implements ServerResource { throw new Exception("Failed to delete ACL ingress rule for DNAT in VNMC for guest network with vlan " + vlanId); } } else { - if (!_connection.createTenantVDCDNatIpPool(tenant, policyIdentifier + "-" + rule.getId(), rule.getDstIp())) { + if (!_connection.createTenantVDCDNatIpPool(tenant, Long.toString(rule.getId()), rule.getDstIp())) { throw new Exception("Failed to create DNAT ip pool in VNMC for guest network with vlan " + vlanId); } @@ -572,10 +574,10 @@ public class CiscoVnmcResource implements ServerResource { throw new Exception("Failed to delete ACL ingress rule for PF in VNMC for guest network with vlan " + vlanId); } } else { - if (!_connection.createTenantVDCPFIpPool(tenant, policyIdentifier + "-" + rule.getId(), rule.getDstIp())) { + if (!_connection.createTenantVDCPFIpPool(tenant, Long.toString(rule.getId()), rule.getDstIp())) { throw new Exception("Failed to create PF ip pool in VNMC for guest network with vlan " + vlanId); } - if (!_connection.createTenantVDCPFPortPool(tenant, policyIdentifier + "-" + rule.getId(), + if (!_connection.createTenantVDCPFPortPool(tenant, Long.toString(rule.getId()), Integer.toString(rule.getDstPortRange()[0]), Integer.toString(rule.getDstPortRange()[1]))) { throw new Exception("Failed to create PF port pool in VNMC for guest network with vlan " + vlanId); } diff --git a/plugins/network-elements/midonet/src/com/cloud/network/element/MidoNetElement.java b/plugins/network-elements/midonet/src/com/cloud/network/element/MidoNetElement.java index d07fa5624c5..ab6a6def405 100644 --- a/plugins/network-elements/midonet/src/com/cloud/network/element/MidoNetElement.java +++ b/plugins/network-elements/midonet/src/com/cloud/network/element/MidoNetElement.java @@ -36,7 +36,6 @@ import com.cloud.network.NetworkModel; import com.cloud.network.Networks; import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PublicIpAddress; -import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.StaticNat; @@ -47,6 +46,8 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.PluggableService; import com.cloud.utils.net.NetUtils; +import com.cloud.user.AccountVO; +import com.cloud.user.dao.AccountDao; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; @@ -131,14 +132,14 @@ public class MidoNetElement extends AdapterBase implements @Inject AccountManager _accountMgr; @Inject - NetworkServiceMapDao _ntwkSrvcDao; + AccountDao _accountDao; public void setMidonetApi(MidonetApi api) { this.api = api; } - public void setNtwkSrvcDao(NetworkServiceMapDao ntwkSrvcDao){ - this._ntwkSrvcDao = ntwkSrvcDao; + public void setAccountDao(AccountDao aDao) { + this._accountDao = aDao; } @Override @@ -172,10 +173,13 @@ public class MidoNetElement extends AdapterBase implements } public boolean midoInNetwork(Network network) { - for (String pname : _ntwkSrvcDao.getDistinctProviders(network.getId())) { - if (pname.equals(getProvider().getName())) { - return true; - } + if((network.getTrafficType() == Networks.TrafficType.Public) && + (network.getBroadcastDomainType() == Networks.BroadcastDomainType.Mido)){ + return true; + } + if((network.getTrafficType() == Networks.TrafficType.Guest) && + (network.getBroadcastDomainType() == Networks.BroadcastDomainType.Mido)){ + return true; } return false; } @@ -280,6 +284,11 @@ public class MidoNetElement extends AdapterBase implements post.addRule().type(DtoRule.RevDNAT).flowAction(DtoRule.Accept).create(); } + public String getAccountUuid(Network network) { + AccountVO acc = _accountDao.findById(network.getAccountId()); + return acc.getUuid(); + } + public boolean associatePublicIP(Network network, final List ipAddress) throws ResourceUnavailableException { @@ -316,7 +325,7 @@ public class MidoNetElement extends AdapterBase implements tenantUplink = ports[0]; providerDownlink = ports[1]; - accountIdStr = String.valueOf(network.getAccountId()); + accountIdStr = getAccountUuid(network); boolean isVpc = getIsVpc(network); long id = getRouterId(network, isVpc); routerName = getRouterName(isVpc, id); @@ -611,7 +620,7 @@ public class MidoNetElement extends AdapterBase implements RuleChain preNat = null; RuleChain post = null; - String accountIdStr = String.valueOf(network.getAccountId()); + String accountIdStr = getAccountUuid(network); String networkUUIDStr = String.valueOf(network.getId()); for (StaticNat rule : rules) { @@ -659,7 +668,7 @@ public class MidoNetElement extends AdapterBase implements return false; } if (canHandle(config, Service.Firewall)) { - String accountIdStr = String.valueOf(config.getAccountId()); + String accountIdStr = getAccountUuid(config); String networkUUIDStr = String.valueOf(config.getId()); RuleChain preFilter = getChain(accountIdStr, networkUUIDStr, RuleChainCode.TR_PREFILTER); RuleChain preNat = getChain(accountIdStr, networkUUIDStr, RuleChainCode.TR_PRENAT); @@ -947,7 +956,7 @@ public class MidoNetElement extends AdapterBase implements return false; } - String accountIdStr = String.valueOf(network.getAccountId()); + String accountIdStr = getAccountUuid(network); String networkUUIDStr = String.valueOf(network.getId()); RuleChain preNat = getChain(accountIdStr, networkUUIDStr, RuleChainCode.TR_PRENAT); RuleChain postNat = getChain(accountIdStr, networkUUIDStr, RuleChainCode.TR_POST); @@ -1170,16 +1179,16 @@ public class MidoNetElement extends AdapterBase implements return routerName + "-tenantrouter-" + chain; } - protected RuleChain getChain(String accountID, String routerName, RuleChainCode chainCode){ - return getChain("", accountID, routerName, chainCode); + protected RuleChain getChain(String accountUuid, String routerName, RuleChainCode chainCode){ + return getChain("", accountUuid, routerName, chainCode); } - protected RuleChain getChain(String networkId, String accountID, + protected RuleChain getChain(String networkId, String accountUuid, String routerName, RuleChainCode chainCode){ String chainName = getChainName(networkId, routerName, chainCode); MultivaluedMap findChain = new MultivaluedMapImpl(); - findChain.add("tenant_id", accountID); + findChain.add("tenant_id", accountUuid); ResourceCollection ruleChains = api.getChains(findChain); @@ -1303,7 +1312,7 @@ public class MidoNetElement extends AdapterBase implements String routerName = getRouterName(isVpc, id); RuleChain egressChain = getChain(String.valueOf(network.getId()), - String.valueOf(network.getAccountId()), + getAccountUuid(network), routerName, RuleChainCode.ACL_EGRESS); @@ -1325,7 +1334,7 @@ public class MidoNetElement extends AdapterBase implements String routerName = getRouterName(isVpc, id); RuleChain egressChain = getChain(String.valueOf(network.getId()), - String.valueOf(network.getAccountId()), + getAccountUuid(network), routerName, RuleChainCode.ACL_EGRESS); @@ -1355,6 +1364,14 @@ public class MidoNetElement extends AdapterBase implements .position(pos++) .create(); + // If it is ICMP to the router, accept that + egressChain.addRule().type(DtoRule.Accept) + .nwProto(SimpleFirewallRule.stringToProtocolNumber("icmp")) + .nwDstAddress(network.getGateway()) + .nwDstLength(32) + .position(pos++) + .create(); + // Everything else gets dropped egressChain.addRule() .type(DtoRule.Drop) @@ -1369,7 +1386,7 @@ public class MidoNetElement extends AdapterBase implements boolean isVpc = getIsVpc(network); long id = getRouterId(network, isVpc); String routerName = getRouterName(isVpc, id); - String accountIdStr = String.valueOf(network.getAccountId()); + String accountIdStr = getAccountUuid(network); // Add interior port on bridge side BridgePort bridgePort = netBridge.addInteriorPort().create(); @@ -1406,6 +1423,14 @@ public class MidoNetElement extends AdapterBase implements .position(pos++) .create(); + // If it is ICMP to the router, accept that + inc.addRule().type(DtoRule.Accept) + .nwProto(SimpleFirewallRule.stringToProtocolNumber("icmp")) + .nwDstAddress(network.getGateway()) + .nwDstLength(32) + .position(pos++) + .create(); + // If it is connection tracked, accept that as well inc.addRule().type(DtoRule.Accept) .matchReturnFlow(true) @@ -1449,27 +1474,25 @@ public class MidoNetElement extends AdapterBase implements private Bridge getOrCreateNetworkBridge(Network network){ // Find the single bridge for this network, create if doesn't exist - return getOrCreateNetworkBridge(network.getId(), network.getAccountId()); + return getOrCreateNetworkBridge(network.getId(), getAccountUuid(network)); } - private Bridge getOrCreateNetworkBridge(long networkID, long accountID){ - Bridge netBridge = getNetworkBridge(networkID, accountID); + private Bridge getOrCreateNetworkBridge(long networkID, String accountUuid){ + Bridge netBridge = getNetworkBridge(networkID, accountUuid); if(netBridge == null){ - String accountIdStr = String.valueOf(accountID); String networkUUIDStr = String.valueOf(networkID); - netBridge = api.addBridge().tenantId(accountIdStr).name(networkUUIDStr).create(); + netBridge = api.addBridge().tenantId(accountUuid).name(networkUUIDStr).create(); } return netBridge; } - private Bridge getNetworkBridge(long networkID, long accountID){ + private Bridge getNetworkBridge(long networkID, String accountUuid){ MultivaluedMap qNetBridge = new MultivaluedMapImpl(); - String accountIdStr = String.valueOf(accountID); String networkUUIDStr = String.valueOf(networkID); - qNetBridge.add("tenant_id", accountIdStr); + qNetBridge.add("tenant_id", accountUuid); for (Bridge b : this. api.getBridges(qNetBridge)) { if(b.getName().equals(networkUUIDStr)){ @@ -1497,7 +1520,7 @@ public class MidoNetElement extends AdapterBase implements boolean isVpc = getIsVpc(network); long id = getRouterId(network, isVpc); - return getOrCreateGuestNetworkRouter(id, network.getAccountId(), isVpc); + return getOrCreateGuestNetworkRouter(id, getAccountUuid(network), isVpc); } @@ -1509,29 +1532,28 @@ public class MidoNetElement extends AdapterBase implements } } - protected Router createRouter(long id, long accountID, boolean isVpc) { + protected Router createRouter(long id, String accountUuid, boolean isVpc) { - String accountIdStr = String.valueOf(accountID); String routerName = getRouterName(isVpc, id); //Set up rule chains RuleChain pre = api.addChain() .name(getChainName(routerName, RuleChainCode.TR_PRE)) - .tenantId(accountIdStr) + .tenantId(accountUuid) .create(); RuleChain post = api.addChain() .name(getChainName(routerName, RuleChainCode.TR_POST)) - .tenantId(accountIdStr) + .tenantId(accountUuid) .create(); // Set up NAT and filter chains for pre-routing RuleChain preFilter = api.addChain() .name(getChainName(routerName, RuleChainCode.TR_PREFILTER)) - .tenantId(accountIdStr) + .tenantId(accountUuid) .create(); RuleChain preNat = api.addChain() .name(getChainName(routerName, RuleChainCode.TR_PRENAT)) - .tenantId(accountIdStr) + .tenantId(accountUuid) .create(); // Hook the chains in - first jump to Filter chain, then jump to Nat chain @@ -1545,28 +1567,27 @@ public class MidoNetElement extends AdapterBase implements .create(); return api.addRouter() - .tenantId(accountIdStr) + .tenantId(accountUuid) .name(routerName) .inboundFilterId(pre.getId()) .outboundFilterId(post.getId()) .create(); } - private Router getOrCreateGuestNetworkRouter(long id, long accountID, boolean isVpc) { - Router tenantRouter = getGuestNetworkRouter(id, accountID, isVpc); + private Router getOrCreateGuestNetworkRouter(long id, String accountUuid, boolean isVpc) { + Router tenantRouter = getGuestNetworkRouter(id, accountUuid, isVpc); if(tenantRouter == null){ - tenantRouter = createRouter(id, accountID, isVpc); + tenantRouter = createRouter(id, accountUuid, isVpc); } return tenantRouter; } - private Router getGuestNetworkRouter(long id, long accountID, boolean isVpc){ + private Router getGuestNetworkRouter(long id, String accountUuid, boolean isVpc){ MultivaluedMap qNetRouter = new MultivaluedMapImpl(); - String accountIdStr = String.valueOf(accountID); String routerName = getRouterName(isVpc, id); - qNetRouter.add("tenant_id", accountIdStr); + qNetRouter.add("tenant_id", accountUuid); for (Router router : api.getRouters(qNetRouter)) { if(router.getName().equals(routerName)){ @@ -1613,10 +1634,10 @@ public class MidoNetElement extends AdapterBase implements } private void deleteNetworkBridges(Network network){ - long accountID = network.getAccountId(); + String accountUuid = getAccountUuid(network); long networkID = network.getId(); - Bridge netBridge = getNetworkBridge(networkID, accountID); + Bridge netBridge = getNetworkBridge(networkID, accountUuid); if(netBridge != null){ cleanBridge(netBridge); @@ -1632,11 +1653,11 @@ public class MidoNetElement extends AdapterBase implements } private void deleteGuestNetworkRouters(Network network){ - long accountID = network.getAccountId(); + String accountUuid = getAccountUuid(network); boolean isVpc = getIsVpc(network); long id = getRouterId(network, isVpc); - Router tenantRouter = getGuestNetworkRouter(id, accountID, isVpc); + Router tenantRouter = getGuestNetworkRouter(id, accountUuid, isVpc); // Delete any peer ports corresponding to this router for(Port peerPort : tenantRouter.getPeerPorts((new MultivaluedMapImpl()))){ @@ -1677,7 +1698,7 @@ public class MidoNetElement extends AdapterBase implements } // Remove inbound and outbound filter chains - String accountIdStr = String.valueOf(accountID); + String accountIdStr = String.valueOf(accountUuid); String routerName = getRouterName(isVpc, id); RuleChain pre = api.getChain(tenantRouter.getInboundFilterId()); diff --git a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetGuestNetworkGuru.java b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetGuestNetworkGuru.java index 20b74b9e491..d57affc5827 100644 --- a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetGuestNetworkGuru.java +++ b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetGuestNetworkGuru.java @@ -30,6 +30,8 @@ import com.cloud.network.*; import com.cloud.network.PhysicalNetwork; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; +import com.cloud.user.AccountVO; +import com.cloud.user.dao.AccountDao; import com.cloud.vm.*; import com.midokura.midonet.client.resource.Bridge; import com.cloud.utils.net.NetUtils; @@ -46,12 +48,16 @@ import com.cloud.vm.Nic.ReservationStrategy; import javax.ejb.Local; import java.util.UUID; +import javax.inject.Inject; @Component @Local(value = NetworkGuru.class) public class MidoNetGuestNetworkGuru extends GuestNetworkGuru { private static final Logger s_logger = Logger.getLogger(MidoNetGuestNetworkGuru.class); + @Inject + AccountDao _accountDao; + public MidoNetGuestNetworkGuru() { super(); _isolationMethods = new PhysicalNetwork.IsolationMethod[] { PhysicalNetwork.IsolationMethod.MIDO }; @@ -118,7 +124,8 @@ public class MidoNetGuestNetworkGuru extends GuestNetworkGuru { implemented.setCidr(network.getCidr()); } - String accountIdStr = String.valueOf(network.getAccountId()); + AccountVO acc = _accountDao.findById(network.getAccountId()); + String accountUUIDStr = acc.getUuid(); String routerName = ""; if (network.getVpcId() != null) { routerName = "VPC" + String.valueOf(network.getVpcId()); @@ -126,7 +133,9 @@ public class MidoNetGuestNetworkGuru extends GuestNetworkGuru { routerName = String.valueOf(network.getId()); } - String broadcastUriStr = accountIdStr + "." + String.valueOf(network.getId()) + ":" + routerName; + String broadcastUriStr = accountUUIDStr + "." + + String.valueOf(network.getId()) + + ":" + routerName; implemented.setBroadcastUri(Networks.BroadcastDomainType.Mido.toUri(broadcastUriStr)); s_logger.debug("Broadcast URI set to " + broadcastUriStr); diff --git a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java index 7e93edbcd99..1daf0bad040 100644 --- a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java +++ b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java @@ -34,6 +34,8 @@ import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; +import com.cloud.user.AccountVO; +import com.cloud.user.dao.AccountDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.IPAddressVO; import com.cloud.vm.*; @@ -50,6 +52,8 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru { // Inject any stuff we need to use (DAOs etc) @Inject NetworkModel _networkModel; + @Inject + AccountDao _accountDao; // Don't need to change traffic type stuff, public is fine @@ -228,9 +232,10 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru { } private URI generateBroadcastUri(Network network){ - String accountIdStr = String.valueOf(network.getAccountId()); + AccountVO acc = _accountDao.findById(network.getAccountId()); + String accountUUIDStr = acc.getUuid(); String networkUUIDStr = String.valueOf(network.getId()); - return Networks.BroadcastDomainType.Mido.toUri(accountIdStr + + return Networks.BroadcastDomainType.Mido.toUri(accountUUIDStr + "." + networkUUIDStr + ":" + diff --git a/plugins/network-elements/midonet/test/com/cloud/network/element/MidoNetElementTest.java b/plugins/network-elements/midonet/test/com/cloud/network/element/MidoNetElementTest.java index aec9c2d9ef9..baf99b908d4 100644 --- a/plugins/network-elements/midonet/test/com/cloud/network/element/MidoNetElementTest.java +++ b/plugins/network-elements/midonet/test/com/cloud/network/element/MidoNetElementTest.java @@ -18,12 +18,13 @@ */ import com.cloud.network.element.MidoNetElement; +import com.cloud.user.AccountVO; +import com.cloud.user.dao.AccountDao; import junit.framework.TestCase; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; import com.midokura.midonet.client.MidonetApi; import com.midokura.midonet.client.resource.*; -import com.cloud.network.dao.NetworkServiceMapDao; import com.sun.jersey.core.util.MultivaluedMapImpl; import com.cloud.network.*; import com.cloud.vm.*; @@ -46,10 +47,6 @@ public class MidoNetElementTest extends TestCase { //mockMgmt MidonetApi api = mock(MidonetApi.class, RETURNS_DEEP_STUBS); - ArrayList arr = new ArrayList(); - arr.add("MidoNet"); - NetworkServiceMapDao mockNSMD = mock(NetworkServiceMapDao.class); - when(mockNSMD.getDistinctProviders(anyLong())).thenReturn(arr); //mockDhcpHost DhcpHost mockDhcpHost = mock(DhcpHost.class); @@ -82,6 +79,14 @@ public class MidoNetElementTest extends TestCase { when(mockNetwork.getGateway()).thenReturn("1.2.3.4"); when(mockNetwork.getCidr()).thenReturn("1.2.3.0/24"); when(mockNetwork.getId()).thenReturn((long)2); + when(mockNetwork.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.Mido); + when(mockNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + + //mockAccountDao + AccountDao mockAccountDao = mock(AccountDao.class); + AccountVO mockAccountVO = mock(AccountVO.class); + when(mockAccountDao.findById(anyLong())).thenReturn(mockAccountVO); + when(mockAccountVO.getUuid()).thenReturn("1"); //mockNic NicProfile mockNic = mock(NicProfile.class); @@ -96,8 +101,8 @@ public class MidoNetElementTest extends TestCase { when(mockVm.getType()).thenReturn(VirtualMachine.Type.User); MidoNetElement elem = new MidoNetElement(); - elem.setNtwkSrvcDao(mockNSMD); elem.setMidonetApi(api); + elem.setAccountDao(mockAccountDao); boolean result = false; try { @@ -119,14 +124,16 @@ public class MidoNetElementTest extends TestCase { public void testImplement() { //mock MidonetApi api = mock(MidonetApi.class, RETURNS_DEEP_STUBS); - ArrayList arr = new ArrayList(); - arr.add("MidoNet"); - NetworkServiceMapDao mockNSMD = mock(NetworkServiceMapDao.class); - when(mockNSMD.getDistinctProviders(anyLong())).thenReturn(arr); + //mockAccountDao + AccountDao mockAccountDao = mock(AccountDao.class); + AccountVO mockAccountVO = mock(AccountVO.class); + when(mockAccountDao.findById(anyLong())).thenReturn(mockAccountVO); + when(mockAccountVO.getUuid()).thenReturn("1"); MidoNetElement elem = new MidoNetElement(); - elem.setNtwkSrvcDao(mockNSMD); + elem.setMidonetApi(api); + elem.setAccountDao(mockAccountDao); //mockRPort RouterPort mockRPort = mock(RouterPort.class); @@ -161,6 +168,8 @@ public class MidoNetElementTest extends TestCase { when(mockNetwork.getGateway()).thenReturn("1.2.3.4"); when(mockNetwork.getCidr()).thenReturn("1.2.3.0/24"); when(mockNetwork.getId()).thenReturn((long)2); + when(mockNetwork.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.Mido); + when(mockNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Public); boolean result = false; try { diff --git a/scripts/vm/hypervisor/xenserver/Add-To-VCPUs-Params-Live.sh b/scripts/vm/hypervisor/xenserver/add_to_vcpus_params_live.sh similarity index 100% rename from scripts/vm/hypervisor/xenserver/Add-To-VCPUs-Params-Live.sh rename to scripts/vm/hypervisor/xenserver/add_to_vcpus_params_live.sh diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 66cde4fb816..d18eca836b8 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -48,7 +48,7 @@ def add_to_VCPUs_params_live(session, args): value = args['value'] vmname = args['vmname'] try: - cmd = ["bash", "/opt/xensource/bin/Add-To-VCPUs-Params-Live.sh", vmname, key, value] + cmd = ["bash", "/opt/xensource/bin/add_to_vcpus_params_live.sh", vmname, key, value] txt = util.pread2(cmd) except: return 'false' @@ -279,7 +279,7 @@ def setLinkLocalIP(session, args): except: return 'can not cat network.conf' - if result.lower() == "bridge": + if result.lower().strip() == "bridge": try: cmd = ["brctl", "addbr", brName] txt = util.pread2(cmd) diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/patch b/scripts/vm/hypervisor/xenserver/xcpserver/patch index bfecd0c8e04..a275df4a48b 100644 --- a/scripts/vm/hypervisor/xenserver/xcpserver/patch +++ b/scripts/vm/hypervisor/xenserver/xcpserver/patch @@ -64,3 +64,4 @@ cloud-prepare-upgrade.sh=..,0755,/opt/xensource/bin getRouterStatus.sh=../../../../network/domr/,0755,/opt/xensource/bin bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin getDomRVersion.sh=../../../../network/domr/,0755,/opt/xensource/bin +add_to_vcpus_params_live.sh=..,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch index 1be14ea62db..5c4673df247 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch @@ -65,4 +65,5 @@ bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin swift=..,0755,/opt/xensource/bin swiftxen=..,0755,/etc/xapi.d/plugins s3xen=..,0755,/etc/xapi.d/plugins +add_to_vcpus_params_live.sh=..,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch index dd31e441b4f..c7c58b98374 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch @@ -64,4 +64,5 @@ bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin swift=..,0755,/opt/xensource/bin swiftxen=..,0755,/etc/xapi.d/plugins s3xen=..,0755,/etc/xapi.d/plugins +add_to_vcpus_params_live.sh=..,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/patch b/scripts/vm/hypervisor/xenserver/xenserver60/patch index 787f474739a..6d819791d3d 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver60/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver60/patch @@ -69,4 +69,5 @@ bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin swift=..,0755,/opt/xensource/bin swiftxen=..,0755,/etc/xapi.d/plugins s3xen=..,0755,/etc/xapi.d/plugins +add_to_vcpus_params_live.sh=..,0755,/opt/xensource/bin diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 55e7b7ed4d9..e1aaa5050f9 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2853,6 +2853,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid()); } + // increment resource count for dedicated public ip's + _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size())); } else if (podId != null) { // This VLAN is pod-wide, so create a PodVlanMapVO entry PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId()); @@ -3124,6 +3126,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid()); } + + // increment resource count for dedicated public ip's + _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size())); + return vlan; } @@ -3187,10 +3193,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati if (_accountVlanMapDao.remove(acctVln.get(0).getId())) { // generate usage events to remove dedication for every ip in the range for (IPAddressVO ip : ips) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getId(), + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getAccountId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid()); } + // decrement resource count for dedicated public ip's + _resourceLimitMgr.decrementResourceCount(acctVln.get(0).getAccountId(), ResourceType.public_ip, new Long(ips.size())); return true; } else { return false; diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 4ce54401618..9440286cb8e 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -394,8 +394,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L addr.getDataCenterId(), addr.getId(), addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem(), addr.getClass().getName(), addr.getUuid()); } - // don't increment resource count for direct ip addresses - if (addr.getAssociatedWithNetworkId() != null) { + // don't increment resource count for direct and dedicated ip addresses + if (addr.getAssociatedWithNetworkId() != null && !isIpDedicated(addr)) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip); } } @@ -640,10 +640,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L s_logger.debug("Associate IP address lock acquired"); } - // Check that the maximum number of public IPs for the given - // accountId will not be exceeded - _resourceLimitMgr.checkResourceLimit(accountToLock, ResourceType.public_ip); - txn.start(); // If account has dedicated Public IP ranges, allocate IP from the dedicated range @@ -668,6 +664,10 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L } if (!allocateFromDedicatedRange) { + // Check that the maximum number of public IPs for the given + // accountId will not be exceeded + _resourceLimitMgr.checkResourceLimit(accountToLock, ResourceType.public_ip); + List nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(zone.getId()); for (VlanVO nonDedicatedVlan : nonDedicatedVlans) { nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId()); @@ -2964,8 +2964,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L if (ip.getState() != State.Releasing) { txn.start(); - // don't decrement resource count for direct ips - if (ip.getAssociatedWithNetworkId() != null) { + // don't decrement resource count for direct and dedicated ips + if (ip.getAssociatedWithNetworkId() != null && !isIpDedicated(ip)) { _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip); } diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index f3ec253d631..5f51a30d389 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -610,18 +610,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("Invalid network id is given"); } - Network network = _networksDao.findById(networkId); - if (network == null) { - throw new InvalidParameterValueException("Invalid network id is given"); - } - accountId = network.getAccountId(); - domainId = network.getDomainId(); - - // Validate network offering - NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(network.getNetworkOfferingId()); - - // verify permissions - _accountMgr.checkAccess(ipOwner, null, true, network); + Account caller = UserContext.current().getCaller(); //check whether the nic belongs to user vm. NicVO nicVO = _nicDao.findById(nicId); @@ -633,6 +622,25 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("The nic is not belongs to user vm"); } + Nic nic = _nicDao.findById(nicId); + VirtualMachine vm = _userVmDao.findById(nicVO.getInstanceId()); + if (vm == null) { + throw new InvalidParameterValueException("There is no vm with the nic"); + } + // verify permissions + _accountMgr.checkAccess(ipOwner, null, true, vm); + + + Network network = _networksDao.findById(networkId); + if (network == null) { + throw new InvalidParameterValueException("Invalid network id is given"); + } + accountId = network.getAccountId(); + domainId = network.getDomainId(); + + // Validate network offering + NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(network.getNetworkOfferingId()); + DataCenter dc = _dcDao.findById(network.getDataCenterId()); Long id = nicVO.getInstanceId(); @@ -649,14 +657,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("Allocating guest ip for nic failed"); } } else if (dc.getNetworkType() == NetworkType.Basic || ntwkOff.getGuestType() == Network.GuestType.Shared) { - Account caller = UserContext.current().getCaller(); - long callerUserId = UserContext.current().getCallerUserId(); - _accountMgr.checkAccess(caller, SecurityChecker.AccessType.UseNetwork, false, network); //handle the basic networks here - VirtualMachine vm = _userVmDao.findById(nicVO.getInstanceId()); - if (vm == null) { - throw new InvalidParameterValueException("There is no vm with the nic"); - } VMInstanceVO vmi = (VMInstanceVO)vm; Long podId = vmi.getPodIdToDeployIn(); if (podId == null) { @@ -718,6 +719,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("Unable to find ip address by id"); } + VirtualMachine vm = _userVmDao.findById(secIpVO.getVmId()); + if (vm == null) { + throw new InvalidParameterValueException("There is no vm with the nic"); + } + // verify permissions + _accountMgr.checkAccess(caller, null, true, vm); + Network network = _networksDao.findById(secIpVO.getNetworkId()); if (network == null) { @@ -727,9 +735,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { // Validate network offering NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(network.getNetworkOfferingId()); - // verify permissions - _accountMgr.checkAccess(caller, null, true, network); - Long nicId = secIpVO.getNicId(); s_logger.debug("ip id = " + ipAddressId + " nic id = " + nicId); //check is this the last secondary ip for NIC @@ -3813,10 +3818,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { s_logger.debug("Created private network " + privateNetwork); } else { s_logger.debug("Private network already exists: " + privateNetwork); + throw new InvalidParameterValueException("Private network for the vlan: " + vlan + " and cidr "+ cidr +" already exists " + + " in zone " + _configMgr.getZone(pNtwk.getDataCenterId()).getName()); } //add entry to private_ip_address table - PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNetwork.getId(), startIp); + PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkIdAndVpcId(privateNetwork.getId(), startIp, vpcId); if (privateIp != null) { throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" + " in zone " + _configMgr.getZone(pNtwk.getDataCenterId()).getName()); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index f6057e8dcc3..29ef0d59f55 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -3888,26 +3888,29 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V String privateIP = router.getPrivateIpAddress(); if (privateIP != null) { + boolean forVpc = router.getVpcId() != null; List routerNics = _nicDao.listByVmId(router.getId()); for (Nic routerNic : routerNics) { Network network = _networkModel.getNetwork(routerNic.getNetworkId()); - if (network.getTrafficType() == TrafficType.Public) { - boolean forVpc = router.getVpcId() != null; + //Send network usage command for public nic in VPC VR + //Send network usage command for isolated guest nic of non VPC VR + if ((forVpc && network.getTrafficType() == TrafficType.Public) || (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) { final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), forVpc, routerNic.getIp4Address()); + String routerType = router.getType().toString(); UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(), - router.getDataCenterId(), network.getId(), null, router.getId(), router.getType().toString()); + router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType); NetworkUsageAnswer answer = null; try { answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); } catch (Exception e) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId(), e); continue; } if (answer != null) { if (!answer.getResult()) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId() + "; details: " + answer.getDetails()); continue; } Transaction txn = Transaction.open(Transaction.CLOUD_DB); @@ -3918,26 +3921,26 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V } txn.start(); UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(), - router.getDataCenterId(), network.getId(), null, router.getId(), router.getType().toString()); + router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType); if (stats == null) { s_logger.warn("unable to find stats for account: " + router.getAccountId()); continue; } - if(previousStats != null - && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) - || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + if (previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + - "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + - answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + "Ignoring current answer. Router: " + answer.getRouterName() + " Rcvd: " + + answer.getBytesReceived() + "Sent: " + answer.getBytesSent()); continue; } if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesReceived() + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName() + " Reported: " + answer.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived()); } stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); @@ -3946,13 +3949,18 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V if (stats.getCurrentBytesSent() > answer.getBytesSent()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesSent() + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName() + " Reported: " + answer.getBytesSent() + " Stored: " + stats.getCurrentBytesSent()); } stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); } stats.setCurrentBytesSent(answer.getBytesSent()); + if (! _dailyOrHourly) { + //update agg bytes + stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } _userStatsDao.update(stats.getId(), stats); txn.commit(); } catch (Exception e) { diff --git a/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java b/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java index ac59fab7ba2..00c90d5164e 100644 --- a/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java +++ b/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java @@ -216,8 +216,8 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ throw new InvalidParameterValueException("Network ACL can be created just for networks of type " + Networks.TrafficType.Guest); } - if(aclId != NetworkACL.DEFAULT_DENY) { - //ACL is not default DENY + if(aclId != NetworkACL.DEFAULT_DENY && aclId != NetworkACL.DEFAULT_ALLOW) { + //ACL is not default DENY/ALLOW // ACL should be associated with a VPC Vpc vpc = _vpcMgr.getVpc(acl.getVpcId()); if(vpc == null){ @@ -254,6 +254,10 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ throw new InvalidParameterValueException("Unable to find specified ACL"); } + if((aclId == NetworkACL.DEFAULT_DENY) || (aclId == NetworkACL.DEFAULT_ALLOW)){ + throw new InvalidParameterValueException("Default ACL cannot be modified"); + } + Vpc vpc = _vpcMgr.getVpc(acl.getVpcId()); if(vpc == null){ throw new InvalidParameterValueException("Unable to find Vpc associated with the NetworkACL"); diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 5bb770871ca..6d929c6438b 100755 --- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -46,6 +46,8 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceCountDao; import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.dao.EntityManager; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -53,6 +55,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkDao; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.projects.Project; @@ -141,6 +144,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim private ServiceOfferingDao _serviceOfferingDao; @Inject private VMTemplateHostDao _vmTemplateHostDao; + @Inject + private VlanDao _vlanDao; protected GenericSearchBuilder templateSizeSearch; @@ -814,7 +819,7 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim } else if (type == Resource.ResourceType.snapshot) { newCount = _snapshotDao.countSnapshotsForAccount(accountId); } else if (type == Resource.ResourceType.public_ip) { - newCount = _ipAddressDao.countAllocatedIPsForAccount(accountId); + newCount = calculatePublicIpForAccount(accountId); } else if (type == Resource.ResourceType.template) { newCount = _vmTemplateDao.countTemplatesForAccount(accountId); } else if (type == Resource.ResourceType.project) { @@ -906,6 +911,22 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim return totalVolumesSize + totalSnapshotsSize + totalTemplatesSize; } + private long calculatePublicIpForAccount(long accountId) { + Long dedicatedCount = 0L; + Long allocatedCount = 0L; + + List dedicatedVlans = _vlanDao.listDedicatedVlans(accountId); + for (VlanVO dedicatedVlan : dedicatedVlans) { + List ips = _ipAddressDao.listByVlanId(dedicatedVlan.getId()); + dedicatedCount += new Long(ips.size()); + } + allocatedCount = _ipAddressDao.countAllocatedIPsForAccount(accountId); + if (dedicatedCount > allocatedCount) + return dedicatedCount; + else + return allocatedCount; + } + @Override public long getResourceCount(Account account, ResourceType type) { return _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 425ecf080f8..137f07e1527 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -887,10 +887,20 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public boolean archiveEvents(ArchiveEventsCmd cmd) { + Account caller = UserContext.current().getCaller(); List ids = cmd.getIds(); boolean result =true; + List permittedAccountIds = new ArrayList(); - List events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), cmd.getEntityOwnerId()); + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && caller.getType() == Account.ACCOUNT_TYPE_PROJECT) { + permittedAccountIds.add(caller.getId()); + } else { + DomainVO domain = _domainDao.findById(caller.getDomainId()); + List permittedDomainIds = _domainDao.getDomainChildrenIds(domain.getPath()); + permittedAccountIds = _accountDao.getAccountIdsForDomains(permittedDomainIds); + } + + List events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), permittedAccountIds); ControlledEntity[] sameOwnerEvents = events.toArray(new ControlledEntity[events.size()]); _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEvents); @@ -904,10 +914,20 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public boolean deleteEvents(DeleteEventsCmd cmd) { + Account caller = UserContext.current().getCaller(); List ids = cmd.getIds(); boolean result =true; + List permittedAccountIds = new ArrayList(); - List events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), cmd.getEntityOwnerId()); + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL || caller.getType() == Account.ACCOUNT_TYPE_PROJECT) { + permittedAccountIds.add(caller.getId()); + } else { + DomainVO domain = _domainDao.findById(caller.getDomainId()); + List permittedDomainIds = _domainDao.getDomainChildrenIds(domain.getPath()); + permittedAccountIds = _accountDao.getAccountIdsForDomains(permittedDomainIds); + } + + List events = _eventDao.listToArchiveOrDeleteEvents(ids, cmd.getType(), cmd.getOlderThan(), permittedAccountIds); ControlledEntity[] sameOwnerEvents = events.toArray(new ControlledEntity[events.size()]); _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEvents); diff --git a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java index 7be63ba562d..c6fd8c17c9c 100644 --- a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java +++ b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java @@ -21,7 +21,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import javax.ejb.Local; @@ -235,8 +234,9 @@ public class IdentityDaoImpl extends GenericDaoBase implements String.format("UPDATE `%s` SET uuid=? WHERE id=?", tableName) ); - pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setString(1, String.valueOf(id)); pstmtUpdate.setLong(2, id); pstmtUpdate.executeUpdate(); } } + diff --git a/server/test/com/cloud/event/EventControlsUnitTest.java b/server/test/com/cloud/event/EventControlsUnitTest.java index 3c2527565c9..e2a86cdb4be 100644 --- a/server/test/com/cloud/event/EventControlsUnitTest.java +++ b/server/test/com/cloud/event/EventControlsUnitTest.java @@ -18,7 +18,6 @@ package com.cloud.event; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyList; -import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @@ -58,7 +57,7 @@ public class EventControlsUnitTest extends TestCase{ _mgmtServer._eventDao = _eventDao; _mgmtServer._accountMgr = _accountMgr; doNothing().when(_accountMgr).checkAccess(any(Account.class), any(AccessType.class), any(Boolean.class), any(ControlledEntity.class)); - when(_eventDao.listToArchiveOrDeleteEvents(anyList(), anyString(), any(Date.class), anyLong())).thenReturn(_events); + when(_eventDao.listToArchiveOrDeleteEvents(anyList(), anyString(), any(Date.class), anyList())).thenReturn(_events); } @After diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java b/server/test/com/cloud/vm/UserVmManagerTest.java index 939ecdcc185..6a9711401c9 100755 --- a/server/test/com/cloud/vm/UserVmManagerTest.java +++ b/server/test/com/cloud/vm/UserVmManagerTest.java @@ -246,8 +246,8 @@ public class UserVmManagerTest { } - // Test scaleVm on incompatible HV. - //@Test(expected=InvalidParameterValueException.class) + // Test scaleVm on equal service offerings. + @Test(expected=InvalidParameterValueException.class) public void testScaleVMF2() throws Exception { ScaleVMCmd cmd = new ScaleVMCmd(); @@ -261,14 +261,11 @@ public class UserVmManagerTest { serviceOfferingIdField.setAccessible(true); serviceOfferingIdField.set(cmd, 1L); - //UserContext.current().setEventDetails("Vm Id: "+getId()); - // Account account = (Account) new AccountVO("testaccount", 1L, "networkdomain", (short) 0, 1); - //AccountVO(String accountName, long domainId, String networkDomain, short type, int regionId) - // UserContext.registerContext(1, account, null, true); when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance); doReturn(Hypervisor.HypervisorType.XenServer).when(_vmInstance).getHypervisorType(); + doReturn(VirtualMachine.State.Running).when(_vmInstance).getState(); doNothing().when(_accountMgr).checkAccess(_account, null, true, _templateMock); @@ -285,8 +282,8 @@ public class UserVmManagerTest { } - // Test scaleVm for Stopped vm. Full positive test. - //@Test + // Test scaleVm for Stopped vm. + @Test(expected=InvalidParameterValueException.class) public void testScaleVMF3() throws Exception { ScaleVMCmd cmd = new ScaleVMCmd(); @@ -316,10 +313,12 @@ public class UserVmManagerTest { when(_configMgr.getServiceOffering(1L)).thenReturn(so1); doReturn(VirtualMachine.State.Stopped).when(_vmInstance).getState(); + when(_vmDao.findById(anyLong())).thenReturn(null); + doReturn(true).when(_itMgr).upgradeVmDb(anyLong(),anyLong()); - when(_vmDao.findById(anyLong())).thenReturn(_vmMock); + //when(_vmDao.findById(anyLong())).thenReturn(_vmMock); _userVmMgr.upgradeVirtualMachine(cmd); diff --git a/server/test/com/cloud/vpc/NetworkACLServiceTest.java b/server/test/com/cloud/vpc/NetworkACLServiceTest.java index 7cc7200718a..9a368b94ae4 100644 --- a/server/test/com/cloud/vpc/NetworkACLServiceTest.java +++ b/server/test/com/cloud/vpc/NetworkACLServiceTest.java @@ -83,7 +83,7 @@ public class NetworkACLServiceTest extends TestCase{ createACLItemCmd = new CreateNetworkACLCmd(){ @Override public Long getACLId(){ - return 1L; + return 3L; } @Override diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 9e1a871e835..334aae76f33 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -29,6 +29,8 @@ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled, max_hosts_per_cluster) VALUES ('VMware', '5.1', 128, 0, 32); DELETE FROM `cloud`.`configuration` where name='vmware.percluster.host.max'; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'AgentManager', 'xen.nics.max', '7', 'Maximum allowed nics for Vms created on Xen'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.apiserver.address', 'http://localhost:8081', 'Specify the address at which the Midonet API server can be contacted (if using Midonet)'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.providerrouter.id', 'd7c5e6a3-e2f4-426b-b728-b7ce6a0448e5', 'Specifies the UUID of the Midonet provider router (if using Midonet)'); ALTER TABLE `cloud`.`load_balancer_vm_map` ADD state VARCHAR(40) NULL COMMENT 'service status updated by LB healthcheck manager'; alter table storage_pool change storage_provider_id storage_provider_name varchar(255); diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index 803911721e9..b5ff5bf7b3f 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -20,6 +20,7 @@ import urllib import base64 import hmac import hashlib +import logging import time import cloudstackException from cloudstackAPI import * @@ -37,6 +38,7 @@ class cloudConnection(object): apiKey=None, securityKey=None, asyncTimeout=3600, logging=None, scheme='http', path='client/api'): + self.loglevel() #Turn off requests logs self.apiKey = apiKey self.securityKey = securityKey self.mgtSvr = mgtSvr @@ -65,6 +67,13 @@ class cloudConnection(object): self.asyncTimeout, self.logging, self.protocol, self.path) + def loglevel(self, lvl=logging.WARNING): + """ + Turns off the INFO/DEBUG logs from `requests` + """ + requests_log = logging.getLogger("requests") + requests_log.setLevel(lvl) + def poll(self, jobid, response): """ polls the completion of a given jobid diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js index 3235cd66c20..1d6160a232c 100644 --- a/ui/scripts/vpc.js +++ b/ui/scripts/vpc.js @@ -102,8 +102,8 @@ }, 'protocolnumber': {label:'Protocol Number',edit:true}, - 'startport': { edit: true, label: 'label.start.port' }, - 'endport': { edit: true, label: 'label.end.port' }, + 'startport': { edit: true, label: 'label.start.port', isOptional: true }, + 'endport': { edit: true, label: 'label.end.port', isOptional: true }, 'networkid': { label: 'Select Tier', select: function(args) { @@ -173,7 +173,18 @@ else delete args.data.protocolnumber; + + if((args.data.protocol == 'tcp' || args.data.protocol == 'udp' || args.data.protocol == 'all') && (args.data.startport=="" || args.data.startport == undefined)){ + cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')}); + $(window).trigger('cloudStack.fullRefresh'); + } + else if((args.data.protocol == 'tcp' || args.data.protocol == 'udp' || args.data.protocol == 'all') && (args.data.endport=="" || args.data.endport == undefined)){ + cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')}); + $(window).trigger('cloudStack.fullRefresh'); + } + + else{ $.ajax({ url: createURL('createNetworkACL'), data: $.extend(args.data, { @@ -210,6 +221,7 @@ } }); } + } }, actions: { destroy: {