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}