Fix overcloud admin authorize

overcloud admin authorize can no longer be used with
ephemeral Heat. This change allows us to use an existing
inventory file. It also allows for the use to provide a
group from the Inventory rather than running against all
of the nodes in the inventory.

Change-Id: I07902a84e16af94b250ecb621017cd5b7de40a9c
(cherry picked from commit a2b6a9addd)
This commit is contained in:
Brendan Shephard
2021-10-23 11:26:33 +10:00
parent a303157cc1
commit b4cb006462
4 changed files with 117 additions and 26 deletions
@@ -0,0 +1,9 @@
---
features:
- |
The Admin Authorize command can now be targeted at
specific nodes using '--limit'. It can also take a
custom static-inventory using '--static-inventory'.
fixes:
- |
Fixes Admin Authorize to work with Ephemeral Heat.
+41 -16
View File
@@ -13,31 +13,56 @@
import mock
from tripleoclient.tests.v1 import test_plugin
from tripleoclient import utils
from tripleoclient.v1 import overcloud_admin
from tripleoclient.workflows import deployment
@mock.patch.object(utils, 'get_stack', autospec=True)
@mock.patch.object(deployment, 'get_hosts_and_enable_ssh_admin', autospec=True)
class TestAdminAuthorize(test_plugin.TestPluginV1):
def setUp(self):
super(TestAdminAuthorize, self).setUp()
self.cmd = overcloud_admin.Authorize(self.app, None)
self.app.client_manager = mock.Mock()
def test_ok(self, mock_get_host_and_enable_ssh_admin, mock_get_stack):
arglist = []
parsed_args = self.check_parser(self.cmd, arglist, [])
mock_stack = mock.Mock()
mock_get_stack.return_value = mock_stack
@mock.patch('tripleoclient.utils.parse_ansible_inventory',
autospec=True)
@mock.patch('tripleoclient.utils.get_key')
@mock.patch('tripleoclient.utils.get_default_working_dir')
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
def test_admin_authorize(self,
mock_playbook,
mock_dir,
mock_key,
mock_inventory):
arglist = ['--limit', 'overcloud']
verifylist = [('limit_hosts', 'overcloud')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
mock_dir.return_value = "/home/stack/overcloud-deploy"
ansible_dir = "{}/config-download/overcloud".format(
mock_dir.return_value
)
inventory = "{}/tripleo-ansible-inventory.yaml".format(
ansible_dir
)
mock_key.return_value = '/home/stack/.ssh/id_rsa_tripleo'
mock_inventory.return_value = ['overcloud-novacompute-0',
'overcloud-dellcompute-0',
'overcloud-controller-0']
self.cmd.take_action(parsed_args)
mock_get_host_and_enable_ssh_admin.assert_called_once_with(
mock_stack,
parsed_args.overcloud_ssh_network,
parsed_args.overcloud_ssh_user,
mock.ANY,
parsed_args.overcloud_ssh_port_timeout,
mock.ANY
mock_playbook.assert_called_once_with(
playbook='cli-enable-ssh-admin.yaml',
inventory=inventory,
workdir=ansible_dir,
key=parsed_args.overcloud_ssh_key,
playbook_dir='/usr/share/ansible/tripleo-playbooks',
ssh_user=parsed_args.overcloud_ssh_user,
extra_vars={
"ANSIBLE_PRIVATE_KEY_FILE": '/home/stack/.ssh/id_rsa_tripleo',
"ssh_servers": ['overcloud-novacompute-0',
'overcloud-dellcompute-0',
'overcloud-controller-0']
},
ansible_timeout=parsed_args.overcloud_ssh_port_timeout
)
+15
View File
@@ -48,6 +48,8 @@ import yaml
import ansible_runner
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from heatclient.common import event_utils
from heatclient.common import template_utils
from heatclient.common import utils as heat_utils
@@ -2983,3 +2985,16 @@ def get_parameter_file(path):
LOG.warning('File %s was not found during export' %
path)
return file_data
def parse_ansible_inventory(inventory_file, group):
""" Retrieve a list of hosts from a defined ansible inventory file.
:param inventory: Ansible inventory file
:param group: The group to return hosts from, default will be 'all'
:return: list of hosts in the inventory matching the pattern
"""
inventory = InventoryManager(loader=DataLoader(),
sources=[inventory_file])
return(inventory.get_hosts(pattern=group))
+52 -10
View File
@@ -13,6 +13,7 @@
# under the License.
#
import os
from oslo_config import cfg
from oslo_log import log as logging
@@ -22,7 +23,7 @@ from osc_lib import utils
from tripleoclient import command
from tripleoclient import constants
from tripleoclient import utils as oooutils
from tripleoclient.workflows import deployment
from tripleoclient.constants import ANSIBLE_TRIPLEO_PLAYBOOKS
CONF = cfg.CONF
@@ -69,6 +70,24 @@ class Authorize(command.Command):
type=int,
default=constants.ENABLE_SSH_ADMIN_SSH_PORT_TIMEOUT
)
parser.add_argument(
'--static-inventory',
dest='static_inventory',
action='store',
default=None,
help=_('Path to an existing ansible inventory to '
'use. If not specified, one will be '
'generated in '
'~/tripleo-ansible-inventory.yaml')
)
parser.add_argument(
'--limit',
dest='limit_hosts',
action='store',
default='all',
help=_('Define which hosts or group of hosts to '
'run the Admin Authorize tasks against.')
)
return parser
@@ -76,13 +95,36 @@ class Authorize(command.Command):
logging.register_options(CONF)
logging.setup(CONF, '')
self.log.debug("take_action({})".format(parsed_args))
clients = self.app.client_manager
stack = oooutils.get_stack(clients.orchestration, parsed_args.stack)
deployment.get_hosts_and_enable_ssh_admin(
stack,
parsed_args.overcloud_ssh_network,
parsed_args.overcloud_ssh_user,
self.get_key_pair(parsed_args),
parsed_args.overcloud_ssh_port_timeout,
verbosity=oooutils.playbook_verbosity(self=self)
ansible_dir = os.path.join(oooutils.get_default_working_dir(
parsed_args.stack
),
'config-download',
parsed_args.stack)
if not parsed_args.static_inventory:
inventory = os.path.join(ansible_dir,
'tripleo-ansible-inventory.yaml')
else:
inventory = parsed_args.static_inventory
key_file = oooutils.get_key(parsed_args.stack)
if not parsed_args.limit_hosts:
hosts = parsed_args.stack
else:
hosts = parsed_args.limit_hosts
oooutils.run_ansible_playbook(
playbook='cli-enable-ssh-admin.yaml',
inventory=inventory,
workdir=ansible_dir,
key=parsed_args.overcloud_ssh_key,
playbook_dir=ANSIBLE_TRIPLEO_PLAYBOOKS,
ssh_user=parsed_args.overcloud_ssh_user,
extra_vars={
"ANSIBLE_PRIVATE_KEY_FILE": key_file,
"ssh_servers": oooutils.parse_ansible_inventory(
inventory, hosts)
},
ansible_timeout=parsed_args.overcloud_ssh_port_timeout
)