@SuppressWarnings("serial")
  @Before
  public void setUp() {
    RemoveImageParameters params = new RemoveImageParameters(Guid.newGuid());
    cmd =
        spy(
            new RemoveImageCommand<RemoveImageParameters>(params) {
              @Override
              protected void initImage() {
                // Stub implementation for testing
              }

              @Override
              protected void initStoragePoolId() {
                // Stub implementation for testing
              }

              @Override
              protected void initStorageDomainId() {
                // Stub implementation for testing
              }

              @Override
              protected void initContainerDetails(ImagesContainterParametersBase parameters) {
                // Stub implementation for testing
              }
            });
    doReturn(snapshotDAO).when(cmd).getSnapshotDao();

    SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository);
  }
  protected void mockInterfaceList() {
    SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository);

    ArrayList<String> diskInterfaces =
        new ArrayList<String>(Arrays.asList(new String[] {"IDE", "VirtIO", "VirtIO_SCSI"}));

    when(osRepository.getDiskInterfaces(anyInt(), any(Version.class))).thenReturn(diskInterfaces);
  }
 public RunVmValidator(
     VM vm, RunVmParams rumVmParam, boolean isInternalExecution, Guid activeIsoDomainId) {
   this.vm = vm;
   this.runVmParam = rumVmParam;
   this.isInternalExecution = isInternalExecution;
   this.activeIsoDomainId = activeIsoDomainId;
   this.osRepository = SimpleDependecyInjector.getInstance().get(OsRepository.class);
 }
  protected void initializeCommand(UpdateVmDiskParameters params, List<VM> vms) {
    // Done before creating the spy to have correct values during the ctor run
    mockCtorRelatedDaoCalls(vms);
    command =
        spy(
            new UpdateVmDiskCommand<UpdateVmDiskParameters>(params) {
              // Overridden here and not during spying, since it's called in the constructor
              @SuppressWarnings("synthetic-access")
              @Override
              public DiskDao getDiskDao() {
                return diskDao;
              }

              @Override
              public VmDao getVmDao() {
                return vmDao;
              }
            });
    doReturn(true).when(command).acquireLockInternal();
    doReturn(snapshotDao).when(command).getSnapshotDao();
    doReturn(diskImageDao).when(command).getDiskImageDao();
    doReturn(storagePoolDao).when(command).getStoragePoolDao();
    doReturn(storageDomainStaticDao).when(command).getStorageDomainStaticDao();
    doReturn(storageDomainDao).when(command).getStorageDomainDao();
    doReturn(vmStaticDao).when(command).getVmStaticDao();
    doReturn(baseDiskDao).when(command).getBaseDiskDao();
    doReturn(imageDao).when(command).getImageDao();
    doReturn(vmDeviceDao).when(command).getVmDeviceDao();
    doReturn(vmDao).when(command).getVmDao();
    doReturn(diskDao).when(command).getDiskDao();
    doNothing().when(command).reloadDisks();
    doNothing().when(command).updateBootOrder();
    doNothing().when(vmStaticDao).incrementDbGeneration(any(Guid.class));

    SnapshotsValidator snapshotsValidator = mock(SnapshotsValidator.class);
    doReturn(snapshotsValidator).when(command).getSnapshotsValidator();
    doReturn(ValidationResult.VALID).when(snapshotsValidator).vmNotDuringSnapshot(any(Guid.class));
    doReturn(ValidationResult.VALID).when(snapshotsValidator).vmNotInPreview(any(Guid.class));
    when(diskValidator.isVirtIoScsiValid(any(VM.class))).thenReturn(ValidationResult.VALID);
    when(diskValidator.isDiskUsedAsOvfStore()).thenReturn(ValidationResult.VALID);
    doReturn(true).when(command).setAndValidateDiskProfiles();

    SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository);

    mockVds();
    mockVmsStoragePoolInfo(vms);
    mockToUpdateDiskVm(vms);

    StorageDomain sd = new StorageDomain();
    sd.setAvailableDiskSize(Integer.MAX_VALUE);
    sd.setStatus(StorageDomainStatus.Active);
    when(storageDomainDao.getForStoragePool(any(Guid.class), any(Guid.class))).thenReturn(sd);
    StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
    doReturn(sdValidator).when(command).getStorageDomainValidator(any(DiskImage.class));
  }
 private void initializeCommand(Guid storageId, AddDiskParameters params) {
   params.setStorageDomainId(storageId);
   command = spy(new AddDiskCommand<AddDiskParameters>(params));
   doReturn(true).when(command).acquireLockInternal();
   doReturn(storageDomainDao).when(command).getStorageDomainDao();
   doReturn(storagePoolIsoMapDao).when(command).getStoragePoolIsoMapDao();
   doReturn(storagePoolDao).when(command).getStoragePoolDao();
   doReturn(vmNicDao).when(command).getVmNicDao();
   doReturn(diskLunMapDao).when(command).getDiskLunMapDao();
   doReturn(vmDao).when(command).getVmDao();
   doNothing().when(command).updateDisksFromDb();
   doReturn(true).when(command).checkImageConfiguration();
   doReturn(mockSnapshotValidator()).when(command).getSnapshotsValidator();
   doReturn(false).when(command).isVirtioScsiControllerAttached(any(Guid.class));
   doReturn(false).when(command).hasWatchdog(any(Guid.class));
   doReturn(false).when(command).isBalloonEnabled(any(Guid.class));
   doReturn(false).when(command).isSoundDeviceEnabled(any(Guid.class));
   doReturn(true).when(command).setAndValidateDiskProfiles();
   SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository);
 }
