pcp
[Top] [All Lists]

Python PMAPI: Allow setting local context

To: pcp developers <pcp@xxxxxxxxxxx>
Subject: Python PMAPI: Allow setting local context
From: Marko Myllynen <myllynen@xxxxxxxxxx>
Date: Tue, 21 Jun 2016 19:55:18 +0300
Delivered-to: pcp@xxxxxxxxxxx
Organization: Red Hat
Reply-to: Marko Myllynen <myllynen@xxxxxxxxxx>
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0
Hi,

What do you think about the patch below? If you think it's ok (perhaps
with the addition of the corresponding getters?) I could send a
follow-up patch to make pmrep to use this (the idea being that it would
then be possible to use the local context mode with configuration file
directives).

---
 qa/722                        |  8 ++++++++
 qa/722.out                    | 12 ++++++++++++
 qa/src/test_set_source.python |  8 ++++++++
 src/include/pcp/impl.h        |  2 ++
 src/libpcp/src/exports        |  2 ++
 src/libpcp/src/getopt.c       |  9 ++++++---
 src/python/pcp/pmapi.py       |  6 ++++++
 src/python/pmapi.c            | 31 +++++++++++++++++++++++++++++++
 8 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/qa/722 b/qa/722
index 2af1d54..1335843 100755
--- a/qa/722
+++ b/qa/722
@@ -47,6 +47,14 @@ echo && echo == Container, expect pass:
 TEST_SET_CONTAINER=abc012345 $script 2>$tmp.stderr
 _check_stderr
 
+echo && echo == Local PMDA, expect pass:
+TEST_SET_LOCALPMDA=true TEST_SET_SPECLOCAL=clear $script 2>$tmp.stderr
+_check_stderr
+
+echo && echo == Local PMDA, expect fail:
+TEST_SET_LOCALPMDA=true TEST_SET_SPECLOCAL=add, $script 2>$tmp.stderr
+_check_stderr
+
 echo && echo == Archive list, expect pass:
 TEST_SET_ARCHIVELIST=archives/pcp-atop $script 2>$tmp.stderr
 _check_stderr
diff --git a/qa/722.out b/qa/722.out
index d8626e4..06c06d6 100644
--- a/qa/722.out
+++ b/qa/722.out
@@ -31,6 +31,18 @@ Archives: None
 Container: abc012345
 pass
 
+== Local PMDA, expect pass:
+== Test ==
+Hosts: None
+Archives: None
+pass
+
+== Local PMDA, expect fail:
+== Test ==
+Hosts: None
+Archives: None
+fail
+
 == Archive list, expect pass:
 == Test ==
 Hosts: None
diff --git a/qa/src/test_set_source.python b/qa/src/test_set_source.python
index c57a25c..036c7aa 100755
--- a/qa/src/test_set_source.python
+++ b/qa/src/test_set_source.python
@@ -63,6 +63,14 @@ class Test(object):
         if value != None:
             opts.pmSetOptionContainer(value)
 
+        value = os.environ.get('TEST_SET_SPECLOCAL')
+        if value != None:
+            opts.pmSetOptionSpecLocal(value)
+
+        value = os.environ.get('TEST_SET_LOCALPMDA')
+        if value != None:
+            opts.pmSetOptionLocalPMDA()
+
         return opts
 
 
diff --git a/src/include/pcp/impl.h b/src/include/pcp/impl.h
index 3120cbc..05326ab 100644
--- a/src/include/pcp/impl.h
+++ b/src/include/pcp/impl.h
@@ -1389,6 +1389,8 @@ PCP_CALL extern void __pmAddOptArchiveFolio(pmOptions *, 
char *);
 PCP_CALL extern void __pmAddOptContainer(pmOptions *, char *);
 PCP_CALL extern void __pmAddOptHost(pmOptions *, char *);
 PCP_CALL extern void __pmAddOptHostList(pmOptions *, char *);
