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
|