Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id D2875200AC0 for ; Tue, 24 May 2016 11:49:12 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id D1400160A33; Tue, 24 May 2016 09:49:12 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 87A1C160A30 for ; Tue, 24 May 2016 11:49:11 +0200 (CEST) Received: (qmail 532 invoked by uid 500); 24 May 2016 09:49:07 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 99661 invoked by uid 99); 24 May 2016 09:49:07 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 24 May 2016 09:49:07 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 57CDBE0556; Tue, 24 May 2016 09:49:07 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dahn@apache.org To: commits@cloudstack.apache.org Date: Tue, 24 May 2016 09:49:19 -0000 Message-Id: <6da77939bc4241b69cc1898f1c9de42c@git.apache.org> In-Reply-To: <9f6d5bfbd239492394945380f6b96af9@git.apache.org> References: <9f6d5bfbd239492394945380f6b96af9@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [14/48] git commit: updated refs/heads/4.9-bountycastle-daan to 98bf0ca archived-at: Tue, 24 May 2016 09:49:13 -0000 http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2bd035d1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index 38b45d0..6391611 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -44,6 +44,8 @@ import org.apache.cloudstack.storage.command.DettachCommand; import org.apache.cloudstack.storage.command.ForgetObjectCmd; import org.apache.cloudstack.storage.command.IntroduceObjectAnswer; import org.apache.cloudstack.storage.command.IntroduceObjectCmd; +import org.apache.cloudstack.storage.command.ResignatureAnswer; +import org.apache.cloudstack.storage.command.ResignatureCommand; import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer; import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand; import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol; @@ -160,6 +162,50 @@ public class XenServerStorageProcessor implements StorageProcessor { } @Override + public ResignatureAnswer resignature(final ResignatureCommand cmd) { + SR newSr = null; + + final Connection conn = hypervisorResource.getConnection(); + + try { + final Map details = cmd.getDetails(); + + final String iScsiName = details.get(DiskTO.IQN); + final String storageHost = details.get(DiskTO.STORAGE_HOST); + final String chapInitiatorUsername = details.get(DiskTO.CHAP_INITIATOR_USERNAME); + final String chapInitiatorSecret = details.get(DiskTO.CHAP_INITIATOR_SECRET); + + newSr = hypervisorResource.getIscsiSR(conn, iScsiName, storageHost, iScsiName, chapInitiatorUsername, chapInitiatorSecret, true, false); + + Set vdis = newSr.getVDIs(conn); + + if (vdis.size() != 1) { + throw new RuntimeException("There were " + vdis.size() + " VDIs in the SR."); + } + + VDI vdi = vdis.iterator().next(); + + final ResignatureAnswer resignatureAnswer = new ResignatureAnswer(); + + resignatureAnswer.setSize(vdi.getVirtualSize(conn)); + resignatureAnswer.setPath(vdi.getUuid(conn)); + resignatureAnswer.setFormat(ImageFormat.VHD); + + return resignatureAnswer; + } + catch (final Exception ex) { + s_logger.warn("Failed to resignature: " + ex.toString(), ex); + + return new ResignatureAnswer(ex.getMessage()); + } + finally { + if (newSr != null) { + hypervisorResource.removeSR(conn, newSr); + } + } + } + + @Override public AttachAnswer attachIso(final AttachCommand cmd) { final DiskTO disk = cmd.getDisk(); final DataTO data = disk.getData(); @@ -763,6 +809,9 @@ public class XenServerStorageProcessor implements StorageProcessor { final DataTO destDataTo = cmd.getDestTO(); final int wait = cmd.getWait(); final DataStoreTO srcDataStoreTo = srcDataTo.getDataStore(); + final Connection conn = hypervisorResource.getConnection(); + SR sr = null; + boolean removeSrAfterCopy = false; try { if (srcDataStoreTo instanceof NfsTO && srcDataTo.getObjectType() == DataObjectType.TEMPLATE) { @@ -796,14 +845,11 @@ public class XenServerStorageProcessor implements StorageProcessor { managedStoragePoolRootVolumeSize = details.get(PrimaryDataStoreTO.VOLUME_SIZE); chapInitiatorUsername = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_USERNAME); chapInitiatorSecret = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_SECRET); + removeSrAfterCopy = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.REMOVE_AFTER_COPY)); } } } - final Connection conn = hypervisorResource.getConnection(); - - final SR sr; - if (managed) { final Map details = new HashMap(); @@ -861,9 +907,11 @@ public class XenServerStorageProcessor implements StorageProcessor { newVol.setUuid(uuidToReturn); newVol.setPath(uuidToReturn); + if (physicalSize != null) { newVol.setSize(physicalSize); } + newVol.setFormat(ImageFormat.VHD); return new CopyCmdAnswer(newVol); @@ -875,6 +923,11 @@ public class XenServerStorageProcessor implements StorageProcessor { return new CopyCmdAnswer(msg); } + finally { + if (removeSrAfterCopy && sr != null) { + hypervisorResource.removeSR(conn, sr); + } + } return new CopyCmdAnswer("not implemented yet"); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2bd035d1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index e58bade..02c3197 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -171,6 +171,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { final DataStoreTO srcStore = srcData.getDataStore(); final Connection conn = hypervisorResource.getConnection(); SR srcSr = null; + SR destSr = null; + boolean removeSrAfterCopy = false; Task task = null; try { @@ -198,7 +200,8 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { final Set setVdis = srcSr.getVDIs(conn); if (setVdis.size() != 1) { - return new CopyCmdAnswer("Expected 1 VDI template but found " + setVdis.size() + " VDI template(s) on: " + uri.getHost() + ":" + uri.getPath() + "/" + volumeDirectory); + return new CopyCmdAnswer("Expected 1 VDI template, but found " + setVdis.size() + " VDI templates on: " + + uri.getHost() + ":" + uri.getPath() + "/" + volumeDirectory); } final VDI srcVdi = setVdis.iterator().next(); @@ -225,11 +228,10 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { managedStoragePoolRootVolumeSize = details.get(PrimaryDataStoreTO.VOLUME_SIZE); chapInitiatorUsername = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_USERNAME); chapInitiatorSecret = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_SECRET); + removeSrAfterCopy = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.REMOVE_AFTER_COPY)); } } - final SR destSr; - if (managed) { details = new HashMap(); @@ -291,9 +293,11 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { newVol.setUuid(uuidToReturn); newVol.setPath(uuidToReturn); + if (physicalSize != null) { newVol.setSize(physicalSize); } + newVol.setFormat(Storage.ImageFormat.VHD); return new CopyCmdAnswer(newVol); @@ -316,6 +320,10 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { if (srcSr != null) { hypervisorResource.removeSR(conn, srcSr); } + + if (removeSrAfterCopy && destSr != null) { + hypervisorResource.removeSR(conn, destSr); + } } return new CopyCmdAnswer("not implemented yet"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2bd035d1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java index 0206939..b8e0f56 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java @@ -27,28 +27,80 @@ import com.cloud.agent.api.storage.ResizeVolumeCommand; import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.exception.CloudRuntimeException; import com.xensource.xenapi.Connection; +import com.xensource.xenapi.PBD; +import com.xensource.xenapi.SR; import com.xensource.xenapi.VDI; +import java.util.HashSet; +import java.util.Set; + @ResourceWrapper(handles = ResizeVolumeCommand.class) public final class CitrixResizeVolumeCommandWrapper extends CommandWrapper { - private static final Logger s_logger = Logger.getLogger(CitrixResizeVolumeCommandWrapper.class); @Override public Answer execute(final ResizeVolumeCommand command, final CitrixResourceBase citrixResourceBase) { - final Connection conn = citrixResourceBase.getConnection(); - final String volid = command.getPath(); - final long newSize = command.getNewSize(); + Connection conn = citrixResourceBase.getConnection(); + + String volId = command.getPath(); + long newSize = command.getNewSize(); try { - final VDI vdi = citrixResourceBase.getVDIbyUuid(conn, volid); + if (command.isManaged()) { + resizeSr(conn, command); + } + + VDI vdi = citrixResourceBase.getVDIbyUuid(conn, volId); + vdi.resize(conn, newSize); + return new ResizeVolumeAnswer(command, true, "success", newSize); - } catch (final Exception e) { - s_logger.warn("Unable to resize volume", e); - final String error = "failed to resize volume:" + e; + } catch (Exception ex) { + s_logger.warn("Unable to resize volume", ex); + + String error = "Failed to resize volume: " + ex; + return new ResizeVolumeAnswer(command, false, error); } } -} \ No newline at end of file + + private void resizeSr(Connection conn, ResizeVolumeCommand command) { + // If this is managed storage, re-size the SR, too. + // The logical unit/volume has already been re-sized, so the SR needs to fill up the new space. + + String iScsiName = command.get_iScsiName(); + + try { + Set srs = SR.getByNameLabel(conn, iScsiName); + Set allPbds = new HashSet<>(); + + for (SR sr : srs) { + if (!CitrixResourceBase.SRType.LVMOISCSI.equals(sr.getType(conn))) { + continue; + } + + Set pbds = sr.getPBDs(conn); + + if (pbds.size() <= 0) { + s_logger.debug("No PBDs found for the following SR: " + sr.getNameLabel(conn)); + } + + allPbds.addAll(pbds); + } + + for (PBD pbd: allPbds) { + PBD.Record pbdr = pbd.getRecord(conn); + + if (pbdr.currentlyAttached) { + pbd.unplug(conn); + pbd.plug(conn); + } + } + } + catch (Throwable ex) { + throw new CloudRuntimeException("Unable to resize volume: " + ex.getMessage()); + } + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2bd035d1/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java index 2411102..073f000 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java @@ -108,11 +108,13 @@ public final class CitrixStartCommandWrapper extends CommandWrapper extends AsyncRpcContext { - private final DataObject volume; + @Override + public long getBytesRequiredForTemplate(TemplateInfo templateInfo, StoragePool storagePool) { + return 0; + } + private class CreateVolumeContext extends AsyncRpcContext { public CreateVolumeContext(AsyncCompletionCallback callback, DataObject volume) { super(callback); - this.volume = volume; } }