You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2014/03/14 13:01:40 UTC

[1/3] git commit: updated refs/heads/master to 6a4927f

Repository: cloudstack
Updated Branches:
  refs/heads/master 794b38a78 -> 6a4927f66


Fixed all findbugs in hyperv plugin code


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

Branch: refs/heads/master
Commit: 6a4927f660f776bcbd12ae45f4e63ae2c2e96774
Parents: 4523f5d
Author: Rajesh Battala <ra...@citrix.com>
Authored: Wed Mar 12 11:32:44 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Fri Mar 14 17:36:43 2014 +0530

----------------------------------------------------------------------
 .../hyperv/src/com/cloud/ha/HypervInvestigator.java           | 4 ++--
 .../hypervisor/hyperv/discoverer/HypervServerDiscoverer.java  | 5 +++--
 .../hyperv/resource/HypervDirectConnectResource.java          | 7 ++++---
 3 files changed, 9 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6a4927f6/plugins/hypervisors/hyperv/src/com/cloud/ha/HypervInvestigator.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/ha/HypervInvestigator.java b/plugins/hypervisors/hyperv/src/com/cloud/ha/HypervInvestigator.java
index cebfb7a..01d75fa 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/ha/HypervInvestigator.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/ha/HypervInvestigator.java
@@ -45,9 +45,9 @@ public class HypervInvestigator extends AdapterBase implements Investigator {
     public Boolean isVmAlive(com.cloud.vm.VirtualMachine vm, Host host) {
         Status status = isAgentAlive(host);
         if (status == null) {
-            return null;
+            return false;
         }
-        return status == Status.Up ? true : null;
+        return status == Status.Up ? true : false;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6a4927f6/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
index c3d79c5..f4c15f6 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
@@ -19,6 +19,7 @@ package com.cloud.hypervisor.hyperv.discoverer;
 import java.net.InetAddress;
 import java.net.URI;
 import java.net.UnknownHostException;
+import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -254,7 +255,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
             // pool in the database
             // This GUID may change.
             if (cluster.getGuid() == null) {
-                cluster.setGuid(UUID.nameUUIDFromBytes(String.valueOf(clusterId).getBytes()).toString());
+                cluster.setGuid(UUID.nameUUIDFromBytes(String.valueOf(clusterId).getBytes(Charset.forName("UTF-8"))).toString());
                 _clusterDao.update(clusterId, cluster);
             }
 
@@ -318,7 +319,7 @@ public class HypervServerDiscoverer extends DiscovererBase implements Discoverer
      * @return GUID in form of a string.
      */
     public static String calcServerResourceGuid(final String uuidSeed) {
-        String guid = UUID.nameUUIDFromBytes(uuidSeed.getBytes()).toString();
+        String guid = UUID.nameUUIDFromBytes(uuidSeed.getBytes(Charset.forName("UTF-8"))).toString();
         return guid;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6a4927f6/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
index b1f5a67..13254a5 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
@@ -24,6 +24,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.channels.SocketChannel;
+import java.nio.charset.Charset;
 import java.rmi.RemoteException;
 import java.security.KeyManagementException;
 import java.security.KeyStoreException;
@@ -597,7 +598,7 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
     public ExecutionResult createFileInVR(String routerIp, String filePath, String fileName, String content) {
         File keyFile = getSystemVMKeyFile();
         try {
-            SshHelper.scpTo(routerIp, 3922, "root", keyFile, null, filePath, content.getBytes(), fileName, null);
+            SshHelper.scpTo(routerIp, 3922, "root", keyFile, null, filePath, content.getBytes(Charset.forName("UTF-8")), fileName, null);
         } catch (Exception e) {
             s_logger.warn("Fail to create file " + filePath + fileName + " in VR " + routerIp, e);
             return new ExecutionResult(false, e.getMessage());
@@ -1262,7 +1263,7 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
         }
 
         try {
-            SshHelper.scpTo(controlIp, DEFAULT_DOMR_SSHPORT, "root", keyFile, null, "/tmp/", tmpCfgFileContents.toString().getBytes(), routerIp.replace('.', '_') +
+            SshHelper.scpTo(controlIp, DEFAULT_DOMR_SSHPORT, "root", keyFile, null, "/tmp/", tmpCfgFileContents.toString().getBytes(Charset.forName("UTF-8")), routerIp.replace('.', '_') +
                 ".cfg", null);
 
             try {
@@ -1459,7 +1460,7 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
         String json = new Gson().toJson(data);
         s_logger.debug("VM data JSON IS:" + json);
 
-        json = Base64.encodeBase64String(json.getBytes());
+        json = Base64.encodeBase64String(json.getBytes(Charset.forName("UTF-8")));
 
         String args = "-d " + json;
 


[3/3] git commit: updated refs/heads/master to 6a4927f

Posted by ra...@apache.org.
CLOUDSTACK-6106 supporting VPC VR on Hyper-V


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

Branch: refs/heads/master
Commit: 1b4325d2c88d49b394256f2130c509eebfe9bf36
Parents: 794b38a
Author: Rajesh Battala <ra...@citrix.com>
Authored: Wed Mar 12 07:26:08 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Fri Mar 14 17:36:43 2014 +0530

----------------------------------------------------------------------
 .../agent/api/ModifyVmNicConfigCommand.java     |   7 +
 .../hypervisor/hyperv/guru/HypervGuru.java      |  45 ++++--
 .../resource/HypervDirectConnectResource.java   | 138 ++++++++++++++++---
 .../com/cloud/network/vpc/VpcManagerImpl.java   |   1 +
 4 files changed, 158 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b4325d2/core/src/com/cloud/agent/api/ModifyVmNicConfigCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/ModifyVmNicConfigCommand.java b/core/src/com/cloud/agent/api/ModifyVmNicConfigCommand.java
index 0230bec..5f4f0e1 100644
--- a/core/src/com/cloud/agent/api/ModifyVmNicConfigCommand.java
+++ b/core/src/com/cloud/agent/api/ModifyVmNicConfigCommand.java
@@ -21,6 +21,7 @@ public class ModifyVmNicConfigCommand extends Command {
     String vmName;
     int vlan;
     String macAddress;
+    int index;
     protected ModifyVmNicConfigCommand() {
     }
 
@@ -30,6 +31,12 @@ public class ModifyVmNicConfigCommand extends Command {
         this.macAddress = macAddress;
     }
 
+    public ModifyVmNicConfigCommand(String vmName, int vlan, int position) {
+        this.vmName = vmName;
+        this.vlan = vlan;
+        this.index = position;
+    }
+
     public String getVmName() {
         return vmName;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b4325d2/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/guru/HypervGuru.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
index bf0795d..4e8d3d5 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/guru/HypervGuru.java
@@ -34,6 +34,7 @@ import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.hypervisor.hyperv.manager.HypervManager;
 import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
@@ -74,16 +75,20 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
         if(vm.getVirtualMachine().getType() ==  VirtualMachine.Type.DomainRouter) {
 
             NicProfile publicNicProfile = null;
+            NicProfile controlNicProfile = null;
+            NicProfile profile = null;
             for(NicProfile nicProfile : nicProfiles) {
                 if(nicProfile.getTrafficType() == TrafficType.Public) {
                     publicNicProfile = nicProfile;
                     break;
                 }
+                else if (nicProfile.getTrafficType() == TrafficType.Control) {
+                    controlNicProfile = nicProfile;
+                }
             }
 
-            if(publicNicProfile != null) {
+            if(publicNicProfile != null || controlNicProfile != null) {
                 NicTO[] nics = to.getNics();
-
                 // reserve extra NICs
                 NicTO[] expandedNics = new NicTO[MaxNicSupported];
                 int i = 0;
@@ -95,18 +100,27 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
                 }
                 deviceId++;
 
-                long networkId = publicNicProfile.getNetworkId();
+                long networkId = 0;
+                if(publicNicProfile != null ) {
+                    networkId= publicNicProfile.getNetworkId();
+                    profile = publicNicProfile;
+                }
+                else {
+                    networkId =  controlNicProfile.getNetworkId();
+                    profile = controlNicProfile;
+                }
+
                 NetworkVO network = _networkDao.findById(networkId);
                 // for Hyperv Hot Nic plug is not supported and it will support upto 8 nics.
                 // creating the VR with extra nics (actual nics(3) + extra nics) will be 8
                 for(; i < MaxNicSupported; i++) {
                     NicTO nicTo = new NicTO();
                     nicTo.setDeviceId(deviceId++);
-                    nicTo.setBroadcastType(publicNicProfile.getBroadcastType());
-                    nicTo.setType(publicNicProfile.getTrafficType());
+                    nicTo.setBroadcastType(BroadcastDomainType.Vlan);
+                    nicTo.setType(TrafficType.Public);
                     nicTo.setIp("0.0.0.0");
                     nicTo.setNetmask("255.255.255.255");
-                    nicTo.setName(publicNicProfile.getName());
+                    nicTo.setName(profile.getName());
 
                     try {
                         String mac = _networkMgr.getNextAvailableMacAddressInNetwork(networkId);
@@ -114,16 +128,16 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
                     } catch (InsufficientAddressCapacityException e) {
                         throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId);
                     }
-                    nicTo.setDns1(publicNicProfile.getDns1());
-                    nicTo.setDns2(publicNicProfile.getDns2());
-                    if (publicNicProfile.getGateway() != null) {
+                    nicTo.setDns1(profile.getDns1());
+                    nicTo.setDns2(profile.getDns2());
+                    if (publicNicProfile != null && publicNicProfile.getGateway() != null) {
                         nicTo.setGateway(publicNicProfile.getGateway());
                     } else {
                         nicTo.setGateway(network.getGateway());
                     }
                     nicTo.setDefaultNic(false);
-                    nicTo.setBroadcastUri(publicNicProfile.getBroadCastUri());
-                    nicTo.setIsolationuri(publicNicProfile.getIsolationUri());
+                    nicTo.setBroadcastUri(profile.getBroadCastUri());
+                    nicTo.setIsolationuri(profile.getIsolationUri());
 
                     Integer networkRate = _networkMgr.getNetworkRate(network.getId(), null);
                     nicTo.setNetworkRateMbps(networkRate);
@@ -137,9 +151,12 @@ public class HypervGuru extends HypervisorGuruBase implements HypervisorGuru {
             for(NicTO nicTo : sortNicsByDeviceId(to.getNics())) {
                 sbMacSequence.append(nicTo.getMac()).append("|");
             }
-            sbMacSequence.deleteCharAt(sbMacSequence.length() - 1);
-            String bootArgs = to.getBootArgs();
-            to.setBootArgs(bootArgs + " nic_macs=" + sbMacSequence.toString());
+
+            if (!sbMacSequence.toString().isEmpty()) {
+                sbMacSequence.deleteCharAt(sbMacSequence.length() - 1);
+                String bootArgs = to.getBootArgs();
+                to.setBootArgs(bootArgs + " nic_macs=" + sbMacSequence.toString());
+            }
 
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b4325d2/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
index a3ffa75..b1f5a67 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
@@ -83,10 +83,14 @@ import com.cloud.agent.api.NetworkUsageCommand;
 import com.cloud.agent.api.PingCommand;
 import com.cloud.agent.api.PingRoutingCommand;
 import com.cloud.agent.api.PingTestCommand;
+import com.cloud.agent.api.PlugNicAnswer;
+import com.cloud.agent.api.PlugNicCommand;
 import com.cloud.agent.api.SetupGuestNetworkCommand;
 import com.cloud.agent.api.StartCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
+import com.cloud.agent.api.UnPlugNicAnswer;
+import com.cloud.agent.api.UnPlugNicCommand;
 import com.cloud.agent.api.StartupRoutingCommand.VmState;
 import com.cloud.agent.api.StartupStorageCommand;
 import com.cloud.agent.api.UnsupportedAnswer;
@@ -172,7 +176,7 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
     protected final int _retry = 24;
     protected final int _sleep = 10000;
     protected static final int DEFAULT_DOMR_SSHPORT = 3922;
-
+    private final int maxid = 4094;
     private String _clusterGuid;
 
     // Used by initialize to assert object configured before
@@ -477,7 +481,12 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
             answer = execute((SetStaticRouteCommand) cmd);
         } else if (clazz == SetMonitorServiceCommand.class) {
             answer = execute((SetMonitorServiceCommand) cmd);
-        } else {
+        } else if (clazz == PlugNicCommand.class) {
+            answer = execute((PlugNicCommand)cmd);
+        } else if (clazz == UnPlugNicCommand.class) {
+            answer = execute((UnPlugNicCommand)cmd);
+        }
+        else {
             if (clazz == StartCommand.class) {
                 VirtualMachineTO vmSpec = ((StartCommand)cmd).getVirtualMachine();
                 if (vmSpec.getType() != VirtualMachine.Type.User) {
@@ -509,6 +518,59 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
         return answer;
     }
 
+
+    private PlugNicAnswer execute(PlugNicCommand cmd) {
+        if (s_logger.isInfoEnabled()) {
+            s_logger.info("Executing resource PlugNicCommand " + s_gson.toJson(cmd));
+        }
+
+        try {
+
+            String vmName = cmd.getVmName();
+            NicTO nic = cmd.getNic();
+            URI broadcastUri = nic.getBroadcastUri();
+            if (BroadcastDomainType.getSchemeValue(broadcastUri) != BroadcastDomainType.Vlan) {
+                throw new InternalErrorException("Unable to assign a public IP to a VIF on network " + nic.getBroadcastUri());
+            }
+            int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+            int publicNicInfo = -1;
+            publicNicInfo = getVmNics(vmName, maxid);
+            if (publicNicInfo > 0) {
+                modifyNicVlan(vmName, vlanId, publicNicInfo);
+            }
+            return new PlugNicAnswer(cmd, true, "success");
+        } catch (Exception e) {
+            s_logger.error("Unexpected exception: ", e);
+            return new PlugNicAnswer(cmd, false, "Unable to execute PlugNicCommand due to " + e.toString());
+        }
+    }
+
+
+    private UnPlugNicAnswer execute(UnPlugNicCommand cmd) {
+        if (s_logger.isInfoEnabled()) {
+            s_logger.info("Executing resource UnPlugNicCommand " + s_gson.toJson(cmd));
+        }
+
+        try {
+            String vmName = cmd.getVmName();
+            NicTO nic = cmd.getNic();
+            URI broadcastUri = nic.getBroadcastUri();
+            if (BroadcastDomainType.getSchemeValue(broadcastUri) != BroadcastDomainType.Vlan) {
+                throw new InternalErrorException("Unable to unassign a public IP to a VIF on network " + nic.getBroadcastUri());
+            }
+            int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+            int publicNicInfo = -1;
+            publicNicInfo = getVmNics(vmName, vlanId);
+            if (publicNicInfo > 0) {
+                modifyNicVlan(vmName, maxid, publicNicInfo);
+            }
+            return new UnPlugNicAnswer(cmd, true, "success");
+        } catch (Exception e) {
+            s_logger.error("Unexpected exception: ", e);
+            return new UnPlugNicAnswer(cmd, false, "Unable to execute unPlugNicCommand due to " + e.toString());
+        }
+    }
+
     @Override
     public ExecutionResult executeInVR(String routerIP, String script, String args) {
         Pair<Boolean, String> result;
@@ -621,14 +683,18 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
 
     protected ExecutionResult prepareNetworkElementCommand(SetupGuestNetworkCommand cmd) {
         NicTO nic = cmd.getNic();
-        String routerIp = getRouterSshControlIp(cmd);
         String domrName =
                 cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
 
         try {
-            int ethDeviceNum = findRouterEthDeviceIndex(domrName, routerIp,
-                    nic.getMac());
-            nic.setDeviceId(ethDeviceNum);
+            URI broadcastUri = nic.getBroadcastUri();
+            int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+            int ethDeviceNum = getVmNics(domrName, vlanId);
+            if (ethDeviceNum > 0) {
+                nic.setDeviceId(ethDeviceNum);
+            } else {
+                return new ExecutionResult(false, "Prepare SetupGuestNetwork failed due to unable to find the nic");
+            }
         } catch (Exception e) {
             String msg = "Prepare SetupGuestNetwork failed due to " + e.toString();
             s_logger.warn(msg, e);
@@ -640,23 +706,27 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
 
     private ExecutionResult prepareNetworkElementCommand(IpAssocVpcCommand cmd) {
         String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
-        String routerIp = getRouterSshControlIp(cmd);
 
         try {
             IpAddressTO[] ips = cmd.getIpAddresses();
             for (IpAddressTO ip : ips) {
-
-                int ethDeviceNum = findRouterEthDeviceIndex(routerName, routerIp, ip.getVifMacAddress());
-                if (ethDeviceNum < 0) {
+                URI broadcastUri = BroadcastDomainType.fromString(ip.getBroadcastUri());
+                if (BroadcastDomainType.getSchemeValue(broadcastUri) != BroadcastDomainType.Vlan) {
+                    throw new InternalErrorException("Invalid Broadcast URI " + ip.getBroadcastUri());
+                }
+                int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+                int publicNicInfo = -1;
+                publicNicInfo = getVmNics(routerName, vlanId);
+                if (publicNicInfo < 0) {
                     if (ip.isAdd()) {
                         throw new InternalErrorException("Failed to find DomR VIF to associate/disassociate IP with.");
-                    } else {
+                        } else {
                         s_logger.debug("VIF to deassociate IP with does not exist, return success");
                         continue;
                     }
                 }
 
-                ip.setNicDevId(ethDeviceNum);
+                ip.setNicDevId(publicNicInfo);
             }
         } catch (Exception e) {
             s_logger.error("Prepare Ip Assoc failure on applying one ip due to exception:  ", e);
@@ -668,12 +738,17 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
 
     protected ExecutionResult prepareNetworkElementCommand(SetSourceNatCommand cmd) {
         String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
-        String routerIp = getRouterSshControlIp(cmd);
         IpAddressTO pubIp = cmd.getIpAddress();
 
         try {
-            int ethDeviceNum = findRouterEthDeviceIndex(routerName, routerIp, pubIp.getVifMacAddress());
-            pubIp.setNicDevId(ethDeviceNum);
+            String broadcastUri = pubIp.getBroadcastUri();
+            int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+            int ethDeviceNum = getVmNics(routerName, vlanId);
+            if (ethDeviceNum > 0) {
+                pubIp.setNicDevId(ethDeviceNum);
+            } else {
+                return new ExecutionResult(false, "Prepare Ip SNAT failed due to unable to find the nic");
+            }
         } catch (Exception e) {
             String msg = "Prepare Ip SNAT failure due to " + e.toString();
             s_logger.error(msg, e);
@@ -686,12 +761,16 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
         NicTO nic = cmd.getNic();
         String routerName =
                 cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME);
-        String routerIp = getRouterSshControlIp(cmd);
 
         try {
-            int ethDeviceNum = findRouterEthDeviceIndex(routerName, routerIp,
-                    nic.getMac());
-            nic.setDeviceId(ethDeviceNum);
+            URI broadcastUri = nic.getBroadcastUri();
+            int vlanId = Integer.parseInt(BroadcastDomainType.getValue(broadcastUri));
+            int ethDeviceNum = getVmNics(routerName, vlanId);
+            if (ethDeviceNum > 0) {
+                nic.setDeviceId(ethDeviceNum);
+            } else {
+                return new ExecutionResult(false, "Prepare SetNetworkACL failed due to unable to find the nic");
+            }
         } catch (Exception e) {
             String msg = "Prepare SetNetworkACL failed due to " + e.toString();
             s_logger.error(msg, e);
@@ -1730,6 +1809,27 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
         }
     }
 
+    protected void modifyNicVlan(String vmName, int vlanId, int pos) {
+        ModifyVmNicConfigCommand modifynic = new ModifyVmNicConfigCommand(vmName, vlanId, pos);
+        URI agentUri = null;
+        try {
+            String cmdName = ModifyVmNicConfigCommand.class.getName();
+            agentUri =
+                    new URI("https", null, _agentIp, _port,
+                            "/api/HypervResource/" + cmdName, null, null);
+        } catch (URISyntaxException e) {
+            String errMsg = "Could not generate URI for Hyper-V agent";
+            s_logger.error(errMsg, e);
+        }
+        String ansStr = postHttpRequest(s_gson.toJson(modifynic), agentUri);
+        Answer[] result = s_gson.fromJson(ansStr, Answer[].class);
+        s_logger.debug("executeRequest received response "
+                + s_gson.toJson(result));
+        if (result.length > 0) {
+            ModifyVmNicConfigAnswer ans = ((ModifyVmNicConfigAnswer)result[0]);
+        }
+    }
+
     protected void assignPublicIpAddress(final String vmName, final String privateIpAddress, final String publicIpAddress, final boolean add, final boolean firstIP,
             final boolean sourceNat, final String broadcastId, final String vlanGateway, final String vlanNetmask, final String vifMacAddress) throws Exception {
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b4325d2/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index c5a048c..2e63639 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -2289,6 +2289,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         hTypes.add(HypervisorType.KVM);
         hTypes.add(HypervisorType.Simulator);
         hTypes.add(HypervisorType.LXC);
+        hTypes.add(HypervisorType.Hyperv);
         return hTypes;
     }
 


[2/3] git commit: updated refs/heads/master to 6a4927f

Posted by ra...@apache.org.
CLOUDSTACK-6106 Agent side changes for VPC on Hyper-V


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

Branch: refs/heads/master
Commit: 4523f5d8de64761a507b5a8f1f9b4d451a8be17a
Parents: 1b4325d
Author: Rajesh Battala <ra...@citrix.com>
Authored: Wed Mar 12 07:45:50 2014 +0530
Committer: Rajesh Battala <ra...@citrix.com>
Committed: Fri Mar 14 17:36:43 2014 +0530

----------------------------------------------------------------------
 .../HypervResource/HypervResourceController.cs  | 14 ++++++++---
 .../HypervResource/IWmiCallsV2.cs               |  1 +
 .../ServerResource/HypervResource/WmiCallsV2.cs | 26 +++++++++++++++++++-
 3 files changed, 37 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4523f5d8/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
index 2d44753..40609e4 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs
@@ -992,6 +992,7 @@ namespace HypervResource
             using (log4net.NDC.Push(Guid.NewGuid().ToString()))
             {
                 logger.Info(CloudStackTypes.PlugNicCommand + cmd.ToString());
+
                 object ansContent = new
                 {
                     result = true,
@@ -1299,9 +1300,16 @@ namespace HypervResource
                 String vmName = cmd.vmName;
                 uint vlan = (uint)cmd.vlan;
                 string macAddress = cmd.macAddress;
-                wmiCallsV2.ModifyVmVLan(vmName, vlan, macAddress);
-
-                result = true;
+                uint pos = cmd.index;
+                if (macAddress != null)
+                {
+                    wmiCallsV2.ModifyVmVLan(vmName, vlan, macAddress);
+                }
+                else if (pos > 1)
+                {
+                    wmiCallsV2.ModifyVmVLan(vmName, vlan, pos);
+                }
+                    result = true;
 
                 object ansContent = new
                 {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4523f5d8/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
index 6018896..8c682ad 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/IWmiCallsV2.cs
@@ -70,5 +70,6 @@ namespace HypervResource
         void SetState(ComputerSystem vm, ushort requiredState);
         Dictionary<String, VmState> GetVmSync(String privateIpAddress);
         void ModifyVmVLan(string vmName, uint vlanid, string mac);
+        void ModifyVmVLan(string vmName, uint vlanid, uint pos);
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4523f5d8/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
index 73156c5..d5cf7c9 100644
--- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
+++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/WmiCallsV2.cs
@@ -229,6 +229,7 @@ namespace HypervResource
             string errMsg = vmName;
             var diskDrives = vmInfo.disks;
             var bootArgs = vmInfo.bootArgs;
+            string defaultvlan = "4094"; 
 
             // assert
             errMsg = vmName + ": missing disk information, array empty or missing, agent expects *at least* one disk for a VM";
@@ -391,6 +392,8 @@ namespace HypervResource
                     string vlan = null;
                     string isolationUri = nic.isolationUri;
                     string broadcastUri = nic.broadcastUri;
+                    string nicIp = nic.ip;
+                    string nicNetmask = nic.netmask;
                     if ( (broadcastUri != null ) || (isolationUri != null && isolationUri.StartsWith("vlan://")))
                     {
                         if (broadcastUri != null && broadcastUri.StartsWith("storage"))
@@ -415,6 +418,10 @@ namespace HypervResource
                             throw ex;
                         }
                     }
+                    if(nicIp.Equals("0.0.0.0") && nicNetmask.Equals("255.255.255.255") ) {
+                        // this is the extra nic added to VR.
+                        vlan = defaultvlan;
+                    }
 
                     if (nicCount == 2)
                     {
@@ -913,7 +920,6 @@ namespace HypervResource
             ResourceAllocationSettingData defaultDiskDriveSettings = defaultDiskDriveSettingsObjs.OfType<ResourceAllocationSettingData>().First();
             return new ResourceAllocationSettingData((ManagementBaseObject)defaultDiskDriveSettings.LateBoundObject.Clone());
         }
-
 
         // Modify the systemvm nic's VLAN id
         public void ModifyVmVLan(string vmName, uint vlanid, String mac)
@@ -945,6 +951,24 @@ namespace HypervResource
                 vlanSettings.LateBoundObject.GetText(TextFormat.CimDtd20)});
         }
 
+        // Modify the systemvm nic's VLAN id
+        public void ModifyVmVLan(string vmName, uint vlanid, uint pos)
+        {
+            ComputerSystem vm = GetComputerSystem(vmName);
+            SyntheticEthernetPortSettingData[] nicSettingsViaVm = GetEthernetPortSettings(vm);
+            // Obtain controller for Hyper-V virtualisation subsystem
+            VirtualSystemManagementService vmMgmtSvc = GetVirtualisationSystemManagementService();
+
+            EthernetPortAllocationSettingData[] ethernetConnections = GetEthernetConnections(vm);
+            EthernetSwitchPortVlanSettingData vlanSettings = GetVlanSettings(ethernetConnections[pos]);
+
+            //Assign configuration to new NIC
+            vlanSettings.LateBoundObject["AccessVlanId"] = vlanid;
+            vlanSettings.LateBoundObject["OperationMode"] = 1;
+            ModifyFeatureVmResources(vmMgmtSvc, vm, new String[] {
+                vlanSettings.LateBoundObject.GetText(TextFormat.CimDtd20)});
+        }
+
         public void AttachIso(string displayName, string iso)
         {
             logger.DebugFormat("Got request to attach iso {0} to vm {1}", iso, displayName);