pcp
[Top] [All Lists]

Python PMAPI Containers Support

To: pcp developers <pcp@xxxxxxxxxxx>
Subject: Python PMAPI Containers Support
From: Marko Myllynen <myllynen@xxxxxxxxxx>
Date: Mon, 20 Jun 2016 14:43:04 +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,

Here's draft to add support for containers in the Python PMAPI.

A follow-up patch for pmrep will use this and it works nice, however
for a reason not instantly clear to me this breaks --help output for
all clients (breaks == formats poorly). Also, I'm not sure is the
pmoptget.c change needed/wanted?

Additionally, I'm not sure should error handling / exit happen
in libpcp or in Python in cases like
https://bugzilla.redhat.com/show_bug.cgi?id=1348186.

Aims to resolve https://bugzilla.redhat.com/show_bug.cgi?id=1333702 .

---
 qa/src/test_set_source.python |  5 +++++
 src/include/pcp/impl.h        |  1 +
 src/libpcp/src/exports        |  5 +++++
 src/libpcp/src/getopt.c       |  6 ++++--
 src/pmgetopt/pmgetopt.c       |  1 +
 src/python/pcp/pmapi.py       |  7 +++++++
 src/python/pmapi.c            | 28 ++++++++++++++++++++++++++++
 7 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/qa/src/test_set_source.python b/qa/src/test_set_source.python
index 9dd2f08..7149cff 100755
--- a/qa/src/test_set_source.python
+++ b/qa/src/test_set_source.python
@@ -30,6 +30,7 @@ class Test(object):
         opts.pmSetLongOptionArchive()      # -a/--archive
         opts.pmSetLongOptionArchiveList()  # --archive-list
         opts.pmSetLongOptionArchiveFolio() # --archive-folio
+        opts.pmSetLongOptionContainer()    # --container
         opts.pmSetLongOptionHost()         # -h/--host
         opts.pmSetLongOptionHostList()     # --host-list
         opts.pmSetLongOptionDebug()        # -D/--debug
@@ -58,6 +59,10 @@ class Test(object):
         if value != None:
             opts.pmSetOptionArchiveFolio(value)
 
+        value = os.environ.get('TEST_SET_CONTAINER')
+        if value != None:
+            opts.pmSetOptionContainer(value)
+
         return opts
 
 
diff --git a/src/include/pcp/impl.h b/src/include/pcp/impl.h
index 40bdeb0..3120cbc 100644
--- a/src/include/pcp/impl.h
+++ b/src/include/pcp/impl.h
@@ -1386,6 +1386,7 @@ PCP_CALL extern void __pmStartOptions(pmOptions *);
 PCP_CALL extern void __pmAddOptArchive(pmOptions *, char *);
 PCP_CALL extern void __pmAddOptArchiveList(pmOptions *, char *);
 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 __pmEndOptions(pmOptions *);
diff --git a/src/libpcp/src/exports b/src/libpcp/src/exports
index e02bd16..1bd4a41 100644
--- a/src/libpcp/src/exports
+++ b/src/libpcp/src/exports
@@ -526,3 +526,8 @@ PCP_3.15 {
     __pmSecureServerCertificateSetup;
     __pmServerGetFeaturesFromPDU;
 } PCP_3.14;
+
+PCP_3.16 {
+  global:
+    __pmAddOptContainer;
+} PCP_3.15;
diff --git a/src/libpcp/src/getopt.c b/src/libpcp/src/getopt.c
index 7b2004f..a985b02 100644
--- a/src/libpcp/src/getopt.c
+++ b/src/libpcp/src/getopt.c
@@ -642,13 +642,13 @@ __pmAddOptHostList(pmOptions *opts, char *arg)
     }
 }
 
-static void
+void
 __pmAddOptContainer(pmOptions *opts, char *arg)
 {
     char buffer[MAXPATHLEN+16];
 
     (void)opts;
-    snprintf(buffer, sizeof(buffer), "%s=%s", "PCP_CONTAINER", arg? arg : "");
+    snprintf(buffer, sizeof(buffer), "%s=%s", "PCP_CONTAINER", arg ? arg : "");
     putenv(buffer);
 }
 
@@ -800,6 +800,8 @@ __pmStartOptions(pmOptions *opts)
            __pmSetDebugFlag(opts, value);
        else if (strcmp(s, "FOLIO") == 0)
            __pmAddOptArchiveFolio(opts, value);
+       else if (strcmp(s, "CONTAINER") == 0)
+           __pmAddOptContainer(opts, value);
        else if (strcmp(s, "GUIMODE") == 0)
            __pmSetGuiModeFlag(opts);
        else if (strcmp(s, "HOST") == 0)
