kolla-ansible/kolla_ansible/cli/commands.py
Michal Nasiadka cd8ecfc8f2 Fix Octavia cert generation
I have no clue how it worked previously in CI, but now
it's using default path to the inventory - which does
not exist.

In addition to that, type=int in cliff will default to
None, so the check had to be rewritten - because we
always did cert expiry check instead of generating them.

Change-Id: I84d71558c2666ba2cfa47054f782d25ff0c1f691
2024-11-03 11:40:46 +01:00

472 lines
15 KiB
Python

# 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.
from cliff.command import Command
from kolla_ansible import ansible
from kolla_ansible import utils
# Serial is not recommended and disabled by default.
# Users can enable it by configuring the variable.
ANSIBLE_SERIAL = 0
def _get_playbook_path(playbook):
"""Return the absolute path of Kolla Ansible playbook"""
return utils.get_data_files_path("ansible", "%s.yml" % playbook)
def _choose_playbooks(parsed_args, kolla_playbook="site"):
"""Return user defined playbook if set, otherwise return Kolla playbook"""
if parsed_args.playbook:
playbooks = parsed_args.playbook
else:
playbooks = [_get_playbook_path(kolla_playbook)]
return playbooks
class KollaAnsibleMixin:
"""Mixin class for commands running Kolla Ansible."""
def get_parser(self, prog_name):
parser = super(KollaAnsibleMixin, self).get_parser(prog_name)
ansible_group = parser.add_argument_group("Ansible arguments")
ka_group = parser.add_argument_group("Kolla Ansible arguments")
self.add_ansible_args(ansible_group)
self.add_kolla_ansible_args(ka_group)
return parser
def add_kolla_ansible_args(self, group):
ansible.add_kolla_ansible_args(group)
def add_ansible_args(self, group):
ansible.add_ansible_args(group)
def _get_verbosity_args(self):
"""Add quietness and verbosity level arguments."""
# Cliff's default verbosity level is 1, 0 means quiet.
verbosity_args = {}
if self.app.options.verbose_level:
ansible_verbose_level = self.app.options.verbose_level - 1
verbosity_args["verbose_level"] = ansible_verbose_level
else:
verbosity_args["quiet"] = True
return verbosity_args
def run_playbooks(self, parsed_args, *args, **kwargs):
kwargs.update(self._get_verbosity_args())
return ansible.run_playbooks(parsed_args, *args, **kwargs)
class GatherFacts(KollaAnsibleMixin, Command):
"""Gather Ansible facts on hosts"""
def take_action(self, parsed_args):
self.app.LOG.info("Gathering Ansible facts")
playbooks = _choose_playbooks(parsed_args, "gather-facts")
self.run_playbooks(parsed_args, playbooks)
class InstallDeps(KollaAnsibleMixin, Command):
"""Install Ansible Galaxy dependencies"""
def take_action(self, parsed_args):
self.app.LOG.info("Installing Ansible Galaxy dependencies")
ansible.install_galaxy_collections()
class Prechecks(KollaAnsibleMixin, Command):
"""Do pre-deployment checks for hosts"""
def take_action(self, parsed_args):
self.app.LOG.info("Pre-deployment checking")
extra_vars = {}
extra_vars["kolla_action"] = "precheck"
playbooks = _choose_playbooks(parsed_args,)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class GenConfig(KollaAnsibleMixin, Command):
"""Generate configuration files for services. No container changes!"""
def take_action(self, parsed_args):
self.app.LOG.info(
"Generate configuration files for enabled OpenStack services")
extra_vars = {}
extra_vars["kolla_action"] = "config"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Reconfigure(KollaAnsibleMixin, Command):
"""Reconfigure enabled OpenStack service"""
def take_action(self, parsed_args):
self.app.LOG.info("Reconfigure OpenStack service")
extra_vars = {}
extra_vars["kolla_action"] = "reconfigure"
extra_vars["kolla_serial"] = ANSIBLE_SERIAL
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class ValidateConfig(KollaAnsibleMixin, Command):
"""Validate configuration files for enabled OpenStack services"""
def take_action(self, parsed_args):
self.app.LOG.info("Validate configuration files for enabled "
"OpenStack services")
extra_vars = {}
extra_vars["kolla_action"] = "config_validate"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class BootstrapServers(KollaAnsibleMixin, Command):
"""Bootstrap servers with Kolla Ansible deploy dependencies"""
def take_action(self, parsed_args):
self.app.LOG.info("Bootstrapping servers")
extra_vars = {}
extra_vars["kolla_action"] = "bootstrap-servers"
playbooks = _choose_playbooks(parsed_args, "kolla-host")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Pull(KollaAnsibleMixin, Command):
"""Pull all images for containers. Only pulls, no container changes."""
def take_action(self, parsed_args):
self.app.LOG.info("Pulling Docker images")
extra_vars = {}
extra_vars["kolla_action"] = "pull"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Certificates(KollaAnsibleMixin, Command):
"""Generate self-signed certificate for TLS *For Development Only*"""
def take_action(self, parsed_args):
self.app.LOG.info("Generate TLS Certificates")
playbooks = _choose_playbooks(parsed_args, "certificates")
self.run_playbooks(parsed_args, playbooks)
class OctaviaCertificates(KollaAnsibleMixin, Command):
"""Generate certificates for octavia deployment"""
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
group = parser.add_argument_group("Octavia certificates action")
group.add_argument(
"--check-expiry",
type=int,
help="Check if the certificates will expire "
"within given number of days",
)
return parser
def take_action(self, parsed_args):
extra_vars = {}
if hasattr(parsed_args, "check_expiry") \
and parsed_args.check_expiry is not None:
self.app.LOG.info("Checking if certificates expire "
"within given number of days.")
extra_vars["octavia_certs_check_expiry"] = "yes"
extra_vars["octavia_certs_expiry_limit"] = parsed_args.check_expiry
else:
self.app.LOG.info("Generate octavia Certificates")
playbooks = _choose_playbooks(parsed_args, "octavia-certificates")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Deploy(KollaAnsibleMixin, Command):
"""Generate config, bootstrap and start all Kolla Ansible containers"""
def take_action(self, parsed_args):
self.app.LOG.info("Deploying Playbooks")
extra_vars = {}
extra_vars["kolla_action"] = "deploy"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class DeployContainers(KollaAnsibleMixin, Command):
"""Only deploy and start containers (no config updates or bootstrapping)"""
def take_action(self, parsed_args):
self.app.LOG.info("Deploying Containers")
extra_vars = {}
extra_vars["kolla_action"] = "deploy-containers"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Postdeploy(KollaAnsibleMixin, Command):
"""Do post deploy on deploy node"""
def take_action(self, parsed_args):
self.app.LOG.info("Post-Deploying Playbooks")
playbooks = _choose_playbooks(parsed_args, "post-deploy")
self.run_playbooks(parsed_args, playbooks)
class Upgrade(KollaAnsibleMixin, Command):
"""Upgrades existing OpenStack Environment"""
def take_action(self, parsed_args):
self.app.LOG.info("Upgrading OpenStack Environment")
extra_vars = {}
extra_vars["kolla_action"] = "upgrade"
extra_vars["kolla_serial"] = ANSIBLE_SERIAL
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Stop(KollaAnsibleMixin, Command):
"""Stop Kolla Ansible containers"""
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
group = parser.add_argument_group("Stop action")
group.add_argument(
"--yes-i-really-really-mean-it",
action="store_true",
required=True,
help="WARNING! This action will remove the Openstack deployment!",
)
return parser
def take_action(self, parsed_args):
self.app.LOG.info("Stop Kolla containers")
extra_vars = {}
extra_vars["kolla_action"] = "stop"
playbooks = _choose_playbooks(parsed_args)
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class Destroy(KollaAnsibleMixin, Command):
"""Destroy Kolla Ansible containers, volumes and host configuration!"""
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
group = parser.add_argument_group("Destroy action")
group.add_argument(
"--yes-i-really-really-mean-it",
action="store_true",
required=True,
help="WARNING! This action will remove the Openstack deployment!",
)
group.add_argument(
"--include-dev",
action="store_true",
help="Remove devevelopment environment",
)
group.add_argument(
"--include-images",
action="store_true",
help="Remove leftover container images",
)
return parser
def take_action(self, parsed_args):
self.app.LOG.warning("WARNING: This will PERMANENTLY DESTROY "
"all deployed kolla containers, volumes "
"and host configuration. There is no way "
"to recover from this action!")
extra_vars = {}
extra_vars["kolla_action"] = "destroy"
extra_vars["destroy_include_dev"] = (
"yes" if parsed_args.include_dev else "no"
)
extra_vars["destroy_include_images"] = (
"yes" if parsed_args.include_images else "no"
)
playbooks = _choose_playbooks(parsed_args, "destroy")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class PruneImages(KollaAnsibleMixin, Command):
"""Prune orphaned Kolla Ansible docker images"""
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
group = parser.add_argument_group("Prune images action")
group.add_argument(
"--yes-i-really-really-mean-it",
action="store_true",
required=True,
help="WARNING! This action will remove all orphaned images!",
)
return parser
def take_action(self, parsed_args):
self.app.LOG.info("Prune orphaned Kolla images")
playbooks = _choose_playbooks(parsed_args, "prune-images")
self.run_playbooks(parsed_args, playbooks)
class BifrostDeploy(KollaAnsibleMixin, Command):
"""Deploy and start bifrost container"""
def take_action(self, parsed_args):
self.app.LOG.info("Deploying Bifrost")
extra_vars = {}
extra_vars["kolla_action"] = "deploy"
playbooks = _choose_playbooks(parsed_args, "bifrost")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class BifrostDeployServers(KollaAnsibleMixin, Command):
"""Enroll and deploy servers with bifrost"""
def take_action(self, parsed_args):
self.app.LOG.info("Deploying servers with bifrost")
extra_vars = {}
extra_vars["kolla_action"] = "deploy-servers"
playbooks = _choose_playbooks(parsed_args, "bifrost")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class BifrostUpgrade(KollaAnsibleMixin, Command):
"""Upgrades an existing bifrost container"""
def take_action(self, parsed_args):
self.app.LOG.info("Upgrading Bifrost")
extra_vars = {}
extra_vars["kolla_action"] = "upgrade"
playbooks = _choose_playbooks(parsed_args, "bifrost")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class RabbitMQResetState(KollaAnsibleMixin, Command):
"""Force reset the state of RabbitMQ"""
def take_action(self, parsed_args):
self.app.LOG.info("Force reset the state of RabbitMQ")
playbooks = _choose_playbooks(parsed_args, "rabbitmq-reset-state")
self.run_playbooks(parsed_args, playbooks)
class MariaDBBackup(KollaAnsibleMixin, Command):
"""Take a backup of MariaDB databases. See help for options."""
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
group = parser.add_argument_group("MariaDB backup type")
group.add_argument(
"--full",
action="store_const",
const="full",
dest="mariadb_backup_type",
default="full"
)
group.add_argument(
"--incremental",
action="store_const",
const="incremental",
dest="mariadb_backup_type"
)
return parser
def take_action(self, parsed_args):
self.app.LOG.info("Backup MariaDB databases")
extra_vars = {}
extra_vars["kolla_action"] = "backup"
extra_vars["mariadb_backup_type"] = parsed_args.mariadb_backup_type
playbooks = _choose_playbooks(parsed_args, "mariadb_backup")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class MariaDBRecovery(KollaAnsibleMixin, Command):
"""Recover a completely stopped MariaDB cluster"""
def take_action(self, parsed_args):
self.app.LOG.info("Attempting to restart MariaDB cluster")
extra_vars = {}
extra_vars["kolla_action"] = "deploy"
playbooks = _choose_playbooks(parsed_args, "mariadb_recovery")
self.run_playbooks(parsed_args, playbooks, extra_vars=extra_vars)
class NovaLibvirtCleanup(KollaAnsibleMixin, Command):
"""Clean up disabled nova_libvirt containers"""
def take_action(self, parsed_args):
self.app.LOG.info("Cleanup disabled nova_libvirt containers")
playbooks = _choose_playbooks(parsed_args, "nova-libvirt-cleanup")
self.run_playbooks(parsed_args, playbooks)