Class: Fog::Compute::Hyperv::Real

Inherits:
Shared
  • Object
show all
Defined in:
lib/fog/hyperv/compute.rb,
lib/fog/hyperv/requests/compute/get_vm.rb,
lib/fog/hyperv/requests/compute/new_vm.rb,
lib/fog/hyperv/requests/compute/set_vm.rb,
lib/fog/hyperv/requests/compute/get_vhd.rb,
lib/fog/hyperv/requests/compute/new_vhd.rb,
lib/fog/hyperv/requests/compute/stop_vm.rb,
lib/fog/hyperv/requests/compute/start_vm.rb,
lib/fog/hyperv/requests/compute/remove_vm.rb,
lib/fog/hyperv/requests/compute/restart_vm.rb,
lib/fog/hyperv/requests/compute/get_cluster.rb,
lib/fog/hyperv/requests/compute/get_vm_bios.rb,
lib/fog/hyperv/requests/compute/get_vm_host.rb,
lib/fog/hyperv/requests/compute/remove_item.rb,
lib/fog/hyperv/requests/compute/set_vm_bios.rb,
lib/fog/hyperv/requests/compute/get_vm_group.rb,
lib/fog/hyperv/requests/compute/get_vm_switch.rb,
lib/fog/hyperv/requests/compute/new_vm_switch.rb,
lib/fog/hyperv/requests/compute/set_vm_switch.rb,
lib/fog/hyperv/requests/compute/get_vm_firmware.rb,
lib/fog/hyperv/requests/compute/set_vm_firmware.rb,
lib/fog/hyperv/requests/compute/add_vm_dvd_drive.rb,
lib/fog/hyperv/requests/compute/get_cluster_node.rb,
lib/fog/hyperv/requests/compute/get_vm_dvd_drive.rb,
lib/fog/hyperv/requests/compute/set_vm_dvd_drive.rb,
lib/fog/hyperv/requests/compute/get_vm_host_cluster.rb,
lib/fog/hyperv/requests/compute/remove_vm_dvd_drive.rb,
lib/fog/hyperv/requests/compute/add_vm_hard_disk_drive.rb,
lib/fog/hyperv/requests/compute/add_vm_network_adapter.rb,
lib/fog/hyperv/requests/compute/get_vm_hard_disk_drive.rb,
lib/fog/hyperv/requests/compute/get_vm_network_adapter.rb,
lib/fog/hyperv/requests/compute/set_vm_hard_disk_drive.rb,
lib/fog/hyperv/requests/compute/set_vm_network_adapter.rb,
lib/fog/hyperv/requests/compute/get_vm_floppy_disk_drive.rb,
lib/fog/hyperv/requests/compute/remove_vm_hard_disk_drive.rb,
lib/fog/hyperv/requests/compute/remove_vm_network_adapter.rb,
lib/fog/hyperv/requests/compute/connect_vm_network_adapter.rb,
lib/fog/hyperv/requests/compute/set_vm_network_adapter_vlan.rb,
lib/fog/hyperv/requests/compute/disconnect_vm_network_adapter.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Real

Returns a new instance of Real.



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/fog/hyperv/compute.rb', line 140

def initialize(options = {})
  # require 'ostruct'
  require 'fog/json'
  require 'logging'

  @connections = {}
  @hyperv_endpoint  = options[:hyperv_endpoint]
  @hyperv_endpoint  = "http://#{options[:hyperv_host]}:5985/wsman" if !@hyperv_endpoint && options[:hyperv_host]
  @hyperv_username  = options[:hyperv_username]
  @hyperv_password  = options[:hyperv_password]
  @hyperv_realm     = options[:hyperv_realm]
  @hyperv_transport = options[:hyperv_transport] || (@hyperv_realm ? :kerberos : :negotiate)

  Logging.logger['WinRM::HTTP::HttpNegotiate'].level = :error
  @logger = Logging.logger['hyper-v']
  if options[:hyperv_debug]
    logger.level = :debug 
    logger.add_appenders Logging.appenders.stdout
  end

  connect
end

Instance Attribute Details

#bake_jsonObject

Returns the value of attribute bake_json.



138
139
140
# File 'lib/fog/hyperv/compute.rb', line 138