diff --git a/src/pmgetopt/pmgetopt.c b/src/pmgetopt/pmgetopt.c
index f3a6121..152c744 100644
--- a/src/pmgetopt/pmgetopt.c
+++ b/src/pmgetopt/pmgetopt.c
@@ -148,6 +148,7 @@ standard_options(pmOptions *opts, char *start)
        PMOPT_HOST_LIST,
        PMOPT_ARCHIVE_LIST,
        PMOPT_ARCHIVE_FOLIO,
+       PMOPT_CONTAINER,
        PMAPI_OPTIONS_END
     };
     pmLongOptions *entry;
diff --git a/src/python/pcp/pmapi.py b/src/python/pcp/pmapi.py
index 7f00964..18c292a 100644
--- a/src/python/pcp/pmapi.py
+++ b/src/python/pcp/pmapi.py
@@ -995,6 +995,10 @@ class pmOptions(object):
         """ Add support for --archive-folio into PMAPI monitor tool """
         return c_api.pmSetLongOptionArchiveFolio()
 
+    def pmSetLongOptionContainer(self):
+        """ Add support for --container into PMAPI monitor tool """
+        return c_api.pmSetLongOptionContainer()
+
     def pmSetLongOptionHostList(self):
         """ Add support for --host-list into PMAPI monitor tool """
         return c_api.pmSetLongOptionHostList()
@@ -1064,6 +1068,9 @@ class pmOptions(object):
     def pmSetOptionArchiveFolio(self, folio):  # str
         return c_api.pmSetOptionArchiveFolio(folio)
 
+    def pmSetOptionContainer(self, container): # str
+        return c_api.pmSetOptionContainer(container)
+
     def pmSetOptionHost(self, host):   # str
         return c_api.pmSetOptionHost(host)
 
diff --git a/src/python/pmapi.c b/src/python/pmapi.c
index c4a3681..b604d24 100644
--- a/src/python/pmapi.c
+++ b/src/python/pmapi.c
@@ -334,6 +334,13 @@ setLongOptionArchiveFolio(PyObject *self, PyObject *args)
 }
 
 static PyObject *
+setLongOptionContainer(PyObject *self, PyObject *args)
+{
+    pmLongOptions option = PMOPT_CONTAINER;
+    return addLongOptionObject(&option);
+}
+
+static PyObject *
 setLongOptionDebug(PyObject *self, PyObject *args)
 {
     pmLongOptions option = PMOPT_DEBUG;
@@ -555,6 +562,21 @@ setOptionArchive(PyObject *self, PyObject *args, PyObject 
*keywords)
 }
 
 static PyObject *
+setOptionContainer(PyObject *self, PyObject *args, PyObject *keywords)
+{
+    char *container;
+    char *keyword_list[] = {PMLONGOPT_CONTAINER, NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, keywords,
+                       "s:pmSetOptionContainer", keyword_list, &container))
+       return NULL;
+
+    __pmAddOptContainer(&options, container);
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+static PyObject *
 setOptionHost(PyObject *self, PyObject *args, PyObject *keywords)
 {
     char *host;
@@ -1148,6 +1170,9 @@ static PyMethodDef methods[] = {
     { .ml_name = "pmSetLongOptionArchiveFolio",
        .ml_meth = (PyCFunction) setLongOptionArchiveFolio,
         .ml_flags = METH_NOARGS },
+    { .ml_name = "pmSetLongOptionContainer",
+       .ml_meth = (PyCFunction) setLongOptionContainer,
+        .ml_flags = METH_NOARGS },
     { .ml_name = "pmSetLongOptionDebug",
        .ml_meth = (PyCFunction) setLongOptionDebug,
         .ml_flags = METH_NOARGS },
@@ -1298,6 +1323,9 @@ static PyMethodDef methods[] = {
     { .ml_name = "pmSetOptionArchiveFolio",
        .ml_meth = (PyCFunction) setOptionArchiveFolio,
         .ml_flags = METH_VARARGS | METH_KEYWORDS },
+    { .ml_name = "pmSetOptionContainer",
+       .ml_meth = (PyCFunction) setOptionContainer,
+        .ml_flags = METH_VARARGS | METH_KEYWORDS },
     { .ml_name = "pmSetOptionHost",
        .ml_meth = (PyCFunction) setOptionHost,
         .ml_flags = METH_VARARGS | METH_KEYWORDS },

Thanks,

-- 
Marko Myllynen

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