blob: 4f5ca2763f4f7dd67982f74a81cc8c6ab582705e [file] [log] [blame]
#*******************************************************************************
#* Copyright (c) 2011 Forschungszentrum Juelich GmbH.
#* All rights reserved. This program and the accompanying materials
#* are made available under the terms of the Eclipse Public License v1.0
#* which accompanies this distribution, and is available at
#* http://www.eclipse.org/legal/epl-v10.html
#*
#* Contributors:
#* Wolfgang Frings (Forschungszentrum Juelich GmbH)
#*******************************************************************************/
package LML_da_step;
my $VERSION='1.0';
my($debug)=0;
use strict;
use Data::Dumper;
use XML::Simple;
use Time::Local;
use Time::HiRes qw ( time );
use LML_da_util;
use LML_da_step_execute;
sub new {
my $self = {};
my $proto = shift;
my $class = ref($proto) || $proto;
my $stepdefs = shift;
my $globalvarref = shift;
my $verbose = shift;
printf("\t LML_da_step: new %s\n",ref($proto)) if($debug>=3);
$self->{STEPDEFS} = $stepdefs;
$self->{GLOBALVARS}= $globalvarref;
$self->{VERBOSE} = $globalvarref->{verbose};
$self->{TMPDIR} = $globalvarref->{"tmpdir"};
$self->{PERMDIR} = $globalvarref->{"permdir"};
$self->{LASTSTEP} = "__init__";
bless $self, $class;
return $self;
}
sub process {
my($self) = shift;
my($step,$steprefs,@steplist,%stepstate,$depsteps,$depstep,$stepref,$dostep);
my $rc=0;
my $loop_done=0;
$steprefs=$self->{STEPDEFS};
foreach $step (keys(%{$steprefs})) {
next if (!exists($steprefs->{$step}->{active}));
next if ($steprefs->{$step}->{active}==0);
print "LML_da_step: scan step $step active=$steprefs->{$step}->{active}\n" if($self->{VERBOSE});
push(@steplist,$step);
$stepstate{$step}="do";
}
push(@steplist,"___endloop___");
while(@steplist) {
$step=shift(@steplist);
if($step eq "___endloop___") {
# check if smething happens in this loop
if($loop_done==0) {
if(!@steplist) {
print "LML_da_step: all steps processed, leaving\n" if($self->{VERBOSE});
return(1);
}
print "LML_da_step: something went wrong --> noc action in current cyle of loop, leaving ...\n";
return(0);
} else {
$loop_done=0;
push(@steplist,$step);
}
next;
}
$stepref=$self->{STEPDEFS}->{$step};
if($stepref->{exec_after} eq "") {
# no dependency, execute
$rc=$self->execute_step($step);
if($rc) {
$stepstate{$step}="failed";
} else {
$stepstate{$step}="done";
}
$loop_done++;
next;
}
$depsteps=$stepref->{exec_after};
$dostep=1;
foreach $depstep (split('\s*,\s*',$depsteps)) {
if(!exists($stepstate{$depstep})) {
print "LML_da_step: dependency to unknown step ($depstep), leaving ...\n";
return(0);
}
print "LML_da_step: step check dependency to step $depstep (=$stepstate{$depstep})\n" if($debug==1);
$dostep=0 if($stepstate{$depstep} ne "done");
}
if($dostep) {
# dependencies fulfilled, execute
$rc=$self->execute_step($step);
if($rc) {
$stepstate{$step}="failed";
} else {
$stepstate{$step}="done";
}
$loop_done++;
next;
} else {
print "LML_da_step: step $step dependencies not fulfilled ($depsteps) dostep=$dostep loop_done=$loop_done\n" if($debug==1);
push(@steplist,$step);
}
}
return($rc);
}
sub execute_step {
my($self) = shift;
my($step) = shift;
my ($stepref);
my $rc=0;
my $laststep=$self->{LASTSTEP};
my $stepinfile=$self->{GLOBALVARS}->{tmpdir}."/datastep_$laststep.xml";
my $stepoutfile=$self->{GLOBALVARS}->{tmpdir}."/datastep_$step.xml";
printf("EXECUTE_STEP: %-10s\n",$step) if($self->{VERBOSE});
printf(" (%-30s->%-30s) ...\n",$stepinfile,$stepoutfile) if($self->{VERBOSE});
$stepref=$self->{STEPDEFS}->{$step};
$self->{GLOBALVARS}->{stepinfile}=$stepinfile;
$self->{GLOBALVARS}->{stepoutfile}=$stepoutfile;
&LML_da_util::substitute_recursive($stepref,$self->{GLOBALVARS});
if(!-f $stepinfile) {
printf("execute_step: input file for step not found %-30s ...\n",$stepinfile);
if($laststep eq "__init__") {
printf("execute_step: --> generating empty %-30s ...\n",$stepinfile);
system("touch $stepinfile");
}
}
if(-f $stepoutfile) {
printf("execute_step: unlink output file from previous run %-30s ...\n",$stepoutfile);
unlink($stepoutfile);
}
if($stepref->{type} eq "execute") {
my $execobj=LML_da_step_execute->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->execute();
}
if($stepref->{type} eq "driver_bgp") {
my $execobj=LML_da_driver_bgp->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->generate_xmlfile();
}
if($stepref->{type} eq "usagedb") {
my $execobj=LML_da_usageDB->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->update_usagedb();
}
if($stepref->{type} eq "forecast") {
my $execobj=LML_da_forecastcaller->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->runforecast();
}
if($stepref->{type} eq "historyMGR") {
my $execobj=LML_da_historyMGR->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->store();
}
if($stepref->{type} eq "put") {
my $execobj=LML_da_put->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->put();
}
if($stepref->{type} eq "LMLconvert") {
my $execobj=LML_da_convert2LMLcaller->new($stepref,$self->{GLOBALVARS});
$rc=$execobj->runconvert();
}
if(! -f $stepoutfile) {
printf("execute_step: output file not generated by step, renaming input file to %-30s ...\n",$stepoutfile);
rename($stepinfile,$stepoutfile);
}
$self->{GLOBALVARS}->{stepinfile}="";
$self->{GLOBALVARS}->{stepoutfile}="";
$self->{LASTSTEP} = $step;
return($rc);
}
1;