Remove Tuskar support

This change removes Tuskar support from the following commands:

    - openstack overcloud deploy
    - openstack overcloud node delete
    - openstack overcloud update stack

This removal is due to the limiting nature of Tuskar, we can achieve everything
we need and more without it. The change also removes python-tuskarclient from
the requirements and if the Tuskar CLI (openstack management commands) is
required it will need to be installed independently.

This change is dependant on the Tuskar examples being removed from the
documentation. These are removed in the dependant change ID below.

Depends-On: I2d4aa114156c5bafb003e6a67862ed6d1449fd98
Change-Id: Ic6fd4568054fe91b8fc898728022a7d7ed8cf3cf
This commit is contained in:
Dougal Matthews 2015-09-15 12:27:59 +01:00
parent 08807350a2
commit 6abf557aa1
12 changed files with 93 additions and 805 deletions

View File

@ -13,7 +13,7 @@ Deploy an overcloud stack
.. code:: bash .. code:: bash
openstack overcloud deploy stack openstack overcloud deploy stack
(--plan PLAN | --templates [TEMPLATES]) --templates [TEMPLATES]
[-t <TIMEOUT>] [-t <TIMEOUT>]
[--control-scale CONTROL_SCALE] [--control-scale CONTROL_SCALE]
[--compute-scale COMPUTE_SCALE] [--compute-scale COMPUTE_SCALE]
@ -46,10 +46,6 @@ Deploy an overcloud stack
[--reg-sat-url REG_SAT_URL] [--reg-sat-url REG_SAT_URL]
[--reg-activation-key REG_ACTIVATION_KEY] [--reg-activation-key REG_ACTIVATION_KEY]
.. option:: --plan <name or UUID>
The Name or UUID of the Tuskar plan to deploy.
.. option:: --templates <directory> .. option:: --templates <directory>
The directory containing the Heat templates to deploy. The directory containing the Heat templates to deploy.
@ -168,11 +164,6 @@ Deploy an overcloud stack
A comma separated list of hosts that should not be proxied. A comma separated list of hosts that should not be proxied.
.. option:: -O <directory>, --output-dir <directory>
Directory to write Tuskar template files into. It will be created if it
does not exist. If not provided a temporary directory will be used.
.. option:: -e <file>, --environment-file <file> .. option:: -e <file>, --environment-file <file>
Environment files to be passed to the heat stack-create or heat Environment files to be passed to the heat stack-create or heat

View File

@ -11,7 +11,6 @@ os-cloud-config
python-heatclient>=0.3.0 python-heatclient>=0.3.0
python-ironicclient>=0.4.1 python-ironicclient>=0.4.1
python-openstackclient>=1.0.0 python-openstackclient>=1.0.0
python-tuskarclient>=0.1.17
six>=1.9.0 six>=1.9.0
# tripleo-common lib is not yet on PyPi # tripleo-common lib is not yet on PyPi

View File

@ -19,7 +19,6 @@ import logging
from ironicclient import client as ironic_client from ironicclient import client as ironic_client
from openstackclient.common import utils from openstackclient.common import utils
from tuskarclient import client as tuskar_client
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -67,7 +66,6 @@ class ClientWrapper(object):
self._instance = instance self._instance = instance
self._baremetal = None self._baremetal = None
self._orchestration = None self._orchestration = None
self._management = None
def baremetal(self): def baremetal(self):
"""Returns an baremetal service client""" """Returns an baremetal service client"""
@ -129,18 +127,3 @@ class ClientWrapper(object):
self._orchestration = client self._orchestration = client
return self._orchestration return self._orchestration
def management(self):
"""Returns an management service client"""
endpoint = self._instance.get_endpoint_for_service_type(
"management",
region_name=self._instance._region_name,
)
token = self._instance.auth.get_token(self._instance.session)
self._management = tuskar_client.get_client(
2, os_auth_token=token, tuskar_url=endpoint)
return self._management

View File

@ -18,10 +18,10 @@ from openstackclient.tests import utils
def create_to_dict_mock(**kwargs): def create_to_dict_mock(**kwargs):
mock_plan = mock.Mock() mock_with_to_dict = mock.Mock()
mock_plan.configure_mock(**kwargs) mock_with_to_dict.configure_mock(**kwargs)
mock_plan.to_dict.return_value = kwargs mock_with_to_dict.to_dict.return_value = kwargs
return mock_plan return mock_with_to_dict
def create_tht_stack(**kwargs): def create_tht_stack(**kwargs):
@ -49,7 +49,6 @@ class FakeClientWrapper(object):
self._instance = mock.Mock() self._instance = mock.Mock()
self._orchestration = mock.Mock() self._orchestration = mock.Mock()
self._baremetal = mock.Mock() self._baremetal = mock.Mock()
self._management = mock.Mock()
def orchestration(self): def orchestration(self):
return self._orchestration return self._orchestration
@ -57,9 +56,6 @@ class FakeClientWrapper(object):
def baremetal(self): def baremetal(self):
return self._baremetal return self._baremetal
def management(self):
return self._management
class TestDeployOvercloud(utils.TestCommand): class TestDeployOvercloud(utils.TestCommand):

View File

