heat_template_version: 2015-04-30 description: > OpenStack controller node configured by Puppet. parameters: AdminPassword: default: unset description: The password for the keystone admin account, used for monitoring, querying neutron etc. type: string hidden: true AdminToken: default: unset description: The keystone auth secret and db password. type: string hidden: true CeilometerBackend: default: 'mongodb' description: The ceilometer backend type. type: string CeilometerMeteringSecret: default: unset description: Secret shared by the ceilometer services. type: string hidden: true CeilometerPassword: default: unset description: The password for the ceilometer service and db account. type: string hidden: true CinderEnableNfsBackend: default: false description: Whether to enable or not the NFS backend for Cinder type: boolean CinderEnableIscsiBackend: default: true description: Whether to enable or not the Iscsi backend for Cinder type: boolean CinderEnableRbdBackend: default: false description: Whether to enable or not the Rbd backend for Cinder type: boolean CinderISCSIHelper: default: tgtadm description: The iSCSI helper to use with cinder. type: string CinderLVMLoopDeviceSize: default: 5000 description: The size of the loopback file used by the cinder LVM driver. type: number CinderNfsMountOptions: default: '' description: > Mount options for NFS mounts used by Cinder NFS backend. Effective when CinderEnableNfsBackend is true. type: string CinderNfsServers: default: '' description: > NFS servers used by Cinder NFS backend. Effective when CinderEnableNfsBackend is true. type: comma_delimited_list CinderPassword: default: unset description: The password for the cinder service and db account, used by cinder-api. type: string hidden: true CinderBackendConfig: default: {} description: Contains parameters to configure Cinder backends. Typically set via parameter_defaults in the resource registry. type: json CloudName: default: '' description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org type: string ControllerExtraConfig: default: {} description: | Controller specific hiera configuration data to inject into the cluster. type: json ControlVirtualInterface: default: 'br-ex' description: Interface where virtual ip will be assigned. type: string Debug: default: '' description: Set to True to enable debugging on all services. type: string EnableFencing: default: false description: Whether to enable fencing in Pacemaker or not. type: boolean EnableGalera: default: true description: Whether to use Galera instead of regular MariaDB. type: boolean EnableCephStorage: default: false description: Whether to deploy Ceph Storage (OSD) on the Controller type: boolean EnableSwiftStorage: default: true description: Whether to enable Swift Storage on the Controller type: boolean ExtraConfig: default: {} description: | Additional hieradata to inject into the cluster, note that ControllerExtraConfig takes precedence over ExtraConfig. type: json FencingConfig: default: {} description: | Pacemaker fencing configuration. The JSON should have the following structure: { "devices": [ { "agent": "AGENT_NAME", "host_mac": "HOST_MAC_ADDRESS", "params": {"PARAM_NAME": "PARAM_VALUE"} } ] } For instance: { "devices": [ { "agent": "fence_xvm", "host_mac": "52:54:00:aa:bb:cc", "params": { "multicast_address": "225.0.0.12", "port": "baremetal_0", "manage_fw": true, "manage_key_file": true, "key_file": "/etc/fence_xvm.key", "key_file_password": "abcdef" } } ] } type: json Flavor: description: Flavor for control nodes to request when deploying. type: string constraints: - custom_constraint: nova.flavor GlanceNotifierStrategy: description: Strategy to use for Glance notification queue type: string default: noop GlanceLogFile: description: The filepath of the file to use for logging messages from Glance. type: string default: '' GlancePassword: default: unset description: The password for the glance service and db account, used by the glance services. type: string hidden: true GlancePort: default: "9292" description: Glance port. type: string GlanceProtocol: default: http description: Protocol to use when connecting to glance, set to https for SSL. type: string GlanceBackend: default: swift description: The short name of the Glance backend to use. Should be one of swift, rbd, or file type: string constraints: - allowed_values: ['swift', 'file', 'rbd'] HeatPassword: default: unset description: The password for the Heat service and db account, used by the Heat services. type: string hidden: true HeatStackDomainAdminPassword: description: Password for heat_domain_admin user. type: string default: '' hidden: true HeatAuthEncryptionKey: description: Auth encryption key for heat-engine type: string HorizonSecret: description: Secret key for Django type: string Image: type: string default: overcloud-control constraints: - custom_constraint: glance.image ImageUpdatePolicy: default: 'REBUILD_PRESERVE_EPHEMERAL' description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt. type: string KeyName: default: default description: Name of an existing EC2 KeyPair to enable SSH access to the instances type: string constraints: - custom_constraint: nova.keypair KeystoneCACertificate: default: '' description: Keystone self-signed certificate authority certificate. type: string KeystoneSigningCertificate: default: '' description: Keystone certificate for verifying token validity. type: string KeystoneSigningKey: default: '' description: Keystone key for signing tokens. type: string hidden: true KeystoneSSLCertificate: default: '' description: Keystone certificate for verifying token validity. type: string KeystoneSSLCertificateKey: default: '' description: Keystone key for signing tokens. type: string hidden: true KeystoneNotificationDriver: description: Comma-separated list of Oslo notification drivers used by Keystone default: ['messaging'] type: comma_delimited_list KeystoneNotificationFormat: description: The Keystone notification format default: 'basic' type: string constraints: - allowed_values: [ 'basic', 'cadf' ] MysqlClusterUniquePart: description: A unique identifier of the MySQL cluster the controller is in. type: string default: 'unset' # Has to be here because of the ignored empty value bug # Drop the validation: https://bugs.launchpad.net/tripleo/+bug/1405446 # constraints: # - length: {min: 4, max: 10} MysqlInnodbBufferPoolSize: description: > Specifies the size of the buffer pool in megabytes. Setting to zero should be interpreted as "no value" and will defer to the lower level default. type: number default: 0 MysqlMaxConnections: description: Configures MySQL max_connections config setting type: number default: 4096 MysqlRootPassword: type: string hidden: true default: '' # Has to be here because of the ignored empty value bug NeutronExternalNetworkBridge: description: Name of bridge used for external network traffic. type: string default: 'br-ex' NeutronBridgeMappings: description: > The OVS logical->physical bridge mappings to use. See the Neutron documentation for details. Defaults to mapping br-ex - the external bridge on hosts - to a physical name 'datacentre' which can be used to create provider networks (and we use this for the default floating network) - if changing this either use different post-install network scripts or be sure to keep 'datacentre' as a mapping network name. type: string de
#!/usr/bin/env python
# Copyright (c) 2020 Orange and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
"""
The CNF Conformance program enables interoperability of Cloud native Network
Functions (CNFs) from multiple vendors running on top of Kubernetes supplied by
different vendors [1].
[1] https://github.com/cncf/cnf-conformance
"""
from __future__ import division
import fnmatch
import logging
import os
import re
import shutil
import subprocess
import time
import yaml
import prettytable
from xtesting.core import testcase
class CNFConformance(testcase.TestCase):
""" Implement CNF Conformance driver.
https://hackmd.io/@vulk/SkY54QnsU
"""
src_dir = '/src/cnf-conformance'
bin_dir = '/usr/local/bin'
default_tag = 'all'
__logger = logging.getLogger(__name__)
def __init__(self, **kwargs):
super(CNFConformance, self).__init__(**kwargs)
self.output_log_name = 'functest-kubernetes.log'
self.output_debug_log_name = 'functest-kubernetes.debug.log'
def check_requirements(self):
"""Check if cnf-conformance is in $PATH"""
if not os.path.exists(os.path.join(self.bin_dir, 'cnf-conformance')):
self.__logger.warning(
"cnf-conformance is not compiled for arm and arm64 for the "
"time being")
self.is_skipped = True
def setup(self):
"""Implement initialization and pre-reqs steps"""
if os.path.exists(self.res_dir):
shutil.rmtree(self.res_dir)
os.makedirs(self.res_dir)
shutil.copy2(os.path.join(self.src_dir, 'points.yml'), self.res_dir)
shutil.copy2(
os.path.join(self.src_dir, 'cnf-conformance.yml'), self.res_dir)
os.chdir(self.res_dir)
# cnf-conformance must be in the working dir
# https://github.com/cncf/cnf-conformance/issues/388
if not os.path.exists(os.path.join(self.res_dir, 'cnf-conformance')):
os.symlink(
os.path.join(self.bin_dir, 'cnf-conformance'),
os.path.join(self.res_dir, 'cnf-conformance'))
cmd = ['cnf-conformance', 'setup']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
cmd = ['cnf-conformance', 'cnf_setup',
'cnf-config=cnf-conformance.yml']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
def run_conformance(self, **kwargs):
"""Run CNF Conformance"""
# a previous results.yml leads to interactive mode
if os.path.exists(os.path.join(self.res_dir, 'results.yml')):
os.remove(os.path.join(self.res_dir, 'results.yml'))
cmd = ['cnf-conformance', kwargs.get("tag", self.default_tag)]
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
for lfile in os.listdir(self.res_dir):
if fnmatch.fnmatch(lfile, 'cnf-conformance-results-*.yml'):
with open(os.path.join(self.res_dir, lfile)) as yfile:
self.details = yaml.safe_load(yfile)
msg = prettytable.PrettyTable(
header_style='upper', padding_width=5,
field_names=['name', 'status'])
for item in self.details['items']:
msg.add_row([item['name'], item['status']])
self.__logger.info("\n\n%s\n", msg.get_string())
grp = re.search(r'Final score: (\d+) of (\d+)', output.decode("utf-8"))
if grp:
self.result = int(grp.group(1)) / int(grp.group(2)) * 100
def run(self, **kwargs):
""""Running the test with example CNF"""
self.start_time = time.time()
try:
self.setup()
self.run_conformance(**kwargs)
except Exception: # pylint: disable=broad-except
self.__logger.exception("Can not run CNF Conformance")
self.stop_time = time.time()
def clean(self):
cmd = ['cnf-conformance', 'cnf_cleanup',
'cnf-config=cnf-conformance.yml']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
self.__logger.info("%s\n%s", " ".join(cmd), output.decode("utf-8"))
shutil.rmtree(os.path.join(self.res_dir, 'tools'), ignore_errors=True)
shutil.rmtree(os.path.join(self.res_dir, 'cnfs'), ignore_errors=True)
for lfile in os.listdir(self.res_dir):
if not fnmatch.fnmatch(lfile, 'cnf-conformance-results-*.yml'):
os.remove(os.path.join(self.res_dir, lfile))