You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by pr...@apache.org on 2013/04/05 23:03:44 UTC
[49/50] [abbrv] Merge branch 'master' into affinity_groups
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/client/tomcatconf/componentContext.xml.in
----------------------------------------------------------------------
diff --cc client/tomcatconf/componentContext.xml.in
index fac17f0,a006708..95737ce
--- a/client/tomcatconf/componentContext.xml.in
+++ b/client/tomcatconf/componentContext.xml.in
@@@ -30,317 -31,221 +31,228 @@@
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
- <!--
- Compose a CloudStack deployment with selected components here
- -->
- <bean id="databaseUpgradeChecker" class="com.cloud.upgrade.DatabaseUpgradeChecker" />
- <bean id="encryptionSecretKeyChecker" class="com.cloud.utils.crypt.EncryptionSecretKeyChecker" />
- <bean id="configurationServerImpl" class="com.cloud.server.ConfigurationServerImpl" />
-
- <bean id="managementServerImpl" class ="com.cloud.server.ManagementServerImpl" >
- <property name="UserAuthenticators">
- <list>
- <ref bean="MD5UserAuthenticator"/>
- <ref bean="LDAPUserAuthenticator"/>
- </list>
- </property>
- </bean>
-
- <bean id ="AccountManagerImpl" class="com.cloud.user.AccountManagerImpl">
- <property name="UserAuthenticators">
- <list>
- <ref bean="MD5UserAuthenticator"/>
- <ref bean="LDAPUserAuthenticator"/>
- </list>
- </property>
- </bean>
-
- <bean id="clusterManagerImpl" class="com.cloud.cluster.ClusterManagerImpl" />
- <bean id="clusteredAgentManagerImpl" class="com.cloud.agent.manager.ClusteredAgentManagerImpl" />
- <bean id="clusteredVirtualMachineManagerImpl" class="com.cloud.vm.ClusteredVirtualMachineManagerImpl" />
- <bean id="highAvailabilityManagerExtImpl" class="com.cloud.ha.HighAvailabilityManagerExtImpl" />
- <bean id="userVmManagerImpl" class="com.cloud.vm.UserVmManagerImpl" />
- <bean id="consoleProxyManagerImpl" class="com.cloud.consoleproxy.ConsoleProxyManagerImpl" />
- <bean id="securityGroupManagerImpl2" class="com.cloud.network.security.SecurityGroupManagerImpl2" />
- <bean id="premiumSecondaryStorageManagerImpl" class="com.cloud.secstorage.PremiumSecondaryStorageManagerImpl" />
- <bean id="userVmDaoImpl" class="com.cloud.vm.dao.UserVmDaoImpl" />
- <bean id="ipv6AddressManagerImpl" class="com.cloud.network.Ipv6AddressManagerImpl" />
-
- <bean id="apiRateLimitServiceImpl" class="org.apache.cloudstack.ratelimit.ApiRateLimitServiceImpl"/>
- <bean id="BaremetalManager" class="com.cloud.baremetal.manager.BaremetalManagerImpl"/>
- <bean id="BaremetalDhcpManager" class="com.cloud.baremetal.networkservice.BaremetalDhcpManagerImpl"/>
- <bean id="BaremetalKickStartPxeService" class="com.cloud.baremetal.networkservice.BaremetalKickStartServiceImpl"/>
- <bean id="BaremetalPingPxeService" class="com.cloud.baremetal.networkservice.BareMetalPingServiceImpl" />
- <bean id="BaremetalPxeManager" class="com.cloud.baremetal.networkservice.BaremetalPxeManagerImpl" />
- <bean id="UcsManager" class="com.cloud.ucs.manager.UcsManagerImpl" />
- <bean id="UcsBladeDao" class="com.cloud.ucs.database.UcsBladeDaoImpl" />
- <bean id="UcsManagerDao" class="com.cloud.ucs.database.UcsManagerDaoImpl" />
-
- <!--
- Network Elements
- -->
- <bean id="Ovs" class="com.cloud.network.element.OvsElement">
- <property name="name" value="Ovs"/>
- </bean>
- <bean id="BareMetalDhcp" class="com.cloud.baremetal.networkservice.BaremetalDhcpElement">
- <property name="name" value="BareMetalDhcp"/>
- </bean>
- <bean id="BareMetalPxe" class="com.cloud.baremetal.networkservice.BaremetalPxeElement">
- <property name="name" value="BareMetalPxe"/>
- </bean>
- <bean id="BareMetalUserdata" class="com.cloud.baremetal.networkservice.BaremetalUserdataElement">
- <property name="name" value="BareMetalUserdata"/>
- </bean>
- <bean id="SecurityGroupProvider" class="com.cloud.network.element.SecurityGroupElement">
- <property name="name" value="SecurityGroupProvider"/>
- </bean>
- <bean id="VirtualRouter" class="com.cloud.network.element.VirtualRouterElement">
- <property name="name" value="VirtualRouter"/>
- </bean>
- <bean id="VpcVirtualRouter" class="com.cloud.network.element.VpcVirtualRouterElement">
- <property name="name" value="VpcVirtualRouter"/>
- </bean>
- <!--
- <bean id="NiciraNvp" class="com.cloud.network.element.NiciraNvpElement">
- <property name="name" value="NiciraNvp"/>
- </bean>
- -->
-
<!--
- <bean id="BigSwitchVnsElementService" class="com.cloud.network.element.BigSwitchVnsElement">
- <property name="name" value="BigSwitchVnsElementService"/>
- </bean>
+
+ OSS deployment configuration
+
+ OSS/non-OSS counter-exclusive components and related configurations should be put here
+ for example, configurationDaoImpl component, it has exclusive configuration settings in OSS and non-OSS deployment,
+ its component declaration should be put in both componentContext.xml.in and nonossComponentContext.xml.in, each with
+ independent configuration
+
-->
-
- <!--
- Adapters
- -->
- <bean id="FirstFitRouting" class="com.cloud.agent.manager.allocator.impl.FirstFitRoutingAllocator">
- <property name="name" value="FirstFitRouting"/>
- </bean>
- <bean id="hypervisorTemplateAdapter" class="com.cloud.template.HypervisorTemplateAdapter">
- <property name="name" value="HypervisorAdapter"/>
- </bean>
+ <bean id="databaseUpgradeChecker" class="com.cloud.upgrade.DatabaseUpgradeChecker" />
+ <bean id="configurationDaoImpl" class="com.cloud.configuration.dao.ConfigurationDaoImpl" />
- <!--
- Storage pool allocators
- -->
+ <bean id="GlobalLoadBalancingRulesServiceImpl" class ="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl" />
- <bean id="LocalStoragePoolAllocator" class="org.apache.cloudstack.storage.allocator.LocalStoragePoolAllocator">
- <property name="name" value="LocalStorage"/>
- </bean>
<!--
- <bean id="FirstFitStoragePoolAllocator" class="org.apache.cloudstack.storage.allocator.FirstFitStoragePoolAllocator">
- <property name="name" value="Storage"/>
- </bean>
+ Nicira support components
-->
-
- <bean id="UserConcentratedAllocator" class="com.cloud.agent.manager.allocator.impl.UserConcentratedAllocator">
- <property name="name" value="User First"/>
- </bean>
-
- <bean id="ConsoleProxyAllocator" class="com.cloud.consoleproxy.ConsoleProxyBalanceAllocator">
- <property name="name" value="Balance"/>
- </bean>
-
- <bean id="StaticRoleBasedAPIAccessChecker" class="org.apache.cloudstack.acl.StaticRoleBasedAPIAccessChecker"/>
-
- <bean id="ExteralIpAddressAllocator" class="com.cloud.network.ExteralIpAddressAllocator">
- <property name="name" value="Basic"/>
- </bean>
-
- <bean id="HypervisorTemplateAdapter" class="com.cloud.template.HypervisorTemplateAdapter">
- <property name="name" value="HypervisorAdapter"/>
- </bean>
-
- <bean id="BareMetalTemplateAdapter" class="com.cloud.baremetal.manager.BareMetalTemplateAdapter" >
- <property name="name" value="BareMetalTemplateAdapter"/>
- </bean>
-
- <!--
- Authenticators
- -->
- <bean id="MD5UserAuthenticator" class="com.cloud.server.auth.MD5UserAuthenticator">
- <property name="name" value="MD5"/>
+ <bean id="niciraNvpDaoImpl" class="com.cloud.network.dao.NiciraNvpDaoImpl" />
+ <bean id="niciraNvpNicMappingDaoImpl" class="com.cloud.network.dao.NiciraNvpNicMappingDaoImpl" />
+ <bean id="niciraNvpRouterMappingDaoImpl" class="com.cloud.network.dao.NiciraNvpRouterMappingDaoImpl" />
+ <bean id="NiciraNvpGuestNetworkGuru" class="com.cloud.network.guru.NiciraNvpGuestNetworkGuru">
+ <property name="name" value="NiciraNvpGuestNetworkGuru"/>
</bean>
-
- <bean id="LDAPUserAuthenticator" class="com.cloud.server.auth.LDAPUserAuthenticator">
- <property name="name" value="LDAP"/>
+ <bean id="NiciraNvp" class="com.cloud.network.element.NiciraNvpElement">
+ <property name="name" value="NiciraNvp"/>
</bean>
- <!--
- Investigators
+ <!--
+ Midonet support components
-->
- <bean id="CheckOnAgentInvestigator" class="com.cloud.ha.CheckOnAgentInvestigator">
- <property name="name" value="SimpleInvestigator"/>
+ <bean id="MidoNetGuestNetworkGuru" class="com.cloud.network.guru.MidoNetGuestNetworkGuru">
+ <property name="name" value="MidoNetGuestNetworkGuru"/>
</bean>
-
- <bean id="XenServerInvestigator" class="com.cloud.ha.XenServerInvestigator">
- <property name="name" value="XenServerInvestigator"/>
+ <bean id="MidoNetElement" class="com.cloud.network.element.MidoNetElement">
+ <property name="name" value="MidoNetElement"/>
</bean>
- <bean id="UserVmDomRInvestigator" class="com.cloud.ha.UserVmDomRInvestigator">
- <property name="name" value="PingInvestigator"/>
- </bean>
-
- <bean id="ManagementIPSystemVMInvestigator" class="com.cloud.ha.ManagementIPSystemVMInvestigator">
- <property name="name" value="ManagementIPSysVMInvestigator"/>
- </bean>
+ <!--
- <!--
- Fencers
- -->
- <bean id="XenServerFencer" class="com.cloud.ha.XenServerFencer">
- <property name="name" value="XenServerFenceBuilder"/>
- </bean>
- <bean id="KVMFencer" class="com.cloud.ha.KVMFencer">
- <property name="name" value="KVMFenceBuilder"/>
+ Deployment configurations of various adapters
+
+ It determines whether or not a adapter is activated or how it is loaded in order in its managing provider,
+
+ -->
+
+ <!-- Security adapters -->
+ <bean id="userAuthenticators" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="SHA256SaltedUserAuthenticator"/>
+ <ref bean="MD5UserAuthenticator"/>
+ <ref bean="LDAPUserAuthenticator"/>
+ <ref bean="PlainTextUserAuthenticator"/>
+ </list>
+ </property>
</bean>
- <bean id="OvmFencer" class="com.cloud.ovm.hypervisor.OvmFencer">
- <property name="name" value="OvmFenceBuilder"/>
+ <bean id="userPasswordEncoders" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="SHA256SaltedUserAuthenticator"/>
+ <ref bean="MD5UserAuthenticator"/>
+ <ref bean="LDAPUserAuthenticator"/>
+ <ref bean="PlainTextUserAuthenticator"/>
+ </list>
+ </property>
</bean>
- <bean id="XcpServerDiscoverer" class="com.cloud.hypervisor.xen.discoverer.XcpServerDiscoverer">
- <property name="name" value="XCP Agent"/>
+ <bean id="securityCheckers" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="domainChecker"/>
+ </list>
+ </property>
</bean>
+ <!-- Resource discoverers -->
+ <bean id="resourceDiscoverers" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="XcpServerDiscoverer"/>
+ <ref bean="SecondaryStorageDiscoverer"/>
+ <ref bean="KvmServerDiscoverer"/>
+ <ref bean="LxcServerDiscoverer"/>
+
<!--
- <bean id="SimulatorSecondaryStorageDiscoverer" class="com.cloud.resource.SimulatorSecondaryDiscoverer">
- <property name="name" value="SecondaryStorage"/>
- </bean>
+ <ref bean="BareMetalDiscoverer"/>
-->
- <bean id="SecondaryStorageDiscoverer" class="com.cloud.storage.secondary.SecondaryStorageDiscoverer">
- <property name="name" value="SecondaryStorage"/>
- </bean>
-
- <bean id="KvmServerDiscoverer" class="com.cloud.hypervisor.kvm.discoverer.KvmServerDiscoverer">
- <property name="name" value="KVM Agent"/>
+ <ref bean="OvmDiscoverer"/>
+ </list>
+ </property>
</bean>
- <bean id="SimulatorDiscoverer" class="com.cloud.resource.SimulatorDiscoverer">
- <property name="name" value="Simulator Agent"/>
+ <!-- HA adapters -->
+ <bean id="haInvestigators" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="CheckOnAgentInvestigator"/>
+ <ref bean="XenServerInvestigator"/>
+ <ref bean="UserVmDomRInvestigator"/>
+ <ref bean="ManagementIPSystemVMInvestigator"/>
+ </list>
+ </property>
</bean>
-
- <bean id="BareMetalDiscoverer" class="com.cloud.baremetal.manager.BareMetalDiscoverer">
- <property name="name" value="Bare Metal Agent"/>
+ <bean id="haFenceBuilders" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="XenServerFencer"/>
+ <ref bean="KVMFencer"/>
+ <ref bean="OvmFencer"/>
+ </list>
+ </property>
</bean>
- <bean id="HypervServerDiscoverer" class="com.cloud.hypervisor.hyperv.HypervServerDiscoverer">
- <property name="name" value="SCVMMServer"/>
- </bean>
+ <!-- Deployment/allocation adapters -->
+ <bean id="deploymentPlanners" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="FirstFitPlanner" />
+ <ref bean="UserDispersingPlanner" />
+ <ref bean="UserConcentratedPodPlanner" />
- <bean id="OvmDiscoverer" class="com.cloud.ovm.hypervisor.OvmDiscoverer">
- <property name="name" value="Ovm Discover"/>
- </bean>
-
- <bean id="FirstFitPlanner" class="com.cloud.deploy.FirstFitPlanner">
- <property name="name" value="FirstFitPlanner"/>
+ <!--
+ <ref bean="BareMetalPlanner" />
+ -->
+ </list>
+ </property>
</bean>
- <bean id="UserDispersingPlanner" class="com.cloud.deploy.UserDispersingPlanner">
- <property name="name" value="UserDispersingPlanner"/>
+ <bean id="podAllocators" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="UserConcentratedAllocator"/>
+ </list>
+ </property>
</bean>
- <bean id="UserConcentratedPodPlanner" class="com.cloud.deploy.UserConcentratedPodPlanner">
- <property name="name" value="UserConcentratedPodPlanner"/>
+ <bean id="hostAllocators" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="FirstFitRouting"/>
+ </list>
+ </property>
</bean>
- <bean id="BareMetalPlanner" class="com.cloud.baremetal.manager.BareMetalPlanner">
- <property name="name" value="BareMetalPlanner"/>
- </bean>
-
- <bean id="BaremetalPlannerSelector" class="com.cloud.baremetal.manager.BaremetalPlannerSelector">
- <property name="name" value="BaremetalPlannerSelector"/>
+ <bean id="storagePoolAllocators" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="LocalStoragePoolAllocator"/>
+ <ref bean="clusterScopeStoragePoolAllocator"/>
+ <ref bean="zoneWideStoragePoolAllocator"/>
+ <ref bean="garbageCollectingStoragePoolAllocator"/>
+ </list>
+ </property>
</bean>
- <bean id="HypervisorPlannerSelector" class="com.cloud.deploy.HypervisorVmPlannerSelector">
- <property name="name" value="HypervisorPlannerSelector"/>
- </bean>
-
-
- <!--
- Network Gurus
- -->
- <bean id="StorageNetworkGuru" class="com.cloud.network.guru.StorageNetworkGuru">
- <property name="name" value="StorageNetworkGuru"/>
- </bean>
- <bean id="ExternalGuestNetworkGuru" class="com.cloud.network.guru.ExternalGuestNetworkGuru">
- <property name="name" value="ExternalGuestNetworkGuru"/>
- </bean>
- <bean id="PublicNetworkGuru" class="com.cloud.network.guru.PublicNetworkGuru">
- <property name="name" value="PublicNetworkGuru"/>
- </bean>
- <bean id="PodBasedNetworkGuru" class="com.cloud.network.guru.PodBasedNetworkGuru">
- <property name="name" value="PodBasedNetworkGuru"/>
- </bean>
- <bean id="ControlNetworkGuru" class="com.cloud.network.guru.ControlNetworkGuru">
- <property name="name" value="ControlNetworkGuru"/>
- </bean>
- <bean id="DirectNetworkGuru" class="com.cloud.network.guru.DirectNetworkGuru">
- <property name="name" value="DirectNetworkGuru"/>
- </bean>
- <bean id="DirectPodBasedNetworkGuru" class="com.cloud.network.guru.DirectPodBasedNetworkGuru">
- <property name="name" value="DirectPodBasedNetworkGuru"/>
- </bean>
- <bean id="OvsGuestNetworkGuru" class="com.cloud.network.guru.OvsGuestNetworkGuru">
- <property name="name" value="OvsGuestNetworkGuru"/>
- </bean>
- <bean id="PrivateNetworkGuru" class="com.cloud.network.guru.PrivateNetworkGuru">
- <property name="name" value="PrivateNetworkGuru"/>
- </bean>
- <bean id="NiciraNvpGuestNetworkGuru" class="com.cloud.network.guru.NiciraNvpGuestNetworkGuru">
- <property name="name" value="NiciraNvpGuestNetworkGuru"/>
- </bean>
-
- <!--
- <bean id="BigSwitchVnsGuestNetworkGuru" class=".BigSwitchVnsGuestNetworkGuru">
- <property name="name" value="com.cloud.network.guru.BigSwitchVnsGuestNetworkGuru"/>
+ <!-- Networking adapters -->
+ <bean id="ipDeployers" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="elasticLoadBalancerElement"/>
+ <ref bean="VirtualRouter"/>
+ <ref bean="VpcVirtualRouter"/>
+ </list>
+ </property>
</bean>
+
+ <bean id="dhcpProviders" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="VirtualRouter"/>
+ <ref bean="VpcVirtualRouter"/>
+ <!--
+ <ref bean="BareMetalDhcp"/>
-->
-
- <!--
- Hypervisor Gurus
- -->
- <bean id="XenServerGuru" class="com.cloud.hypervisor.XenServerGuru">
- <property name="name" value="XenServerGuru"/>
- </bean>
-
- <bean id="KVMGuru" class="com.cloud.hypervisor.KVMGuru">
- <property name="name" value="KVMGuru"/>
- </bean>
-
- <bean id="HypervGuru" class="com.cloud.hypervisor.guru.HypervGuru">
- <property name="name" value="HypervGuru"/>
+ </list>
+ </property>
</bean>
- <bean id="OvmGuru" class="com.cloud.ovm.hypervisor.OvmGuru">
- <property name="name" value="OvmGuru"/>
+ <bean id="networkGurus" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="StorageNetworkGuru"/>
+ <ref bean="ExternalGuestNetworkGuru"/>
+ <ref bean="PublicNetworkGuru"/>
+ <ref bean="PodBasedNetworkGuru"/>
+ <ref bean="DirectPodBasedNetworkGuru"/>
+ <ref bean="ControlNetworkGuru"/>
+ <ref bean="DirectNetworkGuru"/>
+ <ref bean="OvsGuestNetworkGuru"/>
+ <ref bean="PrivateNetworkGuru"/>
+ </list>
+ </property>
</bean>
- <bean id="SimulatorGuru" class="com.cloud.simulator.SimulatorGuru">
- <property name="name" value="SimulatorGuru"/>
- </bean>
-
- <bean id="BaremetalGuru" class="com.cloud.baremetal.manager.BareMetalGuru">
- <property name="name" value="BaremetalGuru"/>
+ <bean id="networkElements" class="com.cloud.utils.component.AdapterList">
+ <property name="Adapters">
+ <list>
+ <ref bean="VirtualRouter"/>
+ <ref bean="Ovs"/>
+ <ref bean="SecurityGroupProvider"/>
+ <ref bean="VpcVirtualRouter"/>
+ <ref bean="NiciraNvp" />
+ <ref bean="MidoNetElement"/>
+ <!--
+ <ref bean="BareMetalDhcp"/>
+ <ref bean="BareMetalPxe"/>
+ <ref bean="BareMetalUserdata"/>
+ -->
+ </list>
+ </property>
</bean>
- <bean id="ClassicalPrimaryDataStoreProvider" class="org.apache.cloudstack.storage.datastore.provider.CloudStackPrimaryDataStoreProviderImpl">
- </bean>
-
-
-
+
+ <!--
+ AffinityGroup Processors
+ -->
+ <bean id="HostAntiAffinityProcessor" class="org.apache.cloudstack.affinity.HostAntiAffinityProcessor">
+ <property name="name" value="HostAntiAffinityProcessor"/>
+ <property name="type" value="host anti-affinity"/>
+ </bean>
-
-
</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/plugins/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiDBUtils.java
index 332157a,7b44190..339c31d
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@@ -329,8 -378,7 +383,9 @@@ public class ApiDBUtils
static VMSnapshotDao _vmSnapshotDao;
static ClusterDetailsDao _clusterDetailsDao;
static NicSecondaryIpDao _nicSecondaryIpDao;
+ static AffinityGroupDao _affinityGroupDao;
+ static AffinityGroupJoinDao _affinityGroupJoinDao;
+ static VpcProvisioningService _vpcProvSvc;
@Inject private ManagementServer ms;
@Inject public AsyncJobManager asyncMgr;
@@@ -434,9 -482,7 +489,11 @@@
@Inject private ClusterDetailsDao clusterDetailsDao;
@Inject private VMSnapshotDao vmSnapshotDao;
@Inject private NicSecondaryIpDao nicSecondaryIpDao;
+ @Inject private AffinityGroupDao affinityGroupDao;
+ @Inject private AffinityGroupJoinDao affinityGroupJoinDao;
+
+ @Inject private VpcProvisioningService vpcProvSvc;
++
@PostConstruct
void init() {
_ms = ms;
@@@ -538,8 -584,7 +595,9 @@@
_clusterDetailsDao = clusterDetailsDao;
_vmSnapshotDao = vmSnapshotDao;
_nicSecondaryIpDao = nicSecondaryIpDao;
+ _affinityGroupDao = affinityGroupDao;
+ _affinityGroupJoinDao = affinityGroupJoinDao;
+ _vpcProvSvc = vpcProvSvc;
// Note: stats collector should already have been initialized by this time, otherwise a null instance is returned
_statsCollector = StatsCollector.getInstance();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiResponseHelper.java
index 5a50ebb,64be7f8..45d8954
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@@ -476,9 -446,10 +476,10 @@@ public class ApiResponseHelper implemen
vmSnapshotResponse.setParentName(ApiDBUtils.getVMSnapshotById(vmSnapshot.getParent()).getDisplayName());
vmSnapshotResponse.setCurrent(vmSnapshot.getCurrent());
vmSnapshotResponse.setType(vmSnapshot.getType().toString());
+ vmSnapshotResponse.setObjectName("vmsnapshot");
return vmSnapshotResponse;
}
-
+
@Override
public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) {
SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/deploy/DeploymentPlanningManager.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/DeploymentPlanningManager.java
index 4ac71e3,0000000..13f1c67
mode 100644,000000..100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManager.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManager.java
@@@ -1,29 -1,0 +1,45 @@@
++// Licensed to the Apache Software Foundation (ASF) under one
++// or more contributor license agreements. See the NOTICE file
++// distributed with this work for additional information
++// regarding copyright ownership. The ASF licenses this file
++// to you under the Apache License, Version 2.0 (the
++// "License"); you may not use this file except in compliance
++// with the License. You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing,
++// software distributed under the License is distributed on an
++// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++// KIND, either express or implied. See the License for the
++// specific language governing permissions and limitations
++// under the License.
+package com.cloud.deploy;
+
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.exception.AffinityConflictException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.utils.component.Manager;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+public interface DeploymentPlanningManager extends Manager {
+
+ /**
+ * Manages vm deployment stages: First Process Affinity/Anti-affinity - Call
+ * the chain of AffinityGroupProcessor adapters to set deploymentplan scope
+ * and exclude list Secondly, Call DeploymentPlanner - to use heuristics to
+ * find the best spot to place the vm/volume. Planner will drill down to the
+ * write set of clusters to look for placement based on various heuristics.
+ * Lastly, Call Allocators - Given a cluster, allocators matches the
+ * requirements to capabilities of the physical resource (host, storage
+ * pool).
+ *
+ * @throws AffinityConflictException
+ *
+ *
+ *
+ */
+ DeployDestination planDeployment(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan,
+ ExcludeList avoids) throws InsufficientServerCapacityException, AffinityConflictException;
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index 11e5b82,0000000..92aac37
mode 100644,000000..100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@@ -1,80 -1,0 +1,96 @@@
++// Licensed to the Apache Software Foundation (ASF) under one
++// or more contributor license agreements. See the NOTICE file
++// distributed with this work for additional information
++// regarding copyright ownership. The ASF licenses this file
++// to you under the Apache License, Version 2.0 (the
++// "License"); you may not use this file except in compliance
++// with the License. You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing,
++// software distributed under the License is distributed on an
++// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++// KIND, either express or implied. See the License for the
++// specific language governing permissions and limitations
++// under the License.
+package com.cloud.deploy;
+
+import java.util.List;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.affinity.AffinityGroupProcessor;
+import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
+import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.log4j.Logger;
+
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.exception.AffinityConflictException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.utils.component.Manager;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
+
+@Local(value = { DeploymentPlanningManager.class })
+public class DeploymentPlanningManagerImpl extends ManagerBase implements DeploymentPlanningManager, Manager {
+
+ private static final Logger s_logger = Logger.getLogger(DeploymentPlanningManagerImpl.class);
+ @Inject
+ protected UserVmDao _vmDao;
+ @Inject
+ protected VMInstanceDao _vmInstanceDao;
+ @Inject
+ protected AffinityGroupDao _affinityGroupDao;
+ @Inject
+ protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
+
+ @Inject
+ protected List<DeploymentPlanner> _planners;
+
+ @Inject
+ protected List<AffinityGroupProcessor> _affinityProcessors;
+
+ @Override
+ public DeployDestination planDeployment(VirtualMachineProfile<? extends VirtualMachine> vmProfile,
+ DeploymentPlan plan, ExcludeList avoids) throws InsufficientServerCapacityException,
+ AffinityConflictException {
+
+ // call affinitygroup chain
+ VirtualMachine vm = vmProfile.getVirtualMachine();
+ long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
+
+ if (vmGroupCount > 0) {
+ for (AffinityGroupProcessor processor : _affinityProcessors) {
+ processor.process(vmProfile, plan, avoids);
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: "
+ + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid());
+ }
+
+ // call planners
+ DeployDestination dest = null;
+ for (DeploymentPlanner planner : _planners) {
+ if (planner.canHandle(vmProfile, plan, avoids)) {
+ dest = planner.plan(vmProfile, plan, avoids);
+ } else {
+ continue;
+ }
+ if (dest != null) {
+ avoids.addHost(dest.getHost().getId());
+ break;
+ }
+
+ }
+ return dest;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/deploy/FirstFitPlanner.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index c0744de,af77ba5..2128d6c
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -47,17 -47,67 +47,74 @@@ import javax.management.MalformedObject
import javax.management.NotCompliantMBeanException;
import javax.naming.ConfigurationException;
- import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.affinity.AffinityGroupProcessor;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
- import org.apache.cloudstack.api.ApiConstants;
-
- import com.cloud.event.ActionEventUtils;
+import org.apache.cloudstack.api.command.user.affinitygroup.CreateAffinityGroupCmd;
+import org.apache.cloudstack.api.command.user.affinitygroup.DeleteAffinityGroupCmd;
+import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupTypesCmd;
+import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupsCmd;
+import org.apache.cloudstack.api.command.user.affinitygroup.UpdateVMAffinityGroupCmd;
+ import com.cloud.storage.dao.*;
+ import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+ import org.apache.cloudstack.api.ApiConstants;
+
+ import com.cloud.event.ActionEventUtils;
+ import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
+ import org.apache.cloudstack.api.command.admin.account.*;
+ import org.apache.cloudstack.api.command.admin.autoscale.*;
+ import org.apache.cloudstack.api.command.admin.cluster.*;
+ import org.apache.cloudstack.api.command.admin.config.*;
+ import org.apache.cloudstack.api.command.admin.domain.*;
+ import org.apache.cloudstack.api.command.admin.host.*;
+ import org.apache.cloudstack.api.command.admin.ldap.*;
+ import org.apache.cloudstack.api.command.admin.network.*;
+ import org.apache.cloudstack.api.command.admin.offering.*;
+ import org.apache.cloudstack.api.command.admin.pod.*;
+ import org.apache.cloudstack.api.command.admin.region.*;
+ import org.apache.cloudstack.api.command.admin.resource.*;
+ import org.apache.cloudstack.api.command.admin.router.*;
+ import org.apache.cloudstack.api.command.admin.storage.*;
+ import org.apache.cloudstack.api.command.admin.swift.*;
+ import org.apache.cloudstack.api.command.admin.systemvm.*;
+ import org.apache.cloudstack.api.command.admin.template.*;
+ import org.apache.cloudstack.api.command.admin.usage.*;
+ import org.apache.cloudstack.api.command.admin.user.*;
+ import org.apache.cloudstack.api.command.admin.vlan.*;
+ import org.apache.cloudstack.api.command.admin.vm.*;
+ import org.apache.cloudstack.api.command.admin.vpc.*;
+ import org.apache.cloudstack.api.command.admin.zone.*;
+ import org.apache.cloudstack.api.command.user.account.*;
+ import org.apache.cloudstack.api.command.user.address.*;
+ import org.apache.cloudstack.api.command.user.autoscale.*;
+ import org.apache.cloudstack.api.command.user.config.*;
+ import org.apache.cloudstack.api.command.user.event.*;
+ import org.apache.cloudstack.api.command.user.firewall.*;
+ import org.apache.cloudstack.api.command.user.guest.*;
+ import org.apache.cloudstack.api.command.user.iso.*;
+ import org.apache.cloudstack.api.command.user.job.*;
+ import org.apache.cloudstack.api.command.user.loadbalancer.*;
+ import org.apache.cloudstack.api.command.user.nat.*;
+ import org.apache.cloudstack.api.command.user.network.*;
+ import org.apache.cloudstack.api.command.user.offering.*;
+ import org.apache.cloudstack.api.command.user.project.*;
+ import org.apache.cloudstack.api.command.user.region.*;
+ import org.apache.cloudstack.api.command.user.resource.*;
+ import org.apache.cloudstack.api.command.user.securitygroup.*;
+ import org.apache.cloudstack.api.command.user.snapshot.*;
+ import org.apache.cloudstack.api.command.user.ssh.*;
+ import org.apache.cloudstack.api.command.user.tag.*;
+ import org.apache.cloudstack.api.command.user.template.*;
+ import org.apache.cloudstack.api.command.user.vm.*;
+ import org.apache.cloudstack.api.command.user.vmgroup.*;
+ import org.apache.cloudstack.api.command.user.volume.*;
+ import org.apache.cloudstack.api.command.user.vpc.*;
+ import org.apache.cloudstack.api.command.user.vpn.*;
+ import org.apache.cloudstack.api.command.user.zone.*;
+ import org.apache.cloudstack.api.response.ExtractResponse;
+ import org.apache.commons.codec.binary.Base64;
+ import org.apache.log4j.Logger;
+ import org.springframework.stereotype.Component;
+
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.GetVncPortAnswer;
import com.cloud.agent.api.GetVncPortCommand;
@@@ -400,11 -457,9 +465,12 @@@ public class ManagementServerImpl exten
private Map<String, Boolean> _availableIdsMap;
- List<UserAuthenticator> _userAuthenticators;
+ private List<UserAuthenticator> _userAuthenticators;
+ private List<UserAuthenticator> _userPasswordEncoders;
+ @Inject
+ protected List<DeploymentPlanner> _planners;
+
@Inject ClusterManager _clusterMgr;
private String _hashKey = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index d7e27ef,52ca79d..12ada66
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -221,10 -220,9 +221,11 @@@ public class AccountManagerImpl extend
@Inject
private AutoScaleManager _autoscaleMgr;
@Inject VolumeManager volumeMgr;
+ @Inject
+ private AffinityGroupDao _affinityGroupDao;
private List<UserAuthenticator> _userAuthenticators;
+ List<UserAuthenticator> _userPasswordEncoders;
private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AccountChecker"));
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 912ee52,af22716..4072531
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@@ -210,16 -208,26 +210,26 @@@ public class VirtualMachineManagerImpl
@Inject
protected VMSnapshotDao _vmSnapshotDao;
- @Inject
protected List<DeploymentPlanner> _planners;
+ public List<DeploymentPlanner> getPlanners() {
+ return _planners;
+ }
+ public void setPlanners(List<DeploymentPlanner> _planners) {
+ this._planners = _planners;
+ }
- @Inject
protected List<HostAllocator> _hostAllocators;
-
- @Inject
+ public List<HostAllocator> getHostAllocators() {
+ return _hostAllocators;
+ }
+ public void setHostAllocators(List<HostAllocator> _hostAllocators) {
+ this._hostAllocators = _hostAllocators;
+ }
+
+ @Inject
protected ResourceManager _resourceMgr;
-
- @Inject
+
+ @Inject
protected VMSnapshotManager _vmSnapshotMgr = null;
@Inject
protected ClusterDetailsDao _clusterDetailsDao;
@@@ -790,10 -794,10 +800,10 @@@
s_logger.info("The guru did not like the answers so stopping " + vm);
}
- StopCommand cmd = new StopCommand(vm.getInstanceName());
+ StopCommand cmd = new StopCommand(vm);
StopAnswer answer = (StopAnswer) _agentMgr.easySend(destHostId, cmd);
if (answer == null || !answer.getResult()) {
- s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers"));
+ s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers"));
_haMgr.scheduleStop(vm, destHostId, WorkType.ForceStop);
throw new ExecutionException("Unable to stop " + vm + " so we are unable to retry the start operation");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
index 17f7401,0000000..e6a1254
mode 100644,000000..100644
--- a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
+++ b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
@@@ -1,318 -1,0 +1,335 @@@
++// Licensed to the Apache Software Foundation (ASF) under one
++// or more contributor license agreements. See the NOTICE file
++// distributed with this work for additional information
++// regarding copyright ownership. The ASF licenses this file
++// to you under the Apache License, Version 2.0 (the
++// "License"); you may not use this file except in compliance
++// with the License. You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing,
++// software distributed under the License is distributed on an
++// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++// KIND, either express or implied. See the License for the
++// specific language governing permissions and limitations
++// under the License.
+package org.apache.cloudstack.affinity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.log4j.Logger;
+import org.springframework.context.annotation.Primary;
+
+
+import com.cloud.deploy.DeploymentPlanner;
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.network.security.SecurityGroup;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.UserContext;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.component.Manager;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.JoinBuilder;
+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.fsm.StateListener;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.Event;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.dao.UserVmDao;
+
+@Local(value = { AffinityGroupService.class })
+public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGroupService, Manager,
+ StateListener<State, VirtualMachine.Event, VirtualMachine> {
+
+ public static final Logger s_logger = Logger.getLogger(AffinityGroupServiceImpl.class);
+ private String _name;
+
+ @Inject
+ AccountManager _accountMgr;
+
+ @Inject
+ AffinityGroupDao _affinityGroupDao;
+
+ @Inject
+ AffinityGroupVMMapDao _affinityGroupVMMapDao;
+
+ @Inject
+ private UserVmDao _userVmDao;
+
+ @Override
++ @ActionEvent(eventType = EventTypes.EVENT_AFFINITY_GROUP_CREATE, eventDescription = "Creating Affinity Group", create = true)
+ public AffinityGroup createAffinityGroup(String account, Long domainId, String affinityGroupName,
+ String affinityGroupType, String description) {
+
+ Account caller = UserContext.current().getCaller();
+ Account owner = _accountMgr.finalizeOwner(caller, account, domainId, null);
+
+ if (_affinityGroupDao.isNameInUse(owner.getAccountId(), owner.getDomainId(), affinityGroupName)) {
+ throw new InvalidParameterValueException("Unable to create affinity group, a group with name "
+ + affinityGroupName
+ + " already exisits.");
+ }
+
+
+ //validate the affinityGroupType
+ Map<String, AffinityGroupProcessor> typeProcessorMap = getAffinityTypeToProcessorMap();
+ if (typeProcessorMap != null && !typeProcessorMap.isEmpty()) {
+ if (!typeProcessorMap.containsKey(affinityGroupType)) {
+ throw new InvalidParameterValueException("Unable to create affinity group, invalid affinity group type"
+ + affinityGroupType);
+ }
+ } else {
+ throw new InvalidParameterValueException(
+ "Unable to create affinity group, no Affinity Group Types configured");
+ }
+
+ if (domainId == null) {
+ domainId = owner.getDomainId();
+ }
+
+ AffinityGroupVO group = new AffinityGroupVO(affinityGroupName, affinityGroupType, description, domainId,
+ owner.getId());
+ _affinityGroupDao.persist(group);
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Created affinity group =" + affinityGroupName);
+ }
+
+ return group;
+ }
+
+ @DB
+ @Override
- @ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_DELETE, eventDescription = "deleting affinity group")
++ @ActionEvent(eventType = EventTypes.EVENT_AFFINITY_GROUP_DELETE, eventDescription = "Deleting affinity group")
+ public boolean deleteAffinityGroup(Long affinityGroupId, String account, Long domainId, String affinityGroupName)
+ throws ResourceInUseException {
+
+ Account caller = UserContext.current().getCaller();
+ Account owner = _accountMgr.finalizeOwner(caller, account, domainId, null);
+
+ AffinityGroupVO group = null;
+ if (affinityGroupId != null) {
+ group = _affinityGroupDao.findById(affinityGroupId);
+ if (group == null) {
+ throw new InvalidParameterValueException("Unable to find affinity group: " + affinityGroupId
+ + "; failed to delete group.");
+ }
+ } else if (affinityGroupName != null) {
+ group = _affinityGroupDao.findByAccountAndName(owner.getAccountId(), affinityGroupName);
+ if (group == null) {
+ throw new InvalidParameterValueException("Unable to find affinity group: " + affinityGroupName
+ + "; failed to delete group.");
+ }
+ } else {
+ throw new InvalidParameterValueException(
+ "Either the affinity group Id or group name must be specified to delete the group");
+ }
+
+ // check permissions
+ _accountMgr.checkAccess(caller, null, true, group);
+
+ final Transaction txn = Transaction.currentTxn();
+ txn.start();
+
+ group = _affinityGroupDao.lockRow(affinityGroupId, true);
+ if (group == null) {
+ throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupId);
+ }
+
+ List<AffinityGroupVMMapVO> affinityGroupVmMap = _affinityGroupVMMapDao.listByAffinityGroup(affinityGroupId);
+ if (!affinityGroupVmMap.isEmpty()) {
+ throw new ResourceInUseException("Cannot delete affinity group when it's in use by virtual machines");
+ }
+
+ _affinityGroupDao.expunge(affinityGroupId);
+ txn.commit();
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Deleted affinity group id=" + affinityGroupId);
+ }
+ return true;
+ }
+
+ @Override
+ public Pair<List<? extends AffinityGroup>, Integer> listAffinityGroups(Long affinityGroupId, String affinityGroupName, String affinityGroupType, Long vmId, Long startIndex, Long pageSize) {
+ Filter searchFilter = new Filter(AffinityGroupVO.class, "id", Boolean.TRUE, startIndex, pageSize);
+
+ Account caller = UserContext.current().getCaller();
+
+ Long accountId = caller.getAccountId();
+ Long domainId = caller.getDomainId();
+
+ SearchBuilder<AffinityGroupVMMapVO> vmInstanceSearch = _affinityGroupVMMapDao.createSearchBuilder();
+ vmInstanceSearch.and("instanceId", vmInstanceSearch.entity().getInstanceId(), SearchCriteria.Op.EQ);
+
+ SearchBuilder<AffinityGroupVO> groupSearch = _affinityGroupDao.createSearchBuilder();
+
+ SearchCriteria<AffinityGroupVO> sc = groupSearch.create();
+
+ if (accountId != null) {
+ sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
+ }
+
+ if (domainId != null) {
+ sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
+ }
+
+ if (affinityGroupId != null) {
+ sc.addAnd("id", SearchCriteria.Op.EQ, affinityGroupId);
+ }
+
+ if (affinityGroupName != null) {
+ sc.addAnd("name", SearchCriteria.Op.EQ, affinityGroupName);
+ }
+
+ if (affinityGroupType != null) {
+ sc.addAnd("type", SearchCriteria.Op.EQ, affinityGroupType);
+ }
+
+ if (vmId != null) {
+ UserVmVO userVM = _userVmDao.findById(vmId);
+ if (userVM == null) {
+ throw new InvalidParameterValueException("Unable to list affinity groups for virtual machine instance "
+ + vmId + "; instance not found.");
+ }
+ _accountMgr.checkAccess(caller, null, true, userVM);
+ // add join to affinity_groups_vm_map
+ groupSearch.join("vmInstanceSearch", vmInstanceSearch, groupSearch.entity().getId(), vmInstanceSearch
+ .entity().getAffinityGroupId(), JoinBuilder.JoinType.INNER);
+ sc.setJoinParameters("vmInstanceSearch", "instanceId", vmId);
+ }
+
+ Pair<List<AffinityGroupVO>, Integer> result = _affinityGroupDao.searchAndCount(sc, searchFilter);
+ return new Pair<List<? extends AffinityGroup>, Integer>(result.first(), result.second());
+ }
+
+
+ @Override
+ public List<String> listAffinityGroupTypes() {
+ List<String> types = new ArrayList<String>();
+ Map<String, AffinityGroupProcessor> componentMap = ComponentContext.getComponentsOfType(AffinityGroupProcessor.class);
+
+ if (componentMap.size() > 0) {
+ for (Entry<String, AffinityGroupProcessor> entry : componentMap.entrySet()) {
+ types.add(entry.getValue().getType());
+ }
+
+ }
+ return types;
+ }
+
+ protected Map<String, AffinityGroupProcessor> getAffinityTypeToProcessorMap() {
+ Map<String, AffinityGroupProcessor> typeProcessorMap = new HashMap<String, AffinityGroupProcessor>();
+ Map<String, AffinityGroupProcessor> componentMap = ComponentContext
+ .getComponentsOfType(AffinityGroupProcessor.class);
+
+ if (componentMap.size() > 0) {
+ for (Entry<String, AffinityGroupProcessor> entry : componentMap.entrySet()) {
+ typeProcessorMap.put(entry.getValue().getType(), entry.getValue());
+ }
+ }
+ return typeProcessorMap;
+ }
+
+ @Override
+ public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
+ _name = name;
+ VirtualMachine.State.getStateMachine().registerListener(this);
+ return true;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public AffinityGroup getAffinityGroup(Long groupId) {
+ return _affinityGroupDao.findById(groupId);
+ }
+
+ @Override
+ public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo,
+ boolean status, Object opaque) {
+ return true;
+ }
+
+ @Override
+ public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo,
+ boolean status, Object opaque) {
+ if (!status) {
+ return false;
+ }
+ if ((newState == State.Expunging)) {
+ // cleanup all affinity groups associations of the Expunged VM
+ SearchCriteria<AffinityGroupVMMapVO> sc = _affinityGroupVMMapDao.createSearchCriteria();
+ sc.addAnd("instanceId", SearchCriteria.Op.EQ, vo.getId());
+ _affinityGroupVMMapDao.expunge(sc);
+ }
+ return true;
+ }
+
+ @Override
+ public UserVm updateVMAffinityGroups(Long vmId, List<Long> affinityGroupIds) {
+ // Verify input parameters
+ UserVmVO vmInstance = _userVmDao.findById(vmId);
+ if (vmInstance == null) {
+ throw new InvalidParameterValueException("unable to find a virtual machine with id " + vmId);
+ }
+
+ // Check that the VM is stopped
+ if (!vmInstance.getState().equals(State.Stopped)) {
+ s_logger.warn("Unable to update affinity groups of the virtual machine " + vmInstance.toString()
+ + " in state " + vmInstance.getState());
+ throw new InvalidParameterValueException("Unable update affinity groups of the virtual machine "
+ + vmInstance.toString() + " " + "in state " + vmInstance.getState()
+ + "; make sure the virtual machine is stopped and not in an error state before updating.");
+ }
+
+ // check that the affinity groups exist
+ for (Long affinityGroupId : affinityGroupIds) {
+ AffinityGroupVO ag = _affinityGroupDao.findById(affinityGroupId);
+ if (ag == null) {
+ throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupId);
+ }
+ }
+ _affinityGroupVMMapDao.updateMap(vmId, affinityGroupIds);
+ // APIResponseHelper will pull out the updated affinitygroups.
+ return vmInstance;
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java
----------------------------------------------------------------------
diff --cc server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java
index d778ed4,0000000..2191a24
mode 100644,000000..100644
--- a/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java
+++ b/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java
@@@ -1,318 -1,0 +1,328 @@@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.affinity;
+
+import java.io.IOException;
+
+import org.apache.cloudstack.acl.SecurityChecker;
+import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.agent.AgentManager;
+import com.cloud.alert.AlertManager;
+import com.cloud.api.query.dao.UserAccountJoinDaoImpl;
+import com.cloud.capacity.dao.CapacityDaoImpl;
+import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.dao.AccountVlanMapDaoImpl;
+import com.cloud.dc.dao.ClusterDaoImpl;
+import com.cloud.dc.dao.DataCenterDaoImpl;
+import com.cloud.dc.dao.DataCenterIpAddressDaoImpl;
+import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl;
+import com.cloud.dc.dao.DataCenterVnetDaoImpl;
+import com.cloud.dc.dao.DcDetailsDaoImpl;
+import com.cloud.dc.dao.HostPodDaoImpl;
+import com.cloud.dc.dao.PodVlanDaoImpl;
+import com.cloud.dc.dao.PodVlanMapDaoImpl;
+import com.cloud.dc.dao.VlanDaoImpl;
+import com.cloud.domain.dao.DomainDaoImpl;
++import com.cloud.event.EventUtils;
++import com.cloud.event.dao.EventDao;
++import com.cloud.event.dao.EventDaoImpl;
+import com.cloud.event.dao.UsageEventDaoImpl;
+import com.cloud.host.dao.HostDaoImpl;
+import com.cloud.host.dao.HostDetailsDaoImpl;
+import com.cloud.host.dao.HostTagsDaoImpl;
+import com.cloud.network.Ipv6AddressManager;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.NetworkService;
+import com.cloud.network.StorageNetworkManager;
+import com.cloud.network.dao.FirewallRulesCidrsDaoImpl;
+import com.cloud.network.dao.FirewallRulesDaoImpl;
+import com.cloud.network.dao.IPAddressDaoImpl;
+import com.cloud.network.dao.LoadBalancerDaoImpl;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDomainDaoImpl;
+import com.cloud.network.dao.NetworkServiceMapDaoImpl;
+import com.cloud.network.dao.PhysicalNetworkDaoImpl;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl;
+import com.cloud.network.dao.PhysicalNetworkTrafficTypeDaoImpl;
+import com.cloud.network.dao.UserIpv6AddressDaoImpl;
+import com.cloud.network.element.DhcpServiceProvider;
+import com.cloud.network.element.IpDeployer;
+import com.cloud.network.element.NetworkElement;
+import com.cloud.network.guru.NetworkGuru;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.rules.FirewallManager;
+import com.cloud.network.rules.RulesManager;
+import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl;
+import com.cloud.network.vpc.NetworkACLManager;
+import com.cloud.network.vpc.VpcManager;
+import com.cloud.network.vpc.dao.PrivateIpDaoImpl;
+import com.cloud.network.vpn.RemoteAccessVpnService;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.projects.ProjectManager;
+import com.cloud.service.dao.ServiceOfferingDaoImpl;
+import com.cloud.storage.dao.DiskOfferingDaoImpl;
+import com.cloud.storage.dao.S3DaoImpl;
+import com.cloud.storage.dao.SnapshotDaoImpl;
+import com.cloud.storage.dao.StoragePoolDetailsDaoImpl;
+import com.cloud.storage.dao.SwiftDaoImpl;
+import com.cloud.storage.dao.VolumeDaoImpl;
+import com.cloud.storage.s3.S3Manager;
+import com.cloud.storage.secondary.SecondaryStorageVmManager;
+import com.cloud.storage.swift.SwiftManager;
+import com.cloud.tags.dao.ResourceTagsDaoImpl;
+import com.cloud.user.AccountManager;
+import com.cloud.user.ResourceLimitService;
- import com.cloud.user.UserContext;
+import com.cloud.user.UserContextInitializer;
- import com.cloud.user.dao.AccountDaoImpl;
++import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDaoImpl;
+import com.cloud.utils.component.SpringComponentScanUtils;
- import com.cloud.utils.db.GenericDao;
- import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.dao.InstanceGroupDaoImpl;
+import com.cloud.vm.dao.NicDaoImpl;
+import com.cloud.vm.dao.NicSecondaryIpDaoImpl;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDaoImpl;
+
+@Configuration
+@ComponentScan(basePackageClasses = { AccountVlanMapDaoImpl.class, VolumeDaoImpl.class, HostPodDaoImpl.class,
+ DomainDaoImpl.class, SwiftDaoImpl.class, ServiceOfferingDaoImpl.class, VlanDaoImpl.class,
- IPAddressDaoImpl.class, ResourceTagsDaoImpl.class, AccountDaoImpl.class, InstanceGroupDaoImpl.class,
++ IPAddressDaoImpl.class, ResourceTagsDaoImpl.class, InstanceGroupDaoImpl.class,
+ UserAccountJoinDaoImpl.class, CapacityDaoImpl.class, SnapshotDaoImpl.class, HostDaoImpl.class,
+ VMInstanceDaoImpl.class, HostTransferMapDaoImpl.class, PortForwardingRulesDaoImpl.class,
+ PrivateIpDaoImpl.class, UsageEventDaoImpl.class, PodVlanMapDaoImpl.class, DiskOfferingDaoImpl.class,
+ DataCenterDaoImpl.class, DataCenterIpAddressDaoImpl.class, DataCenterLinkLocalIpAddressDaoImpl.class,
+ DataCenterVnetDaoImpl.class, PodVlanDaoImpl.class, DcDetailsDaoImpl.class, NicSecondaryIpDaoImpl.class,
+ UserIpv6AddressDaoImpl.class, S3DaoImpl.class, UserDaoImpl.class, NicDaoImpl.class, NetworkDomainDaoImpl.class,
+ HostDetailsDaoImpl.class, HostTagsDaoImpl.class, ClusterDaoImpl.class, FirewallRulesDaoImpl.class,
+ FirewallRulesCidrsDaoImpl.class, PhysicalNetworkDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class,
+ PhysicalNetworkServiceProviderDaoImpl.class, LoadBalancerDaoImpl.class, NetworkServiceMapDaoImpl.class,
+ PrimaryDataStoreDaoImpl.class, StoragePoolDetailsDaoImpl.class, AffinityGroupServiceImpl.class,
- ComponentContext.class, AffinityGroupProcessor.class, UserVmVO.class }, includeFilters = { @Filter(value = AffinityApiTestConfiguration.Library.class, type = FilterType.CUSTOM) }, useDefaultFilters = false)
++ ComponentContext.class, AffinityGroupProcessor.class, EventUtils.class, UserVmVO.class, EventDaoImpl.class }, includeFilters = { @Filter(value = AffinityApiTestConfiguration.Library.class, type = FilterType.CUSTOM) }, useDefaultFilters = false)
+public class AffinityApiTestConfiguration {
+
+ @Bean
+ public AffinityGroupProcessor affinityGroupProcessor() {
+ return Mockito.mock(AffinityGroupProcessor.class);
+ }
+
+ @Bean
++ public AccountDao accountDao() {
++ return Mockito.mock(AccountDao.class);
++ }
++
++ @Bean
++ public EventUtils eventUtils() {
++ return Mockito.mock(EventUtils.class);
++ }
++
++ @Bean
+ public ComponentContext componentContext() {
+ return Mockito.mock(ComponentContext.class);
+ }
+
+
+ @Bean
+ public UserContextInitializer userContextInitializer() {
+ return Mockito.mock(UserContextInitializer.class);
+ }
+
+ @Bean
+ public UserVmVO userVmVO() {
+ return Mockito.mock(UserVmVO.class);
+ }
+
+ @Bean
+ public AffinityGroupDao affinityGroupDao() {
+ return Mockito.mock(AffinityGroupDao.class);
+ }
+
+ @Bean
+ public AffinityGroupVMMapDao affinityGroupVMMapDao() {
+ return Mockito.mock(AffinityGroupVMMapDao.class);
+ }
+
+ @Bean
+ public AccountManager acctMgr() {
+ return Mockito.mock(AccountManager.class);
+ }
+
+ @Bean
+ public NetworkService ntwkSvc() {
+ return Mockito.mock(NetworkService.class);
+ }
+
+ @Bean
+ public NetworkModel ntwkMdl() {
+ return Mockito.mock(NetworkModel.class);
+ }
+
+ @Bean
+ public AlertManager alertMgr() {
+ return Mockito.mock(AlertManager.class);
+ }
+
+ @Bean
+ public SecurityChecker securityChkr() {
+ return Mockito.mock(SecurityChecker.class);
+ }
+
+ @Bean
+ public ResourceLimitService resourceSvc() {
+ return Mockito.mock(ResourceLimitService.class);
+ }
+
+ @Bean
+ public ProjectManager projectMgr() {
+ return Mockito.mock(ProjectManager.class);
+ }
+
+ @Bean
+ public SecondaryStorageVmManager ssvmMgr() {
+ return Mockito.mock(SecondaryStorageVmManager.class);
+ }
+
+ @Bean
+ public SwiftManager swiftMgr() {
+ return Mockito.mock(SwiftManager.class);
+ }
+
+ @Bean
+ public S3Manager s3Mgr() {
+ return Mockito.mock(S3Manager.class);
+ }
+
+ @Bean
+ public VpcManager vpcMgr() {
+ return Mockito.mock(VpcManager.class);
+ }
+
+ @Bean
+ public UserVmDao userVMDao() {
+ return Mockito.mock(UserVmDao.class);
+ }
+
+ @Bean
+ public RulesManager rulesMgr() {
+ return Mockito.mock(RulesManager.class);
+ }
+
+ @Bean
+ public LoadBalancingRulesManager lbRulesMgr() {
+ return Mockito.mock(LoadBalancingRulesManager.class);
+ }
+
+ @Bean
+ public RemoteAccessVpnService vpnMgr() {
+ return Mockito.mock(RemoteAccessVpnService.class);
+ }
+
+ @Bean
+ public NetworkGuru ntwkGuru() {
+ return Mockito.mock(NetworkGuru.class);
+ }
+
+ @Bean
+ public NetworkElement ntwkElement() {
+ return Mockito.mock(NetworkElement.class);
+ }
+
+ @Bean
+ public IpDeployer ipDeployer() {
+ return Mockito.mock(IpDeployer.class);
+ }
+
+ @Bean
+ public DhcpServiceProvider dhcpProvider() {
+ return Mockito.mock(DhcpServiceProvider.class);
+ }
+
+ @Bean
+ public FirewallManager firewallMgr() {
+ return Mockito.mock(FirewallManager.class);
+ }
+
+ @Bean
+ public AgentManager agentMgr() {
+ return Mockito.mock(AgentManager.class);
+ }
+
+ @Bean
+ public StorageNetworkManager storageNtwkMgr() {
+ return Mockito.mock(StorageNetworkManager.class);
+ }
+
+ @Bean
+ public NetworkACLManager ntwkAclMgr() {
+ return Mockito.mock(NetworkACLManager.class);
+ }
+
+ @Bean
+ public Ipv6AddressManager ipv6Mgr() {
+ return Mockito.mock(Ipv6AddressManager.class);
+ }
+
+ @Bean
+ public ConfigurationDao configDao() {
+ return Mockito.mock(ConfigurationDao.class);
+ }
+
+ @Bean
+ public NetworkManager networkManager() {
+ return Mockito.mock(NetworkManager.class);
+ }
+
+ @Bean
+ public NetworkOfferingDao networkOfferingDao() {
+ return Mockito.mock(NetworkOfferingDao.class);
+ }
+
+ @Bean
+ public NetworkDao networkDao() {
+ return Mockito.mock(NetworkDao.class);
+ }
+
+ @Bean
+ public NetworkOfferingServiceMapDao networkOfferingServiceMapDao() {
+ return Mockito.mock(NetworkOfferingServiceMapDao.class);
+ }
+
+ public static class Library implements TypeFilter {
+
+ @Override
+ public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+ mdr.getClassMetadata().getClassName();
+ ComponentScan cs = AffinityApiTestConfiguration.class.getAnnotation(ComponentScan.class);
+ return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
----------------------------------------------------------------------
diff --cc server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
index 17f165d,0000000..3ddfd39
mode 100644,000000..100644
--- a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
+++ b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
@@@ -1,164 -1,0 +1,175 @@@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.affinity;
+
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.*;
+
+import java.util.ArrayList;
- import java.util.HashMap;
+import java.util.List;
- import java.util.Map;
-
+import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
+import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
++import com.cloud.event.EventUtils;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
- import com.cloud.user.AccountManagerImpl;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserContext;
- import com.cloud.user.UserContextInitializer;
++import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.UserVmDao;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = "classpath:/affinityContext.xml")
+public class AffinityApiUnitTest {
+
+ @Inject
+ AffinityGroupServiceImpl _affinityService;
+
+ @Inject
+ AccountManager _acctMgr;
+
+ @Inject
+ AffinityGroupProcessor _processor;
+
+ @Inject
+ AffinityGroupDao _groupDao;
+
+ @Inject
++ EventUtils _eventUtils;
++
++ @Inject
++ AccountDao _accountDao;
++
++ @Inject
+ UserVmDao _vmDao;
+
+ @Inject
+ AffinityGroupVMMapDao _affinityGroupVMMapDao;
+
+ private static long domainId = 5L;
+
+
+ @BeforeClass
+ public static void setUp() throws ConfigurationException {
+
+ }
+
++
++
+ @Before
+ public void testSetUp() {
++
++ ComponentContext.initComponentsLifeCycle();
++
+ AccountVO acct = new AccountVO(200L);
+ acct.setType(Account.ACCOUNT_TYPE_NORMAL);
+ acct.setAccountName("user");
+ acct.setDomainId(domainId);
+
+ UserContext.registerContext(1, acct, null, true);
+
+ when(_acctMgr.finalizeOwner((Account) anyObject(), anyString(), anyLong(), anyLong())).thenReturn(acct);
+ when(_processor.getType()).thenReturn("mock");
++
++ when(_accountDao.findByIdIncludingRemoved(0L)).thenReturn(acct);
++
+ }
+
+ @Test
+ public void createAffinityGroupTest() {
+ AffinityGroup group = _affinityService.createAffinityGroup("user", domainId, "group1", "mock",
+ "affinity group one");
+ assertNotNull("Affinity group 'group1' of type 'mock' failed to create ", group);
+
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void invalidAffinityTypeTest() {
+ AffinityGroup group = _affinityService.createAffinityGroup("user", domainId, "group1", "invalid",
+ "affinity group one");
+
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void uniqueAffinityNameTest() {
+ when(_groupDao.isNameInUse(anyLong(), anyLong(), eq("group1"))).thenReturn(true);
+ AffinityGroup group2 = _affinityService.createAffinityGroup("user", domainId, "group1", "mock",
+ "affinity group two");
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void deleteAffinityGroupInvalidIdTest() throws ResourceInUseException {
+ when(_groupDao.findById(20L)).thenReturn(null);
+ _affinityService.deleteAffinityGroup(20L, "user", domainId, "group1");
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void deleteAffinityGroupInvalidIdName() throws ResourceInUseException {
+ when(_groupDao.findByAccountAndName(200L, "group1")).thenReturn(null);
+ _affinityService.deleteAffinityGroup(null, "user", domainId, "group1");
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void deleteAffinityGroupNullIdName() throws ResourceInUseException {
+ _affinityService.deleteAffinityGroup(null, "user", domainId, null);
+ }
+
+ @Test(expected = ResourceInUseException.class)
+ public void deleteAffinityGroupInUse() throws ResourceInUseException {
+ List<AffinityGroupVMMapVO> affinityGroupVmMap = new ArrayList<AffinityGroupVMMapVO>();
+ AffinityGroupVMMapVO mapVO = new AffinityGroupVMMapVO(20L, 10L);
+ affinityGroupVmMap.add(mapVO);
+ when(_affinityGroupVMMapDao.listByAffinityGroup(20L)).thenReturn(affinityGroupVmMap);
+
+ AffinityGroupVO groupVO = new AffinityGroupVO();
+ when(_groupDao.findById(20L)).thenReturn(groupVO);
+ when(_groupDao.lockRow(20L, true)).thenReturn(groupVO);
+
+ _affinityService.deleteAffinityGroup(20L, "user", domainId, null);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void updateAffinityGroupVMRunning() throws ResourceInUseException {
+
+ UserVmVO vm = new UserVmVO(10L, "test", "test", 101L, HypervisorType.Any, 21L, false, false, domainId, 200L,
+ 5L, "", "test", 1L);
+ vm.setState(VirtualMachine.State.Running);
+ when(_vmDao.findById(10L)).thenReturn(vm);
+
+ List<Long> affinityGroupIds = new ArrayList<Long>();
+ affinityGroupIds.add(20L);
+
+ _affinityService.updateVMAffinityGroups(10L, affinityGroupIds);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/server/test/resources/affinityContext.xml
----------------------------------------------------------------------
diff --cc server/test/resources/affinityContext.xml
index 652905c,0000000..a14ec9b
mode 100644,000000..100644
--- a/server/test/resources/affinityContext.xml
+++ b/server/test/resources/affinityContext.xml
@@@ -1,44 -1,0 +1,44 @@@
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+ license agreements. See the NOTICE file distributed with this work for additional
+ information regarding copyright ownership. The ASF licenses this file to
+ you under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of
+ the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+ by applicable law or agreed to in writing, software distributed under the
+ License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ OF ANY KIND, either express or implied. See the License for the specific
+ language governing permissions and limitations under the License. -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/tx
+ http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+ http://www.springframework.org/schema/aop
+ http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+ <context:annotation-config />
+
- <!-- @DB support -->
- <aop:config proxy-target-class="true">
- <aop:aspect id="dbContextBuilder" ref="transactionContextBuilder">
- <aop:pointcut id="captureAnyMethod" expression="execution(* *(..))" />
++ <bean id="componentContext" class="com.cloud.utils.component.ComponentContext" />
+
- <aop:around pointcut-ref="captureAnyMethod" method="AroundAnyMethod" />
- </aop:aspect>
- </aop:config>
-
++ <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
++ <bean id="actionEventInterceptor" class="com.cloud.event.ActionEventInterceptor" />
++ <bean id="instantiatePostProcessor" class="com.cloud.utils.component.ComponentInstantiationPostProcessor">
++ <property name="Interceptors">
++ <list>
++ <ref bean="transactionContextBuilder" />
++ <ref bean="actionEventInterceptor" />
++ </list>
++ </property>
++ </bean>
+
+ <bean id="ConfigurationManager" class="com.cloud.configuration.ConfigurationManagerImpl">
+ <property name="name" value="ConfigurationManager"/>
+ </bean>
+
+ <bean class="org.apache.cloudstack.affinity.AffinityApiTestConfiguration" />
-
- <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
-
+
+</beans>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca1a7948/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --cc setup/db/db/schema-410to420.sql
index cc759b8,ab9df05..e79bc11
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@@ -413,216 -391,17 +413,232 @@@ CREATE VIEW `cloud`.`account_view` A
and async_job.instance_type = 'Account'
and async_job.job_status = 0;
+
+DROP VIEW IF EXISTS `cloud`.`user_vm_view`;
+CREATE VIEW `cloud`.`user_vm_view` AS
+ select
+ vm_instance.id id,
+ vm_instance.name name,
+ user_vm.display_name display_name,
+ user_vm.user_data user_data,
+ account.id account_id,
+ account.uuid account_uuid,
+ account.account_name account_name,
+ account.type account_type,
+ domain.id domain_id,
+ domain.uuid domain_uuid,
+ domain.name domain_name,
+ domain.path domain_path,
+ projects.id project_id,
+ projects.uuid project_uuid,
+ projects.name project_name,
+ instance_group.id instance_group_id,
+ instance_group.uuid instance_group_uuid,
+ instance_group.name instance_group_name,
+ vm_instance.uuid uuid,
+ vm_instance.last_host_id last_host_id,
+ vm_instance.vm_type type,
+ vm_instance.vnc_password vnc_password,
+ vm_instance.limit_cpu_use limit_cpu_use,
+ vm_instance.created created,
+ vm_instance.state state,
+ vm_instance.removed removed,
+ vm_instance.ha_enabled ha_enabled,
+ vm_instance.hypervisor_type hypervisor_type,
+ vm_instance.instance_name instance_name,
+ vm_instance.guest_os_id guest_os_id,
+ guest_os.uuid guest_os_uuid,
+ vm_instance.pod_id pod_id,
+ host_pod_ref.uuid pod_uuid,
+ vm_instance.private_ip_address private_ip_address,
+ vm_instance.private_mac_address private_mac_address,
+ vm_instance.vm_type vm_type,
+ data_center.id data_center_id,
+ data_center.uuid data_center_uuid,
+ data_center.name data_center_name,
+ data_center.is_security_group_enabled security_group_enabled,
+ host.id host_id,
+ host.uuid host_uuid,
+ host.name host_name,
+ vm_template.id template_id,
+ vm_template.uuid template_uuid,
+ vm_template.name template_name,
+ vm_template.display_text template_display_text,
+ vm_template.enable_password password_enabled,
+ iso.id iso_id,
+ iso.uuid iso_uuid,
+ iso.name iso_name,
+ iso.display_text iso_display_text,
+ service_offering.id service_offering_id,
+ disk_offering.uuid service_offering_uuid,
+ service_offering.cpu cpu,
+ service_offering.speed speed,
+ service_offering.ram_size ram_size,
+ disk_offering.name service_offering_name,
+ storage_pool.id pool_id,
+ storage_pool.uuid pool_uuid,
+ storage_pool.pool_type pool_type,
+ volumes.id volume_id,
+ volumes.uuid volume_uuid,
+ volumes.device_id volume_device_id,
+ volumes.volume_type volume_type,
+ security_group.id security_group_id,
+ security_group.uuid security_group_uuid,
+ security_group.name security_group_name,
+ security_group.description security_group_description,
+ nics.id nic_id,
+ nics.uuid nic_uuid,
+ nics.network_id network_id,
+ nics.ip4_address ip_address,
+ nics.ip6_address ip6_address,
+ nics.ip6_gateway ip6_gateway,
+ nics.ip6_cidr ip6_cidr,
+ nics.default_nic is_default_nic,
+ nics.gateway gateway,
+ nics.netmask netmask,
+ nics.mac_address mac_address,
+ nics.broadcast_uri broadcast_uri,
+ nics.isolation_uri isolation_uri,
+ vpc.id vpc_id,
+ vpc.uuid vpc_uuid,
+ networks.uuid network_uuid,
+ networks.name network_name,
+ networks.traffic_type traffic_type,
+ networks.guest_type guest_type,
+ user_ip_address.id public_ip_id,
+ user_ip_address.uuid public_ip_uuid,
+ user_ip_address.public_ip_address public_ip_address,
+ ssh_keypairs.keypair_name keypair_name,
+ resource_tags.id tag_id,
+ resource_tags.uuid tag_uuid,
+ resource_tags.key tag_key,
+ resource_tags.value tag_value,
+ resource_tags.domain_id tag_domain_id,
+ resource_tags.account_id tag_account_id,
+ resource_tags.resource_id tag_resource_id,
+ resource_tags.resource_uuid tag_resource_uuid,
+ resource_tags.resource_type tag_resource_type,
+ resource_tags.customer tag_customer,
+ async_job.id job_id,
+ async_job.uuid job_uuid,
+ async_job.job_status job_status,
+ async_job.account_id job_account_id,
+ affinity_group.id affinity_group_id,
+ affinity_group.uuid affinity_group_uuid,
+ affinity_group.name affinity_group_name,
+ affinity_group.description affinity_group_description
+ from
+ `cloud`.`user_vm`
+ inner join
+ `cloud`.`vm_instance` ON vm_instance.id = user_vm.id
+ and vm_instance.removed is NULL
+ inner join
+ `cloud`.`account` ON vm_instance.account_id = account.id
+ inner join
+ `cloud`.`domain` ON vm_instance.domain_id = domain.id
+ left join
+ `cloud`.`guest_os` ON vm_instance.guest_os_id = guest_os.id
+ left join
+ `cloud`.`host_pod_ref` ON vm_instance.pod_id = host_pod_ref.id
+ left join
+ `cloud`.`projects` ON projects.project_account_id = account.id
+ left join
+ `cloud`.`instance_group_vm_map` ON vm_instance.id = instance_group_vm_map.instance_id
+ left join
+ `cloud`.`instance_group` ON instance_group_vm_map.group_id = instance_group.id
+ left join
+ `cloud`.`data_center` ON vm_instance.data_center_id = data_center.id
+ left join
+ `cloud`.`host` ON vm_instance.host_id = host.id
+ left join
+ `cloud`.`vm_template` ON vm_instance.vm_template_id = vm_template.id
+ left join
+ `cloud`.`vm_template` iso ON iso.id = user_vm.iso_id
+ left join
+ `cloud`.`service_offering` ON vm_instance.service_offering_id = service_offering.id
+ left join
+ `cloud`.`disk_offering` ON vm_instance.service_offering_id = disk_offering.id
+ left join
+ `cloud`.`volumes` ON vm_instance.id = volumes.instance_id
+ left join
+ `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id
+ left join
+ `cloud`.`security_group_vm_map` ON vm_instance.id = security_group_vm_map.instance_id
+ left join
+ `cloud`.`security_group` ON security_group_vm_map.security_group_id = security_group.id
+ left join
+ `cloud`.`nics` ON vm_instance.id = nics.instance_id
+ left join
+ `cloud`.`networks` ON nics.network_id = networks.id
+ left join
+ `cloud`.`vpc` ON networks.vpc_id = vpc.id
+ left join
+ `cloud`.`user_ip_address` ON user_ip_address.vm_id = vm_instance.id
+ left join
+ `cloud`.`user_vm_details` ON user_vm_details.vm_id = vm_instance.id
+ and user_vm_details.name = 'SSH.PublicKey'
+ left join
+ `cloud`.`ssh_keypairs` ON ssh_keypairs.public_key = user_vm_details.value
+ left join
+ `cloud`.`resource_tags` ON resource_tags.resource_id = vm_instance.id
+ and resource_tags.resource_type = 'UserVm'
+ left join
+ `cloud`.`async_job` ON async_job.instance_id = vm_instance.id
+ and async_job.instance_type = 'VirtualMachine'
+ and async_job.job_status = 0
+ left join
+ `cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id
+ left join
+ `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id;
+
+DROP VIEW IF EXISTS `cloud`.`affinity_group_view`;
+CREATE VIEW `cloud`.`affinity_group_view` AS
+ select
+ affinity_group.id id,
+ affinity_group.name name,
+ affinity_group.description description,
+ affinity_group.uuid uuid,
+ account.id account_id,
+ account.uuid account_uuid,
+ account.account_name account_name,
+ account.type account_type,
+ domain.id domain_id,
+ domain.uuid domain_uuid,
+ domain.name domain_name,
+ domain.path domain_path,
+ vm_instance.id vm_id,
+ vm_instance.uuid vm_uuid,
+ vm_instance.name vm_name,
+ vm_instance.state vm_state,
+ user_vm.display_name vm_display_name
+ from
+ `cloud`.`affinity_group`
+ inner join
+ `cloud`.`account` ON affinity_group.account_id = account.id
+ inner join
+ `cloud`.`domain` ON affinity_group.domain_id = domain.id
+ left join
+ `cloud`.`affinity_group_vm_map` ON affinity_group.id = affinity_group_vm_map.affinity_group_id
+ left join
+ `cloud`.`vm_instance` ON vm_instance.id = affinity_group_vm_map.instance_id
+ left join
+ `cloud`.`user_vm` ON user_vm.id = vm_instance.id;
+
++
+ ALTER TABLE `cloud`.`remote_access_vpn` ADD COLUMN `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id';
+ ALTER TABLE `cloud`.`remote_access_vpn` ADD COLUMN `uuid` varchar(40) UNIQUE;
+
+ -- START: support for LXC
+
+ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('LXC', 'default', 50, 1);
+ ALTER TABLE `cloud`.`physical_network_traffic_types` ADD COLUMN `lxc_network_label` varchar(255) DEFAULT 'cloudbr0' COMMENT 'The network name label of the physical device dedicated to this traffic on a LXC host';
+
+ UPDATE configuration SET value='KVM,XenServer,VMware,BareMetal,Ovm,LXC' WHERE name='hypervisor.list';
+
+ INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type)
+ VALUES (10, 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC');
+
+ -- END: support for LXC
++
+-- Re-enable foreign key checking, at the end of the upgrade path
- SET foreign_key_checks = 1;
++SET foreign_key_checks = 1;