octavia/octavia/tests/unit/controller/worker/test_task_utils.py
Michael Johnson 0e2c927c58 Adds tasks so that reverts set objects to ERROR
This patch adds capstone tasks to our flows that make sure reverts
end in the proper final state for the impacted objects.
Previously some failure scenarios left objects in PENDING_* state.

To accomplish the above, this patch adds provisioning status
to all of the remaining top level objects(pools, members, etc.)
and adds tasks to maintain the proper provisioning status for
these objects.

Change-Id: I857b1aa28e4a6c7466c3abf4e088a74367e78faf
Closes-Bug: #1623686
2016-09-22 19:38:51 +00:00

265 lines
9.7 KiB
Python

# Copyright 2016 Rackspace
#
# 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 oslo_utils import uuidutils
from octavia.common import constants
from octavia.controller.worker import task_utils as task_utilities
import octavia.tests.unit.base as base
TEST_SESSION = 'TEST_SESSION'
class TestTaskUtils(base.TestCase):
def setUp(self):
self.task_utils = task_utilities.TaskUtils()
self.AMPHORA_ID = uuidutils.generate_uuid()
self.HEALTH_MON_ID = uuidutils.generate_uuid()
self.L7POLICY_ID = uuidutils.generate_uuid()
self.L7RULE_ID = uuidutils.generate_uuid()
self.LISTENER_ID = uuidutils.generate_uuid()
self.LOADBALANCER_ID = uuidutils.generate_uuid()
self.MEMBER_ID = uuidutils.generate_uuid()
self.POOL_ID = uuidutils.generate_uuid()
super(TestTaskUtils, self).setUp()
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.AmphoraRepository.update')
def test_mark_amphora_status_error(self,
mock_amphora_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_amphora_status_error(self.AMPHORA_ID)
mock_amphora_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.AMPHORA_ID,
status=constants.ERROR)
# Exception path
mock_amphora_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_amphora_status_error(self.AMPHORA_ID)
self.assertFalse(mock_amphora_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.HealthMonitorRepository.update')
def test_mark_health_mon_prov_status_error(self,
mock_health_mon_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_health_mon_prov_status_error(self.HEALTH_MON_ID)
mock_health_mon_repo_update.assert_called_once_with(
TEST_SESSION,
pool_id=self.HEALTH_MON_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_health_mon_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_health_mon_prov_status_error(self.HEALTH_MON_ID)
self.assertFalse(mock_health_mon_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.L7PolicyRepository.update')
def test_mark_l7policy_prov_status_error(self,
mock_l7policy_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_l7policy_prov_status_error(self.L7POLICY_ID)
mock_l7policy_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.L7POLICY_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_l7policy_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_l7policy_prov_status_error(self.L7POLICY_ID)
self.assertFalse(mock_l7policy_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.L7RuleRepository.update')
def test_mark_l7rule_prov_status_error(self,
mock_l7rule_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_l7rule_prov_status_error(self.L7RULE_ID)
mock_l7rule_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.L7RULE_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_l7rule_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_l7rule_prov_status_error(self.L7RULE_ID)
self.assertFalse(mock_l7rule_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.ListenerRepository.update')
def test_mark_listener_prov_status_active(self,
mock_listener_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_listener_prov_status_active(self.LISTENER_ID)
mock_listener_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.LISTENER_ID,
provisioning_status=constants.ACTIVE)
# Exception path
mock_listener_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_listener_prov_status_active(self.LISTENER_ID)
self.assertFalse(mock_listener_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.ListenerRepository.update')
def test_mark_listener_prov_status_error(self,
mock_listener_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_listener_prov_status_error(self.LISTENER_ID)
mock_listener_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.LISTENER_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_listener_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_listener_prov_status_error(self.LISTENER_ID)
self.assertFalse(mock_listener_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.LoadBalancerRepository.update')
def test_mark_loadbalancer_prov_status_active(self,
mock_lb_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_loadbalancer_prov_status_active(
self.LOADBALANCER_ID)
mock_lb_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.LOADBALANCER_ID,
provisioning_status=constants.ACTIVE)
# Exception path
mock_lb_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_loadbalancer_prov_status_active(
self.LOADBALANCER_ID)
self.assertFalse(mock_lb_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.LoadBalancerRepository.update')
def test_mark_loadbalancer_prov_status_error(self,
mock_lb_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_loadbalancer_prov_status_error(
self.LOADBALANCER_ID)
mock_lb_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.LOADBALANCER_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_lb_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_loadbalancer_prov_status_error(
self.LOADBALANCER_ID)
self.assertFalse(mock_lb_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.MemberRepository.update')
def test_mark_member_prov_status_error(self,
mock_member_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_member_prov_status_error(self.MEMBER_ID)
mock_member_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.MEMBER_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_member_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_member_prov_status_error(self.MEMBER_ID)
self.assertFalse(mock_member_repo_update.called)
@mock.patch('octavia.db.api.get_session', return_value=TEST_SESSION)
@mock.patch('octavia.db.repositories.PoolRepository.update')
def test_mark_pool_prov_status_error(self,
mock_pool_repo_update,
mock_get_session):
# Happy path
self.task_utils.mark_pool_prov_status_error(self.POOL_ID)
mock_pool_repo_update.assert_called_once_with(
TEST_SESSION,
id=self.POOL_ID,
provisioning_status=constants.ERROR)
# Exception path
mock_pool_repo_update.reset_mock()
mock_get_session.side_effect = Exception('fail')
self.task_utils.mark_pool_prov_status_error(self.POOL_ID)
self.assertFalse(mock_pool_repo_update.called)