|
|
|
@ -279,52 +279,6 @@ sub _parse_definition |
|
|
|
|
$anvil->data->{server}{$server}{$source}{parsed} = $server_xml; |
|
|
|
|
#print Dumper $server_xml; |
|
|
|
|
|
|
|
|
|
# Find what drives (disk and "optical") this server uses. |
|
|
|
|
foreach my $device_ref (@{$server_xml->{devices}}) |
|
|
|
|
{ |
|
|
|
|
foreach my $disk_ref (@{$device_ref->{disk}}) |
|
|
|
|
{ |
|
|
|
|
my $type = $disk_ref->{device}; |
|
|
|
|
my $bus = $disk_ref->{target}->[0]->{bus}; |
|
|
|
|
my $target = $disk_ref->{target}->[0]->{dev}; |
|
|
|
|
my $boot_order = defined $disk_ref->{boot}->[0]->{order} ? $disk_ref->{boot}->[0]->{order} : 99; |
|
|
|
|
my $alias = $disk_ref->{alias}->[0]->{name}; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
type => $type, |
|
|
|
|
bus => $bus, |
|
|
|
|
target => $target, |
|
|
|
|
alias => $alias, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
if ($type eq "disk") |
|
|
|
|
{ |
|
|
|
|
foreach my $source_ref (@{$disk_ref->{source}}) |
|
|
|
|
{ |
|
|
|
|
my $device_path = $source_ref->{dev}; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { device_path => $device_path }}); |
|
|
|
|
|
|
|
|
|
$anvil->data->{server}{$server}{$source}{disk}{$device_path}{on_lv} = defined $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{on} ? $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{on} : ""; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{disk}{$device_path}{resource} = defined $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{resource} ? $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{resource} : ""; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::optical::${device_path}::on_lv" => $anvil->data->{server}{$server}{$source}{disk}{$device_path}{on_lv}, |
|
|
|
|
"server::${server}::${source}::optical::${device_path}::resource" => $anvil->data->{server}{$server}{$source}{disk}{$device_path}{resource}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
elsif ($type eq "cdrom") |
|
|
|
|
{ |
|
|
|
|
foreach my $source_ref (@{$disk_ref->{source}}) |
|
|
|
|
{ |
|
|
|
|
my $file = defined $source_ref->{file} ? $source_ref->{file} : ""; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { file => $file }}); |
|
|
|
|
|
|
|
|
|
$anvil->data->{server}{$server}{$source}{optical}{$file} = 1; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "server::${server}::${source}::optical::${file}" => $anvil->data->{server}{$server}{$source}{optical}{$file} }}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Pull out some basic server info. |
|
|
|
|
$anvil->data->{server}{$server}{$source}{info}{uuid} = $server_xml->{uuid}->[0]; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{info}{name} = $server_xml->{name}->[0]; |
|
|
|
@ -485,6 +439,195 @@ sub _parse_definition |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Pull out console data |
|
|
|
|
foreach my $hash_ref (@{$server_xml->{devices}->[0]->{console}}) |
|
|
|
|
{ |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{type} = $hash_ref->{type}; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{tty} = $hash_ref->{tty}; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{alias} = $hash_ref->{alias}->[0]->{name}; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{source} = $hash_ref->{source}->[0]->{path}; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{target_type} = $hash_ref->{target}->[0]->{type}; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{console}{target_port} = $hash_ref->{target}->[0]->{port}; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::console::type" => $anvil->data->{server}{$server}{$source}{device}{console}{type}, |
|
|
|
|
"server::${server}::${source}::device::console::tty" => $anvil->data->{server}{$server}{$source}{device}{console}{tty}, |
|
|
|
|
"server::${server}::${source}::device::console::alias" => $anvil->data->{server}{$server}{$source}{device}{console}{alias}, |
|
|
|
|
"server::${server}::${source}::device::console::source" => $anvil->data->{server}{$server}{$source}{device}{console}{source}, |
|
|
|
|
"server::${server}::${source}::device::console::target_type" => $anvil->data->{server}{$server}{$source}{device}{console}{target_type}, |
|
|
|
|
"server::${server}::${source}::device::console::target_port" => $anvil->data->{server}{$server}{$source}{device}{console}{target_port}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Controllers is a big chunk |
|
|
|
|
foreach my $hash_ref (@{$server_xml->{devices}->[0]->{controller}}) |
|
|
|
|
{ |
|
|
|
|
my $type = $hash_ref->{type}; |
|
|
|
|
my $index = $hash_ref->{'index'}; |
|
|
|
|
my $ports = exists $hash_ref->{ports} ? $hash_ref->{ports} : ""; |
|
|
|
|
my $target_chassis = exists $hash_ref->{target} ? $hash_ref->{target}->[0]->{chassis} : ""; |
|
|
|
|
my $target_port = exists $hash_ref->{target} ? $hash_ref->{target}->[0]->{port} : ""; |
|
|
|
|
my $address_type = defined $hash_ref->{address}->[0]->{type} ? $hash_ref->{address}->[0]->{type} : ""; |
|
|
|
|
my $address_domain = defined $hash_ref->{address}->[0]->{domain} ? $hash_ref->{address}->[0]->{domain} : ""; |
|
|
|
|
my $address_bus = defined $hash_ref->{address}->[0]->{bus} ? $hash_ref->{address}->[0]->{bus} : ""; |
|
|
|
|
my $address_slot = defined $hash_ref->{address}->[0]->{slot} ? $hash_ref->{address}->[0]->{slot} : ""; |
|
|
|
|
my $address_function = defined $hash_ref->{address}->[0]->{function} ? $hash_ref->{address}->[0]->{function} : ""; |
|
|
|
|
|
|
|
|
|
# Model is weird, it can be at '$hash_ref->{model}->[X]' or '$hash_ref->{model}->[Y]->{name}' |
|
|
|
|
# as 'model' is both an attribute and a child element. |
|
|
|
|
$hash_ref->{model} = "" if not defined $hash_ref->{model}; |
|
|
|
|
my $model = ""; |
|
|
|
|
if (not ref($hash_ref->{model})) |
|
|
|
|
{ |
|
|
|
|
$model = $hash_ref->{model}; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
foreach my $entry (@{$hash_ref->{model}}) |
|
|
|
|
{ |
|
|
|
|
if (ref($entry)) |
|
|
|
|
{ |
|
|
|
|
$model = $entry->{name} if $entry->{name}; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
$model = $entry if $entry; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Store the data |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{alias} = $hash_ref->{alias}->[0]->{name}; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::alias" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{alias}, |
|
|
|
|
}}); |
|
|
|
|
if ($model) |
|
|
|
|
{ |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{model} = $model; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::model" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{model}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
if ($ports) |
|
|
|
|
{ |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{ports} = $ports; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::ports" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{ports}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
if ($target_chassis) |
|
|
|
|
{ |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{target}{chassis} = $target_chassis; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{target}{port} = $target_port; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::target::chassis" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{target}{chassis}, |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::target::port" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{target}{port}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
if ($address_type) |
|
|
|
|
{ |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{type} = $address_type; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{domain} = $address_domain; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{bus} = $address_bus; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{slot} = $address_slot; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{function} = $address_function; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::address::type" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{type}, |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::address::domain" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{domain}, |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::address::bus" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{bus}, |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::address::slot" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{slot}, |
|
|
|
|
"server::${server}::${source}::device::controller::${type}::index::${index}::address::function" => $anvil->data->{server}{$server}{$source}{device}{controller}{$type}{'index'}{$index}{address}{function}, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
# Add to system bus list |
|
|
|
|
# Controller type: [pci], alias: (pci.2), index: [2] |
|
|
|
|
# - Model: [pcie-root-port] |
|
|
|
|
# - Target chassis: [2], port: [0x11] |
|
|
|
|
# - Bus type: [pci], domain: [0x0000], bus: [0x00], slot: [0x02], function: [0x1] |
|
|
|
|
# server::test_server::from_memory::address::virtio-serial::controller::0::bus::0::port::2: [channel - spicevmc] |
|
|
|
|
$anvil->data->{server}{$server}{$source}{address}{$address_type}{controller}{$type}{bus}{$address_bus}{bus}{$address_bus}{slot}{$address_slot}{function}{$address_function}{domain} = $address_domain; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::address::${address_type}::controller::${type}::bus::${address_bus}::slot::${address_slot}::function::${address_function}::domain" => $anvil->data->{server}{$server}{$source}{address}{$address_type}{controller}{$type}{bus}{$address_bus}{bus}{$address_bus}{slot}{$address_slot}{function}{$address_function}{domain}, |
|
|
|
|
}}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Find what drives (disk and "optical") this server uses. |
|
|
|
|
foreach my $hash_ref (@{$server_xml->{devices}->[0]->{disk}}) |
|
|
|
|
{ |
|
|
|
|
#print Dumper $hash_ref; |
|
|
|
|
my $device = $hash_ref->{device}; |
|
|
|
|
my $type = $hash_ref->{type}; |
|
|
|
|
my $device_target = $hash_ref->{target}->[0]->{dev}; |
|
|
|
|
my $device_bus = $hash_ref->{target}->[0]->{bus}; |
|
|
|
|
my $address_type = $hash_ref->{address}->[0]->{type}; |
|
|
|
|
my $address_bus = $hash_ref->{address}->[0]->{bus}; |
|
|
|
|
my $boot_order = defined $hash_ref->{boot}->[0]->{order} ? $hash_ref->{boot}->[0]->{order} : 99; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
device => $device, |
|
|
|
|
type => $type, |
|
|
|
|
device_target => $device_target, |
|
|
|
|
device_bus => $device_bus, |
|
|
|
|
address_type => $address_type, |
|
|
|
|
address_bus => $address_bus, |
|
|
|
|
boot_order => $boot_order, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
if ($device eq "disk") |
|
|
|
|
{ |
|
|
|
|
my $address_slot = $hash_ref->{address}->[0]->{slot}; |
|
|
|
|
my $address_domain = $hash_ref->{address}->[0]->{domain}; |
|
|
|
|
my $address_function = $hash_ref->{address}->[0]->{function}; |
|
|
|
|
my $device_path = $hash_ref->{source}->[0]->{dev}; |
|
|
|
|
|
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{type} = $address_type; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{domain} = $address_domain; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{bus} = $address_bus; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{slot} = $address_slot; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{function} = $address_function; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{path} = $device_path; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::${device}::address::type" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{type}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::domain" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{domain}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::bus" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{bus}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::slot" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{slot}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::function" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{function}, |
|
|
|
|
"server::${server}::${source}::device::${device}::path" => $anvil->data->{server}{$server}{$source}{device}{$device}{path}, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device_path}{on_lv} = defined $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{on} ? $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{on} : ""; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device_path}{resource} = defined $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{resource} ? $anvil->data->{drbd}{'local'}{drbd_path}{$device_path}{resource} : ""; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::${device_path}::on_lv" => $anvil->data->{server}{$server}{$source}{device}{$device_path}{on_lv}, |
|
|
|
|
"server::${server}::${source}::device::${device_path}::resource" => $anvil->data->{server}{$server}{$source}{device}{$device_path}{resource}, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
# $anvil->data->{server}{$server}{$source}{address}{$device_bus}{bus}{$address_bus}{bus}{$address_bus}{slot}{$address_slot}{function}{$address_function}{domain} = $address_domain; |
|
|
|
|
# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
# "server::${server}::${source}::address::${address_type}::controller::${type}::bus::${address_bus}::slot::${address_slot}::function::${address_function}::domain" => $anvil->data->{server}{$server}{$source}{address}{$address_type}{controller}{$type}{bus}{$address_bus}{bus}{$address_bus}{slot}{$address_slot}{function}{$address_function}{domain}, |
|
|
|
|
# }}); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
# Looks like IDE is no longer supported on RHEL 8. |
|
|
|
|
my $device_path = defined $hash_ref->{source}->[0]->{file} ? $hash_ref->{source}->[0]->{file} : ""; |
|
|
|
|
my $address_controller = $hash_ref->{address}->[0]->{controller}; |
|
|
|
|
my $address_unit = $hash_ref->{address}->[0]->{unit}; |
|
|
|
|
my $address_target = $hash_ref->{address}->[0]->{target}; |
|
|
|
|
|
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{controller} = $address_controller; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{unit} = $address_unit; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{address}{target} = $address_target; |
|
|
|
|
$anvil->data->{server}{$server}{$source}{device}{$device}{path} = $device_path; |
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { |
|
|
|
|
"server::${server}::${source}::device::${device}::address::controller" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{controller}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::unit" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{unit}, |
|
|
|
|
"server::${server}::${source}::device::${device}::address::target" => $anvil->data->{server}{$server}{$source}{device}{$device}{address}{target}, |
|
|
|
|
"server::${server}::${source}::device::${device}::path" => $anvil->data->{server}{$server}{$source}{device}{$device}{path}, |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
die; |
|
|
|
|
|
|
|
|
|
# Pull out other devices |
|
|
|
|