From d08a6a4e7b33ad7a1d8935b4d0cafac56023b7b0 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 20 Jun 2013 19:40:43 +0530 Subject: [PATCH] Revive simulator based on ImageStore changes Introduced the SimulatorStorageProcessor to handle image store related commands. Right now only mock implementations are provided, no error handling, logging, runtime exception scenarios limited. SystemVMs are able to start up but the default built-in template has trouble in going to Ready state. Signed-off-by: Prasanna Santhanam --- .../agent/manager/SimulatorManagerImpl.java | 46 ++--- .../com/cloud/resource/AgentResourceBase.java | 29 ++- .../resource/SimulatorStorageProcessor.java | 187 ++++++++++++++++++ 3 files changed, 222 insertions(+), 40 deletions(-) create mode 100644 plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorStorageProcessor.java diff --git a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java index c13d37ec4e0..391efeed3b8 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java +++ b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java @@ -16,20 +16,6 @@ // under the License. package com.cloud.agent.manager; -import java.util.HashMap; -import java.util.Map; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import org.apache.cloudstack.storage.command.DeleteCommand; -import org.apache.cloudstack.storage.command.DownloadCommand; -import org.apache.cloudstack.storage.command.DownloadProgressCommand; - import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeCommand; @@ -100,18 +86,32 @@ import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.ListTemplateCommand; import com.cloud.agent.api.storage.ListVolumeCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; +import com.cloud.resource.SimulatorStorageProcessor; import com.cloud.simulator.MockConfigurationVO; import com.cloud.simulator.MockHost; import com.cloud.simulator.MockVMVO; import com.cloud.simulator.dao.MockConfigurationDao; import com.cloud.simulator.dao.MockHostDao; +import com.cloud.storage.resource.StorageSubsystemCommandHandler; +import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase; import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.db.ConnectionConcierge; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VirtualMachine.State; +import org.apache.cloudstack.storage.command.DeleteCommand; +import org.apache.cloudstack.storage.command.DownloadCommand; +import org.apache.cloudstack.storage.command.DownloadProgressCommand; +import org.apache.cloudstack.storage.command.StorageSubSystemCommand; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import javax.ejb.Local; +import javax.inject.Inject; +import javax.naming.ConfigurationException; +import java.util.HashMap; +import java.util.Map; @Component @Local(value = { SimulatorManager.class }) @@ -129,18 +129,12 @@ public class SimulatorManagerImpl extends ManagerBase implements SimulatorManage MockConfigurationDao _mockConfigDao; @Inject MockHostDao _mockHost = null; - private ConnectionConcierge _concierge; + protected StorageSubsystemCommandHandler storageHandler; + @Override public boolean configure(String name, Map params) throws ConfigurationException { - /* - try { - Connection conn = Transaction.getStandaloneSimulatorConnection(); - conn.setAutoCommit(true); - _concierge = new ConnectionConcierge("SimulatorConnection", conn, true); - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to get a db connection to simulator", e); - } - */ + SimulatorStorageProcessor processor = new SimulatorStorageProcessor(this); + this.storageHandler = new StorageSubsystemCommandHandlerBase(processor); return true; } @@ -356,6 +350,8 @@ public class SimulatorManagerImpl extends ManagerBase implements SimulatorManage return _mockVmMgr.scaleVm((ScaleVmCommand) cmd); } else if (cmd instanceof PvlanSetupCommand) { return _mockNetworkMgr.setupPVLAN((PvlanSetupCommand) cmd); + } else if (cmd instanceof StorageSubSystemCommand) { + return this.storageHandler.handleStorageCommands((StorageSubSystemCommand)cmd); } else { s_logger.error("Simulator does not implement command of type "+cmd.toString()); return Answer.createUnsupportedCommandAnswer(cmd); diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentResourceBase.java b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentResourceBase.java index 27f158ca9f6..9de8e568d48 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentResourceBase.java +++ b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentResourceBase.java @@ -16,21 +16,6 @@ // under the License. package com.cloud.resource; -import java.io.File; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -46,6 +31,19 @@ import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.simulator.MockHost; import com.cloud.utils.component.ComponentContext; +import org.apache.log4j.Logger; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; public class AgentResourceBase implements ServerResource { @@ -121,6 +119,7 @@ public class AgentResourceBase implements ServerResource { hostGuid = (String)params.get("guid"); _simMgr = ComponentContext.inject(SimulatorManagerImpl.class); + _simMgr.configure(name, params); agentHost = getAgentMgr().getHost(hostGuid); return true; diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorStorageProcessor.java b/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorStorageProcessor.java new file mode 100644 index 00000000000..16ba367f844 --- /dev/null +++ b/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorStorageProcessor.java @@ -0,0 +1,187 @@ +/* + * 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. + */ + +package com.cloud.resource; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.to.DataStoreTO; +import com.cloud.agent.api.to.DataTO; +import com.cloud.agent.api.to.DiskTO; +import com.cloud.agent.api.to.NfsTO; +import com.cloud.agent.manager.SimulatorManager; +import com.cloud.storage.Storage; +import com.cloud.storage.resource.StorageProcessor; +import org.apache.cloudstack.storage.command.AttachAnswer; +import org.apache.cloudstack.storage.command.AttachCommand; +import org.apache.cloudstack.storage.command.CopyCmdAnswer; +import org.apache.cloudstack.storage.command.CopyCommand; +import org.apache.cloudstack.storage.command.CreateObjectAnswer; +import org.apache.cloudstack.storage.command.CreateObjectCommand; +import org.apache.cloudstack.storage.command.DeleteCommand; +import org.apache.cloudstack.storage.command.DettachAnswer; +import org.apache.cloudstack.storage.command.DettachCommand; +import org.apache.cloudstack.storage.to.SnapshotObjectTO; +import org.apache.cloudstack.storage.to.TemplateObjectTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; + +import java.io.File; +import java.util.UUID; + +public class SimulatorStorageProcessor implements StorageProcessor { + + private static final Logger s_logger = Logger.getLogger(SimulatorStorageProcessor.class); + protected SimulatorManager hypervisorResource; + + public SimulatorStorageProcessor(SimulatorManager resource) { + this.hypervisorResource = resource; + } + + @Override + public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { + TemplateObjectTO template = new TemplateObjectTO(); + template.setPath(UUID.randomUUID().toString()); + template.setFormat(Storage.ImageFormat.RAW); + return new CopyCmdAnswer(template); + } + + @Override + public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) { + VolumeObjectTO volume = new VolumeObjectTO(); + volume.setPath(UUID.randomUUID().toString()); + volume.setFormat(Storage.ImageFormat.RAW); + return new CopyCmdAnswer(volume); + } + + @Override + public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { + return null; + } + + @Override + public Answer copyVolumeFromPrimaryToSecondary(CopyCommand cmd) { + return null; + } + + @Override + public Answer createTemplateFromVolume(CopyCommand cmd) { + DataTO destData = cmd.getDestTO(); + TemplateObjectTO template = new TemplateObjectTO(); + template.setPath(template.getName()); + template.setFormat(Storage.ImageFormat.RAW); + DataStoreTO imageStore = destData.getDataStore(); + if (!(imageStore instanceof NfsTO)) { + return new CopyCmdAnswer("unsupported protocol"); + } + + return new CopyCmdAnswer(template); + } + + @Override + public Answer backupSnasphot(CopyCommand cmd) { + DataTO srcData = cmd.getSrcTO(); + DataTO destData = cmd.getDestTO(); + SnapshotObjectTO snapshot = (SnapshotObjectTO) srcData; + DataStoreTO imageStore = destData.getDataStore(); + if (!(imageStore instanceof NfsTO)) { + return new CopyCmdAnswer("unsupported protocol"); + } + + int index = snapshot.getPath().lastIndexOf("/"); + + String snapshotName = snapshot.getPath().substring(index + 1); + String snapshotRelPath = null; + SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); + newSnapshot.setPath(snapshotRelPath + File.separator + snapshotName); + return new CopyCmdAnswer(newSnapshot); + } + + @Override + public Answer attachIso(AttachCommand cmd) { + DiskTO disk = cmd.getDisk(); + TemplateObjectTO isoTO = (TemplateObjectTO) disk.getData(); + DataStoreTO store = isoTO.getDataStore(); + if (!(store instanceof NfsTO)) { + return new AttachAnswer("unsupported protocol"); + } + return new Answer(cmd); + } + + @Override + public Answer attachVolume(AttachCommand cmd) { + DiskTO disk = cmd.getDisk(); + return new AttachAnswer(disk); + } + + @Override + public Answer dettachIso(DettachCommand cmd) { + DiskTO disk = cmd.getDisk(); + TemplateObjectTO isoTO = (TemplateObjectTO) disk.getData(); + DataStoreTO store = isoTO.getDataStore(); + if (!(store instanceof NfsTO)) { + return new AttachAnswer("unsupported protocol"); + } + return new Answer(cmd); + } + + @Override + public Answer dettachVolume(DettachCommand cmd) { + DiskTO disk = cmd.getDisk(); + return new DettachAnswer(disk); + } + + @Override + public Answer createVolume(CreateObjectCommand cmd) { + VolumeObjectTO volume = (VolumeObjectTO) cmd.getData(); + VolumeObjectTO newVol = new VolumeObjectTO(); + newVol.setPath(volume.getName()); + return new CreateObjectAnswer(newVol); + } + + @Override + public Answer createSnapshot(CreateObjectCommand cmd) { + String snapshotName = UUID.randomUUID().toString(); + SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); + newSnapshot.setPath(snapshotName); + return new CreateObjectAnswer(newSnapshot); + } + + @Override + public Answer deleteVolume(DeleteCommand cmd) { + return new Answer(null); + } + + @Override + public Answer createVolumeFromSnapshot(CopyCommand cmd) { + DataTO srcData = cmd.getSrcTO(); + SnapshotObjectTO snapshot = (SnapshotObjectTO) srcData; + String snapshotPath = snapshot.getPath(); + int index = snapshotPath.lastIndexOf("/"); + snapshotPath = snapshotPath.substring(0, index); + String snapshotName = snapshotPath.substring(index + 1); + VolumeObjectTO newVol = new VolumeObjectTO(); + newVol.setPath(snapshotName); + return new CopyCmdAnswer(newVol); + } + + @Override + public Answer deleteSnapshot(DeleteCommand cmd) { + return new Answer(cmd); + } +}