public abstract class VmInfoBuilderBase {

  protected static final Log log = LogFactory.getLog(VmInfoBuilderBase.class);
  protected Map<String, Object> createInfo;
  protected VM vm;
  // IDE supports only 4 slots , slot 2 is preserved by VDSM to the CDROM
  protected int[] ideIndexSlots = new int[] {0, 1, 3};

  protected OsRepository osRepository =
      SimpleDependecyInjector.getInstance().get(OsRepository.class);
  private VDSGroup vdsGroup;

  private static class DiskImageByBootAndSnapshotComparator
      implements Comparator<Disk>, Serializable {
    private static final long serialVersionUID = 4732164571328497830L;

    @Override
    public int compare(Disk o1, Disk o2) {
      Boolean boot1 = o1.isBoot();
      Boolean boot2 = o2.isBoot();
      int bootResult = boot1.compareTo(boot2);
      if (bootResult == 0 && o1.isBoot()) {
        return Boolean.compare(o2.isDiskSnapshot(), o1.isDiskSnapshot());
      }
      return bootResult;
    }
  }

  protected void buildVmProperties() {
    createInfo.put(VdsProperties.vm_guid, vm.getId().toString());
    createInfo.put(VdsProperties.vm_name, vm.getName());
    createInfo.put(VdsProperties.mem_size_mb, vm.getVmMemSizeMb());
    createInfo.put(VdsProperties.mem_guaranteed_size_mb, vm.getMinAllocatedMem());
    createInfo.put(VdsProperties.smartcardEnabled, Boolean.toString(vm.isSmartcardEnabled()));
    createInfo.put(VdsProperties.num_of_cpus, String.valueOf(vm.getNumOfCpus()));
    if (Config.<Boolean>getValue(ConfigValues.SendSMPOnRunVm)) {
      createInfo.put(VdsProperties.cores_per_socket, (Integer.toString(vm.getCpuPerSocket())));
      if (FeatureSupported.supportedInConfig(
          ConfigValues.HotPlugCpuSupported,
          vm.getVdsGroupCompatibilityVersion(),
          vm.getClusterArch())) {
        createInfo.put(
            VdsProperties.max_number_of_cpus,
            String.valueOf(
                Config.<Integer>getValue(
                    ConfigValues.MaxNumOfVmCpus, vm.getVdsGroupCompatibilityVersion().getValue())));
      }
    }
    final String compatibilityVersion = vm.getVdsGroupCompatibilityVersion().toString();
    addCpuPinning(compatibilityVersion);
    createInfo.put(VdsProperties.emulatedMachine, getVdsGroup().getEmulatedMachine());
    // send cipher suite and spice secure channels parameters only if ssl
    // enabled.
    if (Config.<Boolean>getValue(ConfigValues.SSLEnabled)) {
      createInfo.put(
          VdsProperties.spiceSslCipherSuite, Config.<String>getValue(ConfigValues.CipherSuite));
      createInfo.put(
          VdsProperties.SpiceSecureChannels,
          Config.<String>getValue(ConfigValues.SpiceSecureChannels, compatibilityVersion));
    }
    createInfo.put(VdsProperties.kvmEnable, vm.getKvmEnable().toString().toLowerCase());
    createInfo.put(VdsProperties.acpiEnable, vm.getAcpiEnable().toString().toLowerCase());

    createInfo.put(
        VdsProperties.Custom,
        VmPropertiesUtils.getInstance()
            .getVMProperties(vm.getVdsGroupCompatibilityVersion(), vm.getStaticData()));
    createInfo.put(VdsProperties.vm_type, "kvm"); // "qemu", "kvm"
    if (vm.isRunAndPause()) {
      createInfo.put(VdsProperties.launch_paused_param, "true");
    }
    if (vm.isUseHostCpuFlags()) {
      createInfo.put(VdsProperties.cpuType, "hostPassthrough");
    } else if (vm.getVdsGroupCpuFlagsData() != null) {
      createInfo.put(VdsProperties.cpuType, vm.getVdsGroupCpuFlagsData());
    }
    createInfo.put(VdsProperties.niceLevel, String.valueOf(vm.getNiceLevel()));
    if (vm.getCpuShares() > 0) {
      createInfo.put(VdsProperties.cpuShares, String.valueOf(vm.getCpuShares()));
    }
    if (!StringUtils.isEmpty(vm.getHibernationVolHandle())) {
      createInfo.put(VdsProperties.hiberVolHandle, vm.getHibernationVolHandle());
    }

    String keyboardLayout = vm.getDynamicData().getVncKeyboardLayout();
    if (keyboardLayout == null) {
      keyboardLayout = vm.getDefaultVncKeyboardLayout();
      if (keyboardLayout == null) {
        keyboardLayout = Config.<String>getValue(ConfigValues.VncKeyboardLayout);
      }
    }

    createInfo.put(VdsProperties.KeyboardLayout, keyboardLayout);
    if (osRepository.isLinux(vm.getVmOsId())) {
      createInfo.put(VdsProperties.PitReinjection, "false");
    }

    if (vm.getDisplayType() == DisplayType.vnc) {
      createInfo.put(VdsProperties.TabletEnable, "true");
    }
    createInfo.put(
        VdsProperties.transparent_huge_pages, vm.isTransparentHugePages() ? "true" : "false");
  }