+PCP_CALL extern void __pmSetLocalContextFlag(pmOptions *);
+PCP_CALL extern void __pmSetLocalContextTable(pmOptions *, char *);
 PCP_CALL extern void __pmEndOptions(pmOptions *);
 
 /*
diff --git a/src/libpcp/src/exports b/src/libpcp/src/exports
index 1bd4a41..c76b18b 100644
--- a/src/libpcp/src/exports
+++ b/src/libpcp/src/exports
@@ -530,4 +530,6 @@ PCP_3.15 {
 PCP_3.16 {
   global:
     __pmAddOptContainer;
+    __pmSetLocalContextFlag;
+    __pmSetLocalContextTable;
 } PCP_3.15;
diff --git a/src/libpcp/src/getopt.c b/src/libpcp/src/getopt.c
index a985b02..39e848b 100644
--- a/src/libpcp/src/getopt.c
+++ b/src/libpcp/src/getopt.c
@@ -665,7 +665,7 @@ __pmSetDerivedMetrics(pmOptions *opts, char *arg)
     }
 }
 
-static void
+void
 __pmSetLocalContextTable(pmOptions *opts, char *arg)
 {
     char *errmsg;
@@ -676,7 +676,7 @@ __pmSetLocalContextTable(pmOptions *opts, char *arg)
     }
 }
 
-static void
+void
 __pmSetLocalContextFlag(pmOptions *opts)
 {
     if (opts->context && !(opts->flags & PM_OPTFLAG_MULTI)) {
@@ -808,7 +808,10 @@ __pmStartOptions(pmOptions *opts)
            __pmAddOptHost(opts, value);
        else if (strcmp(s, "HOST_LIST") == 0)
            __pmAddOptHostList(opts, value);
-       else if (strcmp(s, "LOCALMODE") == 0)
+       else if (strcmp(s, "SPECLOCAL") == 0)
+           __pmSetLocalContextTable(opts, value);
+       else if (strcmp(s, "LOCALMODE") == 0 ||
+                strcmp(s, "LOCALPMDA") == 0)
            __pmSetLocalContextFlag(opts);
        else if (strcmp(s, "NAMESPACE") == 0)
            __pmSetNameSpace(opts, value, 1);
diff --git a/src/python/pcp/pmapi.py b/src/python/pcp/pmapi.py
index 1b76edb..9f6b105 100644
--- a/src/python/pcp/pmapi.py
+++ b/src/python/pcp/pmapi.py
@@ -1080,6 +1080,12 @@ class pmOptions(object):
     def pmSetOptionHostList(self, hosts):      # str
         return c_api.pmSetOptionHostList(hosts)
 
+    def pmSetOptionSpecLocal(self, spec):      # str
+        return c_api.pmSetOptionSpecLocal(spec)
+
+    def pmSetOptionLocalPMDA(self):
+        return c_api.pmSetOptionLocalPMDA()
+
 
 ##############################################################################
 #
diff --git a/src/python/pmapi.c b/src/python/pmapi.c
index d8243d2..e7c087c 100644
--- a/src/python/pmapi.c
+++ b/src/python/pmapi.c
@@ -609,6 +609,31 @@ setOptionHostList(PyObject *self, PyObject *args, PyObject 
*keywords)
 }
 
 static PyObject *
+setOptionSpecLocal(PyObject *self, PyObject *args, PyObject *keywords)
+{
+    char *spec;
+    char *keyword_list[] = {"spec", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, keywords,
+                       "s:pmSetOptionSpecLocal", keyword_list, &spec))
+       return NULL;
+
+    if ((spec = strdup(spec ? spec : "")) == NULL)
+       return PyErr_NoMemory();
+    __pmSetLocalContextTable(&options, spec);
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
+setOptionLocalPMDA(PyObject *self, PyObject *args, PyObject *keywords)
+{
+    __pmSetLocalContextFlag(&options);
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
 setOptionSamples(PyObject *self, PyObject *args, PyObject *keywords)
 {
     char *count, *endnum;
@@ -1346,6 +1371,12 @@ static PyMethodDef methods[] = {
     { .ml_name = "pmSetOptionHostList",
        .ml_meth = (PyCFunction) setOptionHostList,
         .ml_flags = METH_VARARGS | METH_KEYWORDS },
+    { .ml_name = "pmSetOptionSpecLocal",
+       .ml_meth = (PyCFunction) setOptionSpecLocal,
+        .ml_flags = METH_VARARGS | METH_KEYWORDS },
+    { .ml_name = "pmSetOptionLocalPMDA",
+       .ml_meth = (PyCFunction) setOptionLocalPMDA,
+        .ml_flags = METH_VARARGS | METH_KEYWORDS },
     { .ml_name = "pmnsTraverse",
        .ml_meth = (PyCFunction) pmnsTraverse,
         .ml_flags = METH_VARARGS | METH_KEYWORDS },

Thanks,

-- 
Marko Myllynen

<Prev in Thread] Current Thread [Next in Thread>