def bake_json
  @bake_json
end

#bake_optmapObject

Returns the value of attribute bake_optmap.



138
139
140
# File 'lib/fog/hyperv/compute.rb', line 138

def bake_optmap
  @bake_optmap
end

#loggerObject (readonly)

Returns the value of attribute logger.



136
137
138
# File 'lib/fog/hyperv/compute.rb', line 136

def logger
  @logger
end

Instance Method Details

#add_vm_dvd_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/add_vm_dvd_drive.rb', line 5

def add_vm_dvd_disk_drive(options = {})
  requires options, :vm_name
  run_shell('Add-VMDvdDrive', options)
end

#add_vm_hard_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/add_vm_hard_disk_drive.rb', line 5

def add_vm_hard_disk_drive(options = {})
  requires options, :vm_name
  run_shell('Add-VMHardDiskDrive', options)
end

#add_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/add_vm_network_adapter.rb', line 5

def add_vm_network_adapter(options = {})
  requires_one options, :vm_name, :management_os
  run_shell('Add-VMNetworkAdapter', options.merge(_always_include: [:is_legacy]))
end

#connect_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/connect_vm_network_adapter.rb', line 5

def connect_vm_network_adapter(options = {})
  requires options, :vm_name, :switch_name
  run_shell('Connect-VMNetworkAdapter', options.merge(_skip_json: true)).exitcode.zero?
end

#disconnect_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/disconnect_vm_network_adapter.rb', line 5

def disconnect_vm_network_adapter(options = {})
  requires :vm_name
  run_shell('Disconnect-VMNetworkAdapter', options.merge(_skip_json: true)).exitcode.zero?
end

#get_cluster(options = {}) ⇒ Object



5
6
7
# File 'lib/fog/hyperv/requests/compute/get_cluster.rb', line 5

def get_cluster(options = {})
  run_shell('Get-Cluster', options)
end

#get_cluster_node(options = {}) ⇒ Object



5
6
7
# File 'lib/fog/hyperv/requests/compute/get_cluster_node.rb', line 5

def get_cluster_node(options = {})
  run_shell('Get-ClusterNode', options)
end

#get_vhd(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vhd.rb', line 5

def get_vhd(options = {})
  requires_one options, :vm_id, :path, :disk_number
  run_shell('Get-VHD', options)
end

#get_vm(options = {}) ⇒ Object



5
6
7
# File 'lib/fog/hyperv/requests/compute/get_vm.rb', line 5

def get_vm(options = {})
  run_shell('Get-VM', options)
end

#get_vm_bios(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_bios.rb', line 5

def get_vm_bios(options = {})
  requires options, :vm_name
  run_shell('Get-VMBios', options)
end

#get_vm_dvd_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_dvd_drive.rb', line 5

def get_vm_dvd_drive(options = {})
  requires options, :vm_name
  run_shell('Get-VMDvdDrive', options)
end

#get_vm_firmware(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_firmware.rb', line 5

def get_vm_firmware(options = {})
  requires options, :vm_name
  run_shell('Get-VMFirmware', options)
end

#get_vm_floppy_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_floppy_disk_drive.rb', line 5

def get_vm_floppy_disk_drive(options = {})
  requires options, :vm_name
  run_shell('Get-VMFloppyDiskDrive', options)
end

#get_vm_group(options = {}) ⇒ Object



5
6
7
8
9
# File 'lib/fog/hyperv/requests/compute/get_vm_group.rb', line 5

def get_vm_group(options = {})
  requires_version '10.0'

  run_shell('Get-VMGroup', options)
end

#get_vm_hard_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_hard_disk_drive.rb', line 5

def get_vm_hard_disk_drive(options = {})
  requires options, :vm_name
  run_shell('Get-VMHardDiskDrive', options)
end

#get_vm_host(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_host.rb', line 5

def get_vm_host(options = {})
  # TODO: Reject unavailable arguments?
  run_shell('Get-VMHost', options)
end

#get_vm_host_cluster(options = {}) ⇒ Object



5
6
7
8
9
10
# File 'lib/fog/hyperv/requests/compute/get_vm_host_cluster.rb', line 5

def get_vm_host_cluster(options = {})
  requires_version '10.0'
  requires options, :cluster_name

  run_shell('Get-VMHostCluster', options)