  private void addCpuPinning(final String compatibilityVersion) {
    final String cpuPinning = vm.getCpuPinning();
    if (StringUtils.isNotEmpty(cpuPinning)
        && Boolean.TRUE.equals(
            Config.<Boolean>getValue(ConfigValues.CpuPinningEnabled, compatibilityVersion))) {
      final Map<String, Object> pinDict = new HashMap<String, Object>();
      for (String pin : cpuPinning.split("_")) {
        final String[] split = pin.split("#");
        pinDict.put(split[0], split[1]);
      }
      createInfo.put(VdsProperties.cpuPinning, pinDict);
    }
  }

  protected void buildVmNetworkCluster() {
    // set Display network
    List<NetworkCluster> all =
        DbFacade.getInstance().getNetworkClusterDao().getAllForCluster(vm.getVdsGroupId());
    NetworkCluster networkCluster = null;
    for (NetworkCluster tempNetworkCluster : all) {
      if (tempNetworkCluster.isDisplay()) {
        networkCluster = tempNetworkCluster;
        break;
      }
    }
    if (networkCluster != null) {
      Network net = null;
      List<Network> allNetworks = DbFacade.getInstance().getNetworkDao().getAll();
      for (Network tempNetwork : allNetworks) {
        if (tempNetwork.getId().equals(networkCluster.getNetworkId())) {
          net = tempNetwork;
          break;
        }
      }
      if (net != null) {
        createInfo.put(VdsProperties.DISPLAY_NETWORK, net.getName());
      }
    }
  }

