diff --git a/Anvil/Tools/Server.pm b/Anvil/Tools/Server.pm index ef81793f..2e70bc82 100755 --- a/Anvil/Tools/Server.pm +++ b/Anvil/Tools/Server.pm @@ -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