123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- # -*- coding: utf-8 -*-
- # 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 netaddr
- from ..installer import utils
- def filtered_hosts(config, exclude=True, dbhost=True):
- """
- Returns list of hosts which need installation taking into account
- CONFIG_MARIADB_INSTALL if parameter dbhost is True and EXCLUDE_SERVERS
- if parameter exclude is True.
- """
- exclset = set([i.strip()
- for i in config.get('EXCLUDE_SERVERS', '').split(',')
- if i.strip()])
- result = set()
- dbinst = config.get('CONFIG_MARIADB_INSTALL') == 'y'
- vcenter = config.get('CONFIG_VMWARE_BACKEND') == 'y'
- for hosttype, hostname in utils.host_iter(config):
- # if dbhost is being taken into account and we are not installing
- # MariaDB then we should omit the MariaDB host
- if dbhost and not dbinst and hosttype == 'CONFIG_MARIADB_HOST':
- continue
- if vcenter and hosttype == 'CONFIG_VCENTER_HOST':
- continue
- result.add(hostname)
- if exclude:
- result = result - exclset
- return result
- def is_all_in_one(config):
- """
- Returns True if packstack is running allinone setup, otherwise
- returns False.
- """
- # Even if some host have been excluded from installation, we must count
- # with them when checking all-in-one. MariaDB host should however be
- # omitted if we are not installing MariaDB.
- return len(filtered_hosts(config, exclude=False, dbhost=True)) == 1
- def cidr_to_ifname(cidr, host, config):
- """
- Returns appropriate host's interface name from given CIDR subnet. Passed
- config dict has to contain discovered hosts details.
- """
- if not config or not config['HOST_DETAILS'] or '/' not in cidr:
- raise ValueError(
- 'Cannot translate CIDR to interface, invalid parameters '
- 'were given.'
- )
- info = config['HOST_DETAILS'][host]
- result = []
- for item in cidr.split(','):
- translated = []
- for fragment in item.split(':'):
- try:
- subnet_a = netaddr.IPNetwork(fragment)
- except netaddr.AddrFormatError:
- translated.append(fragment)
- continue
- for interface in info['interfaces'].split(','):
- interface = interface.strip()
- ipaddr = info.get('ipaddress_{}'.format(interface))
- netmask = info.get('netmask_{}'.format(interface))
- if ipaddr and netmask:
- subnet_b = netaddr.IPNetwork('{ipaddr}/{netmask}'.format(**locals()))
- if subnet_a == subnet_b:
- translated.append(interface)
- break
- result.append(':'.join(translated))
- return ','.join(result)
- # Function find_pair_with search in a list of "key:value" pairs, one
- # containing the desired element as key (if index is 0), or value (if index
- # is 1). It returns the pair if it's found or KeyError.
- def find_pair_with(pairs_list, element, index):
- for pair in pairs_list:
- found_element = pair.split(':')[index].strip()
- if found_element == element:
- return pair
- raise KeyError('Couldn\'t find element %s in %s.' % (element, pairs_list))
|