  protected void buildVmBootOptions() {
    // Boot Options
    if (!StringUtils.isEmpty(vm.getInitrdUrl())) {
      createInfo.put(VdsProperties.InitrdUrl, vm.getInitrdUrl());
    }
    if (!StringUtils.isEmpty(vm.getKernelUrl())) {
      createInfo.put(VdsProperties.KernelUrl, vm.getKernelUrl());

      if (!StringUtils.isEmpty(vm.getKernelParams())) {
        createInfo.put(VdsProperties.KernelParams, vm.getKernelParams());
      }
    }
  }

  protected void buildVmTimeZone() {
    // get vm timezone
    String timeZone = getTimeZoneForVm(vm);

    String javaZoneId = null;
    if (osRepository.isWindows(vm.getOs())) {
      // convert to java & calculate offset
      javaZoneId = WindowsJavaTimezoneMapping.windowsToJava.get(timeZone);
    } else {
      javaZoneId = timeZone;
    }

    int offset = 0;
    if (javaZoneId != null) {
      offset = (TimeZone.getTimeZone(javaZoneId).getOffset(new Date().getTime()) / 1000);
    }
    createInfo.put(VdsProperties.utc_diff, "" + offset);
  }

  private String getTimeZoneForVm(VM vm) {
    if (!StringUtils.isEmpty(vm.getTimeZone())) {
      return vm.getTimeZone();
    }

    // else fallback to engine config default for given OS type
    if (osRepository.isWindows(vm.getOs())) {
      return Config.<String>getValue(ConfigValues.DefaultWindowsTimeZone);
    } else {
      return "Etc/GMT";
    }
  }

  protected List<Disk> getSortedDisks() {
    // order first by drive numbers and then order by boot for the bootable
    // drive to be first (important for IDE to be index 0) !
    List<Disk> diskImages = new ArrayList<Disk>(vm.getDiskMap().values());
    Collections.sort(diskImages, new DiskImageByDiskAliasComparator());
    Collections.sort(
        diskImages, Collections.reverseOrder(new DiskImageByBootAndSnapshotComparator()));
    return diskImages;
  }

  protected void logUnsupportedInterfaceType() {
    log.error("Unsupported interface type, ISCSI interface type is not supported.");
  }

  protected static void reportUnsupportedVnicProfileFeatures(
      VM vm,
      VmNic nic,
      VnicProfile vnicProfile,
      List<VNIC_PROFILE_PROPERTIES> unsupportedFeatures) {

    if (unsupportedFeatures.isEmpty()) {
      return;
    }

    AuditLogableBase event = new AuditLogableBase();
    event.setVmId(vm.getId());
    event.setVdsGroupId(vm.getVdsGroupId());
    event.setCustomId(nic.getId().toString());
    event.setCompatibilityVersion(vm.getVdsGroupCompatibilityVersion().toString());
    event.addCustomValue("NicName", nic.getName());
    event.addCustomValue("VnicProfile", vnicProfile == null ? null : vnicProfile.getName());
    String[] unsupportedFeatureNames = new String[unsupportedFeatures.size()];
    for (int i = 0; i < unsupportedFeatures.size(); i++) {
      unsupportedFeatureNames[i] = unsupportedFeatures.get(i).getFeatureName();
    }

    event.addCustomValue("UnsupportedFeatures", StringUtils.join(unsupportedFeatureNames, ", "));
    AuditLogDirector.log(event, AuditLogType.VNIC_PROFILE_UNSUPPORTED_FEATURES);
  }