end

#get_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/get_vm_network_adapter.rb', line 5

def get_vm_network_adapter(options = {})
  requires_one options, :vm_name, :all, :management_os
  run_shell('Get-VMNetworkAdapter', options)
end

#get_vm_switch(options = {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/fog/hyperv/requests/compute/get_vm_switch.rb', line 5

def get_vm_switch(options = {})
  if options[:_quick_query]
    search = {}
    search[:element_name] = options[:name] if options[:name]
    search[:name] = options[:id].upcase if options[:id]
    data = run_wql('SELECT ElementName,Name FROM Msvm_VirtualEthernetSwitch', search)
    nil if data.empty?
    data[:xml_fragment].map do |sw|
      {
        id: sw[:name].downcase,
        computer_name: options[:computer_name],
        name: sw[:element_name],
      }
    end
  else
    run_shell('Get-VMSwitch', options)
  end
end

#local?Boolean

Returns:

  • (Boolean)


163
164
165
# File 'lib/fog/hyperv/compute.rb', line 163

def local?
  false # @hyperv_endpoint.nil?
end

#new_vhd(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/new_vhd.rb', line 5

def new_vhd(options = {})
  requires options, :path, :size_bytes
  run_shell('New-VHD', options)
end

#new_vm(options = {}) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/fog/hyperv/requests/compute/new_vm.rb', line 5

def new_vm(options = {})
  options[:memory_startup_bytes] = options.delete :memory_startup if options.key? :memory_startup

  requires options, :new_vhd_path, :new_vhd_size_bytes \
    if options[:new_whd_path] || options[:new_vhd_size_bytes]
  run_shell('New-VM', options)
end

#new_vm_switch(options = {}) ⇒ Object



5
6
7
8
9
# File 'lib/fog/hyperv/requests/compute/new_vm_switch.rb', line 5

def new_vm_switch(options = {})
  requires options, :name
  requires_one options, :net_adapter_name, :net_adapter_interface_description
  run_shell('New-VMSwitch', options)
end

#ps_versionObject



194
195
196
# File 'lib/fog/hyperv/compute.rb', line 194

def ps_version
  @ps_version ||= run_shell('$PSVersionTable.PSVersion', _bake_optmap: false, _bake_json: false)
end

#remove_item(options = {}) ⇒ Object



5
6
7
8
9
# File 'lib/fog/hyperv/requests/compute/remove_item.rb', line 5

def remove_item(options = {})
  # TODO: Really lock this method down, validation is good.
  requires options, :path
  run_shell('Remove-Item', options.merge(force: true, _skip_json: true)).exitcode.zero?
end

#remove_vm(options = {}) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/fog/hyperv/requests/compute/remove_vm.rb', line 5

def remove_vm(options = {})
  # TODO: Handle -VMId/-Id too;
  #
  #   Get-VM -Id <guid> | Remove-VM
  requires options, :name
  run_shell('Remove-VM', options.merge(force: true, _skip_json: true)).exitcode.zero?
end

#remove_vm_dvd_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/remove_vm_dvd_drive.rb', line 5

def remove_vm_dvd_drive(options = {})
  requires options, :vm_name, :controller_number, :controller_location
  run_shell('Remove-VMDvdDrive', options.merge(_skip_json: true)).exitcode.zero?
end

#remove_vm_hard_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/remove_vm_hard_disk_drive.rb', line 5

def remove_vm_hard_disk_drive(options = {})
  requires options, :vm_name, :controller_type, :controller_number, :controller_location
  run_shell('Remove-VMHardDiskDrive', options.merge(_skip_json: true)).exitcode.zero?
end

#remove_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/remove_vm_network_adapter.rb', line 5

def remove_vm_network_adapter(options = {})
  requires_one options, :vm_name, :management_os
  run_shell('Remove-VMNetworkAdapter', options)
end

#restart_vm(options = {}) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/fog/hyperv/requests/compute/restart_vm.rb', line 5

def restart_vm(options = {})
  # TODO: Handle -VMId/-Id too;
  #
  #   Get-VM -Id <guid> | Start-VM
  requires options, :name
  run_shell('Restart-VM', options.merge(_skip_json: true)).exitcode.zero?
