vmware_web_service 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/lib/VMwareWebService/MiqVimDataStore.rb +6 -7
  3. data/lib/VMwareWebService/MiqVimHost.rb +1 -2
  4. data/lib/VMwareWebService/MiqVimVm.rb +8 -8
  5. data/lib/VMwareWebService/VixDiskLib/VixDiskLibServer.rb +0 -1
  6. data/lib/VMwareWebService/VixDiskLib/vdl_wrapper.rb +0 -1
  7. data/lib/VMwareWebService/exception.rb +14 -0
  8. data/lib/VMwareWebService/miq_fault_tolerant_vim.rb +1 -0
  9. data/lib/VMwareWebService/version.rb +1 -1
  10. metadata +21 -84
  11. data/lib/VMwareWebService/VixDiskLib/test/api_test.rb +0 -76
  12. data/lib/VMwareWebService/VixDiskLib/test/cookedTest.rb +0 -86
  13. data/lib/VMwareWebService/VixDiskLib/test/fillDisk.rb +0 -30
  14. data/lib/VMwareWebService/VixDiskLib/test/rawCloneTest.rb +0 -49
  15. data/lib/VMwareWebService/VixDiskLib/test/rawTest.rb +0 -79
  16. data/lib/VMwareWebService/VixDiskLib/test/rawTest11.rb +0 -72
  17. data/lib/VMwareWebService/VixDiskLib/test/rawWriteTest.rb +0 -33
  18. data/lib/VMwareWebService/VixDiskLib/test/vixDiskModTest.rb +0 -96
  19. data/lib/VMwareWebService/test/CustomizationSpec/sles10-x64-vanilla-cust-spec.xml +0 -56
  20. data/lib/VMwareWebService/test/CustomizationSpec/w2k8-x64-vanilla-cust-spec.xml +0 -566
  21. data/lib/VMwareWebService/test/MiqVimBrokerClient.rb +0 -116
  22. data/lib/VMwareWebService/test/MiqVimBrokerServer.rb +0 -128
  23. data/lib/VMwareWebService/test/MiqVimFolderTest.rb +0 -57
  24. data/lib/VMwareWebService/test/MiqVimPerfTest.rb +0 -129
  25. data/lib/VMwareWebService/test/MiqVimVmTest.rb +0 -127
  26. data/lib/VMwareWebService/test/addDiskTest.rb +0 -45
  27. data/lib/VMwareWebService/test/addHostToCluster.rb +0 -89
  28. data/lib/VMwareWebService/test/addNasDatastoreByName.rb +0 -45
  29. data/lib/VMwareWebService/test/addStandaloneHost.rb +0 -59
  30. data/lib/VMwareWebService/test/alarmManagerTest.rb +0 -37
  31. data/lib/VMwareWebService/test/alarmTest.rb +0 -20
  32. data/lib/VMwareWebService/test/annotation.rb +0 -33
  33. data/lib/VMwareWebService/test/brokerClientServerStats.rb +0 -78
  34. data/lib/VMwareWebService/test/brokerConnectionLockTest.rb +0 -81
  35. data/lib/VMwareWebService/test/brokerLoadTest.rb +0 -123
  36. data/lib/VMwareWebService/test/brokerObjCountTest.rb +0 -43
  37. data/lib/VMwareWebService/test/browserTest.rb +0 -141
  38. data/lib/VMwareWebService/test/cloneAsyncTest.rb +0 -140
  39. data/lib/VMwareWebService/test/cloneCsmTest.rb +0 -162
  40. data/lib/VMwareWebService/test/cloneDvsTest.rb +0 -187
  41. data/lib/VMwareWebService/test/cloneTest.rb +0 -153
  42. data/lib/VMwareWebService/test/cpuAffinity.rb +0 -35
  43. data/lib/VMwareWebService/test/cpuMemTest.rb +0 -45
  44. data/lib/VMwareWebService/test/createFolderTest.rb +0 -65
  45. data/lib/VMwareWebService/test/createNfsDatastore.rb +0 -42
  46. data/lib/VMwareWebService/test/customFieldsManagerTest.rb +0 -57
  47. data/lib/VMwareWebService/test/customizationSpecManagerTest.rb +0 -69
  48. data/lib/VMwareWebService/test/diskPerf.rb +0 -122
  49. data/lib/VMwareWebService/test/emsRefreshTest.rb +0 -78
  50. data/lib/VMwareWebService/test/enterMaintenanceMode.rb +0 -56
  51. data/lib/VMwareWebService/test/eventHistoryTest.rb +0 -139
  52. data/lib/VMwareWebService/test/hostAdvancedOptionTest.rb +0 -45
  53. data/lib/VMwareWebService/test/hostConfigSpecTest.rb +0 -51
  54. data/lib/VMwareWebService/test/hostDatastoreTest.rb +0 -51
  55. data/lib/VMwareWebService/test/hostDvsTest.rb +0 -60
  56. data/lib/VMwareWebService/test/hostFirewallTest.rb +0 -149
  57. data/lib/VMwareWebService/test/hostNetworkTest.rb +0 -63
  58. data/lib/VMwareWebService/test/hostServiceTest.rb +0 -147
  59. data/lib/VMwareWebService/test/hostSnmpSystemTest.rb +0 -58
  60. data/lib/VMwareWebService/test/hostStandByTest.rb +0 -51
  61. data/lib/VMwareWebService/test/hostStorageSystem.rb +0 -73
  62. data/lib/VMwareWebService/test/hostTest.rb +0 -50
  63. data/lib/VMwareWebService/test/hostVirtualNicManagerTest.rb +0 -83
  64. data/lib/VMwareWebService/test/linkedCloneFromTemplateTest.rb +0 -135
  65. data/lib/VMwareWebService/test/linkedCloneTest.rb +0 -132
  66. data/lib/VMwareWebService/test/list_evm_snapshots.rb +0 -38
  67. data/lib/VMwareWebService/test/logStatusTest.rb +0 -31
  68. data/lib/VMwareWebService/test/logTest.rb +0 -72
  69. data/lib/VMwareWebService/test/migrateTest.rb +0 -71
  70. data/lib/VMwareWebService/test/rebootHostTest.rb +0 -47
  71. data/lib/VMwareWebService/test/remoteDisplayVnc.rb +0 -52
  72. data/lib/VMwareWebService/test/rm_evm_snapshots.rb +0 -45
  73. data/lib/VMwareWebService/test/rtPerfTest.rb +0 -135
  74. data/lib/VMwareWebService/test/selectionSpecBrokerClassTest.rb +0 -90
  75. data/lib/VMwareWebService/test/selectionSpecBrokerInstanceTest.rb +0 -163
  76. data/lib/VMwareWebService/test/selectionSpecVimClassTest.rb +0 -249
  77. data/lib/VMwareWebService/test/selectionSpecVimTest.rb +0 -232
  78. data/lib/VMwareWebService/test/shutdownHostTest.rb +0 -47
  79. data/lib/VMwareWebService/test/snapshotTest.rb +0 -61
  80. data/lib/VMwareWebService/test/templateTest.rb +0 -67
  81. data/lib/VMwareWebService/test/thinProvisioned.rb +0 -87
  82. data/lib/VMwareWebService/test/vdlBrowserTest.rb +0 -113
  83. data/lib/VMwareWebService/test/vimCoreUpdater.rb +0 -25
  84. data/lib/VMwareWebService/test/vimEventMonitory.rb +0 -26
  85. data/lib/VMwareWebService/test/vimInventory.rb +0 -24
  86. data/lib/VMwareWebService/test/virtualApp.rb +0 -47
  87. data/lib/VMwareWebService/test/virtualDiskPerf.rb +0 -82
  88. data/lib/VMwareWebService/test/vmsafe.rb +0 -56
