naichuans 7b6aa0ad9b os-xenapi: Add utils to support HIMN configure
Add utils to do HIMN configuration. If the local HIMN interface
is up and gets IP address allocated, we can get the interface
via checking if the local interface has an IP belong to the same
network as the dom0's HIMN IP which should be supplied. Otherwise
read xenstore to get mac address and find the interface via mac.
After identified the interface, we populate the ifcfg file to
ensure this interface will be up in the future across boots.

Change-Id: I5f8cd53710edb714f0c4c1dc50c1d4472f2e365f
Depends-on: Ia363afc1fc932bf44a7ac956a5bc27978bb47868
2017-12-25 08:20:21 +00:00

78 lines
2.2 KiB
Python

# Copyright 2017 Citrix Systems
#
# 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.
"""The common functions for XenAPI utils
It contains the common functions used by XenAPI utils."""
import logging
import netifaces
import os
import subprocess
from os_xenapi.client import exception
LOG = logging.getLogger('XenAPI_utils')
def detailed_execute(*cmd, **kwargs):
cmd = map(str, cmd)
_env = kwargs.get('env')
env_prefix = ''
if _env:
env_prefix = ''.join(['%s=%s ' % (k, _env[k]) for k in _env])
env = dict(os.environ)
env.update(_env)
else:
env = None
LOG.info(env_prefix + ' '.join(cmd))
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, # nosec
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)
prompt = kwargs.get('prompt')
if prompt:
(out, err) = proc.communicate(prompt)
else:
(out, err) = proc.communicate()
if out:
# Truncate "\n" if it is the last char
out = out.strip()
LOG.debug(out)
if err:
LOG.info(err)
if proc.returncode is not None and proc.returncode != 0:
if proc.returncode in kwargs.get('allowed_return_codes', [0]):
LOG.info('Swallowed acceptable return code of %d',
proc.returncode)
else:
LOG.warn('proc.returncode: %s', proc.returncode)
raise exception(err)
return proc.returncode, out, err
def execute(*cmd, **kwargs):
_, out, _ = detailed_execute(*cmd, **kwargs)
return out
def get_eth_mac(eth):
# Get eth's mac address.
return netifaces.ifaddresses(eth).get(netifaces.AF_LINK)[0]['addr']