예제 #1
0
    def test_send_cluster_metrics(self, mock_make_admin_context,
                                  mock_get_notifier, mock_cluster_list,
                                  mock_create_monitor):
        """Test if RPC notifier receives the expected message"""
        mock_make_admin_context.return_value = self.context
        notifier = mock.MagicMock()
        mock_get_notifier.return_value = notifier
        mock_cluster_list.return_value = [
            self.cluster1, self.cluster2, self.cluster3, self.cluster4
        ]
        self.cluster4.status = cluster_status.CREATE_COMPLETE
        monitor = mock.MagicMock()
        monitor.get_metric_names.return_value = ['metric1', 'metric2']
        monitor.compute_metric_value.return_value = 30
        monitor.get_metric_unit.return_value = '%'
        mock_create_monitor.return_value = monitor

        periodic.MagnumPeriodicTasks(CONF)._send_cluster_metrics(self.context)

        expected_event_type = 'magnum.cluster.metrics.update'
        expected_metrics = [
            {
                'name': 'metric1',
                'value': 30,
                'unit': '%',
            },
            {
                'name': 'metric2',
                'value': 30,
                'unit': '%',
            },
        ]
        expected_msg = {
            'user_id': self.cluster4.user_id,
            'project_id': self.cluster4.project_id,
            'resource_id': self.cluster4.uuid,
            'metrics': expected_metrics
        }

        self.assertEqual(1, mock_create_monitor.call_count)
        notifier.info.assert_called_once_with(self.context,
                                              expected_event_type,
                                              expected_msg)
예제 #2
0
    def test_send_cluster_metrics_pull_data_raise(self,
                                                  mock_make_admin_context,
                                                  mock_get_notifier,
                                                  mock_cluster_list,
                                                  mock_create_monitor):
        CONF.set_override('send_cluster_metrics', True, group='drivers')
        mock_make_admin_context.return_value = self.context
        notifier = mock.MagicMock()
        mock_get_notifier.return_value = notifier
        mock_cluster_list.return_value = [self.cluster4]
        self.cluster4.status = cluster_status.CREATE_COMPLETE
        monitor = mock.MagicMock()
        monitor.pull_data.side_effect = Exception("error on pulling data")
        mock_create_monitor.return_value = monitor

        periodic.MagnumPeriodicTasks(CONF)._send_cluster_metrics(self.context)

        self.assertEqual(1, mock_create_monitor.call_count)
        self.assertEqual(0, notifier.info.call_count)
예제 #3
0
    def test_sync_bay_status_changes(self, mock_db_update, mock_db_destroy,
                                     mock_oscc, mock_bay_list):
        mock_heat_client = mock.MagicMock()
        stack1 = fake_stack(id='11', stack_status=bay_status.CREATE_COMPLETE)
        stack3 = fake_stack(id='33', stack_status=bay_status.UPDATE_COMPLETE)
        mock_heat_client.stacks.list.return_value = [stack1, stack3]
        mock_osc = mock_oscc.return_value
        mock_osc.heat.return_value = mock_heat_client
        mock_bay_list.return_value = [self.bay1, self.bay2, self.bay3]

        mock_keystone_client = mock.MagicMock()
        mock_keystone_client.client.project_id = "fake_project"
        mock_osc.keystone.return_value = mock_keystone_client

        periodic.MagnumPeriodicTasks(CONF).sync_bay_status(None)

        self.assertEqual(self.bay1.status, bay_status.CREATE_COMPLETE)
        mock_db_destroy.assert_called_once_with(self.bay2.uuid)
        self.assertEqual(self.bay3.status, bay_status.UPDATE_COMPLETE)
예제 #4
0
    def test_send_cluster_metrics_disable_pull_data(
            self, mock_make_admin_context, mock_get_notifier,
            mock_cluster_list, mock_create_monitor):

        mock_make_admin_context.return_value = self.context
        notifier = mock.MagicMock()
        mock_get_notifier.return_value = notifier
        mock_cluster_list.return_value = [self.cluster1, self.cluster2,
                                          self.cluster3, self.cluster4]
        self.cluster4.status = cluster_status.CREATE_COMPLETE
        monitor = mock.MagicMock()
        monitor.get_metric_names.return_value = ['metric1', 'metric2']
        monitor.compute_metric_value.return_value = 30
        monitor.get_metric_unit.return_value = '%'
        mock_create_monitor.return_value = monitor

        periodic.MagnumPeriodicTasks(CONF)._send_cluster_metrics(self.context)

        self.assertEqual(0, mock_create_monitor.call_count)
        self.assertEqual(0, notifier.info.call_count)
