Bug 1771333

Summary: Cannot import template from OVA if it has disks
Product: [oVirt] ovirt-engine Reporter: Lucia Jelinkova <ljelinko>
Component: BLL.VirtAssignee: Liran Rotenberg <lrotenbe>
Status: CLOSED WORKSFORME QA Contact: Nisim Simsolo <nsimsolo>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 4.4.0CC: bugs, derez, nsimsolo, rbarry, tnisan
Target Milestone: ovirt-4.4.1Flags: pm-rhel: ovirt-4.4+
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2020-05-19 15:36:32 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: Virt RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 1825638    
Bug Blocks:    

Description Lucia Jelinkova 2019-11-12 07:53:34 UTC
It is not possible to import a template from OVA file if it has disks.

Steps to Reproduce:
1. Create a VM and attach a disk to it
2. Create a template from the VM
3. Export the template as OVA
4. Import the OVA template file

Actual results:
The operation fails

Expected results:
The template should be created

Additional info:
The exception in the engine.log is:
ERROR [org.ovirt.engine.core.bll.exportimport.ImportVmTemplateFromOvaCommand] (EE-ManagedThreadFactory-engine-Thread-4072) [2c9a4d8a-ec84-4f5d-9781-aca861e7aaa0] Exception: java.lang.RuntimeException
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.createCommand(ResourceManager.java:355)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.runVdsCommand(ResourceManager.java:395)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager$Proxy$_$$_WeldSubclass.runVdsCommand$$super(Unknown Source)
	at jdk.internal.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:51)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
	at org.ovirt.engine.core.common//org.ovirt.engine.core.common.di.interceptor.LoggingInterceptor.apply(LoggingInterceptor.java:12)
	at jdk.internal.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
	at org.jboss.weld.core.5.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
	at org.jboss.weld.core.5.Final//org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
	at org.jboss.weld.core.5.Final//org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager$Proxy$_$$_WeldSubclass.runVdsCommand(Unknown Source)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.VDSBrokerFrontendImpl.runVdsCommand(VDSBrokerFrontendImpl.java:33)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.storage.disk.image.ImagesHandler.prepareImage(ImagesHandler.java:992)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.storage.disk.image.ImagesHandler.getQemuImageInfoFromVdsm(ImagesHandler.java:843)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.exportimport.ImportVmTemplateCommand.getQemuImageInfo(ImportVmTemplateCommand.java:795)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.exportimport.ImportVmTemplateCommand.updateDiskSizeByQcowImageInfo(ImportVmTemplateCommand.java:785)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.exportimport.ImportVmTemplateCommand.initImportClonedTemplateDisks(ImportVmTemplateCommand.java:372)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.exportimport.ImportVmTemplateCommand.lambda$executeCommand$1(ImportVmTemplateCommand.java:461)
	at org.ovirt.engine.core.utils//org.ovirt.engine.core.utils.transaction.TransactionSupport.executeInNewTransaction(TransactionSupport.java:202)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.exportimport.ImportVmTemplateCommand.executeCommand(ImportVmTemplateCommand.java:459)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.CommandBase.executeWithoutTransaction(CommandBase.java:1168)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.CommandBase.executeActionInTransactionScope(CommandBase.java:1326)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.CommandBase.runInTransaction(CommandBase.java:2005)
	at org.ovirt.engine.core.utils//org.ovirt.engine.core.utils.transaction.TransactionSupport.executeInSuppressed(TransactionSupport.java:164)
	at org.ovirt.engine.core.utils//org.ovirt.engine.core.utils.transaction.TransactionSupport.executeInScope(TransactionSupport.java:103)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.CommandBase.execute(CommandBase.java:1386)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.CommandBase.executeAction(CommandBase.java:420)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.PrevalidatingMultipleActionsRunner.executeValidatedCommand(PrevalidatingMultipleActionsRunner.java:204)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.PrevalidatingMultipleActionsRunner.runCommands(PrevalidatingMultipleActionsRunner.java:176)
	at deployment.engine.ear.bll.jar//org.ovirt.engine.core.bll.PrevalidatingMultipleActionsRunner.lambda$invokeCommands$3(PrevalidatingMultipleActionsRunner.java:182)
	at org.ovirt.engine.core.utils//org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil$InternalWrapperRunnable.run(ThreadPoolUtil.java:96)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
	at org.glassfish.javax.enterprise.concurrent//org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
	at org.jboss.as.ee.1.Final//org.jboss.as.ee.concurrent.service.ElytronManagedThreadFactory$ElytronManagedThread.run(ElytronManagedThreadFactory.java:78)
Caused by: java.lang.NullPointerException
	at java.base/java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.getVdsManager(ResourceManager.java:226)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager$Proxy$_$$_WeldSubclass.getVdsManager(Unknown Source)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.getVdsManager(ResourceManager.java:222)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager$Proxy$_$$_WeldSubclass.getVdsManager(Unknown Source)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.vdsbroker.VdsBrokerCommand.initializeVdsBroker(VdsBrokerCommand.java:65)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.vdsbroker.VdsBrokerCommand.<init>(VdsBrokerCommand.java:46)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.vdsbroker.ImageActionsVDSCommandBase.<init>(ImageActionsVDSCommandBase.java:10)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.vdsbroker.PrepareImageVDSCommand.<init>(PrepareImageVDSCommand.java:9)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.instantiateInjectedCommand(ResourceManager.java:365)
	at deployment.engine.ear//org.ovirt.engine.core.vdsbroker.ResourceManager.createCommand(ResourceManager.java:349)
	... 45 more

Comment 1 Lucia Jelinkova 2019-11-12 12:03:30 UTC
I looked at the issue and it seems that it might have been introduced by this commit:

https://github.com/oVirt/ovirt-engine/commit/797da354117b4d5bf3d83524d2275c5d01fdfe7e#diff-97a4ba06e96e5776340cd0d0ab200822

The newly added code expects the DiskImage to have storagePoolId set, but it was not for the OVA import. ImportVmTemplateFromOvaCommand overrides validateSourceStorageDomain method and does not set the storagePoolId. 

I tried to set the correct storagePoolId to the disk images but it started to fail with another NullPointerException in PrepareImageVDSCommand -> JsonRpcVdsServer.prepareImage. The PrepareImageReturn expected the response to contain "info" but it contained "status" saying:  Storage domain does not exist: (u'00000000-0000-0000-0000-000000000000',). 

I do not know the logic behind the code so I would appreciate help from the storage team with this. What should be the "correct" storage domain here? Or could you take over the issue and investigate?

Comment 2 Tal Nisan 2019-11-12 13:04:46 UTC
Daniel, you are the author of the patch from comment #1, can you please assist Lucia?

Comment 3 Liran Rotenberg 2020-05-19 15:36:32 UTC
Might be fixed in latest OVA bugs.
I tried the steps in comment #0 and it works.
Closing as works for me.