  protected static VmDevice getVmDeviceByDiskId(Guid diskId, Guid vmId) {
    // get vm device for this disk from DB
    return DbFacade.getInstance().getVmDeviceDao().get(new VmDeviceId(diskId, vmId));
  }

  public void buildVmSerialNumber() {
    new VmSerialNumberBuilder(vm, getVdsGroup(), createInfo).buildVmSerialNumber();
  }

  protected abstract void buildVmVideoCards();

  protected abstract void buildVmCD();

  protected abstract void buildVmFloppy();

  protected abstract void buildVmDrives();

  protected abstract void buildVmNetworkInterfaces();

  protected abstract void buildVmSoundDevices();

  protected abstract void buildVmConsoleDevice();

  protected abstract void buildUnmanagedDevices();

  protected abstract void buildVmBootSequence();

  protected abstract void buildSysprepVmPayload(String strSysPrepContent);

  protected abstract void buildCloudInitVmPayload(Map<String, byte[]> cloudInitContent);

  protected abstract void buildVmUsbDevices();

  protected abstract void buildVmMemoryBalloon();

  protected abstract void buildVmWatchdog();

  protected abstract void buildVmVirtioScsi();

  protected static enum VNIC_PROFILE_PROPERTIES {
    PORT_MIRRORING("Port Mirroring"),
    CUSTOM_PROPERTIES("Custom Properties"),
    NETWORK_QOS("Network QoS");

    private String featureName;

    private VNIC_PROFILE_PROPERTIES(String featureName) {
      this.featureName = featureName;
    }

    public String getFeatureName() {
      return featureName;
    }
  };

  protected VDSGroup getVdsGroup() {
    if (vdsGroup == null) {
      vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(vm.getVdsGroupId());
    }
    return vdsGroup;
  }
}
 private void mockMaxPciSlots() {
   SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository);
   doReturn(MAX_PCI_SLOTS).when(osRepository).getMaxPciDevices(anyInt(), any(Version.class));
 }
public class OvfTemplateReader extends OvfReader {
  protected VmTemplate _vmTemplate;
  private final OsRepository osRepository =
      SimpleDependecyInjector.getInstance().get(OsRepository.class);

  public OvfTemplateReader(
      XmlDocument document,
      VmTemplate vmTemplate,
      ArrayList<DiskImage> images,
      ArrayList<VmNetworkInterface> interfaces) {
    super(document, images, interfaces, vmTemplate);
    _vmTemplate = vmTemplate;
  }

  @Override
  protected void readOsSection(XmlNode section) {
    _vmTemplate.setId(new Guid(section.attributes.get("ovf:id").getValue()));
    XmlNode node = section.SelectSingleNode("Description");
    if (node != null) {
      int osId = osRepository.getOsIdByUniqueName(node.innerText);
      _vmTemplate.setOsId(osId);
      _vmTemplate.setClusterArch(osRepository.getArchitectureFromOS(osId));
    } else {
      _vmTemplate.setClusterArch(ArchitectureType.undefined);
    }
  }

