39c8616876
On a minor interactive update, we never prompoted to clear breakpoints when using deployed-server since the code reads the server id's from nova, of which there are none. This modifies the behavior to read the server id's and names from Heat when nova returns no servers. Change-Id: I682f6dc66705c9d42b9c2d21f675491ea60c9c3c Closes-Bug: #1708236
143 lines
5.6 KiB
Python
143 lines
5.6 KiB
Python
# Copyright 2015 Red Hat, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
import mock
|
|
|
|
from tripleo_common import _stack_update
|
|
from tripleo_common.tests import base
|
|
|
|
|
|
class StackUpdateManagerTest(base.TestCase):
|
|
|
|
def setUp(self):
|
|
super(StackUpdateManagerTest, self).setUp()
|
|
self.heatclient = mock.MagicMock()
|
|
self.novaclient = mock.MagicMock()
|
|
self.stack = mock.MagicMock(id='123', status='IN_PROGRESS',
|
|
stack_name='stack')
|
|
self.heatclient.stacks.get.return_value = self.stack
|
|
|
|
server_mock = mock.MagicMock(id='instance_id')
|
|
server_mock.name = 'instance_name'
|
|
self.novaclient.servers.list.return_value = [server_mock]
|
|
|
|
self.heatclient.software_deployments.get.return_value = \
|
|
mock.MagicMock(server_id='instance_id')
|
|
self.heatclient.resources.list.return_value = [
|
|
mock.MagicMock(
|
|
links=[{'rel': 'stack',
|
|
'href': 'http://192.0.2.1:8004/v1/'
|
|
'a959ac7d6a4a475daf2428df315c41ef/'
|
|
'stacks/overcloud/123'}],
|
|
logical_resource_id='logical_id',
|
|
physical_resource_id='resource_id'
|
|
)
|
|
]
|
|
|
|
def return_events(*args, **kwargs):
|
|
if 'resource_name' in kwargs:
|
|
return [
|
|
mock.MagicMock(
|
|
event_time='2015-03-25T09:15:04Z',
|
|
resource_name='Controller-0',
|
|
resource_status='UPDATE_IN_PROGRESS',
|
|
resource_status_reason='UPDATE paused until Hook '
|
|
'pre-update is cleared')
|
|
]
|
|
else:
|
|
return [
|
|
mock.MagicMock(
|
|
event_time='2015-03-25T09:14:02Z',
|
|
resource_status_reason='Stack UPDATE started')
|
|
|
|
]
|
|
|
|
self.heatclient.events.list.side_effect = return_events
|
|
self.stack_update_manager = _stack_update.StackUpdateManager(
|
|
self.heatclient, self.novaclient, self.stack, 'pre-update')
|
|
|
|
def test_get_status(self):
|
|
status, resources = self.stack_update_manager.get_status()
|
|
self.assertEqual('WAITING', status)
|
|
|
|
def test_clear_breakpoints(self):
|
|
good, bad = self.stack_update_manager.clear_breakpoints(
|
|
['resource_id'])
|
|
self.heatclient.resources.signal.assert_called_once_with(
|
|
stack_id='123',
|
|
resource_name='logical_id',
|
|
data={'unset_hook': 'pre-update'})
|
|
self.assertEqual(good, ['resource_id'])
|
|
self.assertEqual(bad, [])
|
|
|
|
def test_clear_breakpoints_fails(self):
|
|
self.heatclient.resources.signal.side_effect = Exception('error')
|
|
good, bad = self.stack_update_manager.clear_breakpoints(
|
|
['resource_id'])
|
|
self.assertEqual(good, [])
|
|
self.assertEqual(bad, ['resource_id'])
|
|
|
|
def test_intput_to_refs_regexp(self):
|
|
result = self.stack_update_manager._input_to_refs(
|
|
'instance_name.*', ['instance_id'])
|
|
self.assertEqual(result, ['instance_id'])
|
|
|
|
def test_intput_to_refs_invalid_regexp(self):
|
|
result = self.stack_update_manager._input_to_refs(
|
|
']].*', ['instance_id'])
|
|
self.assertEqual(result, [])
|
|
|
|
def test_get_servers(self):
|
|
self.stack_update_manager._get_servers()
|
|
self.novaclient.servers.list.assert_called()
|
|
|
|
def test_get_servers_deployed_server(self):
|
|
self.novaclient.servers.list.return_value = []
|
|
self.heatclient.resources.list.return_value = [
|
|
mock.MagicMock(
|
|
links=[{'rel': 'stack',
|
|
'href': 'http://192.0.2.1:8004/v1/'
|
|
'a959ac7d6a4a475daf2428df315c41ef/'
|
|
'stacks/overcloud/123'}],
|
|
logical_resource_id='logical_id',
|
|
physical_resource_id='controller_resource_id',
|
|
type='OS::Heat::DeployedServer'
|
|
),
|
|
mock.MagicMock(
|
|
links=[{'rel': 'stack',
|
|
'href': 'http://192.0.2.1:8004/v1/'
|
|
'a959ac7d6a4a475daf2428df315c41ef/'
|
|
'stacks/overcloud/123'}],
|
|
logical_resource_id='logical_id',
|
|
physical_resource_id='compute_resource_id',
|
|
type='OS::Heat::DeployedServer'
|
|
)
|
|
]
|
|
self.heatclient.stacks.get.side_effect = [
|
|
mock.MagicMock(
|
|
outputs=[{'output_key': 'name',
|
|
'output_value': 'overcloud-controller-0'}]),
|
|
mock.MagicMock(
|
|
outputs=[{'output_key': 'name',
|
|
'output_value': 'overcloud-compute-0'}]),
|
|
]
|
|
|
|
servers = self.stack_update_manager._get_servers()
|
|
self.assertEqual(servers[0].name, 'overcloud-controller-0')
|
|
self.assertEqual(servers[0].id, 'controller_resource_id')
|
|
self.assertEqual(servers[1].name, 'overcloud-compute-0')
|
|
self.assertEqual(servers[1].id, 'compute_resource_id')
|