
osc-lib library is foundation on which a CLI client for openstack can be built. It is meant to facilitate several aspects, that were previously hard-coded in client: * keystone communication handling * supporting multiple authentication methods (not only password) * common authentication parameters (i.e. environmental OS_*) * communicating over http with service endpoint * interactive CLI mode Thanks to those items, it was possible not only to drop nearly 3k lines of code and replace them with osc-lib but also increase reliabity of the client in terms of new openstack releases. Also it allowed to greatly simpify existing set of unit-tests. They are now testing only actual logic instead of mocking entire process of calling shell (i.e. MonascaShell.run(args)) or mocking HTTP communication. Both items are handled by osc-lib thus not they are not subject of monascaclient unit tests layers. Note: This change is partial integration with osc-lib and its main purpose is to move the responsibility of: * keystone communication * rest-ful communication with service endpoint to underlying library thus allowing client to implement only necessary functionality and not supporting boilerplate code, mentioned above. Story: 2000995 Task: 4172 Change-Id: I1712a24739438e2d8331a495f18f357749a633c5
161 lines
5.6 KiB
Python
161 lines
5.6 KiB
Python
# Copyright 2017 FUJITSU LIMITED
|
|
#
|
|
# 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 oslotest import base
|
|
|
|
from monascaclient.osc import migration as migr
|
|
from monascaclient.v2_0 import notifications
|
|
from monascaclient.v2_0 import shell
|
|
|
|
|
|
class FakeV2Client(object):
|
|
|
|
def __init__(self):
|
|
super(FakeV2Client, self).__init__()
|
|
self.notifications = mock.Mock(spec=notifications.NotificationsManager)
|
|
|
|
|
|
class TestNotificationsShellV2(base.BaseTestCase):
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_notification_create_email(self, mc):
|
|
mc.return_value = c = FakeV2Client()
|
|
|
|
raw_args = ['email1', 'EMAIL', 'john.doe@hp.com']
|
|
name, cmd_clazz = migr.create_command_class('do_notification_create',
|
|
shell)
|
|
cmd = cmd_clazz(mock.Mock(), mock.Mock())
|
|
|
|
parser = cmd.get_parser(name)
|
|
parsed_args = parser.parse_args(raw_args)
|
|
cmd.run(parsed_args)
|
|
|
|
data = {'name': 'email1',
|
|
'type': 'EMAIL',
|
|
'address': 'john.doe@hp.com'}
|
|
|
|
c.notifications.create.assert_called_once_with(**data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_notification_create_webhook(self, mc):
|
|
mc.return_value = c = FakeV2Client()
|
|
|
|
raw_args = ['mypost', 'WEBHOOK', 'http://localhost:8080']
|
|
name, cmd_clazz = migr.create_command_class('do_notification_create',
|
|
shell)
|
|
cmd = cmd_clazz(mock.Mock(), mock.Mock())
|
|
|
|
parser = cmd.get_parser(name)
|
|
parsed_args = parser.parse_args(raw_args)
|
|
cmd.run(parsed_args)
|
|
|
|
data = {'name': 'mypost',
|
|
'type': 'WEBHOOK',
|
|
'address': 'http://localhost:8080'}
|
|
|
|
c.notifications.create.assert_called_once_with(**data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_good_notifications_patch(self, mc):
|
|
args = '--type EMAIL --address john.doe@hpe.com --period 0'
|
|
data = {'type': 'EMAIL',
|
|
'address': 'john.doe@hpe.com',
|
|
'period': 0}
|
|
self._patch_test(mc, args, data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_good_notifications_patch_just_name(self, mc):
|
|
name = 'fred'
|
|
args = '--name ' + name
|
|
data = {'name': name}
|
|
self._patch_test(mc, args, data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_good_notifications_patch_just_address(self, mc):
|
|
address = 'fred@fl.com'
|
|
args = '--address ' + address
|
|
data = {'address': address}
|
|
self._patch_test(mc, args, data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_good_notifications_patch_just_period(self, mc):
|
|
period = 0
|
|
args = '--period ' + str(period)
|
|
data = {'period': period}
|
|
self._patch_test(mc, args, data)
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_bad_notifications_patch(self, mc):
|
|
mc.return_value = c = FakeV2Client()
|
|
|
|
id_str = '0495340b-58fd-4e1c-932b-5e6f9cc96490'
|
|
raw_args = ('{0} --type EMAIL --address john.doe@hpe.com '
|
|
'--period 60').format(id_str).split(' ')
|
|
name, cmd_clazz = migr.create_command_class('do_notification_patch',
|
|
shell)
|
|
cmd = cmd_clazz(mock.Mock(), mock.Mock())
|
|
|
|
parser = cmd.get_parser(name)
|
|
parsed_args = parser.parse_args(raw_args)
|
|
cmd.run(parsed_args)
|
|
|
|
c.notifications.patch.assert_not_called()
|
|
|
|
@mock.patch('monascaclient.osc.migration.make_client')
|
|
def test_good_notifications_update(self, mc):
|
|
mc.return_value = c = FakeV2Client()
|
|
|
|
id_str = '0495340b-58fd-4e1c-932b-5e6f9cc96491'
|
|
raw_args = ('{0} notification_updated_name '
|
|
'EMAIL john.doe@hpe.com 0').format(id_str).split(' ')
|
|
name, cmd_clazz = migr.create_command_class('do_notification_update',
|
|
shell)
|
|
cmd = cmd_clazz(mock.Mock(), mock.Mock())
|
|
|
|
parser = cmd.get_parser(name)
|
|
parsed_args = parser.parse_args(raw_args)
|
|
|
|
cmd.run(parsed_args)
|
|
|
|
data = {
|
|
'name': 'notification_updated_name',
|
|
'type': 'EMAIL',
|
|
'address': 'john.doe@hpe.com',
|
|
'period': 0,
|
|
'notification_id': id_str
|
|
}
|
|
|
|
c.notifications.update.assert_called_once_with(**data)
|
|
|
|
@staticmethod
|
|
def _patch_test(mc, args, data):
|
|
mc.return_value = c = FakeV2Client()
|
|
|
|
id_str = '0495340b-58fd-4e1c-932b-5e6f9cc96490'
|
|
raw_args = '{0} {1}'.format(id_str, args).split(' ')
|
|
name, cmd_clazz = migr.create_command_class('do_notification_patch',
|
|
shell)
|
|
cmd = cmd_clazz(mock.Mock(), mock.Mock())
|
|
|
|
parser = cmd.get_parser(name)
|
|
parsed_args = parser.parse_args(raw_args)
|
|
cmd.run(parsed_args)
|
|
|
|
# add notification_id to data
|
|
data['notification_id'] = id_str
|
|
|
|
c.notifications.patch.assert_called_once_with(**data)
|