001/* 002 * To change this template, choose Tools | Templates 003 * and open the template in the editor. 004 */ 005package org.anarres.qemu.exec.recipe; 006 007import javax.annotation.Nonnegative; 008import javax.annotation.Nonnull; 009import org.anarres.qemu.exec.QEmuDeviceOption; 010import org.anarres.qemu.exec.QEmuDriveOption; 011import org.anarres.qemu.exec.host.disk.Disk; 012import org.anarres.qemu.exec.host.disk.FileDisk; 013import org.anarres.qemu.exec.util.QEmuIdAllocator; 014import org.anarres.qemu.exec.util.QEmuOptionsList; 015import org.anarres.qemu.image.QEmuImage; 016import org.anarres.qemu.image.QEmuImageFormat; 017 018/** 019 * 020 * @author shevek 021 */ 022public class QEmuVirtioDriveRecipe extends QEmuOptionsList implements QEmuRecipe { 023 024 // file=/var/tmp/qemu/sys-1/vda,if=none,id=drive-virtio-disk0,format=raw,cache=unsafe,aio=native 025 // public final QEmuDeviceOption.VirtioScsi busOption; 026 public final QEmuDriveOption driveOption; 027 // virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 028 public final QEmuDeviceOption.VirtioBlock deviceOption; 029 030 public QEmuVirtioDriveRecipe(@Nonnegative int index, @Nonnull Disk disk) { 031 // busOption = new QEmuDeviceOption.VirtioScsi(); 032 // add(busOption); 033 driveOption = new QEmuDriveOption(index, disk) 034 .withInterface(QEmuDriveOption.Interface.none) 035 .withId("backend-disk-" + index) 036 .withAio(QEmuDriveOption.Aio._native); 037 add(driveOption); 038 // virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 039 deviceOption = new QEmuDeviceOption.VirtioBlock(); 040 deviceOption 041 .withId("virtio-disk-" + index) 042 .withProperty("scsi", "off") 043 .withProperty("drive", driveOption.id); 044 add(deviceOption); 045 } 046 047 public QEmuVirtioDriveRecipe(@Nonnegative int index, @Nonnull QEmuImage image) { 048 this(index, new FileDisk(image)); 049 } 050 051 public QEmuVirtioDriveRecipe(@Nonnegative int index, @Nonnull String path) { 052 this(index, new FileDisk(path)); 053 } 054 055 public QEmuVirtioDriveRecipe(@Nonnegative QEmuIdAllocator allocator, @Nonnull Disk disk) { 056 this(allocator.newDriveIndex(), disk); 057 } 058 059 public QEmuVirtioDriveRecipe(@Nonnegative QEmuIdAllocator allocator, @Nonnull QEmuImage image) { 060 this(allocator.newDriveIndex(), new FileDisk(image)); 061 } 062 063 public QEmuVirtioDriveRecipe(@Nonnegative QEmuIdAllocator allocator, @Nonnull String path) { 064 this(allocator.newDriveIndex(), new FileDisk(path)); 065 } 066 067 @Nonnull 068 public QEmuVirtioDriveRecipe withFormat(@Nonnull QEmuImageFormat format) { 069 driveOption.withFormat(format); 070 return this; 071 } 072 073 @Nonnull 074 public QEmuVirtioDriveRecipe withCache(@Nonnull QEmuDriveOption.Cache cache) { 075 driveOption.withCache(cache); 076 return this; 077 } 078 079 @Nonnull 080 public QEmuVirtioDriveRecipe withAio(@Nonnull QEmuDriveOption.Aio aio) { 081 driveOption.withAio(aio); 082 return this; 083 } 084 085 @Nonnull 086 public QEmuVirtioDriveRecipe withPciAddress(@Nonnull String address) { 087 deviceOption.withPciAddress(address); 088 return this; 089 } 090 091 @Nonnull 092 public QEmuVirtioDriveRecipe withPciAddress(@Nonnull QEmuIdAllocator allocator) { 093 deviceOption.withPciAddress(allocator); 094 return this; 095 } 096 097 @Nonnull 098 public QEmuVirtioDriveRecipe withProperty(@Nonnull String key, @Nonnull String value) { 099 deviceOption.withProperty(key, value); 100 return this; 101 } 102}