  @Override
  protected void readDiskImageItem(XmlNode node) {
    final Guid guid = new Guid(node.SelectSingleNode("rasd:InstanceId", _xmlNS).innerText);

    DiskImage image =
        LinqUtils.firstOrNull(
            _images,
            new Predicate<DiskImage>() {
              @Override
              public boolean eval(DiskImage diskImage) {
                return diskImage.getImageId().equals(guid);
              }
            });
    image.setId(
        OvfParser.GetImageGrupIdFromImageFile(
            node.SelectSingleNode("rasd:HostResource", _xmlNS).innerText));
    if (StringUtils.isNotEmpty(node.SelectSingleNode("rasd:Parent", _xmlNS).innerText)) {
      image.setParentId(new Guid(node.SelectSingleNode("rasd:Parent", _xmlNS).innerText));
    }
    if (StringUtils.isNotEmpty(node.SelectSingleNode("rasd:Template", _xmlNS).innerText)) {
      image.setImageTemplateId(new Guid(node.SelectSingleNode("rasd:Template", _xmlNS).innerText));
    }
    image.setAppList(node.SelectSingleNode("rasd:ApplicationList", _xmlNS).innerText);
    if (StringUtils.isNotEmpty(node.SelectSingleNode("rasd:StorageId", _xmlNS).innerText)) {
      image.setStorageIds(
          new ArrayList<Guid>(
              Arrays.asList(new Guid(node.SelectSingleNode("rasd:StorageId", _xmlNS).innerText))));
    }
    if (StringUtils.isNotEmpty(node.SelectSingleNode("rasd:StoragePoolId", _xmlNS).innerText)) {
      image.setStoragePoolId(
          new Guid(node.SelectSingleNode("rasd:StoragePoolId", _xmlNS).innerText));
    }
    final Date creationDate =
        OvfParser.UtcDateStringToLocaDate(
            node.SelectSingleNode("rasd:CreationDate", _xmlNS).innerText);
    if (creationDate != null) {
      image.setCreationDate(creationDate);
    }
    final Date lastModified =
        OvfParser.UtcDateStringToLocaDate(
            node.SelectSingleNode("rasd:LastModified", _xmlNS).innerText);
    if (lastModified != null) {
      image.setLastModified(lastModified);
    }
    readManagedVmDevice(node, image.getId());
  }

  @Override
  protected void readGeneralData(XmlNode content) {
    // General Vm
    XmlNode node = content.SelectSingleNode(OvfProperties.NAME);
    if (node != null) {
      _vmTemplate.setName(node.innerText);
      name = _vmTemplate.getName();
    }
    node = content.SelectSingleNode(OvfProperties.TEMPLATE_ID);
    if (node != null) {
      if (StringUtils.isNotEmpty(node.innerText)) {
        _vmTemplate.setId(new Guid(node.innerText));
      }
    }

    node = content.SelectSingleNode(OvfProperties.IS_DISABLED);
    if (node != null) {
      _vmTemplate.setDisabled(Boolean.parseBoolean(node.innerText));
    }

    node = content.SelectSingleNode(OvfProperties.TRUSTED_SERVICE);
    if (node != null) {
      _vmTemplate.setTrustedService(Boolean.parseBoolean(node.innerText));
    }

    node = content.SelectSingleNode(OvfProperties.TEMPLATE_TYPE);
    if (node != null) {
      _vmTemplate.setTemplateType(VmEntityType.valueOf(node.innerText));
    }

    node = content.SelectSingleNode(OvfProperties.BASE_TEMPLATE_ID);
    if (node != null) {
      _vmTemplate.setBaseTemplateId(Guid.createGuidFromString(node.innerText));
    } else {
      // in case base template is missing, we assume it is a base template
      _vmTemplate.setBaseTemplateId(_vmTemplate.getId());
    }

    node = content.SelectSingleNode(OvfProperties.TEMPLATE_VERSION_NUMBER);
    if (node != null) {
      _vmTemplate.setTemplateVersionNumber(Integer.parseInt(node.innerText));
    }

    node = content.SelectSingleNode(OvfProperties.TEMPLATE_VERSION_NAME);
    if (node != null) {
      _vmTemplate.setTemplateVersionName(node.innerText);
    }

    node = content.SelectSingleNode("AutoStartup");
    if (node != null) {
      _vmTemplate.setAutoStartup(Boolean.parseBoolean(node.innerText));
    }
  }

  @Override
  protected String getDefaultDisplayTypeStringRepresentation() {
    return OvfProperties.TEMPLATE_DEFAULT_DISPLAY_TYPE;
  }
}