Blob Blame History Raw
commit 0b1500ff74341c54c3da4412eb8ee8db9c58cf41
Author: Nathan Scott <nathans@redhat.com>
Date:   Tue Feb 11 09:54:07 2014 +1100

    Allow PMDA Install scripts to be run even when pmcd is stopped.
    
    Following the Install recipe from the GFS2 PMDA man page, users
    can run into difficulty if pmcd is not running first.  There's
    no mention of that, and the error message is cryptic.  This fix
    extends the generic PMDA installation process to allow any PMDA
    to kick-start the pmcd process if it needs to.  The one wrinkle
    there is a chicken-and-egg with the namespace setup, but that's
    tackled via addition of a Rebuild call in the right spot.
    
    Reported by Andrew Price, tested by Paul Evans, myself and now
    also PCP QA test 755.
    
    Resolves Red Hat bug #1062443.

diff --git a/qa/755 b/qa/755
new file mode 100755
index 0000000..be5ae14
--- /dev/null
+++ b/qa/755
@@ -0,0 +1,98 @@
+#!/bin/sh
+# PCP QA Test No. 755
+# Exercise the Apache PMDA Install/Remove, as well as the
+# mechanism by which a PMDA can be installed with no pmcd
+# process running.
+#
+# Copyright (c) 2014 Red Hat.
+#
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+# get standard environment, filters and checks
+. ./common.product
+. ./common.filter
+. ./common.check
+
+status=1	# failure is the default!
+done_clean=false
+rm -f $seq.full
+
+install_on_cleanup=false
+pminfo apache >/dev/null 2>&1 && install_on_cleanup=true
+
+_cleanup()
+{
+    if $done_clean
+    then
+        :
+    else
+        [ -f $tmp.pmcd.conf ] && $sudo mv $tmp.pmcd.conf $PCP_PMCDCONF_PATH
+        rm -f $tmp.*
+        $sudo $PCP_RC_DIR/pcp restart | _filter_pcp_start
+        _wait_for_pmcd
+        _wait_for_pmlogger
+        if $install_on_cleanup
+        then
+            ( cd $PCP_PMDAS_DIR/apache; $sudo ./Install </dev/null >/dev/null 2>&1 )
+        else
+            ( cd $PCP_PMDAS_DIR/apache; $sudo ./Remove >/dev/null 2>&1 )
+        fi
+        done_clean=true
+    fi
+}
+
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_filter_apache()
+{
+    # cull message resulting from no running httpd
+    grep -v 'Information not currently available'
+}
+
+# real QA test starts here
+home=$PCP_PMDAS_DIR
+iam=apache
+cd $home/$iam
+unset ROOT MAKEFLAGS
+
+# copy the pmcd config file to restore state later.
+cp $PCP_PMCDCONF_PATH $tmp.pmcd.conf
+
+# start from a known starting point
+$sudo ./Remove >/dev/null 2>&1
+$sudo $PCP_RC_DIR/pmcd stop
+
+echo
+echo "=== $iam agent installation ==="
+$sudo ./Install </dev/null >$tmp.out 2>&1
+# Check apache metrics have appeared ... X metrics and Y values
+_filter_pmda_install <$tmp.out \
+| sed \
+        -e '/^Waiting for pmcd/s/\.\.\.[. ]*$/DOTS/' \
+        -e 's/[0-9][0-9]* warnings, //' \
+| $PCP_AWK_PROG '
+/Check apache metrics have appeared/    { if ($7 >= 20 && $7 <= 80) $7 = "X"
+                                          if ($10 >= 0 && $10 <= 80) $10 = "Y"
+                                        }
+                                        { print }'
+
+# pmcd should have been started by the Install process - check
+if pminfo -v $iam > $tmp.info 2> $tmp.err
+then
+    :
+else
+    echo "... failed! ... here is the Install log ..."
+    cat $tmp.out
+fi
+cat $tmp.info $tmp.err | _filter_apache
+
+echo
+echo "=== remove $iam agent ==="
+$sudo ./Remove >$tmp.out 2>&1
+_filter_pmda_remove <$tmp.out
+
+# success, all done
+status=0
+exit
diff --git a/qa/755.out b/qa/755.out
new file mode 100644
index 0000000..50b4b3b
--- /dev/null
+++ b/qa/755.out
@@ -0,0 +1,23 @@
+QA output created by 755
+Waiting for pmcd to terminate ...
+
+=== apache agent installation ===
+Installing the "apache" Performance Metrics Domain Agent (PMDA) ...
+
+Apache port number [80]? Updating the Performance Metrics Name Space (PMNS) ...
+Terminate PMDA if already installed ...
+[...install files, make output...]
+Updating the PMCD control file, and notifying PMCD ...
+Starting pmcd ... 
+Starting pmlogger ... 
+Check apache metrics have appeared ... X metrics and Y values
+
+=== remove apache agent ===
+Culling the Performance Metrics Name Space ...
+apache ... done
+Updating the PMCD control file, and notifying PMCD ...
+[...removing files...]
+Check apache metrics have gone away ... OK
+Waiting for pmcd to terminate ...
+Starting pmcd ... 
+Starting pmlogger ... 
diff --git a/qa/group b/qa/group
index bb752f1..0cb02fe 100644
--- a/qa/group
+++ b/qa/group
@@ -130,6 +130,7 @@ pmda
 pmda.install
 
 # Assorted PMDAs
+pmda.apache
 pmda.cisco
 pmda.environ
 pmda.gfs2
@@ -888,6 +889,7 @@ avahi
 748 pmlogrewrite pmda.mysql local oss
 749 pmcd local oss
 750 pmda.rpm local oss
+755 pmda.apache pmda.install local oss
 768 pmlogextract local oss
 775 sanity pmfind local oss
 783 pmda.rpm local oss
diff --git a/src/pmcd/pmdaproc.sh b/src/pmcd/pmdaproc.sh
index 43cffa7..bab0161 100644
--- a/src/pmcd/pmdaproc.sh
+++ b/src/pmcd/pmdaproc.sh
@@ -1163,6 +1163,22 @@ _install()
     # Install the namespace
     #
 
+    if [ ! -f $NAMESPACE ]
+    then
+	# We may be installing an agent right after an install -
+	# before pmcd startup, which has a pre-execution step of
+	# rebuilding the namespace root.  Do so now.
+	if [ -x $PMNSDIR/Rebuild ]
+	then
+	    echo "$prog: cannot Rebuild the PMNS for \"$NAMESPACE\""
+	    exit 1
+	fi
+	cd $PMNSDIR
+	./Rebuild -dus
+	cd $__here
+	forced_restart=true
+    fi
+
     for __n in $pmns_name
     do
 	if pminfo $__ns_opt $__n >/dev/null 2>&1