@ -15,15 +15,12 @@
import json import json
import os import os
import sys import six
import tempfile import tempfile
import mock import mock
import six
from openstackclient.common import exceptions as oscexc from openstackclient.common import exceptions as oscexc
from openstackclient.tests import utils as oscutils
from tuskarclient.v2.plans import Plan
from tripleoclient import exceptions from tripleoclient import exceptions
from tripleoclient.tests.v1.overcloud_deploy import fakes from tripleoclient.tests.v1.overcloud_deploy import fakes
@ -455,406 +452,11 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_process_multiple_env.assert_called_with( mock_process_multiple_env.assert_called_with(
[self.parameter_defaults_env_file]) [self.parameter_defaults_env_file])
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_postconfig')
@mock.patch('tripleoclient.utils.get_config_value', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_tempest_deployer_input', autospec=True)
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.get_template_contents')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_get_stack')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_overcloudrc')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_heat_deploy')
def test_tuskar_deploy(self, mock_heat_deploy, mock_create_overcloudrc,
most_pre_deploy, mock_get_stack,
mock_get_templte_contents,
mock_process_multiple_env,
mock_generate_overcloud_passwords,
mock_create_tempest_deployer_input,
mock_get_key,
mock_deploy_postconfig):
arglist = ['--plan', 'undercloud', '--output-dir', 'fake',
'--compute-flavor', 'baremetal',
'--neutron-bridge-mappings', 'datacentre:br-test',
'--neutron-disable-tunneling',
'--control-scale', '3',
'--neutron-mechanism-drivers', 'linuxbridge',
'--ntp-server', 'ntp.local']
verifylist = [
('templates', None),
('plan', 'undercloud'),
('output_dir', 'fake'),
('ntp_server', 'ntp.local')
]
clients = self.app.client_manager
management = clients.tripleoclient.management()
management.plans.templates.return_value = {}
management.plans.resource_class = Plan
mock_plan = mock.Mock()
mock_plan.configure_mock(name="undercloud")
management.plans.list.return_value = [mock_plan, ]
mock_get_templte_contents.return_value = ({}, "template")
mock_process_multiple_env.return_value = ({}, "envs")
clients.network.api.find_attr.return_value = {
"id": "network id"
}
mock_get_key.return_value = "PASSWORD"
mock_generate_overcloud_passwords.return_value = self._get_passwords()
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
baremetal = clients.tripleoclient.baremetal()
baremetal.node.list.return_value = range(10)
result = self.cmd.take_action(parsed_args)
self.assertTrue(result)
parameters = {
'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Compute-1::AdminPassword': 'password',
'Compute-1::CeilometerMeteringSecret': 'password',
'Compute-1::CeilometerPassword': 'password',
'Compute-1::Flavor': 'baremetal',
'Compute-1::NeutronAllowL3AgentFailover': False,
'Compute-1::NeutronBridgeMappings': 'datacentre:br-test',
'Compute-1::NeutronL3HA': True,
'Compute-1::NeutronMechanismDrivers': 'linuxbridge',
'Compute-1::NeutronPassword': 'password',
'Compute-1::NovaPassword': 'password',
'Compute-1::NtpServer': 'ntp.local',
'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::AdminPassword': 'password',
'Controller-1::AdminToken': 'password',
'Controller-1::CeilometerMeteringSecret': 'password',
'Controller-1::CeilometerPassword': 'password',
'Controller-1::CinderPassword': 'password',
'Controller-1::count': 3,
'Controller-1::GlancePassword': 'password',
'Controller-1::HeatPassword': 'password',
'Controller-1::HeatStackDomainAdminPassword': 'password',
'Controller-1::NeutronAllowL3AgentFailover': False,
'Controller-1::NeutronBridgeMappings': 'datacentre:br-test',
'Controller-1::NeutronDhcpAgentsPerNetwork': 3,
'Controller-1::NeutronL3HA': True,
'Controller-1::NeutronMechanismDrivers': 'linuxbridge',
'Controller-1::NeutronPassword': 'password',
'Controller-1::NovaPassword': 'password',
'Controller-1::NtpServer': 'ntp.local',
'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::SwiftHashSuffix': 'password',
'Controller-1::SwiftPassword': 'password',
'NeutronControlPlaneID': 'network id',
'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
}
mock_heat_deploy.assert_called_with(
mock_get_stack(),
'overcloud',
'fake/plan.yaml',
parameters,
['fake/environment.yaml'],
240
)
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_postconfig')
@mock.patch('tripleoclient.utils.get_config_value', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_tempest_deployer_input', autospec=True)
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.get_template_contents')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_get_stack')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_overcloudrc')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_heat_deploy')
def test_tuskar_scale(self, mock_heat_deploy, mock_create_overcloudrc,
most_pre_deploy, mock_get_stack,
mock_get_templte_contents,
mock_process_multiple_env,
mock_generate_overcloud_passwords,
mock_create_tempest_deployer_input,
mock_get_key,
mock_deploy_postconfig):
arglist = ['--plan', 'undercloud', '--output-dir', 'fake',
'--compute-flavor', 'baremetal',
'--neutron-bridge-mappings', 'datacentre:br-test',
'--neutron-disable-tunneling',
'--control-scale', '3',
'--ntp-server', 'ntp.local',
'--neutron-mechanism-drivers', 'linuxbridge']
verifylist = [
('templates', None),
('plan', 'undercloud'),
('output_dir', 'fake'),
]
clients = self.app.client_manager
management = clients.tripleoclient.management()
management.plans.templates.return_value = {}
management.plans.resource_class = Plan
mock_plan = mock.Mock()
mock_plan.configure_mock(name="undercloud")
management.plans.list.return_value = [mock_plan, ]
mock_get_templte_contents.return_value = ({}, "template")
mock_process_multiple_env.return_value = ({}, "envs")
clients.network.api.find_attr.return_value = {
"id": "network id"
}
mock_get_key.return_value = "PASSWORD"
mock_generate_overcloud_passwords.return_value = self._get_passwords()
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
baremetal = clients.tripleoclient.baremetal()
baremetal.node.list.return_value = range(10)
result = self.cmd.take_action(parsed_args)
self.assertTrue(result)
parameters = {
'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Compute-1::AdminPassword': 'password',
'Compute-1::CeilometerMeteringSecret': 'password',
'Compute-1::CeilometerPassword': 'password',
'Compute-1::Flavor': 'baremetal',
'Compute-1::NeutronAllowL3AgentFailover': False,
'Compute-1::NeutronBridgeMappings': 'datacentre:br-test',
'Compute-1::NeutronL3HA': True,
'Compute-1::NeutronMechanismDrivers': 'linuxbridge',
'Compute-1::NeutronPassword': 'password',
'Compute-1::NovaPassword': 'password',
'Compute-1::NtpServer': 'ntp.local',
'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::AdminPassword': 'password',
'Controller-1::AdminToken': 'password',
'Controller-1::CeilometerMeteringSecret': 'password',
'Controller-1::CeilometerPassword': 'password',
'Controller-1::CinderPassword': 'password',
'Controller-1::count': 3,
'Controller-1::GlancePassword': 'password',
'Controller-1::HeatPassword': 'password',
'Controller-1::HeatStackDomainAdminPassword': 'password',
'Controller-1::NeutronAllowL3AgentFailover': False,
'Controller-1::NeutronBridgeMappings': 'datacentre:br-test',
'Controller-1::NeutronDhcpAgentsPerNetwork': 3,
'Controller-1::NeutronL3HA': True,
'Controller-1::NeutronMechanismDrivers': 'linuxbridge',
'Controller-1::NeutronPassword': 'password',
'Controller-1::NovaPassword': 'password',
'Controller-1::NtpServer': 'ntp.local',
'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::SwiftHashSuffix': 'password',
'Controller-1::SwiftPassword': 'password',
'NeutronControlPlaneID': 'network id',
'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
}
mock_heat_deploy.assert_called_with(
mock_get_stack(),
'overcloud',
'fake/plan.yaml',
parameters,
['fake/environment.yaml'],
240
)
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_postconfig')
@mock.patch('tripleoclient.utils.get_config_value', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_tempest_deployer_input', autospec=True)
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.get_template_contents')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_get_stack')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_overcloudrc')
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_heat_deploy')
def test_tuskar_deploy_extra_config(self, mock_heat_deploy,
mock_create_overcloudrc,
most_pre_deploy, mock_get_stack,
mock_get_templte_contents,
mock_process_multiple_env,
mock_generate_overcloud_passwords,
mock_create_tempest_deployer_input,
mock_get_key,
mock_deploy_postconfig):
arglist = ['--plan', 'undercloud', '--output-dir', 'fake',
'--compute-flavor', 'baremetal',
'--neutron-bridge-mappings', 'datacentre:br-test',
'--neutron-disable-tunneling',
'--control-scale', '3',
'--ntp-server', 'ntp.local',
'-e', 'extra_registry.yaml',
'-e', 'extra_environment.yaml',
'-t', '120', ]
verifylist = [
('templates', None),
('plan', 'undercloud'),
('output_dir', 'fake'),
('environment_files', ['extra_registry.yaml',
'extra_environment.yaml'])
]
clients = self.app.client_manager
management = clients.tripleoclient.management()
management.plans.templates.return_value = {}
management.plans.resource_class = Plan
mock_plan = mock.Mock()
mock_plan.configure_mock(name="undercloud")
management.plans.list.return_value = [mock_plan, ]
mock_get_templte_contents.return_value = ({}, "template")
mock_process_multiple_env.return_value = ({}, "envs")
clients.network.api.find_attr.return_value = {
"id": "network id"
}
mock_get_key.return_value = "PASSWORD"
mock_generate_overcloud_passwords.return_value = self._get_passwords()
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
baremetal = clients.tripleoclient.baremetal()
baremetal.node.list.return_value = range(10)
result = self.cmd.take_action(parsed_args)
self.assertTrue(result)
parameters = {
'Cinder-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Compute-1::AdminPassword': 'password',
'Compute-1::CeilometerMeteringSecret': 'password',
'Compute-1::CeilometerPassword': 'password',
'Compute-1::Flavor': 'baremetal',
'Compute-1::NeutronAllowL3AgentFailover': False,
'Compute-1::NeutronBridgeMappings': 'datacentre:br-test',
'Compute-1::NeutronL3HA': True,
'Compute-1::NeutronPassword': 'password',
'Compute-1::NovaPassword': 'password',
'Compute-1::NtpServer': 'ntp.local',
'Compute-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::AdminPassword': 'password',
'Controller-1::AdminToken': 'password',
'Controller-1::CeilometerMeteringSecret': 'password',
'Controller-1::CeilometerPassword': 'password',
'Controller-1::CinderPassword': 'password',
'Controller-1::count': 3,
'Controller-1::GlancePassword': 'password',
'Controller-1::HeatPassword': 'password',
'Controller-1::HeatStackDomainAdminPassword': 'password',
'Controller-1::NeutronAllowL3AgentFailover': False,
'Controller-1::NeutronBridgeMappings': 'datacentre:br-test',
'Controller-1::NeutronDhcpAgentsPerNetwork': 3,
'Controller-1::NeutronL3HA': True,
'Controller-1::NeutronPassword': 'password',
'Controller-1::NovaPassword': 'password',
'Controller-1::NtpServer': 'ntp.local',
'Controller-1::SnmpdReadonlyUserPassword': "PASSWORD",
'Controller-1::SwiftHashSuffix': 'password',
'Controller-1::SwiftPassword': 'password',
'NeutronControlPlaneID': 'network id',
'Swift-Storage-1::SnmpdReadonlyUserPassword': "PASSWORD",
}
mock_heat_deploy.assert_called_with(
mock_get_stack(),
'overcloud',
'fake/plan.yaml',
parameters,
['fake/environment.yaml',
'extra_registry.yaml',
'extra_environment.yaml'],
120
)
# We can't use assert_called_with() here, as we need to compare
# two lists that may have different ordering, although the ordering
# does not matter:
call_args = dict([(x['name'], x['value']) for x in
management.plans.patch.call_args_list[0][0][1]])
target = dict([(k, six.text_type(v)) for k, v in parameters.items()])
self.assertEqual(call_args, target)
self.assertEqual(management.plans.patch.call_count, 1)
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tuskar', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tripleo_heat_templates', autospec=True) '_deploy_tripleo_heat_templates', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy', autospec=True) '_pre_heat_deploy', autospec=True)
def test_invalid_deploy_call(self, mock_pre_deploy, mock_deploy_tht, def test_missing_sat_url(self, mock_pre_deploy, mock_deploy_tht):
mock_deploy_tuskar):
arglist = ['--plan', 'undercloud', '--templates']
verifylist = [
('templates', '/usr/share/openstack-tripleo-heat-templates/'),
('plan', 'undercloud'),
]
try:
oldstderr = sys.stderr
sys.stderr = self.fake_stdout
self.assertRaises(oscutils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
finally:
sys.stderr = oldstderr
self.assertFalse(mock_deploy_tht.called)
self.assertFalse(mock_deploy_tuskar.called)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tuskar', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tripleo_heat_templates', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy', autospec=True)
def test_missing_sat_url(self, mock_pre_deploy, mock_deploy_tht,
mock_deploy_tuskar):
arglist = ['--templates', '--rhel-reg', arglist = ['--templates', '--rhel-reg',
'--reg-method', 'satellite', '--reg-org', '123456789', '--reg-method', 'satellite', '--reg-org', '123456789',
@ -871,7 +473,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.assertFalse(result) self.assertFalse(result)
self.assertFalse(mock_deploy_tht.called) self.assertFalse(mock_deploy_tht.called)
self.assertFalse(mock_deploy_tuskar.called)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_create_tempest_deployer_input', autospec=True) '_create_tempest_deployer_input', autospec=True)
@ -879,14 +480,12 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
'_create_overcloudrc', autospec=True) '_create_overcloudrc', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_get_overcloud_endpoint', autospec=True) '_get_overcloud_endpoint', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tuskar', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tripleo_heat_templates', autospec=True) '_deploy_tripleo_heat_templates', autospec=True)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_pre_heat_deploy', autospec=True) '_pre_heat_deploy', autospec=True)
def test_rhel_reg_params_provided(self, mock_pre_deploy, mock_deploy_tht, def test_rhel_reg_params_provided(self, mock_pre_deploy, mock_deploy_tht,
mock_deploy_tuskar, mock_oc_endpoint, mock_oc_endpoint,
mock_create_ocrc, mock_create_ocrc,
mock_create_tempest_deployer_input): mock_create_tempest_deployer_input):
@ -909,7 +508,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
self.assertTrue(mock_deploy_tht.called) self.assertTrue(mock_deploy_tht.called)
self.assertTrue(mock_oc_endpoint.called) self.assertTrue(mock_oc_endpoint.called)
self.assertTrue(mock_create_ocrc.called) self.assertTrue(mock_create_ocrc.called)
self.assertFalse(mock_deploy_tuskar.called)
mock_create_tempest_deployer_input.assert_called_with(self.cmd) mock_create_tempest_deployer_input.assert_called_with(self.cmd)

