manageiq-smartstate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +4 -0
- data/.rspec_ci +4 -0
- data/.travis.yml +15 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +202 -0
- data/README.md +45 -0
- data/Rakefile +23 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/MiqContainerGroup/MiqContainerGroup.rb +31 -0
- data/lib/MiqVm/MiqLocalVm.rb +50 -0
- data/lib/MiqVm/MiqRhevmVm.rb +179 -0
- data/lib/MiqVm/MiqVm.rb +355 -0
- data/lib/MiqVm/miq_azure_vm.rb +96 -0
- data/lib/MiqVm/miq_scvmm_vm.rb +38 -0
- data/lib/MiqVm/test/camcorder_fleece_test.rb +60 -0
- data/lib/MiqVm/test/localVm.rb +45 -0
- data/lib/MiqVm/test/partitionAlignmentCheck.rb +76 -0
- data/lib/MiqVm/test/remoteVm.rb +65 -0
- data/lib/MiqVm/test/rhevmNfsTest.rb +62 -0
- data/lib/MiqVm/test/rhevmNfsTest2.rb +66 -0
- data/lib/MiqVm/test/rhevmTest.rb +70 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackCommon.rb +107 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackImage.rb +67 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackInstance.rb +182 -0
- data/lib/Scvmm/miq_hyperv_disk.rb +273 -0
- data/lib/Scvmm/miq_scvmm_parse_powershell.rb +75 -0
- data/lib/Scvmm/miq_scvmm_vm_ssa_info.rb +135 -0
- data/lib/Scvmm/test/miq_hyperv_disk_test.rb +33 -0
- data/lib/Scvmm/test/miq_scvmm_vm_ssa_info_test.rb +41 -0
- data/lib/VmLocalDiskAccess/test/localCfg.rb +97 -0
- data/lib/VolumeManager/LVM/logical_volume.rb +75 -0
- data/lib/VolumeManager/LVM/lv_segment.rb +43 -0
- data/lib/VolumeManager/LVM/lvm2disk.rb +158 -0
- data/lib/VolumeManager/LVM/parser.rb +138 -0
- data/lib/VolumeManager/LVM/physical_volume.rb +19 -0
- data/lib/VolumeManager/LVM/scanner.rb +156 -0
- data/lib/VolumeManager/LVM/thin/btree.rb +83 -0
- data/lib/VolumeManager/LVM/thin/constants.rb +86 -0
- data/lib/VolumeManager/LVM/thin/data_map.rb +44 -0
- data/lib/VolumeManager/LVM/thin/mapping_tree.rb +19 -0
- data/lib/VolumeManager/LVM/thin/space_maps.rb +58 -0
- data/lib/VolumeManager/LVM/thin/superblock.rb +136 -0
- data/lib/VolumeManager/LVM/thin.rb +6 -0
- data/lib/VolumeManager/LVM/volume_group.rb +97 -0
- data/lib/VolumeManager/LVM.rb +8 -0
- data/lib/VolumeManager/MiqLdm.rb +546 -0
- data/lib/VolumeManager/MiqLvm.rb +17 -0
- data/lib/VolumeManager/MiqNativeVolumeManager.rb +150 -0
- data/lib/VolumeManager/MiqVolumeManager.rb +277 -0
- data/lib/VolumeManager/VolMgrPlatformSupport.rb +18 -0
- data/lib/VolumeManager/VolMgrPlatformSupportLinux.rb +77 -0
- data/lib/VolumeManager/VolMgrPlatformSupportWin.rb +17 -0
- data/lib/VolumeManager/test/blockDevTest.rb +40 -0
- data/lib/VolumeManager/test/ldm.rb +97 -0
- data/lib/blackbox/VmBlackBox.rb +103 -0
- data/lib/blackbox/xmlStorage.rb +180 -0
- data/lib/db/MiqBdb/MiqBdb.rb +309 -0
- data/lib/db/MiqBdb/MiqBdbBtree.rb +219 -0
- data/lib/db/MiqBdb/MiqBdbHash.rb +199 -0
- data/lib/db/MiqBdb/MiqBdbPage.rb +159 -0
- data/lib/db/MiqBdb/MiqBdbUtil.rb +18 -0
- data/lib/db/MiqSqlite/MiqSqlite3.rb +330 -0
- data/lib/db/MiqSqlite/MiqSqlite3Cell.rb +167 -0
- data/lib/db/MiqSqlite/MiqSqlite3Page.rb +151 -0
- data/lib/db/MiqSqlite/MiqSqlite3Table.rb +124 -0
- data/lib/db/MiqSqlite/MiqSqlite3Util.rb +32 -0
- data/lib/disk/DiskProbe.rb +68 -0
- data/lib/disk/MiqDisk.rb +317 -0
- data/lib/disk/camcorder_test.rb +90 -0
- data/lib/disk/dos_mbr.img +0 -0
- data/lib/disk/modules/AzureBlobDisk.rb +101 -0
- data/lib/disk/modules/LocalDevMod.rb +47 -0
- data/lib/disk/modules/LocalDevProbe.rb +6 -0
- data/lib/disk/modules/MSCommon.rb +352 -0
- data/lib/disk/modules/MSVSDiffDisk.rb +91 -0
- data/lib/disk/modules/MSVSDiskProbe.rb +61 -0
- data/lib/disk/modules/MSVSDynamicDisk.rb +42 -0
- data/lib/disk/modules/MSVSFixedDisk.rb +45 -0
- data/lib/disk/modules/MiqLargeFile.rb +63 -0
- data/lib/disk/modules/MiqLargeFileWin32.rb +107 -0
- data/lib/disk/modules/QcowDisk.rb +692 -0
- data/lib/disk/modules/QcowDiskProbe.rb +34 -0
- data/lib/disk/modules/RawBlockIO.rb +116 -0
- data/lib/disk/modules/RawDisk.rb +45 -0
- data/lib/disk/modules/RawDiskProbe.rb +7 -0
- data/lib/disk/modules/RhevmDescriptor.rb +167 -0
- data/lib/disk/modules/RhevmDiskProbe.rb +52 -0
- data/lib/disk/modules/VMWareCowdDisk.rb +207 -0
- data/lib/disk/modules/VMWareDescriptor.rb +214 -0
- data/lib/disk/modules/VMWareDiskProbe.rb +74 -0
- data/lib/disk/modules/VMWareSparseDisk.rb +189 -0
- data/lib/disk/modules/VhdxDisk.rb +625 -0
- data/lib/disk/modules/VhdxDiskProbe.rb +46 -0
- data/lib/disk/modules/VixDiskMod.rb +54 -0
- data/lib/disk/modules/VixDiskProbe.rb +6 -0
- data/lib/disk/modules/miq_disk_cache.rb +135 -0
- data/lib/disk/modules/miq_dummy_disk.rb +41 -0
- data/lib/disk/modules/vhdx_bat_entry.rb +10 -0
- data/lib/disk/test.rb +66 -0
- data/lib/fs/MetakitFS/MetakitFS.rb +530 -0
- data/lib/fs/MetakitFS/test/Makefile +14 -0
- data/lib/fs/MetakitFS/test/MkCollectFiles.rb +165 -0
- data/lib/fs/MetakitFS/test/MkSelectFiles.rb +30 -0
- data/lib/fs/MetakitFS/test/collect_files.yaml +70 -0
- data/lib/fs/MetakitFS/test/init.rb +3 -0
- data/lib/fs/MetakitFS/test/mk2vmdk.rb +64 -0
- data/lib/fs/MetakitFS/test/mk4test.c +92 -0
- data/lib/fs/MetakitFS/test/mkFsTest.rb +113 -0
- data/lib/fs/MetakitFS/test/proto.rb +97 -0
- data/lib/fs/MiqFS/FsProbe.rb +39 -0
- data/lib/fs/MiqFS/MiqFS.rb +515 -0
- data/lib/fs/MiqFS/modules/AUFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/Ext3.rb +305 -0
- data/lib/fs/MiqFS/modules/Ext3Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Ext4.rb +304 -0
- data/lib/fs/MiqFS/modules/Ext4Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Fat32.rb +318 -0
- data/lib/fs/MiqFS/modules/Fat32Probe.rb +30 -0
- data/lib/fs/MiqFS/modules/HFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/Iso9660.rb +293 -0
- data/lib/fs/MiqFS/modules/Iso9660Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/LocalFS.rb +105 -0
- data/lib/fs/MiqFS/modules/NTFS.rb +287 -0
- data/lib/fs/MiqFS/modules/NTFSProbe.rb +21 -0
- data/lib/fs/MiqFS/modules/NativeFS.rb +155 -0
- data/lib/fs/MiqFS/modules/ReFSProbe.rb +17 -0
- data/lib/fs/MiqFS/modules/RealFS.rb +79 -0
- data/lib/fs/MiqFS/modules/RealFSProbe.rb +6 -0
- data/lib/fs/MiqFS/modules/Reiser4Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/ReiserFS.rb +315 -0
- data/lib/fs/MiqFS/modules/ReiserFSProbe.rb +42 -0
- data/lib/fs/MiqFS/modules/UnionFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/WebDAV.rb +127 -0
- data/lib/fs/MiqFS/modules/WebDAVFile.rb +68 -0
- data/lib/fs/MiqFS/modules/XFS.rb +300 -0
- data/lib/fs/MiqFS/modules/XFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/ZFSProbe.rb +18 -0
- data/lib/fs/MiqFS/test.rb +59 -0
- data/lib/fs/MiqFsUtil.rb +383 -0
- data/lib/fs/MiqMountManager.rb +209 -0
- data/lib/fs/MiqNativeMountManager.rb +101 -0
- data/lib/fs/MountManagerProbe.rb +29 -0
- data/lib/fs/ReiserFS/block.rb +209 -0
- data/lib/fs/ReiserFS/directory.rb +136 -0
- data/lib/fs/ReiserFS/directory_entry.rb +140 -0
- data/lib/fs/ReiserFS/file_data.rb +111 -0
- data/lib/fs/ReiserFS/superblock.rb +140 -0
- data/lib/fs/ReiserFS/utils.rb +95 -0
- data/lib/fs/VimDatastoreFS/VimDatastoreFS.rb +192 -0
- data/lib/fs/ext3/alloc_bitmap.rb +38 -0
- data/lib/fs/ext3/block_pointers_path.rb +130 -0
- data/lib/fs/ext3/directory.rb +51 -0
- data/lib/fs/ext3/directory_entry.rb +67 -0
- data/lib/fs/ext3/ex_attrib_header.rb +14 -0
- data/lib/fs/ext3/ex_attrib_name.rb +23 -0
- data/lib/fs/ext3/file_data.rb +130 -0
- data/lib/fs/ext3/group_descriptor_entry.rb +65 -0
- data/lib/fs/ext3/group_descriptor_table.rb +54 -0
- data/lib/fs/ext3/hash_tree_entry.rb +18 -0
- data/lib/fs/ext3/hash_tree_header.rb +15 -0
- data/lib/fs/ext3/inode.rb +228 -0
- data/lib/fs/ext3/posix_acl_entry.rb +29 -0
- data/lib/fs/ext3/posix_acl_header.rb +11 -0
- data/lib/fs/ext3/superblock.rb +406 -0
- data/lib/fs/ext3/test/tc_Ext3BlockPointersPath.rb +74 -0
- data/lib/fs/ext4/alloc_bitmap.rb +38 -0
- data/lib/fs/ext4/directory.rb +87 -0
- data/lib/fs/ext4/directory_entry.rb +77 -0
- data/lib/fs/ext4/ex_attrib_header.rb +14 -0
- data/lib/fs/ext4/ex_attrib_name.rb +23 -0
- data/lib/fs/ext4/extent.rb +35 -0
- data/lib/fs/ext4/extent_header.rb +40 -0
- data/lib/fs/ext4/extent_index.rb +33 -0
- data/lib/fs/ext4/group_descriptor_entry.rb +69 -0
- data/lib/fs/ext4/group_descriptor_table.rb +54 -0
- data/lib/fs/ext4/hash_tree_entry.rb +58 -0
- data/lib/fs/ext4/hash_tree_header.rb +35 -0
- data/lib/fs/ext4/inode.rb +465 -0
- data/lib/fs/ext4/posix_acl_entry.rb +29 -0
- data/lib/fs/ext4/posix_acl_header.rb +11 -0
- data/lib/fs/ext4/superblock.rb +412 -0
- data/lib/fs/fat32/boot_sect.rb +379 -0
- data/lib/fs/fat32/directory.rb +222 -0
- data/lib/fs/fat32/directory_entry.rb +540 -0
- data/lib/fs/fat32/file_data.rb +128 -0
- data/lib/fs/iso9660/boot_sector.rb +170 -0
- data/lib/fs/iso9660/directory.rb +90 -0
- data/lib/fs/iso9660/directory_entry.rb +147 -0
- data/lib/fs/iso9660/file_data.rb +78 -0
- data/lib/fs/iso9660/rock_ridge.rb +329 -0
- data/lib/fs/iso9660/util.rb +57 -0
- data/lib/fs/modules/LinuxMount.rb +300 -0
- data/lib/fs/modules/LinuxMountProbe.rb +29 -0
- data/lib/fs/modules/WinMount.rb +97 -0
- data/lib/fs/modules/WinMountProbe.rb +24 -0
- data/lib/fs/ntfs/attrib_attribute_list.rb +131 -0
- data/lib/fs/ntfs/attrib_bitmap.rb +26 -0
- data/lib/fs/ntfs/attrib_data.rb +74 -0
- data/lib/fs/ntfs/attrib_file_name.rb +110 -0
- data/lib/fs/ntfs/attrib_header.rb +194 -0
- data/lib/fs/ntfs/attrib_index_allocation.rb +19 -0
- data/lib/fs/ntfs/attrib_index_root.rb +247 -0
- data/lib/fs/ntfs/attrib_object_id.rb +40 -0
- data/lib/fs/ntfs/attrib_standard_information.rb +107 -0
- data/lib/fs/ntfs/attrib_type.rb +49 -0
- data/lib/fs/ntfs/attrib_volume_information.rb +53 -0
- data/lib/fs/ntfs/attrib_volume_name.rb +31 -0
- data/lib/fs/ntfs/boot_sect.rb +253 -0
- data/lib/fs/ntfs/data_run.rb +358 -0
- data/lib/fs/ntfs/directory_index_node.rb +114 -0
- data/lib/fs/ntfs/index_node_header.rb +69 -0
- data/lib/fs/ntfs/index_record_header.rb +85 -0
- data/lib/fs/ntfs/mft_entry.rb +288 -0
- data/lib/fs/ntfs/utils.rb +43 -0
- data/lib/fs/test/camcorder_fs_test.rb +108 -0
- data/lib/fs/test/collect_files_direct.yaml +22 -0
- data/lib/fs/test/collect_files_in.yaml +24 -0
- data/lib/fs/test/collect_files_in_nc.yaml +22 -0
- data/lib/fs/test/collect_files_out.yaml +6 -0
- data/lib/fs/test/collect_files_rm.yaml +6 -0
- data/lib/fs/test/copyTest.rb +126 -0
- data/lib/fs/test/fsTest.rb +87 -0
- data/lib/fs/test/updateTest.rb +184 -0
- data/lib/fs/xfs/allocation_group.rb +160 -0
- data/lib/fs/xfs/bmap_btree_block.rb +125 -0
- data/lib/fs/xfs/bmap_btree_record.rb +80 -0
- data/lib/fs/xfs/bmap_btree_root_node.rb +72 -0
- data/lib/fs/xfs/directory.rb +133 -0
- data/lib/fs/xfs/directory2_data_header.rb +27 -0
- data/lib/fs/xfs/directory3_data_header.rb +34 -0
- data/lib/fs/xfs/directory_block_tail.rb +22 -0
- data/lib/fs/xfs/directory_data_header.rb +46 -0
- data/lib/fs/xfs/directory_entry.rb +106 -0
- data/lib/fs/xfs/inode.rb +532 -0
- data/lib/fs/xfs/inode_map.rb +100 -0
- data/lib/fs/xfs/short_form_directory_entry.rb +91 -0
- data/lib/fs/xfs/short_form_header.rb +44 -0
- data/lib/fs/xfs/superblock.rb +556 -0
- data/lib/lib/tasks/azure.rake +52 -0
- data/lib/manageiq/smartstate/version.rb +5 -0
- data/lib/manageiq/smartstate.rb +7 -0
- data/lib/manageiq-smartstate.rb +1 -0
- data/lib/metadata/MIQExtract/MIQExtract.rb +297 -0
- data/lib/metadata/MIQExtract/test/extractTest.rb +41 -0
- data/lib/metadata/MIQExtract/test/full_extract_test.rb +68 -0
- data/lib/metadata/ScanProfile/HostScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfiles.rb +41 -0
- data/lib/metadata/ScanProfile/ScanItemBase.rb +63 -0
- data/lib/metadata/ScanProfile/ScanProfileBase.rb +51 -0
- data/lib/metadata/ScanProfile/ScanProfilesBase.rb +60 -0
- data/lib/metadata/ScanProfile/VmScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfiles.rb +38 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemFile.rb +51 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemNteventlog.rb +84 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemFile.rb +39 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemNteventlog.rb +34 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemRegistry.rb +64 -0
- data/lib/metadata/VMMount/VMMount.rb +81 -0
- data/lib/metadata/VMMount/VMPlatformMount.rb +18 -0
- data/lib/metadata/VMMount/VMPlatformMountLinux.rb +75 -0
- data/lib/metadata/VMMount/VMPlatformMountWin.rb +13 -0
- data/lib/metadata/VmConfig/GetNativeCfg.rb +45 -0
- data/lib/metadata/VmConfig/VmConfig.rb +947 -0
- data/lib/metadata/VmConfig/cfgConfig.rb +45 -0
- data/lib/metadata/VmConfig/ovfConfig.rb +99 -0
- data/lib/metadata/VmConfig/test/GetVMwareCfgTest.rb +40 -0
- data/lib/metadata/VmConfig/vmcConfig.rb +116 -0
- data/lib/metadata/VmConfig/vmtxConfig.rb +4 -0
- data/lib/metadata/VmConfig/vmxConfig.rb +162 -0
- data/lib/metadata/VmConfig/xmlConfig.rb +79 -0
- data/lib/metadata/VmConfig/xmlMsHyperVConfig.rb +41 -0
- data/lib/metadata/linux/InitProcHash.rb +632 -0
- data/lib/metadata/linux/LinuxInitProcs.rb +142 -0
- data/lib/metadata/linux/LinuxOSInfo.rb +237 -0
- data/lib/metadata/linux/LinuxPackages.rb +209 -0
- data/lib/metadata/linux/LinuxSystemd.rb +130 -0
- data/lib/metadata/linux/LinuxUsers.rb +289 -0
- data/lib/metadata/linux/LinuxUtils.rb +197 -0
- data/lib/metadata/linux/MiqConaryPackages.rb +41 -0
- data/lib/metadata/linux/MiqRpmPackages.rb +160 -0
- data/lib/metadata/linux/test/Name +0 -0
- data/lib/metadata/linux/test/Packages +0 -0
- data/lib/metadata/linux/test/rpoTest.rb +5 -0
- data/lib/metadata/linux/test/tc_LinuxUtils.rb +4157 -0
- data/lib/metadata/util/event_log_filter.rb +61 -0
- data/lib/metadata/util/md5deep.rb +280 -0
- data/lib/metadata/util/win32/Win32Accounts.rb +764 -0
- data/lib/metadata/util/win32/Win32EventLog.rb +743 -0
- data/lib/metadata/util/win32/Win32Services.rb +86 -0
- data/lib/metadata/util/win32/Win32Software.rb +326 -0
- data/lib/metadata/util/win32/Win32System.rb +333 -0
- data/lib/metadata/util/win32/boot_info_win.rb +59 -0
- data/lib/metadata/util/win32/fleece_hives.rb +220 -0
- data/lib/metadata/util/win32/ms-registry.rb +650 -0
- data/lib/metadata/util/win32/peheader.rb +868 -0
- data/lib/metadata/util/win32/remote-registry.rb +142 -0
- data/lib/metadata/util/win32/system_path_win.rb +103 -0
- data/lib/metadata/util/win32/versioninfo.rb +17 -0
- data/manageiq-smartstate.gemspec +35 -0
- metadata +486 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
require "disk/MiqDisk"
|
3
|
+
require 'binary_struct'
|
4
|
+
require 'VolumeManager/MiqLvm'
|
5
|
+
|
6
|
+
class MiqNativeVolumeManager
|
7
|
+
attr_accessor :rootTrees
|
8
|
+
attr_reader :logicalVolumes, :physicalVolumes, :visibleVolumes, :hiddenVolumes, :allPhysicalVolumes, :vgHash, :wholeDisks, :diskInitErrors
|
9
|
+
|
10
|
+
def initialize(vmCfg, _ost = nil)
|
11
|
+
@logicalVolumes = [] # visible logical volumes
|
12
|
+
@physicalVolumes = [] # visible physical volumes
|
13
|
+
@hiddenVolumes = [] # hidded volumes (in volume groups)
|
14
|
+
@allPhysicalVolumes = [] # all physical volumes
|
15
|
+
@wholeDisks = [] # a list of open base disks
|
16
|
+
@visibleVolumes = nil # logical and physical volumes that should eb checked for filesystems
|
17
|
+
@vgHash = {} # volume groups hashed by name
|
18
|
+
@lvHash = {}
|
19
|
+
@rootTrees = nil # the MiqMountManager objects using this MiqVolumeManager object
|
20
|
+
|
21
|
+
@diskFileNames = vmCfg.getDiskFileHash
|
22
|
+
|
23
|
+
`vgdisplay -c 2> /dev/null`.each { |vgl| vg = getVg(vgl); @vgHash[vg.vgName] = vg }
|
24
|
+
`lvdisplay -c 2> /dev/null`.each { |lvl| lv = getLv(lvl); @lvHash[lv.lvPath] = lv }
|
25
|
+
|
26
|
+
vgNames = @vgHash.keys
|
27
|
+
lvNames = @lvHash.keys
|
28
|
+
hiddenDevNames = `pvdisplay -c 2> /dev/null`.split("\n").collect! { |p| p.lstrip.split(":", 2)[0] }
|
29
|
+
|
30
|
+
if $log.debug?
|
31
|
+
$log.debug "\nVolume Groups: (#{vgNames.class}: #{vgNames.length})"
|
32
|
+
vgNames.each { |dn| $log.debug "\t#{dn}" }
|
33
|
+
$log.debug "\nLogical Volumes: (#{lvNames.class}: #{lvNames.length})"
|
34
|
+
lvNames.each { |dn| $log.debug "\t#{dn}" }
|
35
|
+
$log.debug "\nHidden devs: (#{hiddenDevNames.class}: #{hiddenDevNames.length})"
|
36
|
+
end
|
37
|
+
|
38
|
+
physVolumes = openPhysicalVolumes(@diskFileNames)
|
39
|
+
|
40
|
+
$log.debug "\nMiqNativeVolumeManager: physVolumes:" if $log.debug?
|
41
|
+
physVolumes.each do |pv|
|
42
|
+
if $log.debug?
|
43
|
+
$log.debug "\t#{pv.devFile} => #{pv.dInfo.hardwareId} (SIG: #{pv.dInfo.diskSig})"
|
44
|
+
$log.debug "\t\tPartition: #{pv.partNum}, Type: #{pv.partType}"
|
45
|
+
end
|
46
|
+
if hiddenDevNames.include?(pv.devFile)
|
47
|
+
$log.debug "\t\t\tHIDDEN VOLUME" if $log.debug?
|
48
|
+
hiddenVolumes << pv
|
49
|
+
else
|
50
|
+
@physicalVolumes << pv
|
51
|
+
end
|
52
|
+
@allPhysicalVolumes << pv
|
53
|
+
end
|
54
|
+
|
55
|
+
vgNames.each { |vgn| `vgchange -a y #{vgn}` }
|
56
|
+
|
57
|
+
@logicalVolumes = openLogicalVolumes(lvNames)
|
58
|
+
@visibleVolumes = @logicalVolumes + @physicalVolumes
|
59
|
+
end
|
60
|
+
|
61
|
+
def closeAll
|
62
|
+
@wholeDisks.each(&:close)
|
63
|
+
@logicalVolumes = []
|
64
|
+
@physicalVolumes = []
|
65
|
+
@hiddenVolumes = []
|
66
|
+
@wholeDisks = []
|
67
|
+
@vgHash = nil
|
68
|
+
@ost.miqVim.closeVdlConnection(@vdlConnection) if @vdlConnection
|
69
|
+
@volMgrPS.postMount
|
70
|
+
end
|
71
|
+
|
72
|
+
def openLogicalVolumes(lvnames)
|
73
|
+
lvList = []
|
74
|
+
lvnames.each do |lvn|
|
75
|
+
#
|
76
|
+
# get MiqDisk object for each LV and add to lvList.
|
77
|
+
#
|
78
|
+
dInfo = OpenStruct.new
|
79
|
+
dInfo.localDev = lvn
|
80
|
+
dInfo.lvObj = @lvHash[lvn]
|
81
|
+
dInfo.hardwareId = ""
|
82
|
+
lvList << MiqDisk.getDisk(dInfo)
|
83
|
+
end
|
84
|
+
lvList
|
85
|
+
end # def openLogicalVolumes
|
86
|
+
|
87
|
+
def openPhysicalVolumes(diskFiles)
|
88
|
+
pVolumes = []
|
89
|
+
|
90
|
+
$log.debug "openPhysicalVolumes: no disk files supplied." unless diskFiles
|
91
|
+
|
92
|
+
#
|
93
|
+
# Build a list of the VM's physical volumes.
|
94
|
+
#
|
95
|
+
diskFiles.each do |dtag, df|
|
96
|
+
$log.debug "openPhysicalVolumes: processing disk file (#{dtag}): #{df}"
|
97
|
+
dInfo = OpenStruct.new
|
98
|
+
dInfo.localDev = df
|
99
|
+
dInfo.hardwareId = dtag
|
100
|
+
|
101
|
+
begin
|
102
|
+
d = MiqDisk.getDisk(dInfo)
|
103
|
+
# I am not sure if getting a nil handle back should throw an error or not.
|
104
|
+
# For now I am just skipping to the next disk. (GMM)
|
105
|
+
next if d.nil?
|
106
|
+
rescue => err
|
107
|
+
$log.error "Couldn't open disk file: #{df}"
|
108
|
+
$log.error err.to_s
|
109
|
+
$log.debug err.backtrace.join("\n")
|
110
|
+
@diskInitErrors[df] = err.to_s
|
111
|
+
next
|
112
|
+
end
|
113
|
+
|
114
|
+
@wholeDisks << d
|
115
|
+
p = d.getPartitions
|
116
|
+
if p.empty?
|
117
|
+
#
|
118
|
+
# If the disk has no partitions, the whole disk can be a single volume.
|
119
|
+
#
|
120
|
+
pVolumes << d
|
121
|
+
else
|
122
|
+
#
|
123
|
+
# If the disk is partitioned, the partitions are physical volumes,
|
124
|
+
# but not the whild disk.
|
125
|
+
#
|
126
|
+
pVolumes.concat(p)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
pVolumes
|
131
|
+
end # def openPhysicalVolumes
|
132
|
+
|
133
|
+
def getVg(vgl)
|
134
|
+
vga = vgl.lstrip.split(":")
|
135
|
+
(VolumeGroup.new(vga[16], vga[0]))
|
136
|
+
end
|
137
|
+
|
138
|
+
def getLv(lvl)
|
139
|
+
lva = lvl.lstrip.split(":")
|
140
|
+
lvPath = lva[0]
|
141
|
+
vgName = lva[1]
|
142
|
+
lvId = `lvdisplay -v #{lvPath} 2> /dev/null | grep "LV UUID"`.split(" ").last
|
143
|
+
lv = LogicalVolume.new(lvId, File.basename(lvPath))
|
144
|
+
|
145
|
+
vg = @vgHash[vgName]
|
146
|
+
lv.vgObj = vg
|
147
|
+
lv.lvPath = lvPath
|
148
|
+
vg.logicalVolumes[lv.lvName] = lv
|
149
|
+
end
|
150
|
+
end # class MiqNativeVolumeManager
|
@@ -0,0 +1,277 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'sys-uname'
|
3
|
+
require 'binary_struct'
|
4
|
+
require 'VolumeManager/MiqLvm'
|
5
|
+
require 'VolumeManager/MiqLdm'
|
6
|
+
require 'VolumeManager/VolMgrPlatformSupport'
|
7
|
+
require 'disk/modules/RawDisk'
|
8
|
+
|
9
|
+
class MiqVolumeManager
|
10
|
+
attr_accessor :rootTrees
|
11
|
+
attr_reader :logicalVolumes, :physicalVolumes, :visibleVolumes, :hiddenVolumes, :allPhysicalVolumes, :vgHash, :lvHash, :diskFileNames
|
12
|
+
|
13
|
+
def self.fromNativePvs
|
14
|
+
return nil unless Sys::Platform::IMPL == :linux
|
15
|
+
|
16
|
+
msg_pfx = "MiqVolumeManager.fromNativePvs"
|
17
|
+
|
18
|
+
bdevs = `pvdisplay -c | cut -d: -f1`.tr(" \t", "").split("\n")
|
19
|
+
ldevs = `lvdisplay -c | cut -d: -f1`.tr(" \t", "").split("\n")
|
20
|
+
bdevs -= ldevs
|
21
|
+
bda = []
|
22
|
+
|
23
|
+
bdevs.each do |bd|
|
24
|
+
next if bd == "unknowndevice"
|
25
|
+
$log.debug "#{msg_pfx}: Opening PV = #{bd}"
|
26
|
+
|
27
|
+
diskInfo = OpenStruct.new
|
28
|
+
diskInfo.rawDisk = true
|
29
|
+
diskInfo.fileName = bd
|
30
|
+
|
31
|
+
begin
|
32
|
+
disk = MiqDisk.new(RawDisk, diskInfo, 0)
|
33
|
+
rescue StandardError, NoMemoryError, SignalException => err
|
34
|
+
$log.warn "#{msg_pfx}: Could not open PV: #{bd}"
|
35
|
+
$log.warn err.to_s
|
36
|
+
$log.debug err.backtrace.join("\n")
|
37
|
+
next
|
38
|
+
end
|
39
|
+
|
40
|
+
raise "#{msg_pfx}: Failed to open disk: #{diskInfo.fileName}" unless disk
|
41
|
+
bda << disk
|
42
|
+
|
43
|
+
if $log.debug?
|
44
|
+
$log.debug "#{msg_pfx}: Block device: #{bd}"
|
45
|
+
$log.debug "#{msg_pfx}: \tDisk type: #{disk.diskType}"
|
46
|
+
$log.debug "#{msg_pfx}: \tDisk partition type: #{disk.partType}"
|
47
|
+
$log.debug "#{msg_pfx}: \tDisk block size: #{disk.blockSize}"
|
48
|
+
$log.debug "#{msg_pfx}: \tDisk start LBA: #{disk.lbaStart}"
|
49
|
+
$log.debug "#{msg_pfx}: \tDisk end LBA: #{disk.lbaEnd}"
|
50
|
+
$log.debug "#{msg_pfx}: \tDisk start byte: #{disk.startByteAddr}"
|
51
|
+
$log.debug "#{msg_pfx}: \tDisk end byte: #{disk.endByteAddr}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
new(bda)
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize(pVols)
|
59
|
+
@logicalVolumes = [] # visible logical volumes
|
60
|
+
@physicalVolumes = [] # visible physical volumes
|
61
|
+
@hiddenVolumes = [] # hidded volumes (in volume groups)
|
62
|
+
@allPhysicalVolumes = [] # all physical volumes
|
63
|
+
@vgHash = nil # volume groups hashed by name
|
64
|
+
@rootTrees = nil # the MiqMountManager objects using this MiqVolumeManager object
|
65
|
+
@vdlConnection = nil # connection for remote vmdk access.
|
66
|
+
|
67
|
+
lvmPvHdrHash = {} # physical volume header list, for lvm
|
68
|
+
pVols.each do |pv|
|
69
|
+
pvh = LdmScanner.scan(pv) || Lvm2Scanner.labelScan(pv)
|
70
|
+
if pvh
|
71
|
+
pvh.diskObj = pv # add reference to the pv's open disk object to the pv header
|
72
|
+
lvmPvHdrHash[pvh.pv_uuid] = pvh # this physical volume in an LVM volume group
|
73
|
+
@hiddenVolumes << pv # so it's a hidden volume
|
74
|
+
$log.info "MiqVolumeManager: #{pvh.lvm_type} metadata detected on PV: #{pv.dInfo.fileName}, partition: #{pv.partNum}"
|
75
|
+
else
|
76
|
+
@physicalVolumes << pv # this physical volume is not in an LVM volume group
|
77
|
+
$log.debug "MiqVolumeManager: No LVM metadata detected on PV: #{pv.dInfo.fileName}, partition: #{pv.partNum}"
|
78
|
+
end
|
79
|
+
@allPhysicalVolumes << pv
|
80
|
+
end
|
81
|
+
|
82
|
+
@vgHash = {}
|
83
|
+
parseLvmMetadata(lvmPvHdrHash)
|
84
|
+
parseLvmThinMetadata
|
85
|
+
@vgHash.each_value { |vg| @logicalVolumes.concat(vg.getLvs) }
|
86
|
+
|
87
|
+
@lvHash = {}
|
88
|
+
@logicalVolumes.each do |lvdObj|
|
89
|
+
lv = lvdObj.dInfo.lvObj
|
90
|
+
lvName = lv.lvName
|
91
|
+
vgName = lv.vgObj.vgName
|
92
|
+
|
93
|
+
@lvHash["/dev/#{vgName}/#{lvName}"] = lvdObj
|
94
|
+
end
|
95
|
+
|
96
|
+
@visibleVolumes = @logicalVolumes + @physicalVolumes
|
97
|
+
end
|
98
|
+
|
99
|
+
def close
|
100
|
+
$log.info "MiqVolumeManager.close called"
|
101
|
+
@logicalVolumes = @logicalVolumes.clear
|
102
|
+
@physicalVolumes = @physicalVolumes.clear
|
103
|
+
@hiddenVolumes = @hiddenVolumes.clear
|
104
|
+
@vgHash = nil
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# Physical volumes are opened by the client, so the client should be responsible
|
109
|
+
# for closing them. These methods are provided as a convienience when the volume
|
110
|
+
# manager is instantiated through fromNativePvs().
|
111
|
+
#
|
112
|
+
def closePvols
|
113
|
+
@allPhysicalVolumes.each(&:close)
|
114
|
+
@allPhysicalVolumes.clear
|
115
|
+
end
|
116
|
+
|
117
|
+
def closeAll
|
118
|
+
$log.info "MiqVolumeManager.closeAll called"
|
119
|
+
closePvols
|
120
|
+
close
|
121
|
+
end
|
122
|
+
|
123
|
+
def parseLvmMetadata(pvHdrs)
|
124
|
+
pvHdrs.each_value do |pvh|
|
125
|
+
if pvh.lvm_type == "LVM2"
|
126
|
+
$log.debug "MiqVolumeManager.parseLvmMetadata: parsing LVM2 metadata"
|
127
|
+
pvh.mdList.each do |md|
|
128
|
+
Lvm2MdParser.dumpMetadata(md) if $log.debug?
|
129
|
+
parser = Lvm2MdParser.new(md, pvHdrs)
|
130
|
+
next if @vgHash[parser.vgName]
|
131
|
+
@vgHash[parser.vgName] = parser.parse
|
132
|
+
# @vgHash[parser.vgName].dump
|
133
|
+
end
|
134
|
+
elsif pvh.lvm_type == "LDM"
|
135
|
+
$log.debug "MiqVolumeManager.parseLvmMetadata: parsing LDM metadata"
|
136
|
+
parser = LdmMdParser.new(pvh, pvHdrs)
|
137
|
+
next if @vgHash[parser.vgName]
|
138
|
+
@vgHash[parser.vgName] = parser.parse
|
139
|
+
else
|
140
|
+
$log.debug "MiqVolumeManager.parseLvmMetadata: unknown metadata type #{pvh.lvm_type}"
|
141
|
+
next
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def parseLvmThinMetadata
|
147
|
+
@vgHash.each do |vgname, vg|
|
148
|
+
$log.debug "MiqVolumeManager.parseLvmThinMetadata: setting LVM2 thin metadata"
|
149
|
+
|
150
|
+
vg.thin_volumes.each do |tv|
|
151
|
+
tv.thin_segments.each do |seg|
|
152
|
+
seg.set_thin_pool_volume vg.logicalVolumes.values
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
vg.thin_pool_volumes.each do |tpv|
|
157
|
+
tpv.thin_pool_segments.each do |seg|
|
158
|
+
seg.set_metadata_volume vg.logicalVolumes.values
|
159
|
+
seg.set_data_volume vg.logicalVolumes.values
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def toXml(doc = nil)
|
166
|
+
doc = MiqXml.createDoc(nil) unless doc
|
167
|
+
|
168
|
+
vi = doc.add_element 'volumes'
|
169
|
+
pvToXml(vi, false)
|
170
|
+
pvToXml(vi, true)
|
171
|
+
lvToXml(vi)
|
172
|
+
vgToXml(vi)
|
173
|
+
doc
|
174
|
+
end
|
175
|
+
|
176
|
+
def pvToXml(doc = nil, hidden = false)
|
177
|
+
doc = MiqXml.createDoc(nil) unless doc
|
178
|
+
|
179
|
+
if hidden
|
180
|
+
vols = @hiddenVolumes
|
181
|
+
volType = 'hidden'
|
182
|
+
else
|
183
|
+
vols = @physicalVolumes
|
184
|
+
volType = 'physical'
|
185
|
+
end
|
186
|
+
|
187
|
+
pvs = doc.add_element volType
|
188
|
+
vols.each do |dobj|
|
189
|
+
pv = pvs.add_element('volume', "controller" => dobj.hwId,
|
190
|
+
"disk_type" => dobj.diskType,
|
191
|
+
"location" => dobj.partNum,
|
192
|
+
"partition_type" => dobj.partType,
|
193
|
+
"size" => dobj.size,
|
194
|
+
"virtual_disk_file" => dobj.dInfo.fileName,
|
195
|
+
"start_address" => dobj.startByteAddr,)
|
196
|
+
if @rootTrees && @rootTrees.length > 0
|
197
|
+
pv.add_attribute("name", @rootTrees[0].osNames[dobj.hwId].to_s) if @rootTrees[0].osNames
|
198
|
+
|
199
|
+
fs = @rootTrees[0].fileSystems.find { |f| f.fs.dobj.hwId == dobj.hwId }
|
200
|
+
unless fs.nil?
|
201
|
+
pv.add_attributes("filesystem" => fs.fs.fsType,
|
202
|
+
"free_space" => fs.fs.freeBytes,
|
203
|
+
"used_space" => dobj.size - fs.fs.freeBytes)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
if dobj.pvObj
|
208
|
+
pv.add_attributes("volume_group" => dobj.pvObj.vgObj.vgName,
|
209
|
+
"uid" => dobj.pvObj.pvId)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
doc
|
213
|
+
end
|
214
|
+
|
215
|
+
def lvToXml(doc = nil)
|
216
|
+
doc = MiqXml.createDoc(nil) unless doc
|
217
|
+
|
218
|
+
lvs = doc.add_element 'logical'
|
219
|
+
@logicalVolumes.each do |dobj|
|
220
|
+
lvObj = dobj.dInfo.lvObj
|
221
|
+
name = lvObj.driveHint.blank? ? lvObj.lvName : lvObj.driveHint
|
222
|
+
lv = lvs.add_element('volume', "name" => name,
|
223
|
+
"type" => dobj.diskType,
|
224
|
+
"size" => dobj.size,
|
225
|
+
"uid" => lvObj.lvId,
|
226
|
+
"volume_group" => lvObj.vgObj.vgName,
|
227
|
+
"drive_hint" => lvObj.driveHint,
|
228
|
+
"volume_name" => lvObj.lvName,)
|
229
|
+
|
230
|
+
if @rootTrees && @rootTrees.length > 0
|
231
|
+
fs = @rootTrees[0].fileSystems.find { |f| f.fs.dobj.dInfo.lvObj && f.fs.dobj.dInfo.lvObj.lvName == lvObj.lvName }
|
232
|
+
unless fs.nil?
|
233
|
+
lv.add_attributes("filesystem" => fs.fs.fsType,
|
234
|
+
"free_space" => fs.fs.freeBytes,
|
235
|
+
"used_space" => dobj.size - fs.fs.freeBytes)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
doc
|
240
|
+
end
|
241
|
+
|
242
|
+
def vgToXml(doc = nil)
|
243
|
+
doc = MiqXml.createDoc(nil) unless doc
|
244
|
+
|
245
|
+
vgs = doc.add_element 'volume_groups'
|
246
|
+
@vgHash.each do |vgn, vgo|
|
247
|
+
pext = 0
|
248
|
+
lext = 0
|
249
|
+
|
250
|
+
vg = vgs.add_element('volume_group', {"name" => vgn})
|
251
|
+
|
252
|
+
pvs = vg.add_element 'physical'
|
253
|
+
vgo.physicalVolumes.each do |pvn, pvo|
|
254
|
+
pvs.add_element('volume', "name" => pvn,
|
255
|
+
"uid" => pvo.pvId,
|
256
|
+
"controller" => pvo.diskObj.hwId,
|
257
|
+
"os_name" => pvo.device,
|
258
|
+
"physical_extents" => pvo.peCount,
|
259
|
+
"virtual_disk_file" => pvo.diskObj.dInfo.fileName)
|
260
|
+
pext += pvo.peCount
|
261
|
+
end
|
262
|
+
|
263
|
+
lvs = vg.add_element 'logical'
|
264
|
+
vgo.logicalVolumes.each do |lvn, lvo|
|
265
|
+
lvs.add_element('volume', "name" => lvn,
|
266
|
+
"uid" => lvo.lvId)
|
267
|
+
lvo.segments.each { |s| lext += s.extentCount }
|
268
|
+
end
|
269
|
+
|
270
|
+
vg.add_attributes("extent_size" => vgo.extentSize,
|
271
|
+
"physical_extents" => pext,
|
272
|
+
"logical_extents" => lext,
|
273
|
+
"free_extents" => pext - lext)
|
274
|
+
end if @vgHash
|
275
|
+
doc
|
276
|
+
end
|
277
|
+
end # class MiqVolumeManager
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'sys-uname'
|
2
|
+
|
3
|
+
class VolMgrPlatformSupport
|
4
|
+
def initialize(cfgFile, ost)
|
5
|
+
$log.debug "Initializing VolMgrPlatformSupport" if $log
|
6
|
+
@cfgFile = cfgFile
|
7
|
+
@ost = ost
|
8
|
+
|
9
|
+
if Sys::Platform::OS == :windows
|
10
|
+
require "VolumeManager/VolMgrPlatformSupportWin"
|
11
|
+
extend VolMgrPlatformSupportWin
|
12
|
+
else
|
13
|
+
require "VolumeManager/VolMgrPlatformSupportLinux"
|
14
|
+
extend VolMgrPlatformSupportLinux
|
15
|
+
end
|
16
|
+
init
|
17
|
+
end # def initialize
|
18
|
+
end # class VolMgrPlatformSupport
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'util/miq-password'
|
2
|
+
require 'VMwareWebService/MiqVim'
|
3
|
+
|
4
|
+
module VolMgrPlatformSupportLinux
|
5
|
+
def init
|
6
|
+
$log.debug "VolMgrPlatformSupportLinux.init: #{@cfgFile}"
|
7
|
+
@ems = nil
|
8
|
+
@snMor = nil
|
9
|
+
@vi = nil
|
10
|
+
@vimVm = nil
|
11
|
+
|
12
|
+
unless @ost.force
|
13
|
+
$log.info "VolMgrPlatformSupportLinux.init: force flag = false"
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
if @ost.miqVimVm
|
18
|
+
$log.debug "VolMgrPlatformSupportLinux.init: Have miqVimVm"
|
19
|
+
@vimVm = @ost.miqVimVm
|
20
|
+
return
|
21
|
+
end
|
22
|
+
|
23
|
+
$log.debug "VolMgrPlatformSupportLinux.init: miqVimVm not set - should be a non VMware VM"
|
24
|
+
end
|
25
|
+
|
26
|
+
def preMount
|
27
|
+
$log.debug "VolMgrPlatformSupportLinux.preMount Enter: force = #{@ost.force}"
|
28
|
+
return unless @ost.force
|
29
|
+
|
30
|
+
if @snMor
|
31
|
+
$log.error "VolMgrPlatformSupportLinux.preMount - #{@cfgFile} is already mounted"
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
unless @vimVm
|
36
|
+
$log.warn "VolMgrPlatformSupportLinux.preMount: cannot snapshot VM not registered to this host: #{@cfgFile}"
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
desc = @ost.snapshotDescription ? @ost.snapshotDescription : "EVM Snapshot"
|
41
|
+
st = Time.now
|
42
|
+
@snMor = @vimVm.createEvmSnapshot(desc, "false", true, @ost.snapshot_create_free_space)
|
43
|
+
$log.info "VolMgrPlatformSupportLinux.preMount: VM snapshot created in [#{Time.now - st}] seconds"
|
44
|
+
$log.debug "VolMgrPlatformSupportLinux.preMount: snMor = \"#{@snMor}\""
|
45
|
+
end
|
46
|
+
|
47
|
+
def postMount
|
48
|
+
$log.debug "VolMgrPlatformSupportLinux.postMount Enter: force = #{@ost.force}, @vimVm.nil? = #{@vimVm.nil?}"
|
49
|
+
return unless @ost.force
|
50
|
+
return unless @vimVm
|
51
|
+
|
52
|
+
if @ost.force
|
53
|
+
if !@snMor
|
54
|
+
$log.warn "VolMgrPlatformSupportLinux.postMount: VM not snapped: #{@cfgFile}"
|
55
|
+
else
|
56
|
+
$log.debug "VolMgrPlatformSupportLinux.postMount: removing snapshot snMor = \"#{@snMor}\""
|
57
|
+
begin
|
58
|
+
@vimVm.removeSnapshot(@snMor, "false", true, @ost.snapshot_remove_free_space)
|
59
|
+
rescue => err
|
60
|
+
$log.warn "VolMgrPlatformSupportLinux.postMount: failed to remove snapshot for VM: #{@cfgFile}"
|
61
|
+
$log.warn "VolMgrPlatformSupportLinux.postMount: #{err}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# If we opened the vimVm (it wasn't passed into us)
|
68
|
+
# then release it.
|
69
|
+
#
|
70
|
+
@vimVm.release unless @ost.miqVimVm
|
71
|
+
@vimVm = nil
|
72
|
+
|
73
|
+
@vi.disconnect if @vi
|
74
|
+
@vi = nil
|
75
|
+
@snMor = nil
|
76
|
+
end
|
77
|
+
end # module VolMgrPlatformSupportLinux
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'manageiq-gems-pending'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'log4r'
|
4
|
+
|
5
|
+
require 'disk/MiqDisk'
|
6
|
+
require 'VolumeManager/MiqVolumeManager'
|
7
|
+
|
8
|
+
class ConsoleFormatter < Log4r::Formatter
|
9
|
+
def format(event)
|
10
|
+
(event.data.kind_of?(String) ? event.data : event.data.inspect) + "\n"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
toplog = Log4r::Logger.new 'toplog'
|
15
|
+
Log4r::StderrOutputter.new('err_console', :level => Log4r::DEBUG, :formatter => ConsoleFormatter)
|
16
|
+
toplog.add 'err_console'
|
17
|
+
$vim_log = $log = toplog if $log.nil?
|
18
|
+
|
19
|
+
begin
|
20
|
+
|
21
|
+
volMgr = MiqVolumeManager.fromNativePvs
|
22
|
+
|
23
|
+
puts
|
24
|
+
puts "Volume Groups:"
|
25
|
+
volMgr.vgHash.each do |vgName, vgObj|
|
26
|
+
puts "\t#{vgName}: seq# = #{vgObj.seqNo}"
|
27
|
+
end
|
28
|
+
|
29
|
+
puts
|
30
|
+
puts "Logical Volumes:"
|
31
|
+
volMgr.lvHash.each do |key, lv|
|
32
|
+
puts "\t#{key}\t#{lv.dInfo.lvObj.lvName}"
|
33
|
+
end
|
34
|
+
|
35
|
+
volMgr.closeAll
|
36
|
+
|
37
|
+
rescue => err
|
38
|
+
puts err.to_s
|
39
|
+
puts err.backtrace.join("\n")
|
40
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'manageiq-gems-pending'
|
2
|
+
require 'log4r'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'more_core_extensions/core_ext/object/blank'
|
5
|
+
require 'metadata/VmConfig/VmConfig'
|
6
|
+
require "VolumeManager/MiqVolumeManager"
|
7
|
+
require "fs/MiqFS/MiqFS"
|
8
|
+
require "MiqVm/MiqVm"
|
9
|
+
require 'VMwareWebService/MiqVimBroker'
|
10
|
+
|
11
|
+
SRC_VM = raise "please define"
|
12
|
+
vmCfg = "/Volumes/WDpassport/Virtual Machines/MIQAppliance-win2008x86/Win2008x86.vmx"
|
13
|
+
|
14
|
+
class ConsoleFormatter < Log4r::Formatter
|
15
|
+
def format(event)
|
16
|
+
(event.data.kind_of?(String) ? event.data : event.data.inspect) + "\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
$log = Log4r::Logger.new 'toplog'
|
20
|
+
$log.level = Log4r::DEBUG
|
21
|
+
Log4r::StderrOutputter.new('err_console', :formatter => ConsoleFormatter)
|
22
|
+
$log.add 'err_console'
|
23
|
+
|
24
|
+
vm = nil
|
25
|
+
vim = nil
|
26
|
+
|
27
|
+
begin
|
28
|
+
# Uncomment following 2 lines for clienr/server connection.
|
29
|
+
# broker = MiqVimBroker.new(:client)
|
30
|
+
# vim = broker.getMiqVim(SERVER, USERNAME, PASSWORD)
|
31
|
+
# miqVm = vim.getVimVmByFilter("config.name" => SRC_VM)
|
32
|
+
#
|
33
|
+
# vmCfg = miqVm.vmh['summary']['config']['vmPathName']
|
34
|
+
puts "vmCfg: #{vmCfg}"
|
35
|
+
|
36
|
+
$miqOut = $stdout
|
37
|
+
ost = OpenStruct.new
|
38
|
+
# ost.miqVim = vim
|
39
|
+
vm = MiqVm.new(vmCfg, ost)
|
40
|
+
|
41
|
+
# puts "**** Volume information:"
|
42
|
+
# xml = vm.volumeManager.toXml
|
43
|
+
# xml.write($stdout, 4)
|
44
|
+
# puts
|
45
|
+
|
46
|
+
rta = vm.rootTrees
|
47
|
+
raise "No root filesystems detected for: #{vmCfg}" if rta.empty?
|
48
|
+
rt = rta.first
|
49
|
+
puts "**** Filesystem information:"
|
50
|
+
rt.toXml
|
51
|
+
puts
|
52
|
+
|
53
|
+
# exit
|
54
|
+
|
55
|
+
puts "**** First-level files:"
|
56
|
+
puts "C:"
|
57
|
+
rt.dirForeach("C:/") { |f| puts "\t#{f}" }
|
58
|
+
# puts "F:"
|
59
|
+
# rt.dirForeach("F:/") { |f| puts "\t#{f}" }
|
60
|
+
|
61
|
+
puts
|
62
|
+
puts "******************* SOFTWARE:"
|
63
|
+
xml = vm.extract("software")
|
64
|
+
xml.write($stdout, 4)
|
65
|
+
puts
|
66
|
+
|
67
|
+
exit
|
68
|
+
|
69
|
+
vmConfig = VmConfig.new(vmCfg)
|
70
|
+
volMgr = MiqVolumeManager.new(vmConfig)
|
71
|
+
|
72
|
+
volMgr.visibleVolumes.each do |vv|
|
73
|
+
puts "Disk type: #{vv.diskType}"
|
74
|
+
puts "Disk partition type: #{vv.partType}"
|
75
|
+
puts "Disk block size: #{vv.blockSize}"
|
76
|
+
puts "Disk start LBA: #{vv.lbaStart}"
|
77
|
+
puts "Disk end LBA: #{vv.lbaEnd}"
|
78
|
+
puts "Disk start byte: #{vv.startByteAddr}"
|
79
|
+
puts "Disk end byte: #{vv.endByteAddr}"
|
80
|
+
if (lvObj = vv.dInfo.lvObj)
|
81
|
+
puts "Drive Hint: #{lvObj.driveHint}"
|
82
|
+
end
|
83
|
+
|
84
|
+
if (fs = MiqFS.getFS(vv))
|
85
|
+
puts "\tFS type: #{fs.fsType}"
|
86
|
+
fs.dirForeach { |f| puts "\t\t#{f}" }
|
87
|
+
else
|
88
|
+
puts "\tNo FS detected on volume"
|
89
|
+
end
|
90
|
+
puts
|
91
|
+
end
|
92
|
+
rescue => err
|
93
|
+
puts err.to_s
|
94
|
+
puts err.backtrace.join("\n")
|
95
|
+
ensure
|
96
|
+
vm.unmount if vm
|
97
|
+
end
|