summaryrefslogtreecommitdiffstats
path: root/networking-odl/networking_odl/common/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'networking-odl/networking_odl/common/utils.py')
-rw-r--r--networking-odl/networking_odl/common/utils.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/networking-odl/networking_odl/common/utils.py b/networking-odl/networking_odl/common/utils.py
new file mode 100644
index 0000000..a01a14a
--- /dev/null
+++ b/networking-odl/networking_odl/common/utils.py
@@ -0,0 +1,60 @@
+# Copyright (c) 2014 Red Hat Inc.
+# 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.
+
+import collections
+import socket
+
+from oslo_log import log
+
+from networking_odl.common import cache
+
+LOG = log.getLogger(__name__)
+
+
+def try_del(d, keys):
+ """Ignore key errors when deleting from a dictionary."""
+ for key in keys:
+ try:
+ del d[key]
+ except KeyError:
+ pass
+
+
+def _fetch_all_addresses_by_hostnames(hostnames):
+ for name in hostnames:
+ # it uses an ordered dict to avoid duplicates and keep order
+ entries = collections.OrderedDict(
+ (info[4][0], None) for info in socket.getaddrinfo(name, None))
+ for entry in entries:
+ yield name, entry
+
+
+_addresses_by_name_cache = cache.Cache(_fetch_all_addresses_by_hostnames)
+
+
+def get_addresses_by_name(name, time_to_live=60.0):
+ """Gets and caches addresses for given name.
+
+ This is a cached wrapper for function 'socket.getaddrinfo'.
+
+ :returns: a sequence of unique addresses binded to given hostname.
+ """
+
+ try:
+ results = _addresses_by_name_cache.fetch_all(
+ [name], timeout=time_to_live)
+ return tuple(address for name, address in results)
+ except cache.CacheFetchError as error:
+ error.reraise_cause()