@Override
  public Void apply(IMachine machine) {
    List<IMedium> mediaToBeDeleted = ImmutableList.of();
    try {
      mediaToBeDeleted = machine.unregister(vmSpec.getCleanupMode());
    } catch (VBoxException e) {
      ErrorCode errorCode = ErrorCode.valueOf(e);
      switch (errorCode) {
        case VBOX_E_OBJECT_NOT_FOUND:
          logger.debug("Machine %s does not exists, cannot unregister", vmSpec.getVmName());
          break;
        default:
          throw e;
      }
    }

    List<IMedium> filteredMediaToBeDeleted =
        Lists.newArrayList(
            transform(
                filter(mediaToBeDeleted, new AutoDeleteHardDiskPredicate(vmSpec)),
                new DeleteChildrenOfMedium()));

    if (!filteredMediaToBeDeleted.isEmpty()) {
      try {
        IProgress deletion = machine.delete(filteredMediaToBeDeleted);
        deletion.waitForCompletion(-1);
      } catch (Exception e) {
        logger.error(e, "Problem in deleting the media attached to %s", machine.getName());
        Throwables.propagate(e);
      }
    }

    return null;
  }
  @Override
  @BeforeClass(groups = "live")
  public void setupContext() {
    super.setupContext();
    instanceName =
        VIRTUALBOX_IMAGE_PREFIX
            + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, getClass().getSimpleName());

    StorageController ideController =
        StorageController.builder()
            .name("IDE Controller")
            .bus(StorageBus.IDE)
            .attachISO(0, 0, operatingSystemIso)
            .attachHardDisk(
                HardDisk.builder()
                    .diskpath(adminDisk(instanceName))
                    .controllerPort(0)
                    .deviceSlot(1)
                    .autoDelete(true)
                    .build())
            .attachISO(1, 1, guestAdditionsIso)
            .build();

    VmSpec instanceVmSpec =
        VmSpec.builder()
            .id(instanceName)
            .name(instanceName)
            .osTypeId("")
            .memoryMB(512)
            .cleanUpMode(CleanupMode.Full)
            .controller(ideController)
            .forceOverwrite(true)
            .build();

    Injector injector = view.utils().injector();
    Function<String, String> configProperties =
        injector.getInstance(ValueOfConfigurationKeyOrNull.class);
    IsoSpec isoSpec =
        IsoSpec.builder()
            .sourcePath(operatingSystemIso)
            .installationScript(
                configProperties
                    .apply(VIRTUALBOX_INSTALLATION_KEY_SEQUENCE)
                    .replace("HOSTNAME", instanceVmSpec.getVmName()))
            .build();

    NetworkAdapter networkAdapter =
        NetworkAdapter.builder()
            .networkAttachmentType(NetworkAttachmentType.NAT)
            .tcpRedirectRule("127.0.0.1", 2222, "", 22)
            .build();
    NetworkInterfaceCard networkInterfaceCard =
        NetworkInterfaceCard.builder().addNetworkAdapter(networkAdapter).build();

    NetworkSpec networkSpec = NetworkSpec.builder().addNIC(networkInterfaceCard).build();
    machineSpec = MasterSpec.builder().iso(isoSpec).vm(instanceVmSpec).network(networkSpec).build();
  }