@@ -1,47 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVim'
3
- require 'VMwareWebService/MiqVimBroker'
4
-
5
- $vim_log = Logger.new(STDOUT)
6
- $vim_log.level = Logger::WARN
7
-
8
- # $miq_wiredump = true
9
- TARGET_HOST = raise "please define"
10
- HOST_USERNAME = ""
11
- HOST_PASSWORD = ""
12
- CLUSTER_NAME = ""
13
-
14
- miqCluster = nil
15
- miqHost = nil
16
-
17
- broker = MiqVimBroker.new(:client)
18
- vim = broker.getMiqVim(SERVER, USERNAME, PASSWORD)
19
-
20
- begin
21
-
22
- puts "vim.class: #{vim.class}"
23
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
24
- puts "API version: #{vim.apiVersion}"
25
-
26
- puts
27
- miqHost = vim.getVimHost(TARGET_HOST)
28
- puts "Got object for host: #{miqHost.name}"
29
-
30
- unless miqHost.shutdownSupported?
31
- puts "Host does not support shutdown"
32
- exit
33
- end
34
-
35
- puts
36
- puts "Shutting down host..."
37
- miqHost.shutdownHost
38
- puts "done."
39
-
40
-
41
- rescue => err
42
- puts err.to_s
43
- puts err.backtrace.join("\n")
44
- ensure
45
- miqCluster.release if miqCluster
46
- vim.disconnect
47
- end
@@ -1,61 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVim'
3
-
4
- $vim_log = Logger.new(STDOUT)
5
- $vim_log.level = Logger::WARN
6
-
7
- $stdout.sync = true
8
-
9
- TARGET_VM = "AAA2206"
10
- vmMor = nil
11
-
12
- begin
13
- vim = MiqVim.new(SERVER, USERNAME, PASSWORD)
14
- puts "vim.class: #{vim.class}"
15
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
16
- puts "API version: #{vim.apiVersion}"
17
- puts
18
-
19
- miqVm = vim.getVimVmByFilter("config.name" => TARGET_VM)
20
-
21
- puts "Has EvmSnapshot: #{miqVm.hasSnapshot?('EvmSnapshot')}"
22
- miqVm.removeAllSnapshots
23
- exit
24
-
25
- puts
26
- puts "*** START Snapshot info from vim.virtualMachines"
27
- vim.dumpObj(miqVm.vmh['snapshot'])
28
- puts "*** END Snapshot info from vim.virtualMachines"
29
- puts
30
-
31
- ssInfo = miqVm.snapshotInfo
32
-
33
- if ssInfo
34
- # vim.dumpObj(ssInfo)
35
- hasCh = miqVm.hasSnapshot?("Consolidate Helper", true)
36
- puts "Has Consolidate Helper = #{hasCh}"
37
- # exit
38
-
39
- ssHash = ssInfo['ssMorHash']
40
- curSnapshot = ssHash[ssInfo['currentSnapshot'].to_s]['snapshot']
41
- puts
42
- puts "curSnapshot = #{curSnapshot}"
43
- puts "curSnapshot name = #{ssHash[ssInfo['currentSnapshot'].to_s]['name']}"
44
- puts "++++++++++++++ snapshot props from tree +++++++++++++++++++++++++++"
45
- vim.dumpObj(ssInfo)
46
- puts "+++++++++++++++ end snapshot props from tree ++++++++++++++++++++++++++"
47
- else
48
- puts "No snapshots found"
49
- end
50
-
51
- snMor = miqVm.createSnapshot("rpoTest", "test snapshot", false, "false")
52
- puts "snMor = #{snMor}"
53
-
54
- miqVm.removeSnapshot(snMor)
55
- # miqVm.removeSnapshot(String.new(snMor.to_s))
56
- rescue => err
57
- puts err.to_s
58
- puts err.backtrace.join("\n")
59
- ensure
60
- vim.disconnect
61
- end
@@ -1,67 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVim'
3
-
4
- $vim_log = Logger.new(STDOUT)
5
- $vim_log.level = Logger::WARN
6
-
7
- TARGET_VM = "rpo-template-test"
8
- vmMor = nil
9
- miqVm = nil
10
-
11
- begin
12
- vim = MiqVim.new(SERVER, USERNAME, PASSWORD)
13
-
14
- puts "vim.class: #{vim.class}"
15
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
16
- puts "API version: #{vim.apiVersion}"
17
- puts
18
-
19
- miqVm = vim.getVimVmByFilter("config.name" => TARGET_VM)
20
-
21
- puts "VM: #{miqVm.name}"
22
- puts
23
-
24
- isTemplate = miqVm.template?
25
-
26
- puts "Template: #{isTemplate}"
27
- unless isTemplate
28
- puts "Marking VM as Template."
29
- miqVm.markAsTemplate
30
- puts "Template: #{miqVm.template?}"
31
- exit
32
- end
33
-
34
- targetHostObj = vim.hostSystems.values.first
35
- raise "No suitable target host system found" unless targetHostObj
36
-
37
- targetRp = nil
38
- vim.resourcePoolsByMor.each_value do |rp|
39
- owner = rp['owner']
40
- next unless (cr = vim.computeResourcesByMor[owner])
41
- hosts = cr['host']['ManagedObjectReference']
42
- hosts = [hosts] unless hosts.kind_of?(Array)
43
- hosts.each do |hmor|
44
- if hmor == targetHostObj['MOR']
45
- targetRp = rp
46
- break
47
- end
48
- end
49
- break if targetRp
50
- end
51
- puts
52
-
53
- raise "No suitable target resource pool found" unless targetRp
54
-
55
- puts "Marking VM as Virtual Machine."
56
- puts
57
- miqVm.markAsVm(targetRp, targetHostObj)
58
- puts "Template: #{miqVm.template?}"
59
- rescue => err
60
- puts err.to_s
61
- puts err.backtrace.join("\n")
62
- ensure
63
- puts
64
- puts "Exiting..."
65
- miqVm.release if miqVm
66
- vim.disconnect if vim
67
- end
@@ -1,87 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVim'
3
- require 'VMwareWebService/MiqVimBroker'
4
-
5
- $vim_log = Logger.new(STDOUT)
6
- $vim_log.level = Logger::WARN
7
-
8
- TARGET_VM = raise "please define"
9
- miqVm = nil
10
-
11
- begin
12
- vim = MiqVim.new(SERVER, USERNAME, PASSWORD)
13
-
14
- # vim.logger = $stdout
15
-
16
- puts "vim.class: #{vim.class}"
17
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
18
- puts "API version: #{vim.apiVersion}"
19
- puts
20
-
21
- miqVm = vim.getVimVmByFilter("config.name" => TARGET_VM)
22
-
23
- # puts miqVm.acquireMksTicket
24
-
25
- puts
26
- puts "Connection State: #{miqVm.connectionState}"
27
- puts "Power State: #{miqVm.powerState}"
28
- puts
29
-
30
- thinDevs = miqVm.devicesByFilter("backing.thinProvisioned" => "true")
31
-
32
- if thinDevs.empty?
33
- puts "#{TARGET_VM} has no thin provisioned disks."
34
- exit
35
- end
36
-
37
- vimDs = nil
38
- puts "Thin provisioned disks for #{TARGET_VM}:"
39
- thinDevs.each do |d|
40
- path = d['backing']['fileName']
41
- dsrPath = vim.dsRelativePath(path)
42
- dir, file = File.split(dsrPath)
43
-
44
- #
45
- # Just in case all the files aren't on the same datastore.
46
- #
47
- if vimDs
48
- if vimDs.dsMor != d['backing']['datastore']
49
- vimDs.release
50
- vimDs = vim.getVimDataStoreByMor(d['backing']['datastore'])
51
- end
52
- else
53
- vimDs = vim.getVimDataStoreByMor(d['backing']['datastore'])
54
- puts
55
- puts "\t(Datastore capacity: #{vimDs.capacityBytes} bytes)"
56
- puts "\t(Datastore free space: #{vimDs.freeBytes} bytes)"
57
- if vimDs.uncommitted
58
- deltaCommit = vimDs.freeBytes - vimDs.uncommitted
59
- puts "\t(Datastore uncommitted space: #{vimDs.uncommitted} bytes)"
60
- if deltaCommit >= 0
61
- puts "\t(Datastore under committed by: #{deltaCommit} bytes)"
62
- else
63
- puts "\t(Datastore over committed by: #{-deltaCommit} bytes)"
64
- end
65
- end
66
- puts
67
- end
68
-
69
- fo = vimDs.dsVmDiskFileSearch(file, dir, false, false).first
70
-
71
- puts "\tPath: #{path}"
72
- puts "\t\tFile: #{file}"
73
- puts "\t\tCapacity: #{d['capacityInKB']} KB"
74
- puts "\t\tFile size: #{fo.fileSize.to_i / 1024} KB" if fo
75
- puts
76
- end
77
-
78
- rescue => err
79
- puts err.to_s
80
- puts err.backtrace.join("\n")
81
- ensure
82
- puts
83
- puts "Exiting..."
84
- vimDs.release if vimDs
85
- miqVm.release if miqVm
86
- vim.disconnect if vim
87
- end
@@ -1,113 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'enumerator'
3
-
4
- require 'VMwareWebService/MiqVimBroker'
5
- require 'VMwareWebService/VixDiskLib/VixDiskLib'
6
-
7
- $vim_log = Logger.new(STDOUT)
8
- $vim_log.level = Logger::WARN
9
-
10
- $stderr.sync = true
11
- $stdout.sync = true
12
-
13
- # $DEBUG = true
14
- # MiqVimClientBase.wiredump_file = "clone.txt"
15
-
16
- SRC_VM = "rpo-test2"
17
-
18
- readRanges = [
19
- 0, 256,
20
- 0, 512,
21
- 256, 512,
22
- 512, 256,
23
- 512, 512,
24
- 256, 1024,
25
- 1280, 256,
26
- 1280, 512,
27
- 1280, 1024
28
- ]
29
-
30
- vDisk = nil
31
- vdlc = nil
32
-
33
- begin
34
- broker = MiqVimBroker.new(:client)
35
- unless broker.serverAlive?
36
- puts "Broker server isn't running"
37
- exit
38
- end
39
-
40
- t0 = Time.now
41
-
42
- vim = broker.getMiqVim.new(SERVER, USERNAME, PASSWORD)
43
-
44
- puts "vim.class: #{vim.class}"
45
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
46
- puts "API version: #{vim.apiVersion}"
47
- puts
48
-
49
- svm = vim.virtualMachinesByFilter("config.name" => SRC_VM)
50
- if svm.empty?
51
- puts "VM: #{SRC_VM} not found"
52
- exit
53
- end
54
-
55
- puts "#{SRC_VM} vmPathName: #{svm[0]['summary']['config']['vmPathName']}"
56
- puts "#{SRC_VM} vmLocalPathName: #{svm[0]['summary']['config']['vmLocalPathName']}"
57
-
58
- sVmMor = svm[0]['MOR']
59
- miqVm = vim.getVimVmByMor(sVmMor)
60
-
61
- puts "VM: #{miqVm.name}, HOST: #{miqVm.hostSystem}"
62
- puts
63
-
64
- diskFile = miqVm.getCfg['scsi0:0.filename']
65
- ldiskFile = vim.localVmPath(diskFile)
66
- puts "diskFile: #{diskFile}"
67
- puts "ldiskFile: #{ldiskFile}"
68
- puts
69
-
70
- if vim.isVirtualCenter?
71
- puts "Calling: miqVm.vdlVcConnection"
72
- vdlc = miqVm.vdlVcConnection
73
- vDisk = vdlc.getDisk(diskFile, VixDiskLib_raw::VIXDISKLIB_FLAG_OPEN_READ_ONLY)
74
- else
75
- vdlc = vim.vdlConnection
76
- vDisk = vdlc.getDisk(ldiskFile, VixDiskLib_raw::VIXDISKLIB_FLAG_OPEN_READ_ONLY)
77
- end
78
-
79
- dinfo = vDisk.info
80
- puts
81
- puts "Disk info:"
82
- dinfo.each { |k, v| puts "\t#{k} => #{v}" }
83
- puts
84
-
85
- readRanges.each_slice(2) do |start, len|
86
- puts "Read test: start = #{start}, len = #{len} (bytes)"
87
- startSector, startOffset = start.divmod(vDisk.sectorSize)
88
- endSector = (start + len - 1) / vDisk.sectorSize
89
- numSector = endSector - startSector + 1
90
- puts "\tstartSector = #{startSector}, numSector = #{numSector}, startOffset = #{startOffset}"
91
-
92
- rBData = vDisk.bread(startSector, numSector)
93
- puts "\tBlock read #{rBData.length} bytes of data."
94
-
95
- rCData = vDisk.read(start, len)
96
- puts "\tByte read #{rCData.length} bytes of data."
97
-
98
- if rCData != rBData[startOffset, len]
99
- puts "\t\t*** Block and byte data don't match"
100
- else
101
- puts "\t\tData check passed"
102
- end
103
- puts
104
- end
105
-
106
- rescue => err
107
- puts err
108
- puts err.class.to_s
109
- puts err.backtrace.join("\n")
110
- ensure
111
- vDisk.close if vDisk
112
- vdlc.disconnect if vdlc
113
- end
@@ -1,25 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVimCoreUpdater'
3
-
4
- SERVER = raise "please define SERVER"
5
- USERNAME = raise "please define USERNAME"
6
- PASSWORD = raise "please define PASSWORD"
7
-
8
- $vim_log = Logger.new(STDOUT)
9
- $vim_log.level = Logger::WARN
10
-
11
- vimEm = MiqVimCoreUpdater.new(SERVER, USERNAME, PASSWORD)
12
-
13
- Signal.trap("INT") { vimEm.stop }
14
-
15
- begin
16
- thread = Thread.new do
17
- vimEm.monitorUpdates do |mor, ph|
18
- puts "Object: #{mor} (#{mor.vimType})"
19
- ph.each { |k, v| puts "\t#{k}:\t#{v}" } unless ph.nil?
20
- end
21
- end
22
- thread.join
23
- rescue => err
24
- puts err.to_s
25
- end
@@ -1,26 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVimEventMonitor'
3
-
4
- SERVER = raise "please define SERVER"
5
- USERNAME = raise "please define USERNAME"
6
- PASSWORD = raise "please define PASSWORD"
7
-
8
- $vim_log = Logger.new(STDOUT)
9
- $vim_log.level = Logger::WARN
10
-
11
- vimEm = MiqVimEventMonitor.new(SERVER, USERNAME, PASSWORD)
12
-
13
- Signal.trap("INT") { vimEm.stop }
14
-
15
- puts "vimEm.class: #{vimEm.class}"
16
- puts "#{vimEm.server} is #{(vimEm.isVirtualCenter? ? 'VC' : 'ESX')}"
17
- puts "API version: #{vimEm.apiVersion}"
18
-
19
- begin
20
- thread = Thread.new { vimEm.monitorEventsToStdout }
21
- thread.join
22
- rescue => err
23
- puts err.to_s
24
- end
25
-
26
- puts "done"
@@ -1,24 +0,0 @@
1
- require 'manageiq-gems-pending'
2
- require 'VMwareWebService/MiqVimInventory'
3
-
4
- SERVER = raise "please define SERVER"
5
- USERNAME = raise "please define USERNAME"
6
- PASSWORD = raise "please define PASSWORD"
7
-
8
- $stderr.sync = true
9
- $vim_log = Logger.new(STDOUT)
10
- $vim_log.level = Logger::WARN
11
-
12
- # $miq_wiredump = true
13
- vim = MiqVimInventory.new(SERVER, USERNAME, PASSWORD)
14
-
15
- puts
16
- puts "#{vim.server} is #{(vim.isVirtualCenter? ? 'VC' : 'ESX')}"
17
- puts "API version: #{vim.apiVersion}"
18
- puts
19
-
20
- puts "folders.length: #{vim.folders.length}"
21
- puts "virtualMachines.length: #{vim.virtualMachines.length}"
22
- puts "virtualMachinesByMor.length: #{vim.virtualMachinesByMor.length}"
23
-
24
- vim.disconnect