perfsonar-dev - [pS-dev] [GEANT/SA2/SA2T3-OPPD] r672 - in branches/perfsonar-oppd-new-architect: bin etc/oppd-mdm lib/perfSONAR lib/perfSONAR/DataStruct lib/perfSONAR/MA tools/perfSONAR-client
Subject: perfsonar development work
List archive
[pS-dev] [GEANT/SA2/SA2T3-OPPD] r672 - in branches/perfsonar-oppd-new-architect: bin etc/oppd-mdm lib/perfSONAR lib/perfSONAR/DataStruct lib/perfSONAR/MA tools/perfSONAR-client
Chronological Thread
- From:
- To:
- Subject: [pS-dev] [GEANT/SA2/SA2T3-OPPD] r672 - in branches/perfsonar-oppd-new-architect: bin etc/oppd-mdm lib/perfSONAR lib/perfSONAR/DataStruct lib/perfSONAR/MA tools/perfSONAR-client
- Date: Wed, 19 Jan 2011 09:54:21 GMT
Author: dfn.calim
Date: 2011-01-19 09:54:20 +0000 (Wed, 19 Jan 2011)
New Revision: 672
Added:
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.old.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.old.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-ping
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-l4.xml
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-win-WORKING.xml
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request.xml
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-test
Removed:
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
Modified:
branches/perfsonar-oppd-new-architect/bin/oppd.pl
branches/perfsonar-oppd-new-architect/etc/oppd-mdm/oppd.conf
branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct/NMWG.pm
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MP.pm
Log:
Begin new Hades MA
Modified: branches/perfsonar-oppd-new-architect/bin/oppd.pl
===================================================================
--- branches/perfsonar-oppd-new-architect/bin/oppd.pl 2010-11-15 16:35:48
UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/bin/oppd.pl 2011-01-19 09:54:20
UTC (rev 672)
@@ -365,16 +365,14 @@
layout => $log_layout,
);
-
-# If detach mode log to screen
-unless ($detach) {
- $logger_opts{file} = "STDERR";
-}
#log file defined
if ($logfile) {
$logger_opts{file} = ">>$logfile"; #Append mode
}
-
+# If detach mode log to screen
+unless ($detach) {
+ $logger_opts{file} = "STDERR";
+}
Log::Log4perl->easy_init( \%logger_opts );
my $logger = get_logger( "perSONAR-oppd" );
Modified: branches/perfsonar-oppd-new-architect/etc/oppd-mdm/oppd.conf
===================================================================
--- branches/perfsonar-oppd-new-architect/etc/oppd-mdm/oppd.conf
2010-11-15 16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/etc/oppd-mdm/oppd.conf
2011-01-19 09:54:20 UTC (rev 672)
@@ -17,7 +17,7 @@
# Default: on
#
# Example:
-#detach off
+detach off
#
#detach on
Modified:
branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct/NMWG.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct/NMWG.pm
2010-11-15 16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct/NMWG.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -63,13 +63,36 @@
$self->{NS}->{MPBWCTL} = "http://ggf.org/ns/nmwg/tools/iperf/2.0/";
$self->{NS}->{MPOWAMP} = "http://ggf.org/ns/nmwg/tools/owamp/2.0/";
$self->{NS}->{STORE} = "http://ggf.org/ns/nmwg/ops/store/2.0/";
+ $self->{NS}->{RAW} = "http://ggf.org/ns/nmwg/tools/owd/raw";
+ $self->{NS}->{HADES} =
"http://ggf.org/ns/nwmg/tools/hades/aggregated";
+ $self->{HADES}->{ACTIONS} = {
+
+ ippm_aggregated => [
+ "http://ggf.org/ns/nmwg/tools/hades/",
+
"http://ggf.org/ns/nmwg/characteristic/delay/summary/",
+ "http://ggf.org/ns/nwmg/tools/hades/aggregated",
+ ],
+ ippm_raw => [
+ "http://ggf.org/ns/nmwg/tools/owd/raw",
+
"http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
+ ],
+ };
+
+
push @{$self->{"supportedEventtypes"}},
("http://ggf.org/ns/nmwg/tools/bwctl/2.0/",
"http://ggf.org/ns/nmwg/tools/iperf/2.0/",
"http://ggf.org/ns/nmwg/tools/owamp/2.0/",
+ "http://ggf.org/ns/nmwg/tools/hades/",
+ "http://ggf.org/ns/nmwg/characteristic/delay/summary/",
+ "http://ggf.org/ns/nmwg/tools/owd/raw",
+ "http://ggf.org/ns/nwmg/tools/hades/aggregated",
+ "http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
+ "http://ggf.org/ns/nmwg/ops/select/",
+ "hades",
"owamp",
"bwctl",
"store",
@@ -88,6 +111,7 @@
sub nmwg2ds{
my ($self, $nmwg,$ds) = @_;
my $messagetype = $nmwg->get_message_type();
+ my $select;
$ds->{DSTYPE} = 'NMWG';
$ds->{REQUESTMSG} = $nmwg;
@@ -103,8 +127,9 @@
$ds->{REQUESTMSG}->return_result_code($et, "$ds->{ERRMSG}",
"message");
$ds->{ERROROCCUR} = 1;
return;
- }
+ }
+
#Now get the new messagetype
$messagetype = $ds->{REQUESTMSG}->get_message_type();
@@ -116,7 +141,7 @@
if($errorstring){
$self->{LOGGER}->error($errorstring);
$ds->{REQUESTMSG}->return_result_code("error.common.parse_error",
"$errorstring", $metaid);
- $self->{ERROROCCUR} = 1;
+ $ds->{ERROROCCUR} = 1;
return;
}
@@ -148,14 +173,13 @@
if ($et =~ /admin\/selftest/){
$ds->{DOSELFTEST} = 1;;
}
- #look for store messages
my $found = undef;
foreach my $sup_et (@module_ets){
next unless ($sup_et =~ /$et/);
$found = 1;
}
- #TODO check of evebttypes
+
if (!defined $found){
my $errorstring = "Unknown eventType: $et";
$self->{LOGGER}->error($errorstring);
@@ -214,8 +238,46 @@
$params->{$parameters{'dataref'}}->{STORE}->{DOIT} = 1;
$self->{LOGGER}->info("Get store request for measurement
data");
}
+ if ($key =~ /select/) {
+ $select = $key;
+ }
}# End foreach my $key
+ #Do here some MA::HADES Stuff
+ if ($ds->{SERVICE}->{NAME} =~ /MA\/HADES/){
+ if (!$select){
+ my $error = "No select block found for data id: $dataid";
+ $self->{LOGGER}->error($error);
+ $ds->{REQUESTMSG}->return_result_code("error.ma.parameters",
+ $error,
$ds->{REQUESTMSG}->{"dataIDs"}{$dataid}{"metaref"});
+ $ds->{ERROROCCUR} = 1;
+ return;
+ }
+ if
(!($ds->{REQUESTMSG}->{"dataIDs"}{$dataid}{$select}{"startTime"}) &&
+
!($ds->{REQUESTMSG}->{"dataIDs"}{$dataid}{$select}{"endTime"})){
+ my $error = "No timespan specified!";
+ $self->{LOGGER}->error($error);
+
$ds->{REQUESTMSG}->return_result_code("error.ma.parameters",
+ $error,
$ds->{REQUESTMSG}->{"dataIDs"}{$dataid}{"metaref"});
+ $ds->{ERROROCCUR} = 1;
+ return;
+ }
+ #At fist get eventype from message nor from metadata
+ foreach my $key (keys
%{$ds->{REQUESTMSG}->{"dataIDs"}{$dataid}}){
+ next if ($key eq "node" || $key eq "metaref" || $key =~
/select/
+ || $key eq "ns_uri" || $key eq "ns_prefix" );
+
+ $self->{HADES}->{ACTION}->{EVENTYPE} = $key;
+ }
+ my $agg_ets = join ('_',
@{$self->{HADES}->{ACTIONS}->{"ippm_aggregated"}});
+ my $raw_ets = join ('_',
@{$self->{HADES}->{ACTIONS}->{"ippm_raw"}});
+ if ($agg_ets =~ /$self->{HADES}->{ACTION}->{EVENTYPE}/){
+ $self->{HADES}->{ACTION}->{TYPE} = "ippm_aggregated";
+ } elsif($raw_ets =~ /$self->{HADES}->{ACTION}->{EVENTYPE}/){
+ $self->{HADES}->{ACTION}->{TYPE} = "ippm_raw";
+ }
+ }# End Hades stuff
+
my $error = $self->checkParams($ds, %parameters);
if ($error){
$self->{LOGGER}->error($error);
@@ -235,7 +297,7 @@
$params->{$dataid}->{PARAMS} = \%parameters;
}
- #$self->{LOGGER}->info(Dumper(%parameters));
+ #$self->{LOGGER}->info(Dumper($params));
#do selftests
#TODO test this part
@@ -255,31 +317,13 @@
return #TODO what should here returned
}#End if($messagetype =~
- #TODO test this part
- my @datalines;
- if ($messagetype eq "MetadataKeyResponse") {
- my %data_hash;
- my $key;
- $key .= "src,$parameters{src}" if $parameters{"src"};
- $key .= ",dst,$parameters{dst}" if $parameters{"dst"};
- $key .= ",int,$parameters{interval}" if $parameters{"interval"};
- $key .= ",dur,$parameters{duration}" if $parameters{"duration"};
- $key .= ",win,$parameters{windowSize}" if
$parameters{"windowSize"};
- $key .= ",pro,$parameters{protocol}" if $parameters{"protocol"};
- $key .= ",buf,$parameters{bufferSize}" if
$parameters{"bufferSize"};
- $key .= ",ban,$parameters{bandwidth}" if
$parameters{"bandwidth"};
- $key .= ",tos,$parameters{TOS}" if $parameters{"TOS"};
-
- $data_hash{"MetadataKey"} = "$key";
- push @datalines, \%data_hash;
- $ds->{REQUESTMSG}->set_data($dataid, @datalines);
- return 1; #TODO What should here returned
- }#End if ($messagetype eq "Metad
+
+
}# End foreach my $dataid
$ds->{SERVICE}->{DATA} = $params;
- #$self->{LOGGER}->info(Dumper($params));
+ #$self->{LOGGER}->info(Dumper($ds->{REQUESTMSG}));
}
@@ -347,7 +391,7 @@
sub checkParams{
my ($self,$ds, %parameters) = @_;
my (@unknown,@unsupported, $error);
- #$self->{LOGGER}->info(Dumper($ds->{"known_parameters"}));
+ #$self->{LOGGER}->info(Dumper(%parameters));
foreach my $par (keys %parameters){
Modified: branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct.pm
2010-11-15 16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/DataStruct.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -40,6 +40,9 @@
$self ERROROCCUR If error occur set to 1. Default 0
ERRORMSG If error occur here is the error msg
+ WARN Here are the warninhs stored
+ |-OCCUR If warninhs occur this is set to 1 default 0
+ |- MSG If warninhs occur all messages are here
SERVICES The availible services as Reference
REQUESTMSG A reference to the requested message type with the
handlers
DOECHO If echo is requested set to 1. Default 0
@@ -93,6 +96,8 @@
$self->{RETURNMSG} = undef;
$self->{PARAMS} = {}; #The measurement parameters defined by a ID
$self->{DOECHO} = 0; #Do a status report for the selected service
+ $self->{WARN}->{OCCUR} = 0;
+ $self->{WARN}->{MSG} = "";
#Check if uri is given
if (!$uri){
@@ -136,7 +141,15 @@
#store parameters
uri => 1,
- dataref => 1,
+ dataref => 1,,
+
+ #Hades MA
+ startTime => 1,
+ endTime=> 1,
+ packetsize => 1,
+ precedence => 1,
+ groupsize => 1,
+ interval => 1,
};
$self->{"unsupported_parameters"} = {
Copied: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.old.pm
(from rev 671,
branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm)
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.old.pm
(rev 0)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.old.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,175 @@
+package perfSONAR::MA::Hades;
+#
+# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+use vars qw(@ISA);
+@ISA
= qw(perfSONAR::MA);
+
+#DEBUG
+#use Data::Dumper;
+#/DEBUG
+
+use strict;
+use warnings;
+
+
+use perfSONAR::MA;
+
+my $ns_raw="http://ggf.org/ns/nmwg/tools/owd/raw";
+my $ns_hades="http://ggf.org/ns/nwmg/tools/hades/aggregated";
+
+my $ns = $ns_raw;
+
+sub new {
+ my $this = shift;
+ my %param = (@_);
+ my $self = perfSONAR::MA->new(%param);
+ push @{$self->{"supportedEventtypes"}},
+
+ (
+ "http://ggf.org/ns/nmwg/tools/hades/",
+ "http://ggf.org/ns/nmwg/characteristic/delay/summary/",
+ "http://ggf.org/ns/nmwg/tools/owd/raw",
+ "http://ggf.org/ns/nwmg/tools/hades/aggregated",
+ "http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
+ );
+
+ $self->{"actions"} = {
+
+ ippm_aggregated => [
+ "http://ggf.org/ns/nmwg/tools/hades/",
+
"http://ggf.org/ns/nmwg/characteristic/delay/summary/",
+ "http://ggf.org/ns/nwmg/tools/hades/aggregated",
+ ],
+ ippm_raw => [
+ "http://ggf.org/ns/nmwg/tools/owd/raw",
+
"http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
+ ],
+ };
+
+ bless $self, qw(perfSONAR::MA::Hades);
+ return $self;
+}
+
+sub start_action {
+ my $self = shift;
+ my $msg = shift;
+ my $dataid = shift;
+ my $service_id = shift;
+
+ my @datalines;
+ my $action;
+
+ #determine kind of action from eventtype
+ my $agg_ets = join ('_', @{$self->{"actions"}{"ippm_aggregated"}});
+ my $raw_ets = join ('_', @{$self->{"actions"}{"ippm_raw"}});
+
+
+ $self->SUPER::set_eventType ($msg, $dataid);
+
+
+ my $et = $self->{"eventType"};
+
+ if ($agg_ets =~ /$et/){
+ $action = "ippm_aggregated";
+ } elsif($raw_ets =~ /$et/){
+ $action = "ippm_raw";
+ }
+
+ my $data_obj = $self->SUPER::start_action($msg, $dataid, $action,
$service_id);
+
+ if ($data_obj->isa("Hades::Data::IPPM_Raw")){
+ $ns = $ns_raw;
+ my $data = $data_obj->{data};
+ foreach my $ref (@$data) {
+ next unless (ref ($ref) eq "HASH");
+ my %data_hash;
+ $data_hash{"seqnr"} = $$ref{"seqnr"};
+ $data_hash{"senttime_sec"} = $$ref{"senttime_sec"};
+ $data_hash{"senttime_nsec"} = $$ref{"senttime_nsec"};
+ $data_hash{"recvtime_sec"} = $$ref{"recvtime_sec"};
+ $data_hash{"recvtime_nsec"} = $$ref{"recvtime_nsec"};
+ push @datalines, \%data_hash;
+ }
+ } elsif ($data_obj->isa("Hades::Data::IPPM_Aggregated")){
+ $ns = $ns_hades;
+ my $data = $data_obj->{data};
+ my $metric = $msg->{"dataIDs"}{$dataid}{"select"}{"metric"};
+ my $sample = $msg->{"dataIDs"}{$dataid}{"select"}{"sample"};
+ my $count = -1;
+ foreach my $ref (@$data) {
+ my %data_hash;
+ my $time = $$ref{"time"};
+ next unless $time;
+ if ($sample){
+ $count++;
+ next unless $count % $sample == 0;
+ }
+ $data_hash{"time"} = $time;
+ if (!$metric || $metric eq "all" || $metric eq "owd"){
+ $data_hash{"min_delay"} = $$ref{"min_owd"};
+ $data_hash{"med_delay"} = $$ref{"med_owd"};
+ $data_hash{"max_delay"} = $$ref{"max_owd"};
+ }
+ if (!$metric || $metric eq "all" || $metric eq "ipdv"){
+ $data_hash{"min_ipdv_jitter"} = $$ref{"min_ipdv"};
+ $data_hash{"med_ipdv_jitter"} = $$ref{"med_ipdv"};
+ $data_hash{"max_ipdv_jitter"} = $$ref{"max_ipdv"};
+ }
+ if (!$metric || $metric eq "all" || $metric eq "lost_packets"){
+ $data_hash{"loss"} = $$ref{"lost_packets"};
+ }
+ if (!$metric || $metric eq "all" || $metric eq "duplicate_packets"){
+ $data_hash{"duplicates"} = $$ref{"duplicate_packets"};
+ }
+ $data_hash{"sync"} = "yes";
+ #sent missing (im metadata parameters)
+ push @datalines, \%data_hash;
+ }
+
+ }
+ if ($#datalines > 0){
+ $msg->set_data_ns($dataid, $ns, @datalines);
+ }
+ return 1;
+}
+
+
+sub get_meta_info {
+ my $self = shift;
+ my $msg = shift;
+
+=cut
+ my @eventtypes = keys %eventtype_mapping;
+ my @actions = values %eventtype_mapping;
+
+ my %a; #elimiating duplicates
+
+ foreach my $action (@actions) {
+ if (!$a{$action}){
+ $self->SUPER::get_meta_info($msg, $action, @eventtypes);
+ $a{$action}++;
+ }
+ }
+=cut
+
+ foreach my $action (keys %{$self->{"actions"}}){
+ $self->SUPER::get_meta_info($msg, $action,
@{$self->{"actions"}{$action}});
+ }
+}
+
+1;
Deleted: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
2010-11-15 16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -1,175 +0,0 @@
-package perfSONAR::MA::Hades;
-#
-# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-
-use vars qw(@ISA);
-@ISA
= qw(perfSONAR::MA);
-
-#DEBUG
-#use Data::Dumper;
-#/DEBUG
-
-use strict;
-use warnings;
-
-
-use perfSONAR::MA;
-
-my $ns_raw="http://ggf.org/ns/nmwg/tools/owd/raw";
-my $ns_hades="http://ggf.org/ns/nwmg/tools/hades/aggregated";
-
-my $ns = $ns_raw;
-
-sub new {
- my $this = shift;
- my %param = (@_);
- my $self = perfSONAR::MA->new(%param);
- push @{$self->{"supportedEventtypes"}},
-
- (
- "http://ggf.org/ns/nmwg/tools/hades/",
- "http://ggf.org/ns/nmwg/characteristic/delay/summary/",
- "http://ggf.org/ns/nmwg/tools/owd/raw",
- "http://ggf.org/ns/nwmg/tools/hades/aggregated",
- "http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
- );
-
- $self->{"actions"} = {
-
- ippm_aggregated => [
- "http://ggf.org/ns/nmwg/tools/hades/",
-
"http://ggf.org/ns/nmwg/characteristic/delay/summary/",
- "http://ggf.org/ns/nwmg/tools/hades/aggregated",
- ],
- ippm_raw => [
- "http://ggf.org/ns/nmwg/tools/owd/raw",
-
"http://ggf.org/ns/nmwg/characteristic/delay/one-way/",
- ],
- };
-
- bless $self, qw(perfSONAR::MA::Hades);
- return $self;
-}
-
-sub start_action {
- my $self = shift;
- my $msg = shift;
- my $dataid = shift;
- my $service_id = shift;
-
- my @datalines;
- my $action;
-
- #determine kind of action from eventtype
- my $agg_ets = join ('_', @{$self->{"actions"}{"ippm_aggregated"}});
- my $raw_ets = join ('_', @{$self->{"actions"}{"ippm_raw"}});
-
-
- $self->SUPER::set_eventType ($msg, $dataid);
-
-
- my $et = $self->{"eventType"};
-
- if ($agg_ets =~ /$et/){
- $action = "ippm_aggregated";
- } elsif($raw_ets =~ /$et/){
- $action = "ippm_raw";
- }
-
- my $data_obj = $self->SUPER::start_action($msg, $dataid, $action,
$service_id);
-
- if ($data_obj->isa("Hades::Data::IPPM_Raw")){
- $ns = $ns_raw;
- my $data = $data_obj->{data};
- foreach my $ref (@$data) {
- next unless (ref ($ref) eq "HASH");
- my %data_hash;
- $data_hash{"seqnr"} = $$ref{"seqnr"};
- $data_hash{"senttime_sec"} = $$ref{"senttime_sec"};
- $data_hash{"senttime_nsec"} = $$ref{"senttime_nsec"};
- $data_hash{"recvtime_sec"} = $$ref{"recvtime_sec"};
- $data_hash{"recvtime_nsec"} = $$ref{"recvtime_nsec"};
- push @datalines, \%data_hash;
- }
- } elsif ($data_obj->isa("Hades::Data::IPPM_Aggregated")){
- $ns = $ns_hades;
- my $data = $data_obj->{data};
- my $metric = $msg->{"dataIDs"}{$dataid}{"select"}{"metric"};
- my $sample = $msg->{"dataIDs"}{$dataid}{"select"}{"sample"};
- my $count = -1;
- foreach my $ref (@$data) {
- my %data_hash;
- my $time = $$ref{"time"};
- next unless $time;
- if ($sample){
- $count++;
- next unless $count % $sample == 0;
- }
- $data_hash{"time"} = $time;
- if (!$metric || $metric eq "all" || $metric eq "owd"){
- $data_hash{"min_delay"} = $$ref{"min_owd"};
- $data_hash{"med_delay"} = $$ref{"med_owd"};
- $data_hash{"max_delay"} = $$ref{"max_owd"};
- }
- if (!$metric || $metric eq "all" || $metric eq "ipdv"){
- $data_hash{"min_ipdv_jitter"} = $$ref{"min_ipdv"};
- $data_hash{"med_ipdv_jitter"} = $$ref{"med_ipdv"};
- $data_hash{"max_ipdv_jitter"} = $$ref{"max_ipdv"};
- }
- if (!$metric || $metric eq "all" || $metric eq "lost_packets"){
- $data_hash{"loss"} = $$ref{"lost_packets"};
- }
- if (!$metric || $metric eq "all" || $metric eq "duplicate_packets"){
- $data_hash{"duplicates"} = $$ref{"duplicate_packets"};
- }
- $data_hash{"sync"} = "yes";
- #sent missing (im metadata parameters)
- push @datalines, \%data_hash;
- }
-
- }
- if ($#datalines > 0){
- $msg->set_data_ns($dataid, $ns, @datalines);
- }
- return 1;
-}
-
-
-sub get_meta_info {
- my $self = shift;
- my $msg = shift;
-
-=cut
- my @eventtypes = keys %eventtype_mapping;
- my @actions = values %eventtype_mapping;
-
- my %a; #elimiating duplicates
-
- foreach my $action (@actions) {
- if (!$a{$action}){
- $self->SUPER::get_meta_info($msg, $action, @eventtypes);
- $a{$action}++;
- }
- }
-=cut
-
- foreach my $action (keys %{$self->{"actions"}}){
- $self->SUPER::get_meta_info($msg, $action,
@{$self->{"actions"}{$action}});
- }
-}
-
-1;
Added: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
(rev 0)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA/Hades.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,86 @@
+package perfSONAR::MA::Hades;
+#
+# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+#DEBUG
+use Data::Dumper;
+#/DEBUG
+
+use strict;
+use warnings;
+
+use Log::Log4perl qw(get_logger);
+use base qw(perfSONAR::MA);
+
+use Hades;
+use Hades::Config;
+use Hades::Data::Finder_SQL;
+use Hades::Data::Finder;
+
+sub new{
+ my ($class,%module_param) = @_;
+ my $self = $class->SUPER::new(%module_param);
+
+ # Now create config and initialise everything
+ $Hades::configfile = undef;
+ $Hades::config = undef;
+ my $config = Hades::Config->new(
+ configfile => $module_param{config},
+ use_argv => 0,
+ );
+ $config->init() or die;
+ @{$config->{config}}{keys %module_param} = values %module_param;
+ $self->{CONFIG} = $config;
+
+ return $self;
+}
+
+
+sub run{
+ my ($self, $ds) = @_;
+
+ $self->{DS} = $ds;
+ my $data = $$ds->{SERVICE}->{DATA};
+ $self->{FINDER} = Hades::Data::Finder_SQL->new(
+ config => $self->{CONFIG},
+ );
+ #At teh moment all MA steps happen here
+ #We have no other MA services
+ foreach my $id (keys %{$data}){
+ my $startTime = $data->{$id}->{PARAMS}->{"startTime"};
+ my $endTime = $data->{$id}->{PARAMS}->{"endTime"};
+ my $currentTime = time;
+
+ if ($endTime > $currentTime){
+ $endTime = $currentTime;
+ my $et = "error.ma.parameters";
+ my @errmsg;
+ my $warnmsg = "WARN: endTime value lies ahead!";
+ push @errmsg, $warnmsg;
+ push @errmsg, $et;
+ $$ds->{SERVICE}->{DATA}->{$id}->{WARN}->{MSG} =
\@errmsg;
+ $$ds->{SERVICE}->{DATA}->{$id}->{WARN}->{OCCUR} = 1
+ $self->{LOGGER}->warn($warnmsg);
+ }
+ }#End foreach my $id (keys
+
+ return;
+
+
+}
+
+1;
Copied: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.old.pm (from
rev 671, branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm)
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.old.pm
(rev 0)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.old.pm
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,398 @@
+package perfSONAR::MA;
+#
+# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+#TODO
+# - Build IPPM (and RIPE) class tree as in Hades::Data
+
+use vars qw(@ISA);
+#@ISA
= qw(SOAP::Server::Parameters);
+
+#DEBUG
+use Data::Dumper;
+#/DEBUG
+
+use strict;
+use warnings;
+
+use Carp;
+
+use Hades;
+use Hades::Config;
+use Hades::Data::Finder_SQL;
+use Hades::Data::Finder;
+
+use perfSONAR qw(print_log);
+
+#this module is responsible for the select eventtype and relays action
+#to appropriate data module
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %param = (@_);
+
+ # Now create config and initialise everything
+ $Hades::configfile = undef;
+ $Hades::config = undef;
+ my $config = Hades::Config->new(
+ configfile => $param{config},
+ use_argv => 0,
+ );
+ # We don't need it anymore and it "may" cause trouble:
+ delete $param{config};
+ # Init config
+ $config->init() or die;
+ # Copy module config to config. TODO Really all?
+ @{$config->{config}}{keys %param} = values %param;
+
+ # Generate object
+ my $self = {
+ config => $config,
+ };
+ $self->{"supportedEventtypes"} = [
+ "http://ggf.org/ns/nmwg/ops/select/2.0/",
+ ];
+
+ bless $self, $class;
+ return $self;
+}
+
+sub selftest {
+ my $self = shift;
+ return undef;
+}
+
+sub open_request {
+ my $self = shift;
+ $self->{finder} = Hades::Data::Finder_SQL->new(
+ config => $self->{config},
+ );
+
+ return 1;
+}
+
+
+sub close_request {
+ my $self = shift;
+ $self->{finder} = undef;
+}
+
+sub set_eventType {
+
+ my $self = shift;
+ my $msg = shift;
+ my $dataid = shift;
+
+
+ foreach my $key (keys %{$msg->{"dataIDs"}{$dataid}}){
+ next if ($key eq "node" || $key eq "metaref" || $key =~ /select/
+ || $key eq "ns_uri" || $key eq "ns_prefix" );
+ $self->{"eventType"} = $key;
+ }
+
+}
+
+sub start_action {
+
+ my $self = shift;
+ my $msg = shift;
+ my $dataid = shift;
+ my $action = shift;
+ my $service_id = shift;
+
+
+ my $messagetype = $msg->get_message_type();
+
+ my $metaref = $msg->{"dataIDs"}{$dataid}{"metaref"};
+ my $select;
+
+ $self->set_eventType ($msg, $dataid);
+ my $eventType = $self->{"eventType"};
+
+ foreach my $key (keys %{$msg->{"dataIDs"}{$dataid}}){
+ if ($key =~ /select/) {
+ $select = $key;
+ }
+ }
+
+ if (!$select){
+ print_log("error", "No select block found for data id: $dataid",
$service_id);
+ return $msg->return_result_code("error.ma.parameters",
+ "No select block found for data id: $dataid", $metaref);
+ }
+
+ if (!($msg->{"dataIDs"}{$dataid}{$select}{"startTime"}) &&
+ !($msg->{"dataIDs"}{$dataid}{$select}{"endTime"})){
+ print_log("error", "No timespan specified!", $service_id);
+ return $msg->return_result_code("error.ma.parameters", "No timespan
specified", $metaref);
+ }
+
+ my $startTime = $msg->{"dataIDs"}{$dataid}{$select}{"startTime"};
+ my $endTime = $msg->{"dataIDs"}{$dataid}{$select}{"endTime"};
+
+ my $currentTime = time;
+ if ($endTime > $currentTime){
+ $endTime = $currentTime;
+ $msg->return_result_code("error.ma.parameters", "endTime value lies
ahead!", $metaref);
+ }
+
+ #if no time is specified, take today (for convenience)
+ #if (!(defined $startTime) && !(defined $endTime)) {
+ # $endTime = time;
+ # my ($sec,$min,$hour,$md,$mo,$ye,$wday,$yday,$isdst) =
+ # localtime($endTime);
+ # $startTime = Mktime(($ye+1900), $mo+1, $md, 0, 0, 0);
+ # $msg->{"dataIDs"}{$dataid}{$select}{"startTime"} = $startTime;
+ # $msg->{"dataIDs"}{$dataid}{$select}{"endTime"} = $endTime;
+ #}
+
+ my $filter = $msg->{"dataIDs"}{$dataid}{$eventType};
+ if ($$filter{"interval"}){
+ $$filter{"interval"} *= 1000000;
+ }
+
+ my $src = $msg->{"dataIDs"}{$dataid}{$eventType}{"src"}{"value"};
+ my $dst = $msg->{"dataIDs"}{$dataid}{$eventType}{"dst"}{"value"};
+ my $mid = $msg->{"dataIDs"}{$dataid}{$eventType}{"mid"};
+
+
+ $self->{finder}->reset;
+ $self->{finder}->set_time_epoch($startTime,$endTime)
+ or print_log("error", "Invalid date format", $service_id),
+ return $msg->return_result_code("error.ma.parameters", "Invalid
date format", $metaref);
+ $self->{finder}->set_route($src,$dst); # set_route understands "undef"!!!
+ if (defined $action){
+ $self->{finder}->set_type($action);
+ } else {
+ $self->{finder}->set_type($eventType); # ignores "undef"
+ }
+
+
+ $self->{finder}->set_mid($mid); # ignores "undef"
+ $self->{finder}->set_filter($filter); # filter with metadata
+
+ my @results = $self->{finder}->find;
+
+ unless (@results) {
+ print_log("info","No data found", $service_id);
+ return $msg->return_result_code("error.ma.data", "No data found",
$metaref);
+ }
+
+ my @result_params;
+ if ($#results > 0){ #More than one measurment result found matching the
request pattern
+ #get_meta_info($msg);
+ my $output = "";
+ my $count = 0;
+ foreach my $result (@results){
+ my $info = $result->{meta};
+ my %par;
+ foreach my $key (keys %{$info}){
+ next if ($key eq "sender_port" || $key eq "receiver_port");
+ if ($key eq "interval"){
+ $par{"interval"} = $info->{"interval"} / 1000000;
+ } else {
+ $par{$key} = $info->{$key};
+ }
+ }
+ $par{"sender"} = $result->{"sender"};
+ $par{"receiver"} = $result->{"receiver"};
+ $par{"mid"} = $result->{"mid"};
+ $par{"metadataIdRef"} = "result$count";
+ $count++;
+
+ push @result_params, \%par;
+
+
+ $output = $output . "$result->{sender} to $result->{receiver} "
+ . $result->type2string() . ", mid: $result->{mid}\n";
+ }
+ my $message = "More than one measurement result found";
+ print_log("info",$message, $service_id);
+ print_log("debug","Measurements:\n$output", $service_id);
+ $msg->set_parameter_list(@result_params);
+ print_log("debug", $message, $service_id);
+
+ return $msg->return_result_code("warning.ma.parameters", "More than one
measurement result found!", $metaref);
+ }
+
+ my $warnings = $self->{finder}->{warnings}->get_string();
+ if ($warnings) {
+ #TODO is that right/useful???
+ print_log("info","Warnings from data modules:\n$warnings", $service_id);
+ return $msg->return_result_code("error.ma.data", "Warnings from data
modules: $warnings", $metaref);
+ }
+
+
+ my $data_obj = $results[0];
+
+ my $info = $data_obj->{meta};
+ my %par;
+ foreach my $key (keys %{$info}){
+ next if ($key eq "sender_port" || $key eq "receiver_port");
+ if ($key eq "interval"){
+ $par{"interval"} = $info->{"interval"} / 1000000;
+ } else {
+ $par{$key} = $info->{$key};
+ }
+ }
+ $par{"sender"} = $data_obj->{"sender"};
+ $par{"receiver"} = $data_obj->{"receiver"};
+ $par{"mid"} = $data_obj->{"mid"};
+ $par{"metadataIdRef"} = $$filter{"metaID"};
+ $msg->set_parameter_hash (%par);
+
+ if(!(exists $data_obj->{meta})) {
+ print_log("info","No meta data found", $service_id);
+ return $msg->return_result_code("error.ma.data", "No meta data found",
$metaref);
+ }
+ print_log("info","Meta data retrieval seems to be successful",
$service_id);
+
+ my @datalines;
+
+ if ($messagetype eq "MetadataKeyResponse") {
+ my %data_hash;
+ $data_hash{"MetadataKey"} = "$src.$dst.$data_obj->{mid}";
+ push @datalines, \%data_hash;
+ $msg->set_data($dataid, @datalines);
+ print_log("info","Created MetadataKeyResponse", $service_id);
+ return 1;
+ }
+
+ $data_obj->extract_data();
+ $warnings = $self->{finder}->{warnings}->get_string();
+ #$warnings = $data_obj->{warnings}->get_string();
+ if ($warnings) {
+ #TODO is that right/useful???
+ print_log("info","Warnings from data modules:\n$warnings", $service_id);
+ return $msg->return_result_code("error.ma.data", "Warnings from data
modules: $warnings", $metaref);
+ }
+
+
+ my $data = $data_obj->get_data;
+ unless (defined $data) {
+ print_log("info","No data found", $service_id);
+ return $msg->return_result_code("error.ma.data", "No data found",
$metaref);
+ }
+
+ print_log("info","Data retrieval seems to be successful", $service_id);
+ #print_log("debug","Data:\n$data"); #Too verbose...
+
+
+ return $data_obj; #let data specific modules handle this
+}
+
+sub get_meta_info {
+ my $self = shift;
+ my $msg = shift;
+ my $action = shift;
+ my @eventtypes = @_;
+
+ $self->open_request;
+ $self->{finder}->reset;
+
+ my $endTime = time;
+ my $startTime = $endTime - 300;
+
+ $self->{finder}->set_time_epoch($startTime,$endTime);
+
+ $self->{finder}->set_type($action);
+ my @results = $self->{finder}->find;
+
+ my $datanode = ($msg->{dom}->getElementsByLocalName("data"))[0];
+
+
+ foreach my $result (@results){
+ foreach my $key (keys %{$result}){
+ next if $key eq "get_data_object";
+ next if $key eq "get_data_options";
+ }
+ my $info = $result->{meta};
+ my %par;
+ my %subject;
+
+ my $metaid = $result->{"mid"};
+
+ my ($src_type, $dst_type) = "unknown"; #TODO ipv6!
+ $src_type = "ipv4" if ($info->{"sender_ip"} =~ /\d+\.\d+\.\d+\.\d+/);
+ $dst_type = "ipv4" if ($info->{"receiver_ip"} =~ /\d+\.\d+\.\d+\.\d+/);
+
+
+ my $substring = "<nmwg:subject
xmlns:nmwg=\"http://ggf.org/ns/nmwg/base/2.0/\" id=\"subject-$metaid\">\n";
+ $substring .= " <nmtl4:endPointPair
xmlns:nmtl4=\"http://ogf.org/schema/network/topology/l4/20070707/\">\n";
+ $substring .= " <nmtl4:src id=\"$result->{sender}\">\n";
+ $substring .= " <nmtl4:port>\n";
+ $substring .= " <nmtl4:address type=\"$src_type\"
value=\"$info->{sender_ip}\"/>\n";
+ $substring .= "
<nmtl4:portNum>$info->{sender_port}</nmtl4:portNum>\n";
+ $substring .= " </nmtl4:port>\n";
+ $substring .= " </nmtl4:src>\n";
+
+ $substring .= " <nmtl4:dst id=\"$result->{receiver}\">\n";
+ $substring .= " <nmtl4:port>\n";
+ $substring .= " <nmtl4:address type=\"$dst_type\"
value=\"$info->{receiver_ip}\"/>\n";
+ $substring .= "
<nmtl4:portNum>$info->{receiver_port}</nmtl4:portNum>\n";
+ $substring .= " </nmtl4:port>\n";
+ $substring .= " </nmtl4:dst>\n";
+ $substring .= " </nmtl4:endPointPair>\n";
+ $substring .= "</nmwg:subject>\n";
+
+=cut
+ $subject{"endPointPair"}{"namespace"} =
"http://ogf.org/schema/network/topology/l4/20070707/";
+ $subject{"endPointPair"}{"prefix"} = "nmtl4";
+
+ $subject{"endPointPair"}{"src"}{"port"}{"address"}{"ip"} =
$info->{"sender_ip"};
+ $subject{"endPointPair"}{"src"}{"port"}{"address"}{"IFName"} =
$result->{"sender"};
+ $subject{"endPointPair"}{"src"}{"port"}{"portNum"}{"element"} =
$info->{"sender_port"};
+ $subject{"endPointPair"}{"dst"}{"port"}{"address"}{"ip"} =
$info->{"receiver_ip"};
+ $subject{"endPointPair"}{"dst"}{"port"}{"address"}{"IFName"} =
$result->{"receiver"};
+ $subject{"endPointPair"}{"dst"}{"port"}{"portNum"}{"element"} =
$info->{"receiver_port"};
+
+
+=cut
+ foreach my $key (keys %{$info}){
+
+ next if $key eq "sender_ip";
+ next if $key eq "receiver_ip";
+ next if $key eq "sender_port";
+ next if $key eq "receiver_port";
+
+
+ if ($key eq "interval"){
+ $par{"interval"} = $info->{"interval"} / 1000000;
+ } else {
+ $par{$key} = $info->{$key};
+ }
+ }
+
+ my $subref = \%subject;
+ my $parref = \%par;
+ my $eventref =
\@eventtypes;
+
+
+ $msg->create_metadatablock( #subject => $subref,
+ substring => $substring,
+ parameters => $parref,
+ eventtypes => $eventref,
+ metadata_id => $metaid,
+ parent => $datanode,
+ );
+
+
+ }
+ $self->close_request;
+}
+1;
Deleted: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm 2010-11-15
16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm 2011-01-19
09:54:20 UTC (rev 672)
@@ -1,398 +0,0 @@
-package perfSONAR::MA;
-#
-# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-
-#TODO
-# - Build IPPM (and RIPE) class tree as in Hades::Data
-
-use vars qw(@ISA);
-#@ISA
= qw(SOAP::Server::Parameters);
-
-#DEBUG
-use Data::Dumper;
-#/DEBUG
-
-use strict;
-use warnings;
-
-use Carp;
-
-use Hades;
-use Hades::Config;
-use Hades::Data::Finder_SQL;
-use Hades::Data::Finder;
-
-use perfSONAR qw(print_log);
-
-#this module is responsible for the select eventtype and relays action
-#to appropriate data module
-
-sub new {
- my $this = shift;
- my $class = ref($this) || $this;
- my %param = (@_);
-
- # Now create config and initialise everything
- $Hades::configfile = undef;
- $Hades::config = undef;
- my $config = Hades::Config->new(
- configfile => $param{config},
- use_argv => 0,
- );
- # We don't need it anymore and it "may" cause trouble:
- delete $param{config};
- # Init config
- $config->init() or die;
- # Copy module config to config. TODO Really all?
- @{$config->{config}}{keys %param} = values %param;
-
- # Generate object
- my $self = {
- config => $config,
- };
- $self->{"supportedEventtypes"} = [
- "http://ggf.org/ns/nmwg/ops/select/2.0/",
- ];
-
- bless $self, $class;
- return $self;
-}
-
-sub selftest {
- my $self = shift;
- return undef;
-}
-
-sub open_request {
- my $self = shift;
- $self->{finder} = Hades::Data::Finder_SQL->new(
- config => $self->{config},
- );
-
- return 1;
-}
-
-
-sub close_request {
- my $self = shift;
- $self->{finder} = undef;
-}
-
-sub set_eventType {
-
- my $self = shift;
- my $msg = shift;
- my $dataid = shift;
-
-
- foreach my $key (keys %{$msg->{"dataIDs"}{$dataid}}){
- next if ($key eq "node" || $key eq "metaref" || $key =~ /select/
- || $key eq "ns_uri" || $key eq "ns_prefix" );
- $self->{"eventType"} = $key;
- }
-
-}
-
-sub start_action {
-
- my $self = shift;
- my $msg = shift;
- my $dataid = shift;
- my $action = shift;
- my $service_id = shift;
-
-
- my $messagetype = $msg->get_message_type();
-
- my $metaref = $msg->{"dataIDs"}{$dataid}{"metaref"};
- my $select;
-
- $self->set_eventType ($msg, $dataid);
- my $eventType = $self->{"eventType"};
-
- foreach my $key (keys %{$msg->{"dataIDs"}{$dataid}}){
- if ($key =~ /select/) {
- $select = $key;
- }
- }
-
- if (!$select){
- print_log("error", "No select block found for data id: $dataid",
$service_id);
- return $msg->return_result_code("error.ma.parameters",
- "No select block found for data id: $dataid", $metaref);
- }
-
- if (!($msg->{"dataIDs"}{$dataid}{$select}{"startTime"}) &&
- !($msg->{"dataIDs"}{$dataid}{$select}{"endTime"})){
- print_log("error", "No timespan specified!", $service_id);
- return $msg->return_result_code("error.ma.parameters", "No timespan
specified", $metaref);
- }
-
- my $startTime = $msg->{"dataIDs"}{$dataid}{$select}{"startTime"};
- my $endTime = $msg->{"dataIDs"}{$dataid}{$select}{"endTime"};
-
- my $currentTime = time;
- if ($endTime > $currentTime){
- $endTime = $currentTime;
- $msg->return_result_code("error.ma.parameters", "endTime value lies
ahead!", $metaref);
- }
-
- #if no time is specified, take today (for convenience)
- #if (!(defined $startTime) && !(defined $endTime)) {
- # $endTime = time;
- # my ($sec,$min,$hour,$md,$mo,$ye,$wday,$yday,$isdst) =
- # localtime($endTime);
- # $startTime = Mktime(($ye+1900), $mo+1, $md, 0, 0, 0);
- # $msg->{"dataIDs"}{$dataid}{$select}{"startTime"} = $startTime;
- # $msg->{"dataIDs"}{$dataid}{$select}{"endTime"} = $endTime;
- #}
-
- my $filter = $msg->{"dataIDs"}{$dataid}{$eventType};
- if ($$filter{"interval"}){
- $$filter{"interval"} *= 1000000;
- }
-
- my $src = $msg->{"dataIDs"}{$dataid}{$eventType}{"src"}{"value"};
- my $dst = $msg->{"dataIDs"}{$dataid}{$eventType}{"dst"}{"value"};
- my $mid = $msg->{"dataIDs"}{$dataid}{$eventType}{"mid"};
-
-
- $self->{finder}->reset;
- $self->{finder}->set_time_epoch($startTime,$endTime)
- or print_log("error", "Invalid date format", $service_id),
- return $msg->return_result_code("error.ma.parameters", "Invalid
date format", $metaref);
- $self->{finder}->set_route($src,$dst); # set_route understands "undef"!!!
- if (defined $action){
- $self->{finder}->set_type($action);
- } else {
- $self->{finder}->set_type($eventType); # ignores "undef"
- }
-
-
- $self->{finder}->set_mid($mid); # ignores "undef"
- $self->{finder}->set_filter($filter); # filter with metadata
-
- my @results = $self->{finder}->find;
-
- unless (@results) {
- print_log("info","No data found", $service_id);
- return $msg->return_result_code("error.ma.data", "No data found",
$metaref);
- }
-
- my @result_params;
- if ($#results > 0){ #More than one measurment result found matching the
request pattern
- #get_meta_info($msg);
- my $output = "";
- my $count = 0;
- foreach my $result (@results){
- my $info = $result->{meta};
- my %par;
- foreach my $key (keys %{$info}){
- next if ($key eq "sender_port" || $key eq "receiver_port");
- if ($key eq "interval"){
- $par{"interval"} = $info->{"interval"} / 1000000;
- } else {
- $par{$key} = $info->{$key};
- }
- }
- $par{"sender"} = $result->{"sender"};
- $par{"receiver"} = $result->{"receiver"};
- $par{"mid"} = $result->{"mid"};
- $par{"metadataIdRef"} = "result$count";
- $count++;
-
- push @result_params, \%par;
-
-
- $output = $output . "$result->{sender} to $result->{receiver} "
- . $result->type2string() . ", mid: $result->{mid}\n";
- }
- my $message = "More than one measurement result found";
- print_log("info",$message, $service_id);
- print_log("debug","Measurements:\n$output", $service_id);
- $msg->set_parameter_list(@result_params);
- print_log("debug", $message, $service_id);
-
- return $msg->return_result_code("warning.ma.parameters", "More than one
measurement result found!", $metaref);
- }
-
- my $warnings = $self->{finder}->{warnings}->get_string();
- if ($warnings) {
- #TODO is that right/useful???
- print_log("info","Warnings from data modules:\n$warnings", $service_id);
- return $msg->return_result_code("error.ma.data", "Warnings from data
modules: $warnings", $metaref);
- }
-
-
- my $data_obj = $results[0];
-
- my $info = $data_obj->{meta};
- my %par;
- foreach my $key (keys %{$info}){
- next if ($key eq "sender_port" || $key eq "receiver_port");
- if ($key eq "interval"){
- $par{"interval"} = $info->{"interval"} / 1000000;
- } else {
- $par{$key} = $info->{$key};
- }
- }
- $par{"sender"} = $data_obj->{"sender"};
- $par{"receiver"} = $data_obj->{"receiver"};
- $par{"mid"} = $data_obj->{"mid"};
- $par{"metadataIdRef"} = $$filter{"metaID"};
- $msg->set_parameter_hash (%par);
-
- if(!(exists $data_obj->{meta})) {
- print_log("info","No meta data found", $service_id);
- return $msg->return_result_code("error.ma.data", "No meta data found",
$metaref);
- }
- print_log("info","Meta data retrieval seems to be successful",
$service_id);
-
- my @datalines;
-
- if ($messagetype eq "MetadataKeyResponse") {
- my %data_hash;
- $data_hash{"MetadataKey"} = "$src.$dst.$data_obj->{mid}";
- push @datalines, \%data_hash;
- $msg->set_data($dataid, @datalines);
- print_log("info","Created MetadataKeyResponse", $service_id);
- return 1;
- }
-
- $data_obj->extract_data();
- $warnings = $self->{finder}->{warnings}->get_string();
- #$warnings = $data_obj->{warnings}->get_string();
- if ($warnings) {
- #TODO is that right/useful???
- print_log("info","Warnings from data modules:\n$warnings", $service_id);
- return $msg->return_result_code("error.ma.data", "Warnings from data
modules: $warnings", $metaref);
- }
-
-
- my $data = $data_obj->get_data;
- unless (defined $data) {
- print_log("info","No data found", $service_id);
- return $msg->return_result_code("error.ma.data", "No data found",
$metaref);
- }
-
- print_log("info","Data retrieval seems to be successful", $service_id);
- #print_log("debug","Data:\n$data"); #Too verbose...
-
-
- return $data_obj; #let data specific modules handle this
-}
-
-sub get_meta_info {
- my $self = shift;
- my $msg = shift;
- my $action = shift;
- my @eventtypes = @_;
-
- $self->open_request;
- $self->{finder}->reset;
-
- my $endTime = time;
- my $startTime = $endTime - 300;
-
- $self->{finder}->set_time_epoch($startTime,$endTime);
-
- $self->{finder}->set_type($action);
- my @results = $self->{finder}->find;
-
- my $datanode = ($msg->{dom}->getElementsByLocalName("data"))[0];
-
-
- foreach my $result (@results){
- foreach my $key (keys %{$result}){
- next if $key eq "get_data_object";
- next if $key eq "get_data_options";
- }
- my $info = $result->{meta};
- my %par;
- my %subject;
-
- my $metaid = $result->{"mid"};
-
- my ($src_type, $dst_type) = "unknown"; #TODO ipv6!
- $src_type = "ipv4" if ($info->{"sender_ip"} =~ /\d+\.\d+\.\d+\.\d+/);
- $dst_type = "ipv4" if ($info->{"receiver_ip"} =~ /\d+\.\d+\.\d+\.\d+/);
-
-
- my $substring = "<nmwg:subject
xmlns:nmwg=\"http://ggf.org/ns/nmwg/base/2.0/\" id=\"subject-$metaid\">\n";
- $substring .= " <nmtl4:endPointPair
xmlns:nmtl4=\"http://ogf.org/schema/network/topology/l4/20070707/\">\n";
- $substring .= " <nmtl4:src id=\"$result->{sender}\">\n";
- $substring .= " <nmtl4:port>\n";
- $substring .= " <nmtl4:address type=\"$src_type\"
value=\"$info->{sender_ip}\"/>\n";
- $substring .= "
<nmtl4:portNum>$info->{sender_port}</nmtl4:portNum>\n";
- $substring .= " </nmtl4:port>\n";
- $substring .= " </nmtl4:src>\n";
-
- $substring .= " <nmtl4:dst id=\"$result->{receiver}\">\n";
- $substring .= " <nmtl4:port>\n";
- $substring .= " <nmtl4:address type=\"$dst_type\"
value=\"$info->{receiver_ip}\"/>\n";
- $substring .= "
<nmtl4:portNum>$info->{receiver_port}</nmtl4:portNum>\n";
- $substring .= " </nmtl4:port>\n";
- $substring .= " </nmtl4:dst>\n";
- $substring .= " </nmtl4:endPointPair>\n";
- $substring .= "</nmwg:subject>\n";
-
-=cut
- $subject{"endPointPair"}{"namespace"} =
"http://ogf.org/schema/network/topology/l4/20070707/";
- $subject{"endPointPair"}{"prefix"} = "nmtl4";
-
- $subject{"endPointPair"}{"src"}{"port"}{"address"}{"ip"} =
$info->{"sender_ip"};
- $subject{"endPointPair"}{"src"}{"port"}{"address"}{"IFName"} =
$result->{"sender"};
- $subject{"endPointPair"}{"src"}{"port"}{"portNum"}{"element"} =
$info->{"sender_port"};
- $subject{"endPointPair"}{"dst"}{"port"}{"address"}{"ip"} =
$info->{"receiver_ip"};
- $subject{"endPointPair"}{"dst"}{"port"}{"address"}{"IFName"} =
$result->{"receiver"};
- $subject{"endPointPair"}{"dst"}{"port"}{"portNum"}{"element"} =
$info->{"receiver_port"};
-
-
-=cut
- foreach my $key (keys %{$info}){
-
- next if $key eq "sender_ip";
- next if $key eq "receiver_ip";
- next if $key eq "sender_port";
- next if $key eq "receiver_port";
-
-
- if ($key eq "interval"){
- $par{"interval"} = $info->{"interval"} / 1000000;
- } else {
- $par{$key} = $info->{$key};
- }
- }
-
- my $subref = \%subject;
- my $parref = \%par;
- my $eventref =
\@eventtypes;
-
-
- $msg->create_metadatablock( #subject => $subref,
- substring => $substring,
- parameters => $parref,
- eventtypes => $eventref,
- metadata_id => $metaid,
- parent => $datanode,
- );
-
-
- }
- $self->close_request;
-}
-1;
Added: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm
(rev 0)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MA.pm 2011-01-19
09:54:20 UTC (rev 672)
@@ -0,0 +1,59 @@
+package perfSONAR::MA;
+#
+# Copyright 2010 Verein zur Foerderung eines Deutschen Forschungsnetzes e.
V.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+=head1 NAME
+
+perfSONAR::MA - Main class for all measurement archiev (MA) services.
+
+=head1 SYNOPSIS
+
+use base qw(perfSONAR::MA);
+
+=head1 DESCRIPTION
+
+This is the main class for all MAs.
+=cut
+
+use strict;
+use warnings;
+
+#DEBUG
+use Data::Dumper;
+#DEBUG
+
+use version;
+our $VERSION = 0.53;
+
+use Log::Log4perl qw(get_logger);
+
+
+=head2 new()
+
+The constructor is called withoud a parameter.
+=cut
+sub new{
+ my ($class,%module_param) = @_;
+ my $self = {};
+ $self->{LOGGER} = get_logger(__PACKAGE__);
+ $self->{MODPARAM} = %module_param;
+ bless $self, $class;
+ return $self;
+}
+
+1;
+
Modified: branches/perfsonar-oppd-new-architect/lib/perfSONAR/MP.pm
===================================================================
--- branches/perfsonar-oppd-new-architect/lib/perfSONAR/MP.pm 2010-11-15
16:35:48 UTC (rev 671)
+++ branches/perfsonar-oppd-new-architect/lib/perfSONAR/MP.pm 2011-01-19
09:54:20 UTC (rev 672)
@@ -110,6 +110,7 @@
$self->{LOGGER}->error("@errmsg");
die "@errmsg";
}
+ $self->{MODPARAM} = %module_param;
bless $self, $class;
return $self;
}
Copied:
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-ping (from
rev 663, branches/perfsonar-oppd-all-0.52/tools/perfSONAR-client/hades-ping)
===================================================================
--- branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-ping
(rev 0)
+++ branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-ping
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,2 @@
+/home/unrz170/trunk/tools/perfSONAR-client/perfsonar-client.pl
--reqfile=/home/unrz170/trunk/tools/perfSONAR-client/psping.xml
--uri=http://radagast.rrze.uni-erlangen.de:8090/services/MA/HADES/GEANT
--host=radagast.rrze.uni-erlangen.de
+
Copied:
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-l4.xml
(from rev 663,
branches/perfsonar-oppd-all-0.52/tools/perfSONAR-client/hades-request-l4.xml)
===================================================================
---
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-l4.xml
(rev 0)
+++
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-l4.xml
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <nmwg:message xmlns:nmtm="http://ggf.org/ns/nmwg/time/2.0/"
+ xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/"
+ xmlns="http://ggf.org/ns/nmwg/tools/org/perfsonar/1.0/"
+ xmlns:nmwgt="http://ggf.org/ns/nmwg/topology/2.0/"
+ xmlns:hades="http://ggf.org/ns/nmwg/tools/hades/"
+
xmlns:summary="http://ggf.org/ns/nmwg/characteristic/delay/summary/"
+ xmlns:select="http://ggf.org/ns/nmwg/ops/select/2.0/"
+
xmlns:nmtl4="http://ogf.org/schema/network/topology/l4/20070707/"
+ type="SetupDataRequest">
+ <nmwg:metadata id="hades_meta">
+ <hades:subject id="hades_subject">
+ <nmtl4:endPointPair>
+ <nmtl4:src value="62.40.122.123" type="ipv4"/>
+ <nmtl4:dst value="62.40.122.11" type="ipv4"/>
+ </nmtl4:endPointPair>
+ </hades:subject>
+ <nmwg:eventType>http://ggf.org/ns/nmwg/tools/hades</nmwg:eventType>
+ <hades:parameters id="param1">
+ <nmwg:parameter value="41" name="packetsize"/>
+ <nmwg:parameter value="0x0" name="precedence"/>
+ <nmwg:parameter value="9" name="groupsize"/>
+ <nmwg:parameter value="60" name="interval"/>
+ </hades:parameters>
+ </nmwg:metadata>
+ <nmwg:metadata id="select_meta" metadataIdRef="hades_meta">
+ <select:subject id="select_subject"/>
+
<nmwg:eventType>http://ggf.org/ns/nmwg/ops/select/2.0</nmwg:eventType>
+ <select:parameters id="param2">
+ <nmwg:parameter name="startTime">1210001700</nmwg:parameter>
+ <nmwg:parameter name="endTime">1210002000</nmwg:parameter>
+ </select:parameters>
+ </nmwg:metadata>
+ <nmwg:data id="data1" metadataIdRef="select_meta"/>
+ </nmwg:message>
Copied:
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-win-WORKING.xml
(from rev 663,
branches/perfsonar-oppd-all-0.52/tools/perfSONAR-client/hades-request-win-WORKING.xml)
===================================================================
---
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-win-WORKING.xml
(rev 0)
+++
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request-win-WORKING.xml
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,36 @@
+<nmwg:message xmlns:nmtm="http://ggf.org/ns/nmwg/time/2.0/"
+ xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/"
+ xmlns:nmwgt="http://ggf.org/ns/nmwg/topology/2.0/"
+ xmlns:select="http://ggf.org/ns/nmwg/ops/select/2.0/"
+ xmlns:hades="http://ggf.org/ns/nmwg/tools/hades/"
+ id="datarq2-1" type="SetupDataRequest">
+
+ <nmwg:metadata id="meta1">
+ <hades:subject id="subj1">
+ <nmwgt:endPointPair>
+ <nmwgt:src type="IFname" value="Erlangen_DFN"/>
+ <nmwgt:dst type="IFname" value="Frankfurt_DFN"/>
+ </nmwgt:endPointPair>
+ </hades:subject>
+ <hades:parameters id="param1">
+ <nmwg:parameter value="41" name="packetsize"/>
+ <nmwg:parameter value="0x0" name="precedence"/>
+ <nmwg:parameter value="9" name="groupsize"/>
+ <nmwg:parameter value="60" name="interval"/>
+ </hades:parameters>
+
+ <nmwg:eventType>http://ggf.org/ns/nmwg/tools/hades/</nmwg:eventType>
+ </nmwg:metadata>
+
+ <nmwg:metadata id="meta2">
+ <select:subject id="subj2" metadataIdRef="meta1"/>
+ <nmwg:eventType>http://ggf.org/ns/nmwg/ops/select/</nmwg:eventType>
+ <select:parameters id="param2">
+ <nmwg:parameter name="startTime">1210001700</nmwg:parameter>
+ <nmwg:parameter name="endTime">1210002000</nmwg:parameter>
+ </select:parameters>
+ </nmwg:metadata>
+
+
+ <nmwg:data id="data1" metadataIdRef="meta2"/>
+</nmwg:message>
Copied:
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request.xml
(from rev 663,
branches/perfsonar-oppd-all-0.52/tools/perfSONAR-client/hades-request.xml)
===================================================================
---
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request.xml
(rev 0)
+++
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-request.xml
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <nmwg:message xmlns:nmtm="http://ggf.org/ns/nmwg/time/2.0/"
+ xmlns:nmwg="http://ggf.org/ns/nmwg/base/2.0/"
+ xmlns="http://ggf.org/ns/nmwg/tools/org/perfsonar/1.0/"
+ xmlns:nmwgt="http://ggf.org/ns/nmwg/topology/2.0/"
+ xmlns:hades="http://ggf.org/ns/nmwg/tools/hades/"
+
xmlns:summary="http://ggf.org/ns/nmwg/characteristic/delay/summary/"
+ xmlns:select="http://ggf.org/ns/nmwg/ops/select/2.0/"
+ type="SetupDataRequest">
+ <nmwg:metadata id="hades_meta">
+ <hades:subject id="hades_subject">
+ <nmwgt:endPointPair>
+ <nmwgt:src value="Poznan_GEANT" type="IFName"/>
+ <nmwgt:dst value="Frankfurt_GEANT" type="IFName"/>
+ </nmwgt:endPointPair>
+ </hades:subject>
+ <nmwg:eventType>http://ggf.org/ns/nmwg/tools/hades</nmwg:eventType>
+ <hades:parameters id="param1">
+ <nmwg:parameter value="41" name="packetsize"/>
+ <nmwg:parameter value="0x0" name="precedence"/>
+ <nmwg:parameter value="9" name="groupsize"/>
+ <nmwg:parameter value="60" name="interval"/>
+ </hades:parameters>
+ </nmwg:metadata>
+ <nmwg:metadata id="select_meta" metadataIdRef="hades_meta">
+ <select:subject id="select_subject"/>
+
<nmwg:eventType>http://ggf.org/ns/nmwg/ops/select/2.0</nmwg:eventType>
+ <select:parameters id="param2">
+ <nmwg:parameter name="startTime">1210001700</nmwg:parameter>
+ <nmwg:parameter name="endTime">1210002000</nmwg:parameter>
+ </select:parameters>
+ </nmwg:metadata>
+ <nmwg:data id="data1" metadataIdRef="select_meta"/>
+ </nmwg:message>
Copied:
branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-test (from
rev 663, branches/perfsonar-oppd-all-0.52/tools/perfSONAR-client/hades-test)
===================================================================
--- branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-test
(rev 0)
+++ branches/perfsonar-oppd-new-architect/tools/perfSONAR-client/hades-test
2011-01-19 09:54:20 UTC (rev 672)
@@ -0,0 +1 @@
+./perfsonar-client.pl --reqfile=hades-request.xml
--uri=http://calim.rrze.uni-erlangen.de:8090/services/MA/HADES/MYDOMAIN
--host=calim.rrze.uni-erlangen.de
- [pS-dev] [GEANT/SA2/SA2T3-OPPD] r672 - in branches/perfsonar-oppd-new-architect: bin etc/oppd-mdm lib/perfSONAR lib/perfSONAR/DataStruct lib/perfSONAR/MA tools/perfSONAR-client, svn-noreply, 01/19/2011
Archive powered by MHonArc 2.6.16.