end

#set_vm(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm.rb', line 5

def set_vm(options = {})
  requires options, :name
  run_shell('Set-VM', options)
end

#set_vm_bios(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_bios.rb', line 5

def set_vm_bios(options = {})
  requires options, :vm_name
  run_shell('Set-VMBios', options)
end

#set_vm_dvd_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_dvd_drive.rb', line 5

def set_vm_dvd_drive(options = {})
  requires options, :vm_name
  run_shell('Set-VMDvdDrive', options)
end

#set_vm_firmware(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_firmware.rb', line 5

def set_vm_firmware(options = {})
  requires options, :vm_name
  run_shell('Set-VMFirmware', options)
end

#set_vm_hard_disk_drive(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_hard_disk_drive.rb', line 5

def set_vm_hard_disk_drive(options = {})
  requires options, :vm_name
  run_shell('Set-VMHardDiskDrive', options)
end

#set_vm_network_adapter(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_network_adapter.rb', line 5

def set_vm_network_adapter(options = {})
  requires_one options, :vm_name, :management_os
  run_shell('Set-VMNetworkAdapter', options)
end

#set_vm_network_adapter_vlan(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_network_adapter_vlan.rb', line 5

def set_vm_network_adapter_vlan(options = {})
  requires_one options, :vm_name, :management_os
  run_shell('Set-VMNetworkAdapterVlan', options)
end

#set_vm_switch(options = {}) ⇒ Object



5
6
7
8
# File 'lib/fog/hyperv/requests/compute/set_vm_switch.rb', line 5

def set_vm_switch(options = {})
  requires options, :name
  run_shell('Set-VMSwitch', options)
end

#start_vm(options = {}) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/fog/hyperv/requests/compute/start_vm.rb', line 5

def start_vm(options = {})
  # TODO: Handle -VMId/-Id too;
  #
  #   Get-VM -Id <guid> | Start-VM
  requires options, :name
  run_shell('Start-VM', options.merge(_skip_json: true)).exitcode.zero?
end

#stop_vm(options = {}) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/fog/hyperv/requests/compute/stop_vm.rb', line 5

def stop_vm(options = {})
  # TODO: Handle -VMId/-Id too;
  #
  #   Get-VM -Id <guid> | Stop-VM
  requires options, :name
  run_shell('Stop-VM', options.merge(_skip_json: true)).exitcode.zero?
end

#supports_clusters?Boolean

Returns:

  • (Boolean)


182
183
184
185
186
187
# File 'lib/fog/hyperv/compute.rb', line 182

def supports_clusters?
  run_wql('SELECT Name FROM MSCluster_ResourceGroup', _namespace: 'root/mscluster/*')[:xml_fragment] && true
rescue => e
  logger.debug "Cluster support checking failed with #{e.class}: #{e.message}"
  false
end

#supports_multihop?Boolean

Returns:

  • (Boolean)


178
179
180
# File 'lib/fog/hyperv/compute.rb', line 178

def supports_multihop?
  return [ :kerberos ].include? @hyperv_transport.to_s.downcase.to_sym
end

#valid?Boolean

Returns:

  • (Boolean)


167
168
169
170
171
172
173
174
175
176
# File 'lib/fog/hyperv/compute.rb', line 167

def valid?
  if local?
    run_shell('Get-VMHost', _return_fields: :name) && true
  else
    run_wql('SELECT Name FROM Msvm_ComputerSystem WHERE Caption = "Hosting Computer System"')[:xml_fragment] && true
  end
rescue => e
  logger.debug "Validation failed with #{e.class}; #{e.message}"
  false
end

#versionObject



189
190
191
192
# File 'lib/fog/hyperv/compute.rb', line 189

def version
  @version ||= run_wql('SELECT Version FROM Win32_OperatingSystem', _namespace: 'root/cimv2/*')[:xml_fragment].first[:version] rescue \
    run_shell("$VMMS = if ([environment]::Is64BitProcess) { \"$($env:SystemRoot)\\System32\\vmms.exe\" } else { \"$($env:SystemRoot)\\Sysnative\\vmms.exe\" }\n(Get-Item $VMMS).VersionInfo.ProductVersion", _skip_json: true).stdout.strip
end