summaryrefslogtreecommitdiffstats
path: root/python-discovery-client/discovery_client/util.py
diff options
context:
space:
mode:
authorTommy Carpenter <tommy@research.att.com>2017-08-23 11:21:44 -0400
committerTommy Carpenter <tommy@research.att.com>2017-08-23 12:32:45 -0400
commit81b9ed7a3af1032caa86f316a21e9b2912bb1271 (patch)
treefe3bb349f501619d3b4df4d4dbb07b9d72adc824 /python-discovery-client/discovery_client/util.py
parent280af47e5342de6bb4657ad7b85adcc9395ace20 (diff)
Intiial utils push to ONAP
Issue-Id: DCAEGEN2-80 Change-Id: I1dc8f2d384b0af346fccb86e6767b7e3ca484078 Signed-off-by: Tommy Carpenter <tommy@research.att.com>
Diffstat (limited to 'python-discovery-client/discovery_client/util.py')
-rw-r--r--python-discovery-client/discovery_client/util.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/python-discovery-client/discovery_client/util.py b/python-discovery-client/discovery_client/util.py
new file mode 100644
index 0000000..b59647a
--- /dev/null
+++ b/python-discovery-client/discovery_client/util.py
@@ -0,0 +1,78 @@
+# org.onap.dcae
+# ================================================================================
+# Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+import collections
+import logging, sys
+import six
+
+#####
+# Module contains utility methods
+#####
+
+def update_json(src, key, value):
+ """Updates a nested JSON value
+
+ This method does a recursive lookup for a value given a compound key and then
+ replaces that value with the passed in new value.
+
+ For example, given a src json { "a": [ { "aa": 1 }, "foo" ], "b": "2 } and a
+ key ("a", 0, "aa"), the value parameter would replace 1.
+
+ :param src: json to update
+ :type src: dict or list
+ :param key: compound key used to lookup
+ :type key: tuple
+ :param value: new value used to replace
+ :type value: object
+
+ :return: updated json
+ """
+ if key:
+ src[key[0]] = update_json(src[key[0]], key[1:], value)
+ else:
+ # We've found the value we want to replace regardless of whether or not
+ # the object we are replacing is another copmlicated data structure.
+ src = value
+ return src
+
+def _has_handlers(logger):
+ """Check if logger has handlers"""
+ if six.PY3:
+ return logger.hasHandlers()
+ else:
+ # TODO: Not sure how to check if a handler has already been attached
+ # WATCH: Downside is lines get printed multiple times
+ return False
+
+def get_logger(name, level=logging.INFO):
+ """Get a logger with sensible defaults
+
+ This method returns a logger from logging by name that has been set with sensible
+ defaults if the logger hasn't already been setup with any handlers. The
+ default handler is a stream handler to stdout.
+ """
+ logger = logging.getLogger(name)
+
+ if not _has_handlers(logger):
+ # No handlers attached which means logging hasn't been setup. Set
+ # "sensible" defaults which means stdout, INFO
+ logger.setLevel(level)
+ logger.addHandler(logging.StreamHandler(stream=sys.stdout))
+
+ return logger