Repository: cloudstack
Updated Branches:
  refs/heads/master ea740aa0e -> 47d6a64b3


CLOUDSTACK-7182: NPE while trying to deploy VMs in parallel in isolated network
The following changes are made:
- Check to see if network is implemented changed from 'state == 
Implementing||Implemented' to 'state == Implemented'.
The earlier check was a hack to prevent the issue described below.
- At the time of implementing network (using implementNetwork() method), if the 
VR needs to be deployed then
it follows the same path of regular VM deployment. This leads to a nested call 
to implementNetwork() while
preparing VR nics. This flow creates issues in dealing with network state 
transitions. The original call
puts network in "Implementing" state and then the nested call again tries to 
put it into same state resulting
in issues. In order to avoid it, implementNetwork() call for VR is replaced 
with below code.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/47d6a64b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/47d6a64b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/47d6a64b

Branch: refs/heads/master
Commit: 47d6a64b319ab064c4b855346f2bfdb250fb9ad8
Parents: ea740aa
Author: Koushik Das <[email protected]>
Authored: Fri Jul 25 15:17:35 2014 +0530
Committer: Koushik Das <[email protected]>
Committed: Fri Jul 25 15:17:35 2014 +0530

----------------------------------------------------------------------
 .../engine/orchestration/NetworkOrchestrator.java   | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/47d6a64b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --git 
a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
 
b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 025514b..265515c 100755
--- 
a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ 
b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -925,7 +925,7 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
 
     boolean isNetworkImplemented(NetworkVO network) {
         Network.State state = network.getState();
-        if (state == Network.State.Implemented || state == 
Network.State.Implementing) {
+        if (state == Network.State.Implemented) {
             return true;
         } else if (state == Network.State.Setup) {
             DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
@@ -1277,7 +1277,19 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
         });
 
         for (NicVO nic : nics) {
-            Pair<NetworkGuru, NetworkVO> implemented = 
implementNetwork(nic.getNetworkId(), dest, context);
+            Pair<NetworkGuru, NetworkVO> implemented = null;
+            if (vmProfile.getVirtualMachine().getType() != Type.DomainRouter) {
+                implemented = implementNetwork(nic.getNetworkId(), dest, 
context);
+            } else {
+                // At the time of implementing network (using 
implementNetwork() method), if the VR needs to be deployed then
+                // it follows the same path of regular VM deployment. This 
leads to a nested call to implementNetwork() while
+                // preparing VR nics. This flow creates issues in dealing with 
network state transitions. The original call
+                // puts network in "Implementing" state and then the nested 
call again tries to put it into same state resulting
+                // in issues. In order to avoid it, implementNetwork() call 
for VR is replaced with below code.
+                NetworkVO network = _networksDao.findById(nic.getNetworkId());
+                NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, 
network.getGuruName());
+                implemented = new Pair<NetworkGuru, NetworkVO>(guru, network);
+            }
             if (implemented == null || implemented.first() == null) {
                 s_logger.warn("Failed to implement network id=" + 
nic.getNetworkId() + " as a part of preparing nic id=" + nic.getId());
                 throw new CloudRuntimeException("Failed to implement network 
id=" + nic.getNetworkId() + " as a part preparing nic id=" + nic.getId());

Reply via email to