97 lines
4.7 KiB
Python
97 lines
4.7 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 nova.compute import instance_actions
|
|
from nova.compute import power_state
|
|
from nova.compute import vm_states
|
|
from nova.tests.functional import integrated_helpers
|
|
from nova.tests.unit import fake_notifier
|
|
|
|
|
|
class ServerExternalEventsTestV276(
|
|
integrated_helpers.ProviderUsageBaseTestCase):
|
|
microversion = '2.76'
|
|
compute_driver = 'fake.PowerUpdateFakeDriver'
|
|
|
|
def setUp(self):
|
|
super(ServerExternalEventsTestV276, self).setUp()
|
|
self.compute = self.start_service('compute', host='compute')
|
|
|
|
server_req = self._build_server(
|
|
image_uuid='155d900f-4e14-4e4c-a73d-069cbf4541e6',
|
|
networks='none')
|
|
created_server = self.api.post_server({'server': server_req})
|
|
self.server = self._wait_for_state_change(created_server, 'ACTIVE')
|
|
self.power_off = {'name': 'power-update',
|
|
'tag': 'POWER_OFF',
|
|
'server_uuid': self.server["id"]}
|
|
self.power_on = {'name': 'power-update',
|
|
'tag': 'POWER_ON',
|
|
'server_uuid': self.server["id"]}
|
|
|
|
def test_server_power_update(self):
|
|
# This test checks the functionality of handling the "power-update"
|
|
# external events.
|
|
self.assertEqual(
|
|
power_state.RUNNING, self.server['OS-EXT-STS:power_state'])
|
|
self.api.create_server_external_events(events=[self.power_off])
|
|
expected_params = {'OS-EXT-STS:task_state': None,
|
|
'OS-EXT-STS:vm_state': vm_states.STOPPED,
|
|
'OS-EXT-STS:power_state': power_state.SHUTDOWN}
|
|
server = self._wait_for_server_parameter(self.server,
|
|
expected_params)
|
|
msg = ' with target power state POWER_OFF.'
|
|
self.assertIn(msg, self.stdlog.logger.output)
|
|
# Test if this is logged in the instance action list.
|
|
actions = self.api.get_instance_actions(server['id'])
|
|
self.assertEqual(2, len(actions))
|
|
acts = {action['action']: action for action in actions}
|
|
self.assertEqual(['create', 'stop'], sorted(acts))
|
|
stop_action = acts[instance_actions.STOP]
|
|
detail = self.api.get_instance_action_details(server['id'],
|
|
stop_action['request_id'])
|
|
events_by_name = {event['event']: event for event in detail['events']}
|
|
self.assertEqual(1, len(detail['events']), detail)
|
|
self.assertIn('compute_power_update', events_by_name)
|
|
self.assertEqual('Success', detail['events'][0]['result'])
|
|
# Test if notifications were emitted.
|
|
fake_notifier.wait_for_versioned_notifications(
|
|
'instance.power_off.start')
|
|
fake_notifier.wait_for_versioned_notifications(
|
|
'instance.power_off.end')
|
|
|
|
# Checking POWER_ON
|
|
self.api.create_server_external_events(events=[self.power_on])
|
|
expected_params = {'OS-EXT-STS:task_state': None,
|
|
'OS-EXT-STS:vm_state': vm_states.ACTIVE,
|
|
'OS-EXT-STS:power_state': power_state.RUNNING}
|
|
server = self._wait_for_server_parameter(self.server, expected_params)
|
|
msg = ' with target power state POWER_ON.'
|
|
self.assertIn(msg, self.stdlog.logger.output)
|
|
# Test if this is logged in the instance action list.
|
|
actions = self.api.get_instance_actions(server['id'])
|
|
self.assertEqual(3, len(actions))
|
|
acts = {action['action']: action for action in actions}
|
|
self.assertEqual(['create', 'start', 'stop'], sorted(acts))
|
|
start_action = acts[instance_actions.START]
|
|
detail = self.api.get_instance_action_details(server['id'],
|
|
start_action['request_id'])
|
|
events_by_name = {event['event']: event for event in detail['events']}
|
|
self.assertEqual(1, len(detail['events']), detail)
|
|
self.assertIn('compute_power_update', events_by_name)
|
|
self.assertEqual('Success', detail['events'][0]['result'])
|
|
# Test if notifications were emitted.
|
|
fake_notifier.wait_for_versioned_notifications(
|
|
'instance.power_on.start')
|
|
fake_notifier.wait_for_versioned_notifications(
|
|
'instance.power_on.end')
|