diff options
author | Dan Prince <dprince@redhat.com> | 2014-08-20 13:10:40 -0400 |
---|---|---|
committer | Dan Prince <dprince@redhat.com> | 2014-08-20 13:10:40 -0400 |
commit | b3e74611befb157dc4bf992f23aaba346e655a86 (patch) | |
tree | 30807f86f1e54e10576780611772ec790807f729 /os_net_config/utils.py | |
parent | 2d3af95651223ca142e99c9c2bbe284481e3f33d (diff) |
Add nic1, nic2 naming abstraction
Implements a new active NIC abstraction and naming convention
that allows nic1, nic2, etc. to be translated to actual (active)
network device names like em1, em2 (or eth0, eth1).
This includes some logic to map ordered active nics to the
nic1, nic2 naming scheme. Embedded nics are always listed
first (in sort order) followed by any other active Nics
on the system.
With the new code:
{"type": "interface", "name": "nic1" }
is automatically translated (internally) to:
{"type": "interface", "name": "em1" }
This works for all top level "interface" devices, vlans, bonds, and
bridges alike. For vlans the 'device' name is translated instead
of the device name per vlan object conventions.
Diffstat (limited to 'os_net_config/utils.py')
-rw-r--r-- | os_net_config/utils.py | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/os_net_config/utils.py b/os_net_config/utils.py index cd7ee65..e51d197 100644 --- a/os_net_config/utils.py +++ b/os_net_config/utils.py @@ -14,35 +14,76 @@ # License for the specific language governing permissions and limitations # under the License. +import glob import logging logger = logging.getLogger(__name__) +_SYS_CLASS_NET = '/sys/class/net' def write_config(filename, data): - with open(filename, "w") as f: + with open(filename, 'w') as f: f.write(str(data)) def get_file_data(filename): try: - with open(filename, "r") as f: + with open(filename, 'r') as f: return f.read() except IOError: logger.error("Error reading file: %s" % filename) - return "" + return '' def interface_mac(name): try: - with open('/sys/class/net/%s/address' % name, "r") as f: + with open('/sys/class/net/%s/address' % name, 'r') as f: return f.read().rstrip() except IOError: logger.error("Unable to read file: %s" % name) raise +def _is_active_nic(interface_name): + try: + if interface_name == 'lo': + return False + + addr_assign_type = None + with open(_SYS_CLASS_NET + '/%s/addr_assign_type' % interface_name, + 'r') as f: + addr_assign_type = int(f.read().rstrip()) + + carrier = None + with open(_SYS_CLASS_NET + '/%s/carrier' % interface_name, 'r') as f: + carrier = int(f.read().rstrip()) + + address = None + with open(_SYS_CLASS_NET + '/%s/address' % interface_name, 'r') as f: + address = f.read().rstrip() + + if addr_assign_type == 0 and carrier == 1 and address: + return True + else: + return False + except IOError: + return False + + +def ordered_active_nics(): + embedded_nics = [] + nics = [] + for name in glob.iglob(_SYS_CLASS_NET + '/*'): + nic = name[(len(_SYS_CLASS_NET) + 1):] + if _is_active_nic(nic): + if nic.startswith('em') or nic.startswith('eth'): + embedded_nics.append(nic) + else: + nics.append(nic) + return sorted(embedded_nics) + sorted(nics) + + def diff(filename, data): file_data = get_file_data(filename) logger.debug("Diff file data:\n%s" % file_data) |