예제 #5
0
    def test_sync_cluster_status_changes(self, mock_db_update, mock_db_destroy,
                                         mock_oscc, mock_cluster_list):
        mock_heat_client = mock.MagicMock()
        stack1 = fake_stack(id='11',
                            stack_status=cluster_status.CREATE_COMPLETE,
                            stack_status_reason='fake_reason_11')
        stack3 = fake_stack(id='33',
                            stack_status=cluster_status.UPDATE_COMPLETE,
                            stack_status_reason='fake_reason_33')
        stack5 = fake_stack(id='55',
                            stack_status=cluster_status.ROLLBACK_COMPLETE,
                            stack_status_reason='fake_reason_55')
        mock_heat_client.stacks.list.return_value = [stack1, stack3, stack5]
        get_stacks = {'11': stack1, '33': stack3, '55': stack5}

        def stack_get_sideefect(arg):
            if arg == '22':
                raise heat_exc.HTTPNotFound
            return get_stacks[arg]

        mock_heat_client.stacks.get.side_effect = stack_get_sideefect
        mock_osc = mock_oscc.return_value
        mock_osc.heat.return_value = mock_heat_client
        mock_cluster_list.return_value = [
            self.cluster1, self.cluster2, self.cluster3, self.cluster5
        ]

        mock_keystone_client = mock.MagicMock()
        mock_keystone_client.client.project_id = "fake_project"
        mock_osc.keystone.return_value = mock_keystone_client

        periodic.MagnumPeriodicTasks(CONF).sync_cluster_status(None)

        self.assertEqual(cluster_status.CREATE_COMPLETE, self.cluster1.status)
        self.assertEqual('fake_reason_11', self.cluster1.status_reason)
        mock_db_destroy.assert_called_once_with(self.cluster2.uuid)
        self.assertEqual(cluster_status.UPDATE_COMPLETE, self.cluster3.status)
        self.assertEqual('fake_reason_33', self.cluster3.status_reason)
        self.assertEqual(cluster_status.ROLLBACK_COMPLETE,
                         self.cluster5.status)
        self.assertEqual('fake_reason_55', self.cluster5.status_reason)
예제 #6
0
    def test_sync_bay_status_heat_not_found(self, mock_db_update,
                                            mock_db_destroy, mock_oscc,
                                            mock_bay_list):
        mock_heat_client = mock.MagicMock()
        mock_heat_client.stacks.list.return_value = []
        mock_osc = mock_oscc.return_value
        mock_osc.heat.return_value = mock_heat_client
        mock_bay_list.return_value = [self.bay1, self.bay2, self.bay3]

        mock_keystone_client = mock.MagicMock()
        mock_keystone_client.client.project_id = "fake_project"
        mock_osc.keystone.return_value = mock_keystone_client

        periodic.MagnumPeriodicTasks(CONF).sync_bay_status(None)

        self.assertEqual(bay_status.CREATE_FAILED, self.bay1.status)
        self.assertEqual('Stack with id 11 not found in Heat.',
                         self.bay1.status_reason)
        mock_db_destroy.assert_called_once_with(self.bay2.uuid)
        self.assertEqual(bay_status.UPDATE_FAILED, self.bay3.status)
        self.assertEqual('Stack with id 33 not found in Heat.',
                         self.bay3.status_reason)
예제 #7
0
    def test_sync_auth_fail(self, mock_oscc, mock_bay_list):
        """Tests handling for unexpected exceptions in _get_bay_stacks()

        It does this by raising an a HTTPUnauthorized exception in Heat client.
        The affected stack thus missing from the stack list should not lead to
        bay state changing in this case. Likewise, subsequent bays should still
        change state, despite the affected bay being skipped.
        """
        stack1 = fake_stack(id='11', stack_status=bay_status.CREATE_COMPLETE)

        mock_heat_client = mock.MagicMock()

        def stack_get_sideefect(arg):
            raise heat_exc.HTTPUnauthorized

        mock_heat_client.stacks.get.side_effect = stack_get_sideefect
        mock_heat_client.stacks.list.return_value = [stack1]
        mock_osc = mock_oscc.return_value
        mock_osc.heat.return_value = mock_heat_client
        mock_bay_list.return_value = [self.bay1]
        periodic.MagnumPeriodicTasks(CONF).sync_bay_status(None)

        self.assertEqual(bay_status.CREATE_IN_PROGRESS, self.bay1.status)
