Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ public TemplateInfo getTemplate() {

AsyncCallFuture<TemplateApiResult> createTemplateFromVolumeAsync(VolumeInfo volume, TemplateInfo template, DataStore store);

boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate);

AsyncCallFuture<TemplateApiResult> deleteTemplateAsync(TemplateInfo template);

AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate, DataStore destStore);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,15 @@ public void handleTemplateSync(DataStore store) {
_templateDao.update(tmplt.getId(), tmlpt);

if (tmplt.getState() == VirtualMachineTemplate.State.NotUploaded || tmplt.getState() == VirtualMachineTemplate.State.UploadInProgress) {
VirtualMachineTemplate.Event event = VirtualMachineTemplate.Event.OperationSucceeded;
// For multi-disk OVA, check and create data disk templates
if (tmplt.getFormat().equals(ImageFormat.OVA)) {
if (!createOvaDataDiskTemplates(_templateFactory.getTemplate(tmlpt.getId(), store))) {
event = VirtualMachineTemplate.Event.OperationFailed;
}
}
try {
stateMachine.transitTo(tmplt, VirtualMachineTemplate.Event.OperationSucceeded, null, _templateDao);
stateMachine.transitTo(tmplt, event, null, _templateDao);
} catch (NoTransitionException e) {
s_logger.error("Unexpected state transition exception for template " + tmplt.getName() + ". Details: " + e.getMessage());
}
Expand Down Expand Up @@ -701,7 +708,7 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher<TemplateServiceImp
return null;
}

// Check if OVA contains additional data disks. If yes, create Datadisk templates for each of the additional datadisk present in the OVA
// For multi-disk OVA, check and create data disk templates
if (template.getFormat().equals(ImageFormat.OVA)) {
if (!createOvaDataDiskTemplates(template)) {
template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
Expand Down Expand Up @@ -729,8 +736,8 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher<TemplateServiceImp
return null;
}


protected boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate) {
@Override
public boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate) {
try {
// Get Datadisk template (if any) for OVA
List<DatadiskTO> dataDiskTemplates = new ArrayList<DatadiskTO>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ public ObjectInDataStoreManagerImpl() {
stateMachines.addTransition(State.Allocated, Event.CreateOnlyRequested, State.Creating);
stateMachines.addTransition(State.Allocated, Event.DestroyRequested, State.Destroying);
stateMachines.addTransition(State.Allocated, Event.OperationFailed, State.Failed);
stateMachines.addTransition(State.Allocated, Event.OperationSuccessed, State.Ready);
stateMachines.addTransition(State.Creating, Event.OperationFailed, State.Allocated);
stateMachines.addTransition(State.Creating, Event.OperationSuccessed, State.Ready);
stateMachines.addTransition(State.Ready, Event.CopyingRequested, State.Copying);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,14 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;

import com.cloud.configuration.Resource;
import com.cloud.event.EventTypes;
import com.cloud.event.UsageEventUtils;
import com.cloud.user.ResourceLimitService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
Expand All @@ -48,6 +45,8 @@
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
import org.apache.cloudstack.utils.identity.ManagementServerNode;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.cloud.agent.Listener;
import com.cloud.agent.api.AgentControlAnswer;
Expand All @@ -56,6 +55,9 @@
import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand;
import com.cloud.alert.AlertManager;
import com.cloud.configuration.Resource;
import com.cloud.event.EventTypes;
import com.cloud.event.UsageEventUtils;
import com.cloud.exception.ConnectionException;
import com.cloud.host.Host;
import com.cloud.host.Status;
Expand All @@ -65,6 +67,7 @@
import com.cloud.storage.dao.VMTemplateZoneDao;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.ResourceLimitService;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.Transaction;
Expand Down Expand Up @@ -102,6 +105,12 @@ public class ImageStoreUploadMonitorImpl extends ManagerBase implements ImageSto
private AlertManager _alertMgr;
@Inject
private VMTemplateZoneDao _vmTemplateZoneDao;
@Inject
private DataStoreManager dataStoreManager;
@Inject
private TemplateDataFactory templateFactory;
@Inject
private TemplateService templateService;

private long _nodeId;
private ScheduledExecutorService _executor = null;
Expand Down Expand Up @@ -395,6 +404,20 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
VMTemplateVO templateUpdate = _templateDao.createForUpdate();
templateUpdate.setSize(answer.getVirtualSize());
_templateDao.update(tmpTemplate.getId(), templateUpdate);
// For multi-disk OVA, check and create data disk templates
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i see the same commen t in three places. Is this eligible for a refactor as overloaded method?

if (tmpTemplate.getFormat().equals(Storage.ImageFormat.OVA)) {
final DataStore store = dataStoreManager.getDataStore(templateDataStore.getDataStoreId(), templateDataStore.getDataStoreRole());
final TemplateInfo templateInfo = templateFactory.getTemplate(tmpTemplate.getId(), store);
if (!templateService.createOvaDataDiskTemplates(templateInfo)) {
tmpTemplateDataStore.setDownloadState(VMTemplateStorageResourceAssoc.Status.ABANDONED);
tmpTemplateDataStore.setState(State.Failed);
stateMachine.transitTo(tmpTemplate, VirtualMachineTemplate.Event.OperationFailed, null, _templateDao);
msg = "Multi-disk OVA template " + tmpTemplate.getUuid() + " failed to process data disks";
s_logger.error(msg);
sendAlert = true;
break;
}
}
stateMachine.transitTo(tmpTemplate, VirtualMachineTemplate.Event.OperationSucceeded, null, _templateDao);
_resourceLimitMgr.incrementResourceCount(template.getAccountId(), Resource.ResourceType.secondary_storage, answer.getVirtualSize());
//publish usage event
Expand Down