|
17 | 17 | package com.cloud.deploy; |
18 | 18 |
|
19 | 19 | import java.util.ArrayList; |
20 | | -import java.util.Arrays; |
| 20 | +import java.util.Arrays; |
21 | 21 | import java.util.Comparator; |
22 | 22 | import java.util.HashMap; |
23 | | -import java.util.HashSet; |
| 23 | +import java.util.HashSet; |
24 | 24 | import java.util.List; |
25 | 25 | import java.util.Map; |
26 | | -import java.util.Set; |
| 26 | +import java.util.Set; |
27 | 27 | import java.util.Timer; |
28 | 28 | import java.util.TreeSet; |
29 | 29 |
|
|
33 | 33 |
|
34 | 34 | import org.apache.cloudstack.affinity.AffinityGroupProcessor; |
35 | 35 | import org.apache.cloudstack.affinity.AffinityGroupService; |
36 | | -import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; |
| 36 | +import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; |
37 | 37 | import org.apache.cloudstack.affinity.AffinityGroupVO; |
38 | 38 | import org.apache.cloudstack.affinity.dao.AffinityGroupDao; |
39 | 39 | import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; |
|
49 | 49 | import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; |
50 | 50 | import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; |
51 | 51 | import org.apache.cloudstack.utils.identity.ManagementServerNode; |
52 | | -import org.apache.log4j.Logger; |
53 | | - |
54 | | -import com.cloud.agent.AgentManager; |
55 | | -import com.cloud.agent.Listener; |
56 | | -import com.cloud.agent.api.AgentControlAnswer; |
57 | | -import com.cloud.agent.api.AgentControlCommand; |
58 | | -import com.cloud.agent.api.Answer; |
59 | | -import com.cloud.agent.api.Command; |
60 | | -import com.cloud.agent.api.StartupCommand; |
61 | | -import com.cloud.agent.api.StartupRoutingCommand; |
62 | | -import com.cloud.agent.manager.allocator.HostAllocator; |
| 52 | +import org.apache.log4j.Logger; |
| 53 | + |
| 54 | +import com.cloud.agent.AgentManager; |
| 55 | +import com.cloud.agent.Listener; |
| 56 | +import com.cloud.agent.api.AgentControlAnswer; |
| 57 | +import com.cloud.agent.api.AgentControlCommand; |
| 58 | +import com.cloud.agent.api.Answer; |
| 59 | +import com.cloud.agent.api.Command; |
| 60 | +import com.cloud.agent.api.StartupCommand; |
| 61 | +import com.cloud.agent.api.StartupRoutingCommand; |
| 62 | +import com.cloud.agent.manager.allocator.HostAllocator; |
63 | 63 | import com.cloud.capacity.CapacityManager; |
64 | 64 | import com.cloud.capacity.dao.CapacityDao; |
65 | 65 | import com.cloud.configuration.Config; |
|
68 | 68 | import com.cloud.dc.ClusterVO; |
69 | 69 | import com.cloud.dc.DataCenter; |
70 | 70 | import com.cloud.dc.DataCenterVO; |
71 | | -import com.cloud.dc.DedicatedResourceVO; |
| 71 | +import com.cloud.dc.DedicatedResourceVO; |
72 | 72 | import com.cloud.dc.Pod; |
73 | 73 | import com.cloud.dc.dao.ClusterDao; |
74 | 74 | import com.cloud.dc.dao.DataCenterDao; |
75 | | -import com.cloud.dc.dao.DedicatedResourceDao; |
| 75 | +import com.cloud.dc.dao.DedicatedResourceDao; |
76 | 76 | import com.cloud.dc.dao.HostPodDao; |
77 | 77 | import com.cloud.deploy.DeploymentPlanner.ExcludeList; |
78 | 78 | import com.cloud.deploy.DeploymentPlanner.PlannerResourceUsage; |
79 | 79 | import com.cloud.deploy.dao.PlannerHostReservationDao; |
80 | 80 | import com.cloud.exception.AffinityConflictException; |
81 | 81 | import com.cloud.exception.ConnectionException; |
82 | 82 | import com.cloud.exception.InsufficientServerCapacityException; |
83 | | -import com.cloud.gpu.GPU; |
| 83 | +import com.cloud.gpu.GPU; |
84 | 84 | import com.cloud.host.Host; |
85 | 85 | import com.cloud.host.HostVO; |
86 | 86 | import com.cloud.host.Status; |
|
89 | 89 | import com.cloud.offering.ServiceOffering; |
90 | 90 | import com.cloud.org.Cluster; |
91 | 91 | import com.cloud.org.Grouping; |
92 | | -import com.cloud.resource.ResourceManager; |
| 92 | +import com.cloud.resource.ResourceManager; |
93 | 93 | import com.cloud.resource.ResourceState; |
94 | | -import com.cloud.service.ServiceOfferingDetailsVO; |
95 | | -import com.cloud.service.dao.ServiceOfferingDetailsDao; |
| 94 | +import com.cloud.service.ServiceOfferingDetailsVO; |
| 95 | +import com.cloud.service.dao.ServiceOfferingDetailsDao; |
96 | 96 | import com.cloud.storage.DiskOfferingVO; |
97 | 97 | import com.cloud.storage.ScopeType; |
98 | | -import com.cloud.storage.Storage; |
| 98 | +import com.cloud.storage.Storage; |
99 | 99 | import com.cloud.storage.StorageManager; |
100 | 100 | import com.cloud.storage.StoragePool; |
101 | 101 | import com.cloud.storage.StoragePoolHostVO; |
|
117 | 117 | import com.cloud.utils.db.Transaction; |
118 | 118 | import com.cloud.utils.db.TransactionCallback; |
119 | 119 | import com.cloud.utils.db.TransactionStatus; |
120 | | -import com.cloud.utils.exception.CloudRuntimeException; |
| 120 | +import com.cloud.utils.exception.CloudRuntimeException; |
121 | 121 | import com.cloud.utils.fsm.StateListener; |
122 | 122 | import com.cloud.vm.DiskProfile; |
123 | 123 | import com.cloud.vm.ReservationContext; |
124 | 124 | import com.cloud.vm.VMInstanceVO; |
125 | 125 | import com.cloud.vm.VirtualMachine; |
126 | 126 | import com.cloud.vm.VirtualMachine.Event; |
127 | 127 | import com.cloud.vm.VirtualMachine.State; |
128 | | -import com.cloud.vm.VirtualMachineProfile; |
| 128 | +import com.cloud.vm.VirtualMachineProfile; |
129 | 129 | import com.cloud.vm.dao.UserVmDao; |
130 | 130 | import com.cloud.vm.dao.VMInstanceDao; |
131 | 131 |
|
@@ -1161,6 +1161,11 @@ protected Pair<Map<Volume, List<StoragePool>>, List<Volume>> findSuitablePoolsFo |
1161 | 1161 | throw new CloudRuntimeException("Unable to create deployment, no usable volumes found for the VM"); |
1162 | 1162 | } |
1163 | 1163 |
|
| 1164 | + // don't allow to start vm that doesn't have a root volume |
| 1165 | + if (_volsDao.findByInstanceAndType(vmProfile.getId(), Volume.Type.ROOT).isEmpty()) { |
| 1166 | + throw new CloudRuntimeException("Unable to prepare volumes for vm as ROOT volume is missing"); |
| 1167 | + } |
| 1168 | + |
1164 | 1169 | // for each volume find list of suitable storage pools by calling the |
1165 | 1170 | // allocators |
1166 | 1171 | Set<Long> originalAvoidPoolSet = avoid.getPoolsToAvoid(); |
|
0 commit comments