Updated Branches: refs/heads/4.2 7d02c71ff -> 1c3b9b53f
Changed host stats to be collected through the http connection Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5e44df6d Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5e44df6d Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5e44df6d Branch: refs/heads/4.2 Commit: 5e44df6de55fdee6302bc567339cb1e5bbdd5254 Parents: 7d02c71 Author: Alex Huang <alex.hu...@citrix.com> Authored: Mon Nov 11 01:57:15 2013 -0800 Committer: Alex Huang <alex.hu...@citrix.com> Committed: Mon Nov 11 08:24:02 2013 -0800 ---------------------------------------------------------------------- .../xen/resource/CitrixResourceBase.java | 249 ++++++++++--------- .../hypervisor/xenserver/xenserver60/NFSSR.py | 64 +++-- 2 files changed, 167 insertions(+), 146 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e44df6d/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 bd04e02..6c75835 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 @@ -11,11 +11,93 @@ // 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 +// KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.hypervisor.xen.resource; +import static com.cloud.utils.ReflectUtil.flattenProperties; +import static com.google.common.collect.Lists.newArrayList; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Queue; +import java.util.Random; +import java.util.Set; +import java.util.UUID; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.codec.binary.Base64; +import org.apache.log4j.Logger; +import org.apache.xmlrpc.XmlRpcException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import com.google.gson.Gson; +import com.trilead.ssh2.SCPClient; +import com.xensource.xenapi.Bond; +import com.xensource.xenapi.Connection; +import com.xensource.xenapi.Console; +import com.xensource.xenapi.Host; +import com.xensource.xenapi.HostCpu; +import com.xensource.xenapi.HostMetrics; +import com.xensource.xenapi.Network; +import com.xensource.xenapi.PBD; +import com.xensource.xenapi.PIF; +import com.xensource.xenapi.PIF.Record; +import com.xensource.xenapi.Pool; +import com.xensource.xenapi.SR; +import com.xensource.xenapi.Session; +import com.xensource.xenapi.Task; +import com.xensource.xenapi.Types; +import com.xensource.xenapi.Types.BadAsyncResult; +import com.xensource.xenapi.Types.BadServerResponse; +import com.xensource.xenapi.Types.ConsoleProtocol; +import com.xensource.xenapi.Types.IpConfigurationMode; +import com.xensource.xenapi.Types.OperationNotAllowed; +import com.xensource.xenapi.Types.SrFull; +import com.xensource.xenapi.Types.VbdType; +import com.xensource.xenapi.Types.VmBadPowerState; +import com.xensource.xenapi.Types.VmPowerState; +import com.xensource.xenapi.Types.XenAPIException; +import com.xensource.xenapi.VBD; +import com.xensource.xenapi.VBDMetrics; +import com.xensource.xenapi.VDI; +import com.xensource.xenapi.VIF; +import com.xensource.xenapi.VLAN; +import com.xensource.xenapi.VM; +import com.xensource.xenapi.VMGuestMetrics; +import com.xensource.xenapi.XenAPIObject; + +import org.apache.cloudstack.storage.command.StorageSubSystemCommand; +import org.apache.cloudstack.storage.to.TemplateObjectTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; + import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; @@ -174,7 +256,6 @@ import com.cloud.agent.api.to.VolumeTO; import com.cloud.exception.InternalErrorException; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.hypervisor.xen.resource.CitrixHelper; import com.cloud.network.HAProxyConfigurator; import com.cloud.network.LoadBalancerConfigurator; import com.cloud.network.Networks; @@ -208,92 +289,15 @@ import com.cloud.storage.template.TemplateProp; import com.cloud.template.VirtualMachineTemplate.BootloaderType; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.Ternary; import com.cloud.utils.S3Utils; import com.cloud.utils.StringUtils; +import com.cloud.utils.Ternary; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.snapshot.VMSnapshot; -import com.google.gson.Gson; -import com.trilead.ssh2.SCPClient; -import com.xensource.xenapi.Bond; -import com.xensource.xenapi.Connection; -import com.xensource.xenapi.Console; -import com.xensource.xenapi.Host; -import com.xensource.xenapi.HostCpu; -import com.xensource.xenapi.HostMetrics; -import com.xensource.xenapi.Network; -import com.xensource.xenapi.PBD; -import com.xensource.xenapi.PIF; -import com.xensource.xenapi.PIF.Record; -import com.xensource.xenapi.Pool; -import com.xensource.xenapi.SR; -import com.xensource.xenapi.Session; -import com.xensource.xenapi.Task; -import com.xensource.xenapi.Types; -import com.xensource.xenapi.Types.BadAsyncResult; -import com.xensource.xenapi.Types.BadServerResponse; -import com.xensource.xenapi.Types.ConsoleProtocol; -import com.xensource.xenapi.Types.IpConfigurationMode; -import com.xensource.xenapi.Types.OperationNotAllowed; -import com.xensource.xenapi.Types.SrFull; -import com.xensource.xenapi.Types.VbdType; -import com.xensource.xenapi.Types.VmBadPowerState; -import com.xensource.xenapi.Types.VmPowerState; -import com.xensource.xenapi.Types.XenAPIException; -import com.xensource.xenapi.VBD; -import com.xensource.xenapi.VBDMetrics; -import com.xensource.xenapi.VDI; -import com.xensource.xenapi.VIF; -import com.xensource.xenapi.VLAN; -import com.xensource.xenapi.VM; -import com.xensource.xenapi.VMGuestMetrics; -import com.xensource.xenapi.XenAPIObject; -import org.apache.cloudstack.storage.command.StorageSubSystemCommand; -import org.apache.cloudstack.storage.to.TemplateObjectTO; -import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; -import org.apache.xmlrpc.XmlRpcException; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Queue; -import java.util.Random; -import java.util.Set; -import java.util.UUID; - -import static com.cloud.utils.ReflectUtil.flattenProperties; -import static com.google.common.collect.Lists.newArrayList; /** * CitrixResourceBase encapsulates the calls to the XenServer Xapi process @@ -799,7 +803,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.error("revert vm " + vmName + " to snapshot " + cmd.getTarget().getSnapshotName() + " failed due to " + e.getMessage()); return new RevertToVMSnapshotAnswer(cmd, false, e.getMessage()); - } + } } private String revertToSnapshot(Connection conn, VM vmSnapshot, @@ -952,10 +956,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe nw = Network.create(conn, rec); // Plug dom0 vif only when creating network enableXenServerNetwork(conn, nw, nwName, "tunnel network for account " + key); - s_logger.debug("### Xen Server network for tunnels created:" + nwName); + s_logger.debug("### Xen Server network for tunnels created:" + nwName); } else { nw = networks.iterator().next(); - s_logger.debug("Xen Server network for tunnels found:" + nwName); + s_logger.debug("Xen Server network for tunnels found:" + nwName); } return nw; } catch (Exception e) { @@ -1084,10 +1088,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vifr.device = Integer.toString(nic.getDeviceId()); vifr.MAC = nic.getMac(); - // Nicira needs these IDs to find the NIC + // Nicira needs these IDs to find the NIC vifr.otherConfig = new HashMap<String, String>(); vifr.otherConfig.put("nicira-iface-id", nic.getUuid()); - vifr.otherConfig.put("nicira-vm-id", vm.getUuid(conn)); + vifr.otherConfig.put("nicira-vm-id", vm.getUuid(conn)); vifr.network = getNetwork(conn, nic); @@ -1311,7 +1315,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe Map<String, String> platform = vmr.platform; platform.put("cores-per-socket", coresPerSocket); vmr.platform = platform; - } + } } vmr.VCPUsAtStartup = (long) vmSpec.getCpus(); @@ -1454,7 +1458,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (network.getNameLabel(conn).startsWith("VLAN")) { disableVlanNetwork(conn, network); } - } + } } catch (Exception e) { s_logger.warn("VM getRecord failed due to ", e); } @@ -1763,7 +1767,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return new StartAnswer(cmd, msg); } finally { synchronized (_cluster.intern()) { - if (state != State.Stopped) { + if (state != State.Stopped) { s_vms.put(_cluster, _name, vmName, state); s_logger.debug("2. The VM " + vmName + " is in " + state + " state."); } else { @@ -2435,7 +2439,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.debug("VIF to deassociate IP with does not exist, return success"); return; } - } + } String args = "vpc_ipassoc.sh " + routerIp; String snatArgs = "vpc_privateGateway.sh " + routerIp; @@ -2906,10 +2910,33 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected String getHostStatsRawXML(Connection conn) { Date currentDate = new Date(); - String startTime = String.valueOf(currentDate.getTime() / 1000 - 1000); - - return callHostPlugin(conn, "vmops", "gethostvmstats", "collectHostStats", String.valueOf("true"), "consolidationFunction", _consolidationFunction, "interval", String - .valueOf(_pollingIntervalInSeconds), "startTime", startTime); + String urlStr = "http://" + _host.ip + "/rrd_updates?"; + urlStr += "session_id=" + conn.getSessionReference(); + urlStr += "&host=" + "true"; + urlStr += "&cf=" + _consolidationFunction; + urlStr += "&interval=" + _pollingIntervalInSeconds; + urlStr += "&start=" + (currentDate.getTime() / 1000 - 1000 - 100); + + URL url; + try { + url = new URL(urlStr); + url.openConnection(); + URLConnection uc = url.openConnection(); + BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream())); + StringBuilder buff = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + buff.append(inputLine); + } + in.close(); + return buff.toString(); + } catch (MalformedURLException e) { + s_logger.warn("Malformed URL? come on...." + urlStr); + return null; + } catch (IOException e) { + s_logger.warn("Problems getting stats using " + urlStr, e); + return null; + } } protected String getVmStatsRawXML(Connection conn) { @@ -3772,7 +3799,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe other.put("live", "true"); task = vm.poolMigrateAsync(conn, destHost, other); try { - // poll every 1 seconds + // poll every 1 seconds long timeout = (_migratewait) * 1000L; waitForTask(conn, task, 1000, timeout); checkForSuccess(conn, task); @@ -4785,7 +4812,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe XsLocalNetwork privateNic = getManagementNetwork(conn); _privateNetworkName = privateNic.getNetworkRecord(conn).nameLabel; _host.privatePif = privateNic.getPifRecord(conn).uuid; - _host.privateNetwork = privateNic.getNetworkRecord(conn).uuid; + _host.privateNetwork = privateNic.getNetworkRecord(conn).uuid; _host.systemvmisouuid = null; XsLocalNetwork guestNic = null; @@ -4985,7 +5012,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } catch (Throwable e) { s_logger.warn("Check for master failed, failing the FULL Cluster sync command"); - } + } StartupStorageCommand sscmd = initializeLocalSR(conn); if (sscmd != null) { @@ -5288,7 +5315,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if(!isNetworkSetupByName(info.getPrivateNetworkName())){ msg = "For Physical Network id:"+ info.getPhysicalNetworkId() + ", Private Network is not configured on the backend by name " + info.getPrivateNetworkName(); errorout = true; - break; + break; } if(!isNetworkSetupByName(info.getPublicNetworkName())){ msg = "For Physical Network id:"+ info.getPhysicalNetworkId() + ", Public Network is not configured on the backend by name " + info.getPublicNetworkName(); @@ -5331,7 +5358,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } return true; - } + } protected List<File> getPatchFiles() { return null; @@ -5655,9 +5682,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return new OvsCreateTunnelAnswer(cmd, false, "Cannot create network", bridge); } - configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getFrom(), cmd.getKey()); + configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getFrom(), cmd.getKey()); bridge = nw.getBridge(conn); - String result = callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(), + String result = callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(), "key", cmd.getKey().toString(), "from", cmd.getFrom().toString(), "to", cmd.getTo().toString()); String[] res = result.split(":"); if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) { @@ -5764,7 +5791,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe PIF pif = nw.getPif(conn); Record pifRec = pif.getRecord(conn); s_logger.debug("PIF object:" + pifRec.uuid + "(" + pifRec.device + ")"); - return new OvsFetchInterfaceAnswer(cmd, true, "Interface " + pifRec.device + " retrieved successfully", + return new OvsFetchInterfaceAnswer(cmd, true, "Interface " + pifRec.device + " retrieved successfully", pifRec.IP, pifRec.netmask, pifRec.MAC); } catch (BadServerResponse e) { s_logger.error("An error occurred while fetching the interface for " + @@ -5823,7 +5850,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (!_canBridgeFirewall) { s_logger.warn("Host " + _host.ip + " cannot do bridge firewalling"); - return new SecurityGroupRuleAnswer(cmd, false, + return new SecurityGroupRuleAnswer(cmd, false, "Host " + _host.ip + " cannot do bridge firewalling", SecurityGroupRuleAnswer.FailureReason.CANNOT_BRIDGE_FIREWALL); } @@ -5889,7 +5916,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if( hr.softwareVersion.get("product_version_text_short") != null ) { details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short")); - cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short")); + cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short")); cmd.setHypervisorVersion(_host.product_version); } @@ -6743,7 +6770,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } - private long getVMSnapshotChainSize(Connection conn, VolumeTO volumeTo, String vmName) + private long getVMSnapshotChainSize(Connection conn, VolumeTO volumeTo, String vmName) throws BadServerResponse, XenAPIException, XmlRpcException { Set<VDI> allvolumeVDIs = VDI.getByNameLabel(conn, volumeTo.getName()); long size = 0; @@ -6871,7 +6898,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe checkForSuccess(conn, task); String result = task.getResult(conn); - // extract VM snapshot ref from result + // extract VM snapshot ref from result String ref = result.substring("<value>".length(), result.length() - "</value>".length()); vmSnapshot = Types.toVM(ref); try { @@ -7433,7 +7460,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } finally { deleteSnapshotBackup(conn, dcId, accountId, volumeId, secondaryStorageMountPath, snapshotBackupUuid); } - } + } success = true; } finally { if( snapshotSr != null) { @@ -7797,7 +7824,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } protected boolean deleteSnapshotsDir(Connection conn, Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath) { - return deleteSecondaryStorageFolder(conn, secondaryStorageMountPath, "snapshots" + "/" + accountId.toString() + "/" + volumeId.toString()); + return deleteSecondaryStorageFolder(conn, secondaryStorageMountPath, "snapshots" + "/" + accountId.toString() + "/" + volumeId.toString()); } @@ -8107,7 +8134,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } catch (Throwable e) { s_logger.warn("Check for master failed, failing the Cluster sync command"); return new Answer(cmd); - } + } HashMap<String, Ternary<String, State, String>> newStates = deltaClusterSync(conn); return new ClusterSyncAnswer(cmd.getClusterId(), newStates); } @@ -8137,10 +8164,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } if (s_logger.isTraceEnabled()) { s_logger.trace("VM " + vm_name + ": powerstate = " + ps + "; vm state=" + state.toString()); - } + } } } catch (final Throwable e) { - String msg = "Unable to get vms through host " + _host.uuid + " due to to " + e.toString(); + String msg = "Unable to get vms through host " + _host.uuid + " due to to " + e.toString(); s_logger.warn(msg, e); throw new CloudRuntimeException(msg); } @@ -8209,7 +8236,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.warn("Detecting a new state but couldn't find a old state so adding it to the changes: " + vm); changes.put(vm, new Ternary<String, State, String>(host_uuid, newState, null)); } else if (oldState.second() == State.Starting) { - if (newState == State.Running) { + if (newState == State.Running) { s_logger.debug("12. The VM " + vm + " is in " + State.Running + " state"); s_vms.put(_cluster, host_uuid, vm, newState, xstoolsversion); } else if (newState == State.Stopped) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5e44df6d/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py ---------------------------------------------------------------------- diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py b/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py index 0d6badb..d0c98a1 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py @@ -1,21 +1,16 @@ #!/usr/bin/python -# 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. - +# Copyright (C) 2006-2007 XenSource Ltd. +# Copyright (C) 2008-2009 Citrix Ltd. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation; version 2.1 only. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# # FileSR: local-file storage repository import SR, VDI, SRCommand, FileSR, util @@ -42,8 +37,8 @@ CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', - 'vendor': 'The Apache Software Foundation', - 'copyright': 'Copyright (c) 2012 The Apache Software Foundation', + 'vendor': 'Citrix Systems Inc', + 'copyright': '(C) 2008 Citrix Systems Inc', 'driver_version': '1.0', 'required_api_version': '1.0', 'capabilities': CAPABILITIES, @@ -112,8 +107,7 @@ class NFSSR(FileSR.FileSR): def attach(self, sr_uuid): self.validate_remotepath(False) - #self.remotepath = os.path.join(self.dconf['serverpath'], sr_uuid) - self.remotepath = self.dconf['serverpath'] + self.remotepath = os.path.join(self.dconf['serverpath'], sr_uuid) util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') self.mount_remotepath(sr_uuid) @@ -181,20 +175,20 @@ class NFSSR(FileSR.FileSR): pass raise exn - #newpath = os.path.join(self.path, sr_uuid) - #if util.ioretry(lambda: util.pathexists(newpath)): - # if len(util.ioretry(lambda: util.listdir(newpath))) != 0: - # self.detach(sr_uuid) - # raise xs_errors.XenError('SRExists') - #else: - # try: - # util.ioretry(lambda: util.makedirs(newpath)) - # except util.CommandException, inst: - # if inst.code != errno.EEXIST: - # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' - # % inst.code) + newpath = os.path.join(self.path, sr_uuid) + if util.ioretry(lambda: util.pathexists(newpath)): + if len(util.ioretry(lambda: util.listdir(newpath))) != 0: + self.detach(sr_uuid) + raise xs_errors.XenError('SRExists') + else: + try: + util.ioretry(lambda: util.makedirs(newpath)) + except util.CommandException, inst: + if inst.code != errno.EEXIST: + self.detach(sr_uuid) + raise xs_errors.XenError('NFSCreate', + opterr='remote directory creation error is %d' + % inst.code) self.detach(sr_uuid) def delete(self, sr_uuid):