예제 #8
0
    def test_sync_cluster_status_not_changes(self, mock_oscc,
                                             mock_cluster_list):
        mock_heat_client = mock.MagicMock()
        stack1 = fake_stack(id='11',
                            stack_status=cluster_status.CREATE_IN_PROGRESS)
        stack2 = fake_stack(id='22',
                            stack_status=cluster_status.DELETE_IN_PROGRESS)
        stack3 = fake_stack(id='33',
                            stack_status=cluster_status.UPDATE_IN_PROGRESS)
        stack5 = fake_stack(id='55',
                            stack_status=cluster_status.ROLLBACK_IN_PROGRESS)
        get_stacks = {'11': stack1, '22': stack2, '33': stack3, '55': stack5}

        def stack_get_sideefect(arg):
            if arg == '22':
                raise heat_exc.HTTPNotFound
            return get_stacks[arg]

        mock_heat_client.stacks.get.side_effect = stack_get_sideefect
        mock_heat_client.stacks.list.return_value = [
            stack1, stack2, stack3, stack5
        ]
        mock_osc = mock_oscc.return_value
        mock_osc.heat.return_value = mock_heat_client
        mock_cluster_list.return_value = [
            self.cluster1, self.cluster2, self.cluster3, self.cluster5
        ]
        periodic.MagnumPeriodicTasks(CONF).sync_cluster_status(None)

        self.assertEqual(cluster_status.CREATE_IN_PROGRESS,
                         self.cluster1.status)
        self.assertEqual(cluster_status.DELETE_IN_PROGRESS,
                         self.cluster2.status)
        self.assertEqual(cluster_status.UPDATE_IN_PROGRESS,
                         self.cluster3.status)
        self.assertEqual(cluster_status.ROLLBACK_IN_PROGRESS,
                         self.cluster5.status)
예제 #9
0
    def test_sync_cluster_status_heat_not_found(self, mock_db_destroy,
                                                mock_cluster_list,
                                                mock_get_driver):
        self.get_stacks.clear()
        mock_get_driver.return_value = self.mock_driver
        mock_cluster_list.return_value = [
            self.cluster1, self.cluster2, self.cluster3, self.cluster4,
            self.cluster5
        ]

        periodic.MagnumPeriodicTasks(CONF).sync_cluster_status(None)

        self.assertEqual(cluster_status.CREATE_FAILED, self.cluster1.status)
        self.assertEqual('Stack 11 not found', self.cluster1.status_reason)
        self.assertEqual(cluster_status.UPDATE_FAILED, self.cluster3.status)
        self.assertEqual('Stack 33 not found', self.cluster3.status_reason)
        self.assertEqual(cluster_status.ROLLBACK_FAILED, self.cluster5.status)
        self.assertEqual('Stack 55 not found', self.cluster5.status_reason)
        mock_db_destroy.assert_has_calls(
            [mock.call(self.cluster2.uuid),
             mock.call(self.cluster4.uuid)])
        self.assertEqual(2, mock_db_destroy.call_count)
        notifications = fake_notifier.NOTIFICATIONS
        self.assertEqual(5, len(notifications))
예제 #10
0
    def test_sync_cluster_status_changes(self, mock_db_destroy,
                                         mock_cluster_list, mock_get_driver):

        mock_cluster_list.return_value = [self.cluster1, self.cluster2,
                                          self.cluster3, self.cluster4,
                                          self.cluster5]
        mock_get_driver.return_value = self.mock_driver

        periodic.MagnumPeriodicTasks(CONF).sync_cluster_status(None)

        self.assertEqual(cluster_status.CREATE_COMPLETE, self.cluster1.status)
        self.assertEqual('fake_reason_11', self.cluster1.status_reason)
        # make sure cluster 2 didn't change
        self.assertEqual(cluster_status.DELETE_IN_PROGRESS,
                         self.cluster2.status)
        self.assertEqual('no change', self.cluster2.status_reason)
        self.assertEqual(cluster_status.UPDATE_COMPLETE, self.cluster3.status)
        self.assertEqual('fake_reason_33', self.cluster3.status_reason)
        mock_db_destroy.assert_called_once_with(self.cluster4.uuid)
        self.assertEqual(cluster_status.ROLLBACK_COMPLETE,
                         self.cluster5.status)
        self.assertEqual('fake_reason_55', self.cluster5.status_reason)
        notifications = fake_notifier.NOTIFICATIONS
        self.assertEqual(4, len(notifications))