blob: 0a15fc799385913e74ce6d589859006e9afcb72e [file] [log] [blame]
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