View File

@ -22,7 +22,6 @@ class FakeClientWrapper(object):
def __init__(self): def __init__(self):
self._instance = mock.Mock() self._instance = mock.Mock()
self._orchestration = None self._orchestration = None
self._management = None
def orchestration(self): def orchestration(self):
@ -31,13 +30,6 @@ class FakeClientWrapper(object):
return self._orchestration return self._orchestration
def management(self):
if self._management is None:
self._management = mock.Mock()
return self._management
class TestDeleteNode(utils.TestCommand): class TestDeleteNode(utils.TestCommand):

View File

@ -31,10 +31,9 @@ class TestDeleteNode(fakes.TestDeleteNode):
# probably be fixed so that it can pass with that. # probably be fixed so that it can pass with that.
@mock.patch('tripleo_common.scale.ScaleManager') @mock.patch('tripleo_common.scale.ScaleManager')
def test_node_delete(self, scale_manager): def test_node_delete(self, scale_manager):
argslist = ['instance1', 'instance2', '--plan', 'overcloud', argslist = ['instance1', 'instance2', '--templates',
'--stack', 'overcloud'] '--stack', 'overcloud']
verifylist = [ verifylist = [
('plan', 'overcloud'),
('stack', 'overcloud'), ('stack', 'overcloud'),
('nodes', ['instance1', 'instance2']) ('nodes', ['instance1', 'instance2'])
] ]

