92cda5aa90
Change-Id: I52b7bc06ccd61d28189821c1d1d301aed58648b8
205 lines
5.8 KiB
Python
205 lines
5.8 KiB
Python
# Copyright 2014 Huawei Technologies Co. Ltd
|
|
#
|
|
# 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.
|
|
|
|
"""Metadata Callback methods."""
|
|
import logging
|
|
import netaddr
|
|
import random
|
|
import re
|
|
import socket
|
|
|
|
from compass.db import exception
|
|
from compass.utils import setting_wrapper as setting
|
|
from compass.utils import util
|
|
|
|
|
|
CALLBACK_GLOBALS = globals()
|
|
CALLBACK_LOCALS = locals()
|
|
CALLBACK_CONFIGS = util.load_configs(
|
|
setting.CALLBACK_DIR,
|
|
config_name_suffix='.py',
|
|
env_globals=CALLBACK_GLOBALS,
|
|
env_locals=CALLBACK_LOCALS
|
|
)
|
|
for callback_config in CALLBACK_CONFIGS:
|
|
CALLBACK_LOCALS.update(callback_config)
|
|
|
|
|
|
def default_proxy(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_PROXY
|
|
|
|
|
|
def proxy_options(name, **kwargs):
|
|
return [setting.COMPASS_SUPPORTED_PROXY]
|
|
|
|
|
|
def default_noproxy(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DEFAULT_NOPROXY
|
|
|
|
|
|
def noproxy_options(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DEFAULT_NOPROXY
|
|
|
|
|
|
def default_ntp_server(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_NTP_SERVER
|
|
|
|
|
|
def ntp_server_options(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_NTP_SERVER
|
|
|
|
|
|
def default_dns_servers(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DNS_SERVERS
|
|
|
|
|
|
def dns_servers_options(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DNS_SERVERS
|
|
|
|
|
|
def default_domain(name, **kwargs):
|
|
if setting.COMPASS_SUPPORTED_DOMAINS:
|
|
return setting.COMPASS_SUPPORTED_DOMAINS[0]
|
|
else:
|
|
return None
|
|
|
|
|
|
def domain_options(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DOMAINS
|
|
|
|
|
|
def default_search_path(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DOMAINS
|
|
|
|
|
|
def search_path_options(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DOMAINS
|
|
|
|
|
|
def default_gateway(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_DEFAULT_GATEWAY
|
|
|
|
|
|
def default_gateway_options(name, **kwargs):
|
|
return [setting.COMPASS_SUPPORTED_DEFAULT_GATEWAY]
|
|
|
|
|
|
def default_localrepo(name, **kwargs):
|
|
return setting.COMPASS_SUPPORTED_LOCAL_REPO
|
|
|
|
|
|
def default_localrepo_options(name, **kwargs):
|
|
return [setting.COMPASS_SUPPORTED_LOCAL_REPO]
|
|
|
|
|
|
def autofill_callback_default(name, config, **kwargs):
|
|
if config is None:
|
|
if (
|
|
'autofill_types' not in kwargs or
|
|
not (set(kwargs['autofill_types']) & set(kwargs))
|
|
):
|
|
return None
|
|
if 'default_value' not in kwargs:
|
|
return None
|
|
return kwargs['default_value']
|
|
return config
|
|
|
|
|
|
def autofill_callback_random_option(name, config, **kwargs):
|
|
if config is None:
|
|
if (
|
|
'autofill_types' not in kwargs or
|
|
not (set(kwargs['autofill_types']) & set(kwargs))
|
|
):
|
|
return None
|
|
if 'options' not in kwargs or not kwargs['options']:
|
|
return None
|
|
return random.choice(kwargs['options'])
|
|
return config
|
|
|
|
|
|
def autofill_no_proxy(name, config, **kwargs):
|
|
logging.debug(
|
|
'autofill %s config %s by params %s',
|
|
name, config, kwargs
|
|
)
|
|
if 'cluster' in kwargs:
|
|
if config is None:
|
|
config = []
|
|
if 'default_value' in kwargs:
|
|
for default_no_proxy in kwargs['default_value']:
|
|
if default_no_proxy and default_no_proxy not in config:
|
|
config.append(default_no_proxy)
|
|
cluster = kwargs['cluster']
|
|
for clusterhost in cluster.clusterhosts:
|
|
host = clusterhost.host
|
|
hostname = host.name
|
|
if hostname not in config:
|
|
config.append(hostname)
|
|
for host_network in host.host_networks:
|
|
if host_network.is_mgmt:
|
|
ip = host_network.ip
|
|
if ip not in config:
|
|
config.append(ip)
|
|
if not config:
|
|
return config
|
|
return [no_proxy for no_proxy in config if no_proxy]
|
|
|
|
|
|
def autofill_network_mapping(name, config, **kwargs):
|
|
logging.debug(
|
|
'autofill %s config %s by params %s',
|
|
name, config, kwargs
|
|
)
|
|
if not config:
|
|
return config
|
|
if isinstance(config, basestring):
|
|
config = {
|
|
'interface': config,
|
|
'subnet': None
|
|
}
|
|
if not isinstance(config, dict):
|
|
return config
|
|
if 'interface' not in config:
|
|
return config
|
|
subnet = None
|
|
interface = config['interface']
|
|
if 'cluster' in kwargs:
|
|
cluster = kwargs['cluster']
|
|
for clusterhost in cluster.clusterhosts:
|
|
host = clusterhost.host
|
|
for host_network in host.host_networks:
|
|
if host_network.interface == interface:
|
|
subnet = host_network.subnet.subnet
|
|
elif 'clusterhost' in kwargs:
|
|
clusterhost = kwargs['clusterhost']
|
|
host = clusterhost.host
|
|
for host_network in host.host_networks:
|
|
if host_network.interface == interface:
|
|
subnet = host_network.subnet.subnet
|
|
if not subnet:
|
|
raise exception.InvalidParameter(
|
|
'interface %s not found in host(s)' % interface
|
|
)
|
|
if 'subnet' not in config or not config['subnet']:
|
|
config['subnet'] = subnet
|
|
else:
|
|
if config['subnet'] != subnet:
|
|
raise exception.InvalidParameter(
|
|
'subnet %s in config is not equal to subnet %s in hosts' % (
|
|
config['subnet'], subnet
|
|
)
|
|
)
|
|
return config
|