| From 7afb20f3484eb118855d2033e7308cfc4a07fae3 Mon Sep 17 00:00:00 2001 |
| From: Norm James <njames@us.ibm.com> |
| Date: Mon, 12 Sep 2016 18:47:13 -0700 |
| Subject: [PATCH] Add ability to read old and new Serverwiz xml outputs. |
| |
| The new Serverwiz format added outer tags for performance |
| reasons. It also added attribute groups for accessing |
| like attributes with one API call. |
| |
| Change-Id: I6b6c6de8defbc5c0f0c8c7d191836e69ac7bfc98 |
| --- |
| src/usr/targeting/common/Targets.pm | 157 +++++++++++++++++++++++++++++------- |
| 1 file changed, 126 insertions(+), 31 deletions(-) |
| |
| diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm |
| index 096db10..35f0842 100644 |
| --- a/src/usr/targeting/common/Targets.pm |
| +++ b/src/usr/targeting/common/Targets.pm |
| @@ -26,6 +26,7 @@ package Targets; |
| |
| use strict; |
| use XML::Simple; |
| +use XML::Parser; |
| use Data::Dumper; |
| |
| sub new |
| @@ -43,9 +44,10 @@ sub new |
| force => 0, |
| debug => 0, |
| version => "", |
| + xml_version => 0, |
| errorsExist => 0, |
| NUM_PROCS => 0, |
| - TOP_LEVEL => "sys-0", |
| + TOP_LEVEL => "", |
| TOPOLOGY => undef, |
| report_log => "", |
| vpd_num => 0, |
| @@ -87,9 +89,16 @@ sub loadXML |
| print "Loading MRW XML: $filename\n"; |
| $self->{xml} = |
| XMLin($filename,forcearray => [ 'child_id', 'hidden_child_id', 'bus', |
| - 'property' ]); |
| + 'property', 'field', 'attribute' ]); |
| + |
| + if (defined($self->{xml}->{'enumerationTypes'})) |
| + { |
| + $self->{xml_version} = 1; |
| + } |
| + |
| $self->storeEnumerations(); |
| - $self->buildHierarchy($self->{TOP_LEVEL}); |
| + $self->storeGroups(); |
| + $self->buildHierarchy(); |
| $self->buildAffinity(); |
| $self->{report_filename}=$filename.".rpt"; |
| $self->{report_filename}=~s/\.xml//g; |
| @@ -230,15 +239,31 @@ sub printAttribute |
| sub storeEnumerations |
| { |
| my $self = shift; |
| - |
| - foreach my $enumType (keys(%{ $self->{xml}->{enumerationType} })) |
| + my $baseptr = $self->{xml}->{enumerationType}; |
| + if ($self->{xml_version} == 1) |
| + { |
| + $baseptr = $self->{xml}->{enumerationTypes}->{enumerationType}; |
| + } |
| + foreach my $enumType (keys(%{ $baseptr })) |
| { |
| foreach my $enum ( |
| - keys(%{$self->{xml}->{enumerationType}->{$enumType}->{enumerator}})) |
| + keys(%{$baseptr->{$enumType}->{enumerator}})) |
| { |
| $self->{enumeration}->{$enumType}->{$enum} = |
| - $self->{xml}->{enumerationType}->{$enumType}->{enumerator} |
| - ->{$enum}->{value}; |
| + $baseptr->{$enumType}->{enumerator}->{$enum}->{value}; |
| + } |
| + } |
| +} |
| +sub storeGroups |
| +{ |
| + my $self = shift; |
| + foreach my $grp (keys(%{ $self->{xml}->{attributeGroups} |
| + ->{attributeGroup} })) |
| + { |
| + foreach my $attr (@{$self->{xml}->{attributeGroups} |
| + ->{attributeGroup}->{$grp}->{'attribute'}}) |
| + { |
| + $self->{groups}->{$grp}->{$attr} = 1; |
| } |
| } |
| } |
| @@ -277,13 +302,45 @@ sub buildHierarchy |
| my $self = shift; |
| my $target = shift; |
| |
| - my $old_path = $self->{data}->{INSTANCE_PATH}; |
| - my $target_xml = $self->{xml}->{'targetInstance'}{$target}; |
| + my $instance_path = $self->{data}->{INSTANCE_PATH}; |
| + if (!defined $instance_path) |
| + { |
| + $instance_path = ""; |
| + } |
| + my $baseptr = $self->{xml}->{'targetInstance'}; |
| + if ($self->{xml_version} == 1) |
| + { |
| + $baseptr = $self->{xml}->{'targetInstances'}->{'targetInstance'}; |
| + } |
| + if ($target eq "") |
| + { |
| + ## find system target |
| + foreach my $t (keys(%{$baseptr})) |
| + { |
| + if ($baseptr->{$t}->{attribute}->{TYPE}->{default} eq "SYS") |
| + { |
| + $self->{TOP_LEVEL} = $t; |
| + $target = $t; |
| + } |
| + } |
| + } |
| + if ($target eq "") |
| + { |
| + die "Unable to find system top level target\n"; |
| + } |
| + my $old_path = $instance_path; |
| + my $target_xml = $baseptr->{$target}; |
| my $affinity_target = $target; |
| - my $key = $self->{data}->{INSTANCE_PATH} . "/" . $target; |
| + my $key = $instance_path . "/" . $target; |
| |
| - my $instance_path = $self->{data}->{INSTANCE_PATH}; |
| - $instance_path = "instance:" . substr($instance_path, 1); |
| + if ($instance_path ne "") |
| + { |
| + $instance_path = "instance:" . substr($instance_path, 1); |
| + } |
| + else |
| + { |
| + $instance_path = "instance:"; |
| + } |
| $self->setAttribute($key, "INSTANCE_PATH", $instance_path); |
| $self->{data}->{TARGETS}->{$key}->{TARGET} = $target_xml; |
| $self->{data}->{INSTANCE_PATH} = $old_path . "/" . $target; |
| @@ -321,9 +378,15 @@ sub buildHierarchy |
| } |
| } |
| ## global attributes overwrite local |
| - foreach my $prop (keys %{$self->{xml}->{globalSetting}->{$key}->{property}}) |
| + my $settingptr = $self->{xml}->{globalSetting}; |
| + if ($self->{xml_version} == 1) |
| { |
| - my $val=$self->{xml}->{globalSetting}->{$key}->{property}-> |
| + $settingptr = $self->{xml}->{globalSettings}->{globalSetting}; |
| + } |
| + |
| + foreach my $prop (keys %{$settingptr->{$key}->{property}}) |
| + { |
| + my $val=$settingptr->{$key}->{property}-> |
| {$prop}->{value}; |
| $self->setAttribute($key, $prop, $val); |
| } |
| @@ -413,8 +476,10 @@ sub buildAffinity |
| $node = -1; |
| |
| $self->{targeting}{SYS}[0]{KEY} = $target; |
| - $self->setAttribute($target, "AFFINITY_PATH", "affinity:sys-0"); |
| - $self->setAttribute($target, "PHYS_PATH", "physical:sys-0"); |
| + $self->setAttribute($target, "AFFINITY_PATH", |
| + "affinity:".$self->{TOP_LEVEL}); |
| + $self->setAttribute($target, "PHYS_PATH", |
| + "physical:".$self->{TOP_LEVEL}); |
| $self->setAttribute($target, "ENTITY_INSTANCE","0"); |
| } |
| elsif ($type eq "NODE") |
| @@ -424,13 +489,13 @@ sub buildAffinity |
| $self->{dimm_tpos} = 0; |
| $self->{membuf_inst_num}=0; |
| $node++; |
| - $node_phys = "physical:sys-0/node-$node"; |
| - $node_aff = "affinity:sys-0/node-$node"; |
| + $node_phys = "physical:".$self->{TOP_LEVEL}."/node-$node"; |
| + $node_aff = "affinity:".$self->{TOP_LEVEL}."/node-$node"; |
| $self->{targeting}{SYS}[0]{NODES}[$node]{KEY} = $target; |
| $self->setAttribute($target, "AFFINITY_PATH", |
| - "affinity:sys-0/node-$node"); |
| + "affinity:".$self->{TOP_LEVEL}."/node-$node"); |
| $self->setAttribute($target, "PHYS_PATH", |
| - "physical:sys-0/node-$node"); |
| + "physical:".$self->{TOP_LEVEL}."/node-$node"); |
| $self->setHuid($target, 0, $node); |
| $self->setAttribute($target, "ENTITY_INSTANCE",$node); |
| } |
| @@ -439,9 +504,11 @@ sub buildAffinity |
| $tpm++; |
| $self->{targeting}{SYS}[0]{NODES}[$node]{TPMS}[$tpm]{KEY} = $target; |
| $self->setAttribute($target, "AFFINITY_PATH", |
| - "affinity:sys-0/node-$node/tpm-$tpm"); |
| + "affinity:".$self->{TOP_LEVEL}. |
| + "/node-$node/tpm-$tpm"); |
| $self->setAttribute($target, "PHYS_PATH", |
| - "physical:sys-0/node-$node/tpm-$tpm"); |
| + "physical:".$self->{TOP_LEVEL}. |
| + "/node-$node/tpm-$tpm"); |
| $self->setHuid($target, 0, $tpm); |
| $self->setAttribute($target, "ENTITY_INSTANCE",$tpm); |
| } |
| @@ -469,8 +536,10 @@ sub buildAffinity |
| $self->setHuid($target, 0, $node); |
| my $socket = $self->getTargetParent( |
| $self->getTargetParent($target)); |
| - my $parent_affinity = "affinity:sys-0/node-$node/proc-$proc"; |
| - my $parent_physical = "physical:sys-0/node-$node/proc-$proc"; |
| + my $parent_affinity = "affinity:".$self->{TOP_LEVEL} |
| + ."/node-$node/proc-$proc"; |
| + my $parent_physical = "physical:".$self->{TOP_LEVEL} |
| + ."/node-$node/proc-$proc"; |
| $self->setAttribute($target, "AFFINITY_PATH", $parent_affinity); |
| $self->setAttribute($target, "PHYS_PATH", $parent_physical); |
| $self->setAttribute($target, "POSITION", $proc); |
| @@ -619,8 +688,6 @@ sub processMcs |
| $self->setFsiAttributes($membuf,"FSICM",0,$proc_path,$fsi_port,0); |
| $self->setAttribute($unit, "DMI_REFCLOCK_SWIZZLE",$fsi_port); |
| my $dmi_swizzle = |
| - $dmi_bus->{bus_attribute}->{DMI_REFCLOCK_SWIZZLE}->{default}; |
| - my $dmi_swizzle = |
| $self->getBusAttribute($unit,0,"DMI_REFCLOCK_SWIZZLE"); |
| if ($dmi_swizzle ne "") |
| { |
| @@ -974,7 +1041,8 @@ sub isBadAttribute |
| { |
| return 1; |
| } |
| - if ($target_ptr->{ATTRIBUTES}->{$attribute}->{default} eq $badvalue) |
| + if (defined $badvalue && |
| + $target_ptr->{ATTRIBUTES}->{$attribute}->{default} eq $badvalue) |
| { |
| return 1; |
| } |
| @@ -1029,7 +1097,6 @@ sub getAttribute |
| printf("ERROR: getAttribute(%s,%s) | Attribute not defined\n", |
| $target, $attribute); |
| |
| - #print Dumper($target_ptr); |
| $self->myExit(4); |
| } |
| if (ref($target_ptr->{ATTRIBUTES}->{$attribute}->{default}) eq "HASH") |
| @@ -1038,6 +1105,30 @@ sub getAttribute |
| } |
| return $target_ptr->{ATTRIBUTES}->{$attribute}->{default}; |
| } |
| + |
| +sub getAttributeGroup |
| +{ |
| + my $self = shift; |
| + my $target = shift; |
| + my $group = shift; |
| + my $target_ptr = $self->getTarget($target); |
| + if (!defined($self->{groups}->{$group})) { |
| + printf("ERROR: getAttributeGroup(%s,%s) | Group not defined\n", |
| + $target, $group); |
| + $self->myExit(4); |
| + } |
| + my %attr; |
| + foreach my $attribute (keys(%{$self->{groups}->{$group}})) |
| + { |
| + if (defined($target_ptr->{ATTRIBUTES}->{$attribute}->{default})) |
| + { |
| + $attr{$attribute} = $target_ptr->{ATTRIBUTES}->{$attribute}; |
| + } |
| + } |
| + return \%attr; |
| +} |
| + |
| + |
| ## renames a target attribute |
| sub renameAttribute |
| { |
| @@ -1141,6 +1232,8 @@ sub getBusAttribute |
| return $target_ptr->{CONNECTION}->{BUS}->[$busnum]->{bus_attribute}->{$attr} |
| ->{default}; |
| } |
| + |
| + |
| ## returns a pointer to an array of children target names |
| sub getTargetChildren |
| { |
| @@ -1216,7 +1309,10 @@ sub setMruid |
| |
| my $type = $self->getType($target); |
| my $mru_prefix_id = $self->{enumeration}->{MRU_PREFIX}->{$type}; |
| - if ($mru_prefix_id eq "") { $mru_prefix_id = "0xFFFF"; } |
| + if (!defined $mru_prefix_id || $mru_prefix_id eq "") |
| + { |
| + $mru_prefix_id = "0xFFFF"; |
| + } |
| if ($mru_prefix_id eq "0xFFFF") { return; } |
| my $index = 0; |
| if (defined($self->{mru_idx}->{$node}->{$type})) |
| @@ -1486,4 +1582,3 @@ Prints to stdout log message is debug mode is turned on. |
| Norman James <njames@us.ibm.com> |
| |
| =cut |
| - |
| -- |
| 1.8.2.2 |
| |