diff options
-rw-r--r-- | deploy/reap.py | 36 | ||||
-rw-r--r-- | deploy/transplant_fuel_settings.py | 37 | ||||
-rw-r--r-- | docs/buildprocedure/build.instruction.rst | 2 |
3 files changed, 73 insertions, 2 deletions
diff --git a/deploy/reap.py b/deploy/reap.py index 7d996314b..eb02fe25d 100644 --- a/deploy/reap.py +++ b/deploy/reap.py @@ -16,6 +16,8 @@ import yaml import glob import shutil import tempfile +import re +import netaddr from common import ( N, @@ -253,6 +255,40 @@ class Reap(object): if key not in ['ipaddress', 'netmask', 'dhcp_pool_start', 'dhcp_pool_end', 'ssh_network']: del fuel['ADMIN_NETWORK'][key] + + ## FIXME(armband): Factor in support for adding public/other interfaces. + ## TODO: Following block expects interface name(s) to be lowercase only + interfaces_list = exec_cmd('ip -o -4 a | grep -e "e[nt][hopsx].*"') + for interface in re.split('\n', interfaces_list): + # Sample output line from above cmd: + # 3: eth1 inet 10.0.2.10/24 scope global eth1 valid_lft forever ... + ifcfg = re.split(r'\s+', interface) + ifcfg_name = ifcfg[1] + ifcfg_ipaddr = ifcfg[3] + + # Filter out admin interface (device name is not known, match IP) + current_network = netaddr.IPNetwork(ifcfg_ipaddr) + if str(current_network.ip) == fuel['ADMIN_NETWORK']['ipaddress']: + continue + + # Read ifcfg-* network interface config file, write IFCFG_<IFNAME> + ifcfg_sec = 'IFCFG_%s' % ifcfg_name.upper() + fuel[ifcfg_sec] = {} + ifcfg_data = {} + ifcfg_f = ('/etc/sysconfig/network-scripts/ifcfg-%s' % ifcfg_name) + with open(ifcfg_f) as f: + for line in f: + if line.startswith('#'): + continue + (key, val) = line.split('=') + ifcfg_data[key.lower()] = val.rstrip() + + # Keep only needed info (e.g. filter-out type=Ethernet). + fuel[ifcfg_sec]['ipaddress'] = ifcfg_data['ipaddr'] + fuel[ifcfg_sec]['device'] = ifcfg_data['device'] + fuel[ifcfg_sec]['netmask'] = str(current_network.netmask) + fuel[ifcfg_sec]['gateway'] = ifcfg_data['gateway'] + self.write_yaml(self.dea_file, {'fuel': fuel}) def reap_network_settings(self): diff --git a/deploy/transplant_fuel_settings.py b/deploy/transplant_fuel_settings.py index 318c633aa..993b0dcce 100644 --- a/deploy/transplant_fuel_settings.py +++ b/deploy/transplant_fuel_settings.py @@ -11,10 +11,14 @@ import sys import io import yaml +import re +import os from dea import DeploymentEnvironmentAdapter from common import ( check_file_exists, + exec_cmd, + log, ) ASTUTE_YAML = '/etc/fuel/astute.yaml' @@ -36,15 +40,45 @@ def parse_arguments(): check_file_exists(dea_file) return dea_file +def write_ifcfg_file(key, fuel_conf): + config = ('BOOTPROTO=none\n' + 'ONBOOT=yes\n' + 'TYPE=Ethernet\n' + 'NM_CONTROLLED=yes\n') + for skey in ('ipaddress', 'device', 'netmask', 'gateway'): + if not fuel_conf[key].get(skey): + log('Warning: missing key %s for %s' % (skey, key)) + config += '%s=\n' % skey.upper() + elif skey == 'ipaddress': + config += 'IPADDR=%s\n' % fuel_conf[key][skey] + else: + config += '%s=%s\n' % (skey.upper(), fuel_conf[key][skey]) + + fname = os.path.join('/etc/sysconfig/network-scripts/', + key.lower().replace('_','-')) + with open(fname, 'wc') as f: + f.write(config) def transplant(dea, astute): fuel_conf = dea.get_fuel_config() + require_network_restart = False for key in fuel_conf.iterkeys(): if key == 'ADMIN_NETWORK': for skey in fuel_conf[key].iterkeys(): astute[key][skey] = fuel_conf[key][skey] + elif re.match('^IFCFG', key): + log('Adding interface configuration for: %s' % key.lower()) + require_network_restart = True + write_ifcfg_file(key, fuel_conf) + if astute.has_key(key): + astute.pop(key, None) else: astute[key] = fuel_conf[key] + if require_network_restart: + admin_ifcfg = '/etc/sysconfig/network-scripts/ifcfg-eth0' + exec_cmd('echo "DEFROUTE=no" >> %s' % admin_ifcfg) + log('At least one interface was reconfigured, restart network manager') + exec_cmd('systemctl restart network') return astute @@ -62,11 +96,14 @@ def main(): check_file_exists(ASTUTE_YAML) check_file_exists(FUEL_BOOTSTRAP_CLI_YAML) dea = DeploymentEnvironmentAdapter(dea_file) + log('Reading astute file %s' % ASTUTE_YAML) with io.open(ASTUTE_YAML) as stream: astute = yaml.load(stream) + log('Initiating transplant') transplant(dea, astute) with io.open(ASTUTE_YAML, 'w') as stream: yaml.dump(astute, stream, default_flow_style=False) + log('Transplant done') # Update bootstrap config yaml with info from DEA/astute.yaml with io.open(FUEL_BOOTSTRAP_CLI_YAML) as stream: fuel_bootstrap_cli = yaml.load(stream) diff --git a/docs/buildprocedure/build.instruction.rst b/docs/buildprocedure/build.instruction.rst index dd7aab51a..8ec8cb7b0 100644 --- a/docs/buildprocedure/build.instruction.rst +++ b/docs/buildprocedure/build.instruction.rst @@ -68,8 +68,6 @@ On the host, the following packages must be installed: - curl (simply available through $ sudo apt-get install curl) -- p7zip-full (simply available through $ sudo apt-get install p7zip-full) - Preparations ============ |