2727import com .cloud .utils .Pair ;
2828import com .cloud .utils .exception .CloudRuntimeException ;
2929import com .cloud .vm .VirtualMachine ;
30- import org .apache .cloudstack .utils .qemu .QemuImg ;
31- import org .apache .cloudstack .utils .qemu .QemuImgException ;
32- import org .apache .cloudstack .utils .qemu .QemuImgFile ;
3330import org .apache .cloudstack .vm .UnmanagedInstanceTO ;
3431import org .apache .commons .lang3 .StringUtils ;
3532import org .apache .log4j .Logger ;
3633import org .libvirt .Connect ;
3734import org .libvirt .Domain ;
35+ import org .libvirt .DomainBlockInfo ;
3836import org .libvirt .LibvirtException ;
3937
4038import java .util .ArrayList ;
4139import java .util .HashMap ;
4240import java .util .List ;
43- import java .util .Map ;
4441
4542@ ResourceWrapper (handles =GetUnmanagedInstancesCommand .class )
4643public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWrapper <GetUnmanagedInstancesCommand , GetUnmanagedInstancesAnswer , LibvirtComputingResource > {
@@ -132,7 +129,7 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
132129 instance .setPowerState (getPowerState (libvirtComputingResource .getVmState (conn ,domain .getName ())));
133130 instance .setMemory ((int ) LibvirtComputingResource .getDomainMemory (domain ) / 1024 );
134131 instance .setNics (getUnmanagedInstanceNics (parser .getInterfaces ()));
135- instance .setDisks (getUnmanagedInstanceDisks (parser .getDisks (),libvirtComputingResource ));
132+ instance .setDisks (getUnmanagedInstanceDisks (parser .getDisks (),libvirtComputingResource , conn , domain . getName () ));
136133 instance .setVncPassword (parser .getVncPasswd () + "aaaaaaaaaaaaaa" ); // Suffix back extra characters for DB compatibility
137134
138135 return instance ;
@@ -170,7 +167,7 @@ private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef
170167 return nics ;
171168 }
172169
173- private List <UnmanagedInstanceTO .Disk > getUnmanagedInstanceDisks (List <LibvirtVMDef .DiskDef > disksInfo , LibvirtComputingResource libvirtComputingResource ) {
170+ private List <UnmanagedInstanceTO .Disk > getUnmanagedInstanceDisks (List <LibvirtVMDef .DiskDef > disksInfo , LibvirtComputingResource libvirtComputingResource , Connect conn , String domainName ) {
174171 final ArrayList <UnmanagedInstanceTO .Disk > disks = new ArrayList <>(disksInfo .size ());
175172 int counter = 0 ;
176173 for (LibvirtVMDef .DiskDef diskDef : disksInfo ) {
@@ -180,14 +177,11 @@ private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMD
180177
181178 final UnmanagedInstanceTO .Disk disk = new UnmanagedInstanceTO .Disk ();
182179 Long size = null ;
183- String imagePath = null ;
184180 try {
185- QemuImgFile file = new QemuImgFile (diskDef .getSourcePath ());
186- QemuImg qemu = new QemuImg (0 );
187- Map <String , String > info = qemu .info (file );
188- size = Long .parseLong (info .getOrDefault ("virtual_size" , "0" ));
189- imagePath = info .getOrDefault ("image" , null );
190- } catch (QemuImgException | LibvirtException e ) {
181+ Domain dm = conn .domainLookupByName (domainName );
182+ DomainBlockInfo blockInfo = dm .blockInfo (diskDef .getDiskLabel ());
183+ size = blockInfo .getCapacity ();
184+ } catch (LibvirtException e ) {
191185 throw new RuntimeException (e );
192186 }
193187
@@ -203,14 +197,17 @@ private List<UnmanagedInstanceTO.Disk> getUnmanagedInstanceDisks(List<LibvirtVMD
203197 disk .setDatastoreHost (sourceHostPath .first ());
204198 disk .setDatastorePath (sourceHostPath .second ());
205199 } else {
206- disk .setDatastorePath (diskDef .getSourcePath ());
200+ int pathEnd = diskDef .getSourcePath ().lastIndexOf ("/" );
201+ if (pathEnd >= 0 ) {
202+ disk .setDatastorePath (diskDef .getSourcePath ().substring (0 , pathEnd ));
203+ }
207204 disk .setDatastoreHost (diskDef .getSourceHost ());
208205 }
209206
210207 disk .setDatastoreType (diskDef .getDiskType ().toString ());
211208 disk .setDatastorePort (diskDef .getSourceHostPort ());
212- disk .setImagePath (imagePath );
213- disk .setDatastoreName (imagePath . substring ( imagePath . lastIndexOf ( "/" ) ));
209+ disk .setImagePath (diskDef . getSourcePath () );
210+ disk .setDatastoreName (disk . getDatastorePath ( ));
214211 disks .add (disk );
215212 }
216213 return disks ;
0 commit comments