add name for audit, changes for python-watcherclient
Change-Id: I9000018459913cd3107814e34977525eb3da10f4 Implements:blueprint add-name-for-audit
This commit is contained in:
@@ -68,7 +68,7 @@ Once you have an watcher `Client`_, you can perform various tasks::
|
||||
|
||||
>>> watcher.action.list() # list of actions
|
||||
>>> watcher.action_plan.list() # list of action_plan
|
||||
>>> watcher.audit.get(audit_uuid) # information about a particular audit
|
||||
>>> watcher.audit.get(audit_uuid_or_name) # information about a particular audit
|
||||
|
||||
When the `Client`_ needs to propagate an exception, it will usually
|
||||
raise an instance subclassed from
|
||||
|
@@ -22,7 +22,7 @@ class AuditTests(base.TestCase):
|
||||
"""Functional tests for audit."""
|
||||
|
||||
dummy_name = 'dummy'
|
||||
list_fields = ['UUID', 'Audit Type', 'State', 'Goal', 'Strategy']
|
||||
list_fields = ['UUID', 'Name', 'Audit Type', 'State', 'Goal', 'Strategy']
|
||||
detailed_list_fields = list_fields + ['Created At', 'Updated At',
|
||||
'Deleted At', 'Parameters',
|
||||
'Interval', 'Audit Scope',
|
||||
@@ -71,7 +71,7 @@ class AuditTests(base.TestCase):
|
||||
|
||||
class AuditActiveTests(base.TestCase):
|
||||
|
||||
list_fields = ['UUID', 'Audit Type', 'State', 'Goal', 'Strategy']
|
||||
list_fields = ['UUID', 'Name', 'Audit Type', 'State', 'Goal', 'Strategy']
|
||||
detailed_list_fields = list_fields + ['Created At', 'Updated At',
|
||||
'Deleted At', 'Parameters',
|
||||
'Interval', 'Audit Scope']
|
||||
|
94
watcherclient/tests/unit/v1/test_audit_shell.py
Normal file → Executable file
94
watcherclient/tests/unit/v1/test_audit_shell.py
Normal file → Executable file
@@ -17,7 +17,6 @@ import datetime
|
||||
import mock
|
||||
import six
|
||||
|
||||
from watcherclient import exceptions
|
||||
from watcherclient import shell
|
||||
from watcherclient.tests.unit.v1 import base
|
||||
from watcherclient import v1 as resource
|
||||
@@ -69,6 +68,7 @@ AUDIT_1 = {
|
||||
'scope': '',
|
||||
'auto_trigger': False,
|
||||
'next_run_time': None,
|
||||
'name': 'my_audit1',
|
||||
}
|
||||
|
||||
AUDIT_2 = {
|
||||
@@ -87,6 +87,7 @@ AUDIT_2 = {
|
||||
'scope': '',
|
||||
'auto_trigger': False,
|
||||
'next_run_time': None,
|
||||
'name': 'my_audit2',
|
||||
}
|
||||
|
||||
AUDIT_3 = {
|
||||
@@ -105,6 +106,7 @@ AUDIT_3 = {
|
||||
'scope': '',
|
||||
'auto_trigger': True,
|
||||
'next_run_time': None,
|
||||
'name': 'my_audit3',
|
||||
}
|
||||
|
||||
|
||||
@@ -202,14 +204,19 @@ class AuditShellTest(base.CommandTestCase):
|
||||
self.m_audit_mgr.get.assert_called_once_with(
|
||||
'5869da81-4876-4687-a1ed-12cd64cf53d9')
|
||||
|
||||
def test_do_audit_show_by_not_uuid(self):
|
||||
self.m_audit_mgr.get.side_effect = exceptions.HTTPNotFound
|
||||
def test_do_audit_show_by_name(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
self.m_audit_mgr.get.return_value = audit
|
||||
|
||||
exit_code, result = self.run_cmd(
|
||||
'audit show not_uuid', formatting=None)
|
||||
'audit show my_audit')
|
||||
|
||||
self.assertEqual(1, exit_code)
|
||||
self.assertEqual('', result)
|
||||
self.assertEqual(0, exit_code)
|
||||
self.assertEqual(
|
||||
self.resource_as_dict(audit, self.FIELDS, self.FIELD_LABELS),
|
||||
result)
|
||||
self.m_audit_mgr.get.assert_called_once_with(
|
||||
'my_audit')
|
||||
|
||||
def test_do_audit_delete(self):
|
||||
self.m_audit_mgr.delete.return_value = ''
|
||||
@@ -223,6 +230,18 @@ class AuditShellTest(base.CommandTestCase):
|
||||
self.m_audit_mgr.delete.assert_called_once_with(
|
||||
'5869da81-4876-4687-a1ed-12cd64cf53d9')
|
||||
|
||||
def test_do_audit_delete_by_name(self):
|
||||
self.m_audit_mgr.delete.return_value = ''
|
||||
|
||||
exit_code, result = self.run_cmd(
|
||||
'audit delete my_audit',
|
||||
formatting=None)
|
||||
|
||||
self.assertEqual(0, exit_code)
|
||||
self.assertEqual('', result)
|
||||
self.m_audit_mgr.delete.assert_called_once_with(
|
||||
'my_audit')
|
||||
|
||||
def test_do_audit_delete_multiple(self):
|
||||
self.m_audit_mgr.delete.return_value = ''
|
||||
|
||||
@@ -238,16 +257,6 @@ class AuditShellTest(base.CommandTestCase):
|
||||
self.m_audit_mgr.delete.assert_any_call(
|
||||
'5b157edd-5a7e-4aaa-b511-f7b33ec86e9f')
|
||||
|
||||
def test_do_audit_delete_with_not_uuid(self):
|
||||
self.m_audit_mgr.delete.return_value = ''
|
||||
|
||||
exit_code, result = self.run_cmd(
|
||||
'audit delete not_uuid',
|
||||
formatting=None)
|
||||
|
||||
self.assertEqual(1, exit_code)
|
||||
self.assertEqual('', result)
|
||||
|
||||
def test_do_audit_update(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
self.m_audit_mgr.update.return_value = audit
|
||||
@@ -264,14 +273,20 @@ class AuditShellTest(base.CommandTestCase):
|
||||
'5869da81-4876-4687-a1ed-12cd64cf53d9',
|
||||
[{'op': 'replace', 'path': '/state', 'value': 'PENDING'}])
|
||||
|
||||
def test_do_audit_update_with_not_uuid(self):
|
||||
self.m_audit_mgr.update.return_value = ''
|
||||
def test_do_audit_update_by_name(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
self.m_audit_mgr.update.return_value = audit
|
||||
|
||||
exit_code, result = self.run_cmd(
|
||||
'audit update not_uuid replace state=PENDING', formatting=None)
|
||||
'audit update my_audit replace state=PENDING')
|
||||
|
||||
self.assertEqual(1, exit_code)
|
||||
self.assertEqual('', result)
|
||||
self.assertEqual(0, exit_code)
|
||||
self.assertEqual(
|
||||
self.resource_as_dict(audit, self.FIELDS, self.FIELD_LABELS),
|
||||
result)
|
||||
self.m_audit_mgr.update.assert_called_once_with(
|
||||
'my_audit',
|
||||
[{'op': 'replace', 'path': '/state', 'value': 'PENDING'}])
|
||||
|
||||
def test_do_audit_create_with_audit_template_uuid(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_3)
|
||||
@@ -288,7 +303,9 @@ class AuditShellTest(base.CommandTestCase):
|
||||
result)
|
||||
self.m_audit_mgr.create.assert_called_once_with(
|
||||
audit_template_uuid='f8e47706-efcf-49a4-a5c4-af604eb492f2',
|
||||
audit_type='ONESHOT', auto_trigger=False)
|
||||
audit_type='ONESHOT',
|
||||
auto_trigger=False
|
||||
)
|
||||
|
||||
def test_do_audit_create_with_audit_template_name(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_3)
|
||||
@@ -305,7 +322,8 @@ class AuditShellTest(base.CommandTestCase):
|
||||
self.m_audit_mgr.create.assert_called_once_with(
|
||||
audit_template_uuid='f8e47706-efcf-49a4-a5c4-af604eb492f2',
|
||||
auto_trigger=False,
|
||||
audit_type='ONESHOT')
|
||||
audit_type='ONESHOT'
|
||||
)
|
||||
|
||||
def test_do_audit_create_with_goal(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
@@ -356,7 +374,9 @@ class AuditShellTest(base.CommandTestCase):
|
||||
result)
|
||||
self.m_audit_mgr.create.assert_called_once_with(
|
||||
goal='fc087747-61be-4aad-8126-b701731ae836',
|
||||
auto_trigger=False, audit_type='ONESHOT')
|
||||
auto_trigger=False,
|
||||
audit_type='ONESHOT'
|
||||
)
|
||||
|
||||
def test_do_audit_create_with_parameter(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
@@ -374,7 +394,8 @@ class AuditShellTest(base.CommandTestCase):
|
||||
goal='fc087747-61be-4aad-8126-b701731ae836',
|
||||
audit_type='ONESHOT',
|
||||
auto_trigger=False,
|
||||
parameters={'para1': 10, 'para2': 20})
|
||||
parameters={'para1': 10, 'para2': 20}
|
||||
)
|
||||
|
||||
def test_do_audit_create_with_type_continuous(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
@@ -392,4 +413,25 @@ class AuditShellTest(base.CommandTestCase):
|
||||
goal='fc087747-61be-4aad-8126-b701731ae836',
|
||||
audit_type='CONTINUOUS',
|
||||
auto_trigger=False,
|
||||
interval='3600')
|
||||
interval='3600'
|
||||
)
|
||||
|
||||
def test_do_audit_create_with_name(self):
|
||||
audit = resource.Audit(mock.Mock(), AUDIT_1)
|
||||
self.m_audit_mgr.create.return_value = audit
|
||||
|
||||
exit_code, result = self.run_cmd(
|
||||
'audit create -g fc087747-61be-4aad-8126-b701731ae836 '
|
||||
'-t CONTINUOUS -i 3600 --name my_audit')
|
||||
|
||||
self.assertEqual(0, exit_code)
|
||||
self.assertEqual(
|
||||
self.resource_as_dict(audit, self.FIELDS, self.FIELD_LABELS),
|
||||
result)
|
||||
self.m_audit_mgr.create.assert_called_once_with(
|
||||
goal='fc087747-61be-4aad-8126-b701731ae836',
|
||||
audit_type='CONTINUOUS',
|
||||
auto_trigger=False,
|
||||
interval='3600',
|
||||
name='my_audit'
|
||||
)
|
||||
|
@@ -19,7 +19,8 @@ from watcherclient import exceptions as exc
|
||||
|
||||
|
||||
CREATION_ATTRIBUTES = ['audit_template_uuid', 'audit_type', 'interval',
|
||||
'parameters', 'goal', 'strategy', 'auto_trigger']
|
||||
'parameters', 'goal', 'strategy', 'auto_trigger',
|
||||
'name']
|
||||
|
||||
|
||||
class Audit(base.Resource):
|
||||
@@ -38,8 +39,7 @@ class AuditManager(base.Manager):
|
||||
sort_dir=None, detail=False, goal=None, strategy=None):
|
||||
"""Retrieve a list of audit.
|
||||
|
||||
:param audit_template: Name of the audit
|
||||
:param name: Name of the audit
|
||||
:param audit_template: Name of the audit template
|
||||
:param limit: The maximum number of results to return per
|
||||
request, if:
|
||||
|
||||
@@ -92,14 +92,14 @@ class AuditManager(base.Manager):
|
||||
raise exc.InvalidAttribute()
|
||||
return self._create(self._path(), new)
|
||||
|
||||
def get(self, audit_id):
|
||||
def get(self, audit):
|
||||
try:
|
||||
return self._list(self._path(audit_id))[0]
|
||||
return self._list(self._path(audit))[0]
|
||||
except IndexError:
|
||||
return None
|
||||
|
||||
def delete(self, audit_id):
|
||||
return self._delete(self._path(audit_id))
|
||||
def delete(self, audit):
|
||||
return self._delete(self._path(audit))
|
||||
|
||||
def update(self, audit_id, patch):
|
||||
return self._update(self._path(audit_id), patch)
|
||||
def update(self, audit, patch):
|
||||
return self._update(self._path(audit), patch)
|
||||
|
@@ -31,7 +31,7 @@ class ShowAudit(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'audit',
|
||||
metavar='<audit>',
|
||||
help=_('UUID of the audit'),
|
||||
help=_('UUID or name of the audit'),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -175,13 +175,19 @@ class CreateAudit(command.ShowOne):
|
||||
default=False,
|
||||
help=_('Trigger automatically action plan '
|
||||
'once audit is succeeded.'))
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
dest='name',
|
||||
metavar='<name>',
|
||||
help=_('Name for this audit.'))
|
||||
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = getattr(self.app.client_manager, "infra-optim")
|
||||
|
||||
field_list = ['audit_template_uuid', 'audit_type', 'parameters',
|
||||
'interval', 'goal', 'strategy', 'auto_trigger']
|
||||
'interval', 'goal', 'strategy', 'auto_trigger', 'name']
|
||||
|
||||
fields = dict((k, v) for (k, v) in vars(parsed_args).items()
|
||||
if k in field_list and v is not None)
|
||||
@@ -219,7 +225,7 @@ class UpdateAudit(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'audit',
|
||||
metavar='<audit>',
|
||||
help=_("UUID of the audit."))
|
||||
help=_("UUID or name of the audit."))
|
||||
parser.add_argument(
|
||||
'op',
|
||||
metavar='<op>',
|
||||
@@ -239,9 +245,6 @@ class UpdateAudit(command.ShowOne):
|
||||
def take_action(self, parsed_args):
|
||||
client = getattr(self.app.client_manager, "infra-optim")
|
||||
|
||||
if not uuidutils.is_uuid_like(parsed_args.audit):
|
||||
raise exceptions.ValidationError()
|
||||
|
||||
patch = common_utils.args_array_to_patch(
|
||||
parsed_args.op, parsed_args.attributes[0],
|
||||
exclude_fields=['/interval'])
|
||||
@@ -263,7 +266,7 @@ class DeleteAudit(command.Command):
|
||||
'audits',
|
||||
metavar='<audit>',
|
||||
nargs='+',
|
||||
help=_('UUID of the audit'),
|
||||
help=_('UUID or name of the audit'),
|
||||
)
|
||||
return parser
|
||||
|
||||
@@ -271,7 +274,4 @@ class DeleteAudit(command.Command):
|
||||
client = getattr(self.app.client_manager, "infra-optim")
|
||||
|
||||
for audit in parsed_args.audits:
|
||||
if not uuidutils.is_uuid_like(audit):
|
||||
raise exceptions.ValidationError()
|
||||
|
||||
client.audit.delete(audit)
|
||||
|
@@ -30,20 +30,20 @@ AUDIT_TEMPLATE_SHORT_LIST_FIELDS = [
|
||||
AUDIT_TEMPLATE_SHORT_LIST_FIELD_LABELS = ['UUID', 'Name', 'Goal', 'Strategy']
|
||||
|
||||
# Audit
|
||||
AUDIT_FIELDS = ['uuid', 'created_at', 'updated_at', 'deleted_at',
|
||||
AUDIT_FIELDS = ['uuid', 'name', 'created_at', 'updated_at', 'deleted_at',
|
||||
'state', 'audit_type', 'parameters', 'interval', 'goal_name',
|
||||
'strategy_name', 'scope', 'auto_trigger', 'next_run_time']
|
||||
|
||||
AUDIT_FIELD_LABELS = ['UUID', 'Created At', 'Updated At', 'Deleted At',
|
||||
AUDIT_FIELD_LABELS = ['UUID', 'Name', 'Created At', 'Updated At', 'Deleted At',
|
||||
'State', 'Audit Type', 'Parameters', 'Interval', 'Goal',
|
||||
'Strategy', 'Audit Scope', 'Auto Trigger',
|
||||
'Next Run Time']
|
||||
|
||||
AUDIT_SHORT_LIST_FIELDS = ['uuid', 'audit_type',
|
||||
AUDIT_SHORT_LIST_FIELDS = ['uuid', 'name', 'audit_type',
|
||||
'state', 'goal_name', 'strategy_name',
|
||||
'auto_trigger']
|
||||
|
||||
AUDIT_SHORT_LIST_FIELD_LABELS = ['UUID', 'Audit Type', 'State', 'Goal',
|
||||
AUDIT_SHORT_LIST_FIELD_LABELS = ['UUID', 'Name', 'Audit Type', 'State', 'Goal',
|
||||
'Strategy', 'Auto Trigger']
|
||||
|
||||
# Action Plan
|
||||
|
Reference in New Issue
Block a user