From 2004b97ab3032a7c5841f05b41886d45df0b9a02 Mon Sep 17 00:00:00 2001
From: Volker Hilsheimer <volker.hilsheimer@qt.io>
Date: Thu, 23 May 2019 18:37:54 +0200
Subject: [PATCH] Basic support for vmware

Implement folder sharing and disk support, hiding the differences
between VMWare and VirtualBox.

Add basic scripting for packaging an existing VMWare machine into
a vagrant base-box. Exporting a pre-built basebox from VirtualBox
as an OVA, then importing it into VMWare, then packaging it.
---
 basebox/package-vmware.sh    |  10 ++++
 basebox/vmware/metadata.json |   4 ++
 minicoin/Vagrantfile         | 103 ++++++++++++++++++++++++-----------
 3 files changed, 86 insertions(+), 31 deletions(-)
 create mode 100755 basebox/package-vmware.sh
 create mode 100644 basebox/vmware/metadata.json

diff --git a/basebox/package-vmware.sh b/basebox/package-vmware.sh
new file mode 100755
index 0000000..72f8d2b
--- /dev/null
+++ b/basebox/package-vmware.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set +ex
+
+if [[ $# < 2 ]]; then
+  echo "Usage: $0 name folder"
+  exit 1
+fi
+
+tar zcvf $1.box -Cvmware ./metadata.json "-C$2" .
+vagrant box add $1.box --name vmware/$1 --provider vmware_desktop
diff --git a/basebox/vmware/metadata.json b/basebox/vmware/metadata.json
new file mode 100644
index 0000000..00eee76
--- /dev/null
+++ b/basebox/vmware/metadata.json
@@ -0,0 +1,4 @@
+{
+  "provider": "vmware_desktop"
+}
+
diff --git a/minicoin/Vagrantfile b/minicoin/Vagrantfile
index 8db45e8..71d0ed7 100644
--- a/minicoin/Vagrantfile
+++ b/minicoin/Vagrantfile
@@ -183,41 +183,59 @@ def insert_disk(box, disk_filename, role_params)
       return false
     end
 
-    box.vm.provider "virtualbox" do |vb|
+    disk_settings = disk_data["settings"] unless disk_data.nil?
+    if disk_settings.nil?
+      disk_settings = {}
+    end
+    # default settings, disks can override
+    disk_settings["storagectl"] = "SATA" unless !disk_settings["storagectl"].nil?
+
+    if disk_file.end_with?(".iso")
+      disk_settings["port"] = "1" unless !disk_settings["port"].nil?
+      disk_settings["type"] = "dvddrive" unless !disk_settings["type"].nil?
+    elsif disk_file.end_with?(".vdi") || disk_file.end_with?(".vmdk")
+      disk_settings["port"] = "2" unless !disk_settings["port"].nil?
+      disk_settings["type"] = "hdd" unless !disk_settings["type"].nil?
+      disk_settings["mtype"] = "multiattach" unless !disk_settings["mtype"].nil?
+    end
+
+    # boxes can override disk settings
+    if role_params.is_a?(Hash)
+      role_params.each do |key, value|
+        disk_settings[key] = value
+      end
+    end
+
+    box.vm.provider :virtualbox do |vb|
       storage_params = [
         "storageattach", :id,
         "--medium", "#{disk_cache}/#{disk_file}",
       ]
 
-      disk_settings = disk_data["settings"] unless disk_data.nil?
-      if disk_settings.nil?
-        disk_settings = {}
-      end
-
-      # default settings, disks can override
-      disk_settings["storagectl"] = "SATA" unless !disk_settings["storagectl"].nil?
-
-      if disk_file.end_with?(".iso")
-        disk_settings["port"] = "1" unless !disk_settings["port"].nil?
-        disk_settings["type"] = "dvddrive" unless !disk_settings["type"].nil?
-      elsif disk_file.end_with?(".vdi")
-        disk_settings["port"] = "2" unless !disk_settings["port"].nil?
-        disk_settings["type"] = "hdd" unless !disk_settings["type"].nil?
-        disk_settings["mtype"] = "multiattach" unless !disk_settings["mtype"].nil?
-      end
-
-      # boxes can override disk settings
-      if role_params.is_a?(Hash)
-        role_params.each do |key, value|
-          disk_settings[key] = value
-        end
-      end
-
       disk_settings.each do |key, value|
         storage_params += ["--#{key}", "#{value}"]
       end
       vb.customize storage_params
     end
+    box.vm.provider :vmware_desktop do |vmware|
+      # map defaults to VMWare
+      device_ctl = "sata0:" if disk_settings["storagectl"] == "SATA"
+      device_ctl = "ide0:" if disk_settings["storagectrl"] == "IDE"
+      device_port = disk_settings["port"]
+
+      device_string = "#{device_ctl}#{device_port}"
+      puts "Inserting disk in #{device_string}"
+      if disk_settings["type"] == "dvddrive"
+        device_type = "cdrom-image"
+      elsif disk_settings["type"] == "hdd"
+        device_type = "disk"
+      end
+
+      vmware.vmx["#{device_string}.present"] = "TRUE"
+      vmware.vmx["#{device_string}.deviceType"] = device_type
+      vmware.vmx["#{device_string}.filename"] = "#{disk_cache}/#{disk_file}"
+      vmware.vmx["#{device_string}.startConnected"] = "TRUE"
+    end
   end
   return true
 end
@@ -448,7 +466,7 @@ end
 
   # VirtualBox specific settings
 def virtualbox_setup(box, machine)
-  box.vm.provider "virtualbox" do |vb|
+  box.vm.provider :virtualbox do |vb|
     vb.memory = machine["memory"] unless machine["memory"].nil?
     vb.cpus = machine["cpus"] unless machine["cpus"].nil?
     vb.gui = machine["gui"] unless machine["gui"].nil?
@@ -521,10 +539,36 @@ def virtualbox_setup(box, machine)
         key, value
       ]
     end
+  end
+end
 
+def vmware_setup(box, machine)
+  box.vm.provider :vmware_desktop do |vmware|
+    vmware.gui = machine["gui"] unless machine["gui"].nil?
+    vmware.vmx["memsize"] = machine["memory"] unless machine["memory"].nil?
+    vmware.vmx["numvcpus"] = machine["cpus"] unless machine["cpus"].nil?
+    vmware.vmx["svga.vramSize"] = machine["vram"] unless machine["vram"].nil?
   end
 end
 
+def win_link_folders(box)
+  link_cmd = <<-SCRIPT
+  function Link-Host {
+    Param($Hostname)
+    if (!(Test-Path -Path "$($Hostname)minicoin")) { return }
+    New-Item -ItemType SymbolicLink -Path c:\\minicoin -Target "$($Hostname)minicoin" -Force
+    New-Item -ItemType SymbolicLink -Path c:\\host -Target "$($Hostname)host" -Force
+  }
+  Link-Host -Hostname \\\\VBOXSVR\\
+  Link-Host -Hostname "\\\\vmware-host\\Shared Folders\\-"
+  cmd /c "rd c:\\Users\\host"
+  New-Item -ItemType Junction -Path c:\\Users\\host -Target c:\\host -Force
+  SCRIPT
+
+  box.vm.provision "shell",
+    inline: link_cmd
+end
+
 Vagrant.configure("2") do |config|
   machines = load_minicoin()
   machines.each do |machine|
@@ -658,6 +702,7 @@ Vagrant.configure("2") do |config|
       end
 
       virtualbox_setup(box, machine)
+      vmware_setup(box, machine)
 
       if machine["shared_folders"] == "disabled"
         box.vm.synced_folder ".", "/minicoin", disabled: true
@@ -724,11 +769,7 @@ Vagrant.configure("2") do |config|
         end
         box.vm.synced_folder ".", "/minicoin"
         if is_windows
-          box.vm.provision "shell", inline: \
-            'cmd /c "rd c:\\minicoin & rd c:\\host & rd c:\\Users\\host & ' \
-            'mklink /D C:\\minicoin \\\\VBOXSRV\\minicoin & ' \
-            'mklink /D C:\\host \\\\VBOXSRV\\host & ' \
-            'mklink /J C:\\Users\\host C:\\host"'
+          win_link_folders(box)
         end
       end
 
-- 
GitLab