Updated Branches:
  refs/heads/master a4ed061db -> cc2a3c549

CLOUDSTACK-651: Removed 7 nics limitation for VR on XenServer
# of nics can be configured using global param xen.nics.max. Param defaults to 7
Added new param to upgrade schema.


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

Branch: refs/heads/master
Commit: cc2a3c5498f18cc99ac2dc23554d440138aabb7a
Parents: a4ed061
Author: Kishan Kavala <[email protected]>
Authored: Mon Feb 18 20:29:19 2013 +0530
Committer: Kishan Kavala <[email protected]>
Committed: Mon Feb 18 20:30:03 2013 +0530

----------------------------------------------------------------------
 .../xen/discoverer/XcpServerDiscoverer.java        |    1 +
 .../xen/resource/CitrixResourceBase.java           |   45 ++++++---------
 server/src/com/cloud/configuration/Config.java     |    4 +-
 server/src/com/cloud/resource/DiscovererBase.java  |    1 +
 setup/db/db/schema-410to420.sql                    |    1 +
 5 files changed, 23 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cc2a3c54/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index 65a97a8..a054063 100755
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -315,6 +315,7 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
                 params.put("wait", Integer.toString(_wait));
                 details.put("wait", Integer.toString(_wait));
                 params.put("migratewait", 
_configDao.getValue(Config.MigrateWait.toString()));
+                params.put(Config.XenMaxNics.toString().toLowerCase(), 
_configDao.getValue(Config.XenMaxNics.toString()));
                 params.put(Config.InstanceName.toString().toLowerCase(), 
_instance);
                 details.put(Config.InstanceName.toString().toLowerCase(), 
_instance);
                 try {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cc2a3c54/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 22f4ba9..e2e2d66 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -331,6 +331,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
     protected boolean _isOvs = false;
     protected List<VIF> _tmpDom0Vif = new ArrayList<VIF>();
     protected XenServerStorageResource storageResource;
+    protected int _maxNics = 7;
 
     public enum SRType {
         NFS, LVM, ISCSI, ISO, LVMOISCSI, LVMOHBA, EXT, FILE;
@@ -3842,22 +3843,6 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         throw new CloudRuntimeException("Could not find an available slot in 
VM with name to attach a new disk.");
     }
 
-
-    protected String getUnusedVIFNum(Connection conn, VM vm) {
-        String vmName = "";
-        try {
-            vmName = vm.getNameLabel(conn);
-            Set<String> allowedVIFDevices = vm.getAllowedVIFDevices(conn);
-            if (allowedVIFDevices.size() > 0) {
-                return allowedVIFDevices.iterator().next();
-            }
-        } catch (Exception e) {
-            String msg = "getUnusedVIFNum failed due to " + e.toString();
-            s_logger.warn(msg, e);
-        }
-        throw new CloudRuntimeException("Could not find available VIF slot in 
VM with name: " + vmName + " to plug a VIF");
-    }
-
     protected String callHostPlugin(Connection conn, String plugin, String 
cmd, String... params) {
         Map<String, String> args = new HashMap<String, String>();
         String msg;
@@ -3990,21 +3975,25 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
 
     protected String getLowestAvailableVIFDeviceNum(Connection conn, VM vm) {
         try {
-            Set<String> availableDeviceNums = vm.getAllowedVIFDevices(conn);
-            Iterator<String> deviceNumsIterator = 
availableDeviceNums.iterator();
-            List<Integer> sortedDeviceNums = new ArrayList<Integer>();
-
-            while (deviceNumsIterator.hasNext()) {
-                try {
-                    
sortedDeviceNums.add(Integer.valueOf(deviceNumsIterator.next()));
+            List<Integer> usedDeviceNums = new ArrayList<Integer>();
+            Set<VIF> vifs = vm.getVIFs(conn);
+            Iterator<VIF> vifIter = vifs.iterator();
+            while(vifIter.hasNext()){
+                VIF vif = vifIter.next();
+                try{
+                    usedDeviceNums.add(Integer.valueOf(vif.getDevice(conn)));
                 } catch (NumberFormatException e) {
-                    s_logger.debug("Obtained an invalid value for an available 
VIF device number for VM: " + vm.getNameLabel(conn));
+                    s_logger.debug("Obtained an invalid value for an allocated 
VIF device number for VM: " + vm.getNameLabel(conn));
                     return null;
                 }
             }
 
-            Collections.sort(sortedDeviceNums);
-            return String.valueOf(sortedDeviceNums.get(0));
+            for(Integer i=0; i< _maxNics; i++){
+                if(!usedDeviceNums.contains(i)){
+                    s_logger.debug("Lowest available Vif device number: "+i+" 
for VM: " + vm.getNameLabel(conn));
+                    return i.toString();
+                }
+            }
         } catch (XmlRpcException e) {
             String msg = "Caught XmlRpcException: " + e.getMessage();
             s_logger.warn(msg, e);
@@ -5655,6 +5644,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         value = (String) params.get("migratewait");
         _migratewait = NumbersUtil.parseInt(value, 3600);
 
+        _maxNics = NumbersUtil.parseInt((String) params.get("xen.nics.max"), 
7);
+
         if (_pod == null) {
             throw new ConfigurationException("Unable to get the pod");
         }
@@ -7765,7 +7756,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
                 s_logger.warn(msg);
                 return new PlugNicAnswer(cmd, false, msg);
             }
-            String deviceId = getUnusedVIFNum(conn, vm);
+            String deviceId = getLowestAvailableVIFDeviceNum(conn, vm);
             nic.setDeviceId(Integer.parseInt(deviceId));
             vif = createVif(conn, vmName, vm, nic);
             vif.plug(conn);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cc2a3c54/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java 
b/server/src/com/cloud/configuration/Config.java
index abc6a09..4a0306a 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -247,7 +247,7 @@ public enum Config {
     XenBondStorageNic("Advanced", ManagementServer.class, String.class, 
"xen.bond.storage.nics", null, "Attempt to bond the two networks if found", 
null),
     XenHeartBeatInterval("Advanced", ManagementServer.class, Integer.class, 
"xen.heartbeat.interval", "60", "heartbeat to use when implementing XenServer 
Self Fencing", null),
     XenGuestNetwork("Hidden", ManagementServer.class, String.class, 
"xen.guest.network.device", null, "Specify for guest network name label", null),
-
+    XenMaxNics("Advanced", AgentManager.class, Integer.class, "xen.nics.max", 
"7", "Maximum allowed nics for Vms created on Xen", null),
     // VMware
     VmwarePrivateNetworkVSwitch("Hidden", ManagementServer.class, 
String.class, "vmware.private.vswitch", null, "Specify the vSwitch on host for 
private network", null),
     VmwarePublicNetworkVSwitch("Hidden", ManagementServer.class, String.class, 
"vmware.public.vswitch", null, "Specify the vSwitch on host for public 
network", null),
@@ -360,7 +360,7 @@ public enum Config {
     VpcMaxNetworks("Advanced", ManagementServer.class, Integer.class, 
"vpc.max.networks", "3", "Maximum number of networks per vpc", null),
     DetailBatchQuerySize("Advanced", ManagementServer.class, Integer.class, 
"detail.batch.query.size", "2000", "Default entity detail batch query size for 
listing", null),
        ConcurrentSnapshotsThresholdPerHost("Advanced", ManagementServer.class, 
Long.class, "concurrent.snapshots.threshold.perhost",
-                       null, "Limits number of snapshots that can be handled 
by the host concurrently; default is NULL - unlimited", null),
+                       null, "Limits number of snapshots that can be handled 
by the host concurrently; default is NULL - unlimited", null),
        NetworkIPv6SearchRetryMax("Network", ManagementServer.class, 
Integer.class, "network.ipv6.search.retry.max", "10000", "The maximum number of 
retrying times to search for an available IPv6 address in the table", null),
 
        ExternalBaremetalSystemUrl("Advanced", ManagementServer.class, 
String.class, "external.baremetal.system.url", null, "url of external baremetal 
system that CloudStack will talk to", null),

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cc2a3c54/server/src/com/cloud/resource/DiscovererBase.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/DiscovererBase.java 
b/server/src/com/cloud/resource/DiscovererBase.java
index 940608c..b7c5b6f 100644
--- a/server/src/com/cloud/resource/DiscovererBase.java
+++ b/server/src/com/cloud/resource/DiscovererBase.java
@@ -128,6 +128,7 @@ public abstract class DiscovererBase extends AdapterBase 
implements Discoverer {
         params.put("secondary.storage.vm", "false");
         params.put("max.template.iso.size", 
_configDao.getValue(Config.MaxTemplateAndIsoSize.toString()));
         params.put("migratewait", 
_configDao.getValue(Config.MigrateWait.toString()));
+        params.put(Config.XenMaxNics.toString().toLowerCase(), 
_configDao.getValue(Config.XenMaxNics.toString()));
         return params;
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cc2a3c54/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index 8bd9bfd..65add75 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -23,3 +23,4 @@ ALTER TABLE `cloud`.`hypervisor_capabilities` ADD COLUMN 
`max_hosts_per_cluster`
 UPDATE `cloud`.`hypervisor_capabilities` SET `max_hosts_per_cluster`=32 WHERE 
`hypervisor_type`='VMware';
 INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, 
hypervisor_version, max_guests_limit, security_group_enabled, 
max_hosts_per_cluster) VALUES ('VMware', '5.1', 128, 0, 32);
 DELETE FROM `cloud`.`configuration` where name='vmware.percluster.host.max';
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 
'AgentManager', 'xen.nics.max', '7', 'Maximum allowed nics for Vms created on 
Xen');
\ No newline at end of file

Reply via email to