View File

@ -22,7 +22,6 @@ class FakeClientWrapper(object):
def __init__(self): def __init__(self):
self._instance = mock.Mock() self._instance = mock.Mock()
self._orchestration = None self._orchestration = None
self._management = None
def orchestration(self): def orchestration(self):
@ -31,13 +30,6 @@ class FakeClientWrapper(object):
return self._orchestration return self._orchestration
def management(self):
if self._management is None:
self._management = mock.Mock()
return self._management
class TestOvercloudUpdate(utils.TestCommand): class TestOvercloudUpdate(utils.TestCommand):

View File

@ -31,10 +31,9 @@ class TestOvercloudUpdate(fakes.TestOvercloudUpdate):
def test_update_out(self, update_manager): def test_update_out(self, update_manager):
update_manager.return_value.get_status.return_value = ( update_manager.return_value.get_status.return_value = (
'UPDATE_COMPLETE', {}) 'UPDATE_COMPLETE', {})
argslist = ['-i', '--plan', 'overcloud', 'overcloud'] argslist = ['overcloud', '-i', '--templates']
verifylist = [ verifylist = [
('stack', 'overcloud'), ('stack', 'overcloud'),
('plan', 'overcloud'),
('interactive', True), ('interactive', True),
] ]
parsed_args = self.check_parser(self.cmd, argslist, verifylist) parsed_args = self.check_parser(self.cmd, argslist, verifylist)

View File

@ -35,7 +35,6 @@ from os_cloud_config import keystone
from os_cloud_config import keystone_pki from os_cloud_config import keystone_pki
from os_cloud_config.utils import clients from os_cloud_config.utils import clients
from six.moves import configparser from six.moves import configparser
from tuskarclient.common import utils as tuskarutils
from tripleoclient import exceptions from tripleoclient import exceptions
from tripleoclient import utils from tripleoclient import utils
@ -114,66 +113,24 @@ class DeployOvercloud(command.Command):
self.passwords = passwords = utils.generate_overcloud_passwords() self.passwords = passwords = utils.generate_overcloud_passwords()
ceilometer_pass = passwords['OVERCLOUD_CEILOMETER_PASSWORD'] ceilometer_pass = passwords['OVERCLOUD_CEILOMETER_PASSWORD']
ceilometer_secret = passwords['OVERCLOUD_CEILOMETER_SECRET'] ceilometer_secret = passwords['OVERCLOUD_CEILOMETER_SECRET']
if parsed_args.templates: parameters['AdminPassword'] = passwords['OVERCLOUD_ADMIN_PASSWORD']
parameters['AdminPassword'] = passwords['OVERCLOUD_ADMIN_PASSWORD'] parameters['AdminToken'] = passwords['OVERCLOUD_ADMIN_TOKEN']
parameters['AdminToken'] = passwords['OVERCLOUD_ADMIN_TOKEN'] parameters['CeilometerPassword'] = ceilometer_pass
parameters['CeilometerPassword'] = ceilometer_pass parameters['CeilometerMeteringSecret'] = ceilometer_secret
parameters['CeilometerMeteringSecret'] = ceilometer_secret parameters['CinderPassword'] = passwords[
parameters['CinderPassword'] = passwords[ 'OVERCLOUD_CINDER_PASSWORD']
'OVERCLOUD_CINDER_PASSWORD'] parameters['GlancePassword'] = passwords[
parameters['GlancePassword'] = passwords[ 'OVERCLOUD_GLANCE_PASSWORD']
'OVERCLOUD_GLANCE_PASSWORD'] parameters['HeatPassword'] = passwords['OVERCLOUD_HEAT_PASSWORD']
parameters['HeatPassword'] = passwords['OVERCLOUD_HEAT_PASSWORD'] parameters['HeatStackDomainAdminPassword'] = passwords[
parameters['HeatStackDomainAdminPassword'] = passwords[ 'OVERCLOUD_HEAT_STACK_DOMAIN_PASSWORD']
'OVERCLOUD_HEAT_STACK_DOMAIN_PASSWORD'] parameters['NeutronPassword'] = passwords[
parameters['NeutronPassword'] = passwords[ 'OVERCLOUD_NEUTRON_PASSWORD']
'OVERCLOUD_NEUTRON_PASSWORD'] parameters['NovaPassword'] = passwords['OVERCLOUD_NOVA_PASSWORD']
parameters['NovaPassword'] = passwords['OVERCLOUD_NOVA_PASSWORD'] parameters['SwiftHashSuffix'] = passwords['OVERCLOUD_SWIFT_HASH']
parameters['SwiftHashSuffix'] = passwords['OVERCLOUD_SWIFT_HASH'] parameters['SwiftPassword'] = passwords['OVERCLOUD_SWIFT_PASSWORD']
parameters['SwiftPassword'] = passwords['OVERCLOUD_SWIFT_PASSWORD'] parameters['SnmpdReadonlyUserPassword'] = (
parameters['SnmpdReadonlyUserPassword'] = ( undercloud_ceilometer_snmpd_password)
undercloud_ceilometer_snmpd_password)
else:
parameters['Controller-1::AdminPassword'] = passwords[
'OVERCLOUD_ADMIN_PASSWORD']
parameters['Controller-1::AdminToken'] = passwords[
'OVERCLOUD_ADMIN_TOKEN']
parameters['Compute-1::AdminPassword'] = passwords[
'OVERCLOUD_ADMIN_PASSWORD']
parameters['Controller-1::SnmpdReadonlyUserPassword'] = (
undercloud_ceilometer_snmpd_password)
parameters['Cinder-Storage-1::SnmpdReadonlyUserPassword'] = (
undercloud_ceilometer_snmpd_password)
parameters['Swift-Storage-1::SnmpdReadonlyUserPassword'] = (
undercloud_ceilometer_snmpd_password)
parameters['Compute-1::SnmpdReadonlyUserPassword'] = (
undercloud_ceilometer_snmpd_password)
parameters['Controller-1::CeilometerPassword'] = ceilometer_pass
parameters[
'Controller-1::CeilometerMeteringSecret'] = ceilometer_secret
parameters['Compute-1::CeilometerPassword'] = ceilometer_pass
parameters[
'Compute-1::CeilometerMeteringSecret'] = ceilometer_secret
parameters['Controller-1::CinderPassword'] = (
passwords['OVERCLOUD_CINDER_PASSWORD'])
parameters['Controller-1::GlancePassword'] = (
passwords['OVERCLOUD_GLANCE_PASSWORD'])
parameters['Controller-1::HeatPassword'] = (
passwords['OVERCLOUD_HEAT_PASSWORD'])
parameters['Controller-1::HeatStackDomainAdminPassword'] = (
passwords['OVERCLOUD_HEAT_STACK_DOMAIN_PASSWORD'])
parameters['Controller-1::NeutronPassword'] = (
passwords['OVERCLOUD_NEUTRON_PASSWORD'])
parameters['Compute-1::NeutronPassword'] = (
passwords['OVERCLOUD_NEUTRON_PASSWORD'])
parameters['Controller-1::NovaPassword'] = (
passwords['OVERCLOUD_NOVA_PASSWORD'])
parameters['Compute-1::NovaPassword'] = (
passwords['OVERCLOUD_NOVA_PASSWORD'])
parameters['Controller-1::SwiftHashSuffix'] = (
passwords['OVERCLOUD_SWIFT_HASH'])
parameters['Controller-1::SwiftPassword'] = (
passwords['OVERCLOUD_SWIFT_PASSWORD'])
def _get_stack(self, orchestration_client, stack_name): def _get_stack(self, orchestration_client, stack_name):
"""Get the ID for the current deployed overcloud stack if it exists.""" """Get the ID for the current deployed overcloud stack if it exists."""
@ -185,12 +142,9 @@ class DeployOvercloud(command.Command):
return None return None
def _update_paramaters(self, args, network_client, stack): def _update_paramaters(self, args, network_client, stack):
if args.templates: parameters = PARAMETERS.copy()
parameters = PARAMETERS.copy() if stack is None:
if stack is None: parameters.update(NEW_STACK_PARAMETERS)
parameters.update(NEW_STACK_PARAMETERS)
else:
parameters = {}
self.log.debug("Generating overcloud passwords") self.log.debug("Generating overcloud passwords")
self.set_overcloud_passwords(parameters, args) self.set_overcloud_passwords(parameters, args)
@ -199,107 +153,42 @@ class DeployOvercloud(command.Command):
net = network_client.api.find_attr('networks', 'ctlplane') net = network_client.api.find_attr('networks', 'ctlplane')
parameters['NeutronControlPlaneID'] = net['id'] parameters['NeutronControlPlaneID'] = net['id']
if args.templates: param_args = (
param_args = ( ('NeutronPublicInterface', 'neutron_public_interface'),
('NeutronPublicInterface', 'neutron_public_interface'), ('NeutronBridgeMappings', 'neutron_bridge_mappings'),
('NeutronBridgeMappings', 'neutron_bridge_mappings'), ('NeutronFlatNetworks', 'neutron_flat_networks'),
('NeutronFlatNetworks', 'neutron_flat_networks'), ('HypervisorNeutronPhysicalBridge', 'neutron_physical_bridge'),
('HypervisorNeutronPhysicalBridge', 'neutron_physical_bridge'), ('NtpServer', 'ntp_server'),
('NtpServer', 'ntp_server'), ('ControllerCount', 'control_scale'),
('ControllerCount', 'control_scale'), ('ComputeCount', 'compute_scale'),
('ComputeCount', 'compute_scale'), ('ObjectStorageCount', 'swift_storage_scale'),
('ObjectStorageCount', 'swift_storage_scale'), ('BlockStorageCount', 'block_storage_scale'),
('BlockStorageCount', 'block_storage_scale'), ('CephStorageCount', 'ceph_storage_scale'),
('CephStorageCount', 'ceph_storage_scale'), ('OvercloudControlFlavor', 'control_flavor'),
('OvercloudControlFlavor', 'control_flavor'), ('OvercloudComputeFlavor', 'compute_flavor'),
('OvercloudComputeFlavor', 'compute_flavor'), ('OvercloudBlockStorageFlavor', 'block_storage_flavor'),
('OvercloudBlockStorageFlavor', 'block_storage_flavor'), ('OvercloudSwiftStorageFlavor', 'swift_storage_flavor'),
('OvercloudSwiftStorageFlavor', 'swift_storage_flavor'), ('OvercloudCephStorageFlavor', 'ceph_storage_flavor'),
('OvercloudCephStorageFlavor', 'ceph_storage_flavor'), ('NeutronNetworkVLANRanges', 'neutron_network_vlan_ranges'),
('NeutronNetworkVLANRanges', 'neutron_network_vlan_ranges'), ('NeutronMechanismDrivers', 'neutron_mechanism_drivers')
('NeutronMechanismDrivers', 'neutron_mechanism_drivers') )
if stack is None:
new_stack_args = (
('NeutronNetworkType', 'neutron_network_type'),
('NeutronTunnelIdRanges', 'neutron_tunnel_id_ranges'),
('NeutronTunnelTypes', 'neutron_tunnel_types'),
('NeutronVniRanges', 'neutron_vni_ranges'),
('NovaComputeLibvirtType', 'libvirt_type'),
) )
param_args = param_args + new_stack_args
if stack is None: if args.neutron_disable_tunneling is not None:
new_stack_args = ( neutron_enable_tunneling = (
('NeutronNetworkType', 'neutron_network_type'), not args.neutron_disable_tunneling)
('NeutronTunnelIdRanges', 'neutron_tunnel_id_ranges'), parameters.update({
('NeutronTunnelTypes', 'neutron_tunnel_types'), 'NeutronEnableTunnelling': neutron_enable_tunneling,
('NeutronVniRanges', 'neutron_vni_ranges'), })
('NovaComputeLibvirtType', 'libvirt_type'),
)
param_args = param_args + new_stack_args
if args.neutron_disable_tunneling is not None:
neutron_enable_tunneling = (
not args.neutron_disable_tunneling)
parameters.update({
'NeutronEnableTunnelling': neutron_enable_tunneling,
})
else:
param_args = (
('Controller-1::NeutronPublicInterface',
'neutron_public_interface'),
('Compute-1::NeutronPublicInterface',
'neutron_public_interface'),
('Controller-1::NeutronBridgeMappings',
'neutron_bridge_mappings'),
('Compute-1::NeutronBridgeMappings',
'neutron_bridge_mappings'),
('Controller-1::NeutronFlatNetworks', 'neutron_flat_networks'),
('Compute-1::NeutronFlatNetworks', 'neutron_flat_networks'),
('Compute-1::NeutronPhysicalBridge',
'neutron_physical_bridge'),
('Controller-1::NtpServer', 'ntp_server'),
('Compute-1::NtpServer', 'ntp_server'),
('Controller-1::NeutronNetworkVLANRanges',
'neutron_network_vlan_ranges'),
('Compute-1::NeutronNetworkVLANRanges',
'neutron_network_vlan_ranges'),
('Controller-1::NeutronMechanismDrivers',
'neutron_mechanism_drivers'),
('Compute-1::NeutronMechanismDrivers',
'neutron_mechanism_drivers'),
('Controller-1::count', 'control_scale'),
('Compute-1::count', 'compute_scale'),
('Swift-Storage-1::count', 'swift_storage_scale'),
('Cinder-Storage-1::count', 'block_storage_scale'),
('Ceph-Storage-1::count', 'ceph_storage_scale'),
('Cinder-Storage-1::Flavor', 'block_storage_flavor'),
('Compute-1::Flavor', 'compute_flavor'),
('Controller-1::Flavor', 'control_flavor'),
('Swift-Storage-1::Flavor', 'swift_storage_flavor'),
('Ceph-Storage-1::Flavor', 'ceph_storage_flavor'),
)
if stack is None:
new_stack_args = (
('Controller-1::NeutronNetworkType',
'neutron_network_type'),
('Compute-1::NeutronNetworkType', 'neutron_network_type'),
('Controller-1::NeutronTunnelTypes',
'neutron_tunnel_types'),
('Compute-1::NeutronTunnelTypes', 'neutron_tunnel_types'),
('Compute-1::NovaComputeLibvirtType', 'libvirt_type'),
('Controller-1::NeutronTunnelIdRanges',
'neutron_tunnel_id_ranges'),
('Controller-1::NeutronVniRanges', 'neutron_vni_ranges'),
('Compute-1::NeutronTunnelIdRanges',
'neutron_tunnel_id_ranges'),
('Compute-1::NeutronVniRanges', 'neutron_vni_ranges'),
)
param_args = param_args + new_stack_args
if args.neutron_disable_tunneling is not None:
neutron_enable_tunneling = (
not args.neutron_disable_tunneling)
parameters.update({
'Controller-1::NeutronEnableTunnelling':
neutron_enable_tunneling,
'Compute-1::NeutronEnableTunnelling':
neutron_enable_tunneling,
})
# Update parameters from commandline # Update parameters from commandline
for param, arg in param_args: for param, arg in param_args:
@ -312,57 +201,30 @@ class DeployOvercloud(command.Command):
parameters[param] = getattr(args, arg) parameters[param] = getattr(args, arg)
# Scaling needs extra parameters # Scaling needs extra parameters
number_controllers = max(( number_controllers = int(parameters.get('ControllerCount', 0))
int(parameters.get('ControllerCount', 0)),
int(parameters.get('Controller-1::count', 0))
))
if number_controllers > 1: if number_controllers > 1:
if not args.ntp_server: if not args.ntp_server:
raise Exception('Specify --ntp-server when using multiple' raise Exception('Specify --ntp-server when using multiple'
' controllers (with HA).') ' controllers (with HA).')
if args.templates: parameters.update({
parameters.update({ 'NeutronL3HA': True,
'NeutronL3HA': True, 'NeutronAllowL3AgentFailover': False,
'NeutronAllowL3AgentFailover': False, })
})
else:
parameters.update({
'Controller-1::NeutronL3HA': True,
'Controller-1::NeutronAllowL3AgentFailover': False,
'Compute-1::NeutronL3HA': True,
'Compute-1::NeutronAllowL3AgentFailover': False,
})
else: else:
if args.templates: parameters.update({
parameters.update({ 'NeutronL3HA': False,
'NeutronL3HA': False, 'NeutronAllowL3AgentFailover': False,
'NeutronAllowL3AgentFailover': False, })
})
else:
parameters.update({
'Controller-1::NeutronL3HA': False,
'Controller-1::NeutronAllowL3AgentFailover': False,
'Compute-1::NeutronL3HA': False,
'Compute-1::NeutronAllowL3AgentFailover': False,
})
dhcp_agents_per_network = (min(number_controllers, 3) if dhcp_agents_per_network = (min(number_controllers, 3) if
number_controllers else 1) number_controllers else 1)
if args.templates: parameters.update({
parameters.update({ 'NeutronDhcpAgentsPerNetwork': dhcp_agents_per_network,
'NeutronDhcpAgentsPerNetwork': dhcp_agents_per_network, })
})
else:
parameters.update({
'Controller-1::NeutronDhcpAgentsPerNetwork':
dhcp_agents_per_network,
})
if max((int(parameters.get('CephStorageCount', 0)), if int(parameters.get('CephStorageCount', 0)) > 0:
int(parameters.get('Ceph-Storage-1::count', 0)))) > 0:
if stack is None: if stack is None:
parameters.update({ parameters.update({
@ -375,10 +237,7 @@ class DeployOvercloud(command.Command):
def _create_registration_env(self, args): def _create_registration_env(self, args):
if args.templates: tht_root = args.templates
tht_root = args.templates
else:
tht_root = TRIPLEO_HEAT_TEMPLATES
environment = os.path.join(tht_root, environment = os.path.join(tht_root,
RHEL_REGISTRATION_EXTRACONFIG_NAME, RHEL_REGISTRATION_EXTRACONFIG_NAME,
@ -538,95 +397,6 @@ class DeployOvercloud(command.Command):
self._heat_deploy(stack, parsed_args.stack, overcloud_yaml, parameters, self._heat_deploy(stack, parsed_args.stack, overcloud_yaml, parameters,
environments, parsed_args.timeout) environments, parsed_args.timeout)
def _deploy_tuskar(self, stack, parsed_args):
clients = self.app.client_manager
management = clients.tripleoclient.management()
network_client = clients.network
# TODO(dmatthews): The Tuskar client has very similar code to this for
# downloading templates. It should be refactored upstream so we can use
# it.
if parsed_args.output_dir:
output_dir = parsed_args.output_dir
else:
output_dir = tempfile.mkdtemp()
if not os.path.isdir(output_dir):
os.mkdir(output_dir)
management_plan = tuskarutils.find_resource(
management.plans, parsed_args.plan)
# retrieve templates
templates = management.plans.templates(management_plan.uuid)
parameters = self._update_paramaters(
parsed_args, network_client, stack)
utils.check_nodes_count(
self.app.client_manager.tripleoclient.baremetal(),
stack,
parameters,
{
'Controller-1::count': 1,
'Compute-1::count': 1,
'Swift-Storage-1::count': 0,
'Cinder-Storage-1::count': 0,
'Ceph-Storage-1::count': 0,
}
)
if stack is None:
ca_key_pem, ca_cert_pem = keystone_pki.create_ca_pair()
signing_key_pem, signing_cert_pem = (
keystone_pki.create_signing_pair(ca_key_pem, ca_cert_pem))
parameters['Controller-1::KeystoneCACertificate'] = ca_cert_pem
parameters['Controller-1::KeystoneSigningCertificate'] = (
signing_cert_pem)
parameters['Controller-1::KeystoneSigningKey'] = signing_key_pem
# Save the parameters to Tuskar so they can be used when redeploying.
# Tuskar expects to get all values as strings. So we convert them all
# below.
management.plans.patch(
management_plan.uuid,
[{'name': x[0], 'value': six.text_type(x[1])}
for x in parameters.items()]
)
# write file for each key-value in templates
print("The following templates will be written:")
for template_name, template_content in templates.items():
# It's possible to organize the role templates and their dependent
# files into directories, in which case the template_name will
# carry the directory information. If that's the case, first
# create the directory structure (if it hasn't already been
# created by another file in the templates list).
template_dir = os.path.dirname(template_name)
output_template_dir = os.path.join(output_dir, template_dir)
if template_dir and not os.path.exists(output_template_dir):
os.makedirs(output_template_dir)
filename = os.path.join(output_dir, template_name)
with open(filename, 'w+') as template_file:
template_file.write(template_content)
print(filename)
overcloud_yaml = os.path.join(output_dir, 'plan.yaml')
environment_yaml = os.path.join(output_dir, 'environment.yaml')
environments = [environment_yaml, ]
if parsed_args.rhel_reg:
reg_env = self._create_registration_env(parsed_args)
environments.extend(reg_env)
if parsed_args.environment_files:
environments.extend(parsed_args.environment_files)
self._heat_deploy(stack, parsed_args.stack, overcloud_yaml, parameters,
environments, parsed_args.timeout)
def _create_overcloudrc(self, stack, parsed_args): def _create_overcloudrc(self, stack, parsed_args):
overcloud_endpoint = self._get_overcloud_endpoint(stack) overcloud_endpoint = self._get_overcloud_endpoint(stack)
overcloud_ip = six.moves.urllib.parse.urlparse( overcloud_ip = six.moves.urllib.parse.urlparse(
@ -1014,14 +784,11 @@ class DeployOvercloud(command.Command):
prog=prog_name, prog=prog_name,
add_help=False add_help=False
) )
main_group = parser.add_mutually_exclusive_group(required=True) parser.add_argument(
main_group.add_argument(
'--plan',
help=_("The Name or UUID of the Tuskar plan to deploy.")
)
main_group.add_argument(
'--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES, '--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES,
help=_("The directory containing the Heat templates to deploy")) help=_("The directory containing the Heat templates to deploy"),
required=True
)
parser.add_argument('--stack', parser.add_argument('--stack',
help=_("Stack name to create or update"), help=_("Stack name to create or update"),
default='overcloud') default='overcloud')
@ -1112,12 +879,6 @@ class DeployOvercloud(command.Command):
help=_('A comma separated list of hosts that should not be ' help=_('A comma separated list of hosts that should not be '
'proxied.') 'proxied.')
) )
parser.add_argument(
'-O', '--output-dir', metavar='<OUTPUT DIR>',
help=_('Directory to write Tuskar template files into. It will be '
'created if it does not exist. If not provided a temporary '
'directory will be used.')
)
parser.add_argument( parser.add_argument(
'-e', '--environment-file', metavar='<HEAT ENVIRONMENT FILE>', '-e', '--environment-file', metavar='<HEAT ENVIRONMENT FILE>',
action='append', dest='environment_files', action='append', dest='environment_files',
@ -1230,10 +991,7 @@ class DeployOvercloud(command.Command):
"must specify --reg-org, and " "must specify --reg-org, and "
"--reg-activation-key.") "--reg-activation-key.")
if parsed_args.templates: self._deploy_tripleo_heat_templates(stack, parsed_args)
self._deploy_tripleo_heat_templates(stack, parsed_args)
else:
self._deploy_tuskar(stack, parsed_args)
# Get a new copy of the stack after stack update/create. If it was # Get a new copy of the stack after stack update/create. If it was
# a create then the previous stack object would be None. # a create then the previous stack object would be None.

View File

@ -35,10 +35,6 @@ class DeleteNode(command.Command):
help='Name or ID of heat stack to scale ' help='Name or ID of heat stack to scale '
'(default=Env: OVERCLOUD_STACK_NAME)', '(default=Env: OVERCLOUD_STACK_NAME)',
default=utils.env('OVERCLOUD_STACK_NAME')) default=utils.env('OVERCLOUD_STACK_NAME'))
parser.add_argument('--plan', dest='plan',
help='Name or ID of tuskar plan to scale '
'(default=Env: OVERCLOUD_PLAN_NAME)',
default=utils.env('OVERCLOUD_PLAN_NAME'))
parser.add_argument( parser.add_argument(
'--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES, '--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES,
help="The directory containing the Heat templates to deploy" help="The directory containing the Heat templates to deploy"
@ -56,19 +52,13 @@ class DeleteNode(command.Command):
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args) self.log.debug("take_action(%s)" % parsed_args)
osc_plugin = self.app.client_manager.tripleoclient osc_plugin = self.app.client_manager.tripleoclient
if parsed_args.templates:
management = None
else:
management = osc_plugin.management()
orchestration = osc_plugin.orchestration() orchestration = osc_plugin.orchestration()
scale_manager = scale.ScaleManager( scale_manager = scale.ScaleManager(
tuskarclient=management,
heatclient=orchestration, heatclient=orchestration,
plan_id=parsed_args.plan,
stack_id=parsed_args.stack, stack_id=parsed_args.stack,
tht_dir=parsed_args.templates, tht_dir=parsed_args.templates,
environment_files=parsed_args.environment_files) environment_files=parsed_args.environment_files)
print("deleting nodes {0} from stack {1}".format(parsed_args.nodes, print("deleting nodes {0} from stack {1}".format(parsed_args.nodes,
parsed_args.plan)) parsed_args.stack))
scale_manager.scaledown(parsed_args.nodes) scale_manager.scaledown(parsed_args.nodes)

View File

@ -17,6 +17,7 @@ import logging
from cliff import command from cliff import command
from openstackclient.common import utils from openstackclient.common import utils
from openstackclient.i18n import _
from tripleo_common import update from tripleo_common import update
TRIPLEO_HEAT_TEMPLATES = "/usr/share/openstack-tripleo-heat-templates/" TRIPLEO_HEAT_TEMPLATES = "/usr/share/openstack-tripleo-heat-templates/"
@ -31,17 +32,13 @@ class UpdateOvercloud(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(UpdateOvercloud, self).get_parser(prog_name) parser = super(UpdateOvercloud, self).get_parser(prog_name)
parser.add_argument('stack', nargs='?', parser.add_argument('stack', nargs='?',
help='Name or ID of heat stack to scale ' help=_('Name or ID of heat stack to scale '
'(default=Env: OVERCLOUD_STACK_NAME)', '(default=Env: OVERCLOUD_STACK_NAME)'),
default=utils.env('OVERCLOUD_STACK_NAME')) default=utils.env('OVERCLOUD_STACK_NAME'))
main_group = parser.add_mutually_exclusive_group(required=True) parser.add_argument(
main_group.add_argument('--plan', dest='plan',
help='Name or ID of tuskar plan to scale '
'(default=Env: OVERCLOUD_PLAN_NAME)',
default=utils.env('OVERCLOUD_PLAN_NAME'))
main_group.add_argument(
'--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES, '--templates', nargs='?', const=TRIPLEO_HEAT_TEMPLATES,
help="The directory containing the Heat templates to deploy" help=_("The directory containing the Heat templates to deploy"),
required=True
) )
parser.add_argument('-i', '--interactive', dest='interactive', parser.add_argument('-i', '--interactive', dest='interactive',
action='store_true') action='store_true')
@ -50,26 +47,20 @@ class UpdateOvercloud(command.Command):
parser.add_argument( parser.add_argument(
'-e', '--environment-file', metavar='<HEAT ENVIRONMENT FILE>', '-e', '--environment-file', metavar='<HEAT ENVIRONMENT FILE>',
action='append', dest='environment_files', action='append', dest='environment_files',
help='Environment files to be passed to the heat stack-create ' help=_('Environment files to be passed to the heat stack-create '
'or heat stack-update command. (Can be specified more than ' 'or heat stack-update command. (Can be specified more than '
'once.)' 'once.)')
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug("take_action(%s)" % parsed_args) self.log.debug("take_action(%s)" % parsed_args)
osc_plugin = self.app.client_manager.tripleoclient osc_plugin = self.app.client_manager.tripleoclient
if parsed_args.templates:
management = None
else:
management = osc_plugin.management()
orchestration = osc_plugin.orchestration() orchestration = osc_plugin.orchestration()
update_manager = update.PackageUpdateManager( update_manager = update.PackageUpdateManager(
tuskarclient=management,
heatclient=orchestration, heatclient=orchestration,
novaclient=self.app.client_manager.compute, novaclient=self.app.client_manager.compute,
plan_id=parsed_args.plan,
stack_id=parsed_args.stack, stack_id=parsed_args.stack,
tht_dir=parsed_args.templates, tht_dir=parsed_args.templates,
environment_files=parsed_args.environment_files) environment_files=parsed_args.environment_files)