pcp
[Top] [All Lists]

Re: [pcp] Python PMAPI: Allow setting local context

To: Nathan Scott <nathans@xxxxxxxxxx>
Subject: Re: [pcp] Python PMAPI: Allow setting local context
From: Marko Myllynen <myllynen@xxxxxxxxxx>
Date: Sun, 26 Jun 2016 16:46:42 +0300
Cc: pcp developers <pcp@xxxxxxxxxxx>
Delivered-to: pcp@xxxxxxxxxxx
In-reply-to: <2134000453.761158.1466555658813.JavaMail.zimbra@xxxxxxxxxx>
Organization: Red Hat
References: <57697176.8060708@xxxxxxxxxx> <2134000453.761158.1466555658813.JavaMail.zimbra@xxxxxxxxxx>
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,

On 2016-06-22 03:34, Nathan Scott wrote:
> ----- Original Message -----
>>
>> What do you think about the patch below? If you think it's ok (perhaps
> 
> Looks good Marko.
> 
>> with the addition of the corresponding getters?) I could send a
> 
> +1  (allows QA to show it working end-to-end)

Digging up the spec in effect would require more effort I think would
be worth it, testing the flag only still allows to see that we've
successfully called the routine in libpcp where both functions reside,
does this look acceptable?

---
 qa/722                        |  8 ++++++++
 qa/722.out                    | 14 ++++++++++++++
 qa/src/test_set_source.python | 11 +++++++++++
 src/include/pcp/impl.h        |  2 ++
 src/libpcp/src/exports        |  2 ++
 src/libpcp/src/getopt.c       |  9 ++++++---
 src/python/pcp/pmapi.py       | 11 +++++++++++
 src/python/pmapi.c            | 39 +++++++++++++++++++++++++++++++++++++++
 8 files changed, 93 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..dee95b5 100644
--- a/qa/722.out
+++ b/qa/722.out
@@ -31,6 +31,20 @@ Archives: None
 Container: abc012345
 pass
 
+== Local PMDA, expect pass:
+== Test ==
+Hosts: None
+Archives: None
+Local PMDA: True
+pass
+
+== Local PMDA, expect fail:
+== Test ==
+Hosts: None
+Archives: None
+Local PMDA: True
+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..5ef16b7 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
 
 
@@ -74,6 +82,9 @@ class Test(object):
         container = self.opts.pmGetOptionContainer()
         if container:
             print("Container: %s" % (container))
+        localpmda = self.opts.pmGetOptionLocalPMDA()
+        if localpmda:
+            print("Local PMDA: %s" % (str(localpmda)))
         self.context = pmapi.pmContext.fromOptions(self.opts, sys.argv)
 
 if __name__ == '__main__':
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 7ef29d9..2a083cb 100644
--- a/src/libpcp/src/exports
+++ b/src/libpcp/src/exports
@@ -532,4 +532,6 @@ PCP_3.16 {
     pmSemStr;
     pmSemStr_r;
     __pmAddOptContainer;
+    __pmSetLocalContextFlag;
+    __pmSetLocalContextTable;
 } PCP_3.15;
diff --git a/src/libpcp/src/getopt.c b/src/libpcp/src/getopt.c
index bd6e6cf..f3a2bd8 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 c9604f9..b2d7070 100644
--- a/src/python/pcp/pmapi.py
+++ b/src/python/pcp/pmapi.py
@@ -1065,6 +1065,11 @@ class pmOptions(object):
     def pmGetOptionContainer(self):    # str
         return c_api.pmGetOptionContainer()
 
+    def pmGetOptionLocalPMDA(self):    # boolean
+        if c_api.pmGetOptionLocalPMDA() == 0:
+            return False
+        return True
+
     def pmSetOptionArchive(self, archive):     # str
         return c_api.pmSetOptionArchive(archive)
 
@@ -1083,6 +1088,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..0bd33d4 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;
@@ -1137,6 +1162,11 @@ getOptionContainer(PyObject *self, PyObject *args)
     return Py_None;
 }
 
+static PyObject *
+getOptionLocalPMDA(PyObject *self, PyObject *args)
+{
+    return Py_BuildValue("i", options.Lflag);
+}
 
 static PyMethodDef methods[] = {
     { .ml_name = "PM_XTB_SET",
@@ -1328,6 +1358,9 @@ static PyMethodDef methods[] = {
     { .ml_name = "pmGetOptionContainer",
        .ml_meth = (PyCFunction) getOptionContainer,
         .ml_flags = METH_NOARGS },
+    { .ml_name = "pmGetOptionLocalPMDA",
+       .ml_meth = (PyCFunction) getOptionLocalPMDA,
+        .ml_flags = METH_NOARGS },
     { .ml_name = "pmSetOptionArchive",
        .ml_meth = (PyCFunction) setOptionArchive,
         .ml_flags = METH_VARARGS | METH_KEYWORDS },
@@ -1346,6 +1379,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>