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
|