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
|