Skip to content

Commit 4311e96

Browse files
authored
Add commands for notes endpoints (#210)
1 parent 1d10a78 commit 4311e96

6 files changed

Lines changed: 125 additions & 30 deletions

File tree

.pre-commit-config.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks.git
3-
rev: v1.4.0
3+
rev: v2.5.0
44
hooks:
55
- id: check-added-large-files
66
- id: check-ast
@@ -23,16 +23,16 @@ repos:
2323
- id: requirements-txt-fixer
2424
- id: trailing-whitespace
2525
- repo: https://github.com/pre-commit/mirrors-autopep8
26-
rev: v1.5
26+
rev: v1.5.1
2727
hooks:
2828
- id: autopep8
2929
- repo: https://github.com/asottile/pyupgrade
30-
rev: v1.26.2
30+
rev: v2.1.1
3131
hooks:
3232
- id: pyupgrade
3333
args: ['--py3-plus']
3434
- repo: https://github.com/asottile/seed-isort-config
35-
rev: v1.9.4
35+
rev: v2.1.1
3636
hooks:
3737
- id: seed-isort-config
3838
- repo: https://github.com/pre-commit/mirrors-isort

alertaclient/api.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from alertaclient.models.heartbeat import Heartbeat
2121
from alertaclient.models.history import RichHistory
2222
from alertaclient.models.key import ApiKey
23+
from alertaclient.models.note import Note
2324
from alertaclient.models.permission import Permission
2425
from alertaclient.models.user import User
2526
from alertaclient.utils import CustomJsonEncoder, DateTime
@@ -97,12 +98,6 @@ def update_attributes(self, id, attributes):
9798
}
9899
return self.http.put('/alert/%s/attributes' % id, data)
99100

100-
def add_note(self, id, note):
101-
data = {
102-
'note': note
103-
}
104-
return self.http.put('/alert/%s/note' % id, data)
105-
106101
def delete_alert(self, id):
107102
return self.http.delete('/alert/%s' % id)
108103

@@ -149,6 +144,25 @@ def get_tags(self, query=None):
149144
r = self.http.get('/alerts/tags', query)
150145
return r['tags']
151146

147+
def alert_note(self, id, note):
148+
data = {
149+
'note': note
150+
}
151+
return self.http.put('/alert/%s/note' % id, data)
152+
153+
def get_alert_notes(self, id, page=1, page_size=None):
154+
r = self.http.get('/alert/{}/notes'.format(id), page=page, page_size=page_size)
155+
return [Note.parse(b) for b in r['notes']]
156+
157+
def update_alert_note(self, id, note_id, text):
158+
data = {
159+
'text': text,
160+
}
161+
self.http.put('/alert/{}/note/{}'.format(id, note_id), data)
162+
163+
def delete_alert_note(self, id, note_id):
164+
return self.http.delete('/alert/{}/note/{}'.format(id, note_id))
165+
152166
# Blackouts
153167
def create_blackout(self, environment, service=None, resource=None, event=None, group=None, tags=None, customer=None, start=None, duration=None, text=None):
154168
data = {
@@ -313,7 +327,7 @@ def create_user(self, name, email, password, status, roles=None, attributes=None
313327
return User.parse(r['user'])
314328

315329
def get_user(self):
316-
return Permission.parse(self.http.get('/user/%s' % id)['user'])
330+
return User.parse(self.http.get('/user/%s' % id)['user'])
317331

318332
def get_user_groups(self, id):
319333
r = self.http.get('/user/{}/groups'.format(id))
@@ -414,7 +428,7 @@ def get_users_groups(self, query=None):
414428
r = self.http.get('/groups', query)
415429
return [Group.parse(g) for g in r['groups']]
416430

417-
def update_group(self, id, kwargs):
431+
def update_group(self, id, **kwargs):
418432
data = {
419433
'name': kwargs.get('name'),
420434
'text': kwargs.get('text')

alertaclient/commands/cmd_note.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,30 @@
33
from alertaclient.utils import build_query
44

55

6-
@click.command('note', short_help='Add note to alerts')
7-
@click.option('--ids', '-i', metavar='UUID', multiple=True, help='List of alert IDs (can use short 8-char id)')
6+
@click.command('note', short_help='Add note')
7+
@click.option('--ids', '-i', metavar='UUID', multiple=True, help='List of note IDs')
8+
@click.option('--alert-ids', '-i', metavar='UUID', multiple=True, help='List of alert IDs (can use short 8-char id)')
89
@click.option('--query', '-q', 'query', metavar='QUERY', help='severity:"warning" AND resource:web')
910
@click.option('--filter', '-f', 'filters', metavar='FILTER', multiple=True, help='KEY=VALUE eg. serverity=warning resource=web')
10-
@click.option('--text', required=True, help='Note or message')
11+
@click.option('--text', help='Note or message')
12+
@click.option('--delete', '-D', metavar='ID', nargs=2, help='Delete note parent ID and note ID')
1113
@click.pass_obj
12-
def cli(obj, ids, query, filters, text):
13-
"""Add note to alerts."""
14+
def cli(obj, ids, alert_ids, query, filters, text, delete):
15+
"""Add or delete note to alerts."""
1416
client = obj['client']
15-
if ids:
16-
total = len(ids)
17+
if delete:
18+
client.delete_alert_note(*delete)
1719
else:
18-
if query:
19-
query = [('q', query)]
20+
if alert_ids:
21+
total = len(alert_ids)
2022
else:
21-
query = build_query(filters)
22-
total, _, _ = client.get_count(query)
23-
ids = [a.id for a in client.get_alerts(query)]
23+
if query:
24+
query = [('q', query)]
25+
else:
26+
query = build_query(filters)
27+
total, _, _ = client.get_count(query)
28+
alert_ids = [a.id for a in client.get_alerts(query)]
2429

25-
with click.progressbar(ids, label='Add note to {} alerts'.format(total)) as bar:
26-
for id in bar:
27-
client.add_note(id, note=text)
30+
with click.progressbar(alert_ids, label='Add note to {} alerts'.format(total)) as bar:
31+
for id in bar:
32+
client.alert_note(id, note=text)

alertaclient/commands/cmd_notes.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import json
2+
3+
import click
4+
from tabulate import tabulate
5+
6+
7+
@click.command('notes', short_help='List notes')
8+
@click.option('--alert-id', '-i', metavar='UUID', help='alert IDs (can use short 8-char id)')
9+
@click.pass_obj
10+
def cli(obj, alert_id):
11+
"""List notes."""
12+
client = obj['client']
13+
if alert_id:
14+
if obj['output'] == 'json':
15+
r = client.http.get('/alert/{}/notes'.format(alert_id))
16+
click.echo(json.dumps(r['notes'], sort_keys=True, indent=4, ensure_ascii=False))
17+
else:
18+
timezone = obj['timezone']
19+
headers = {
20+
'id': 'NOTE ID', 'text': 'NOTE', 'user': 'USER', 'type': 'TYPE', 'attributes': 'ATTRIBUTES',
21+
'createTime': 'CREATED', 'updateTime': 'UPDATED', 'related': 'RELATED ID', 'customer': 'CUSTOMER'
22+
}
23+
click.echo(tabulate([n.tabular(timezone) for n in client.get_alert_notes(alert_id)], headers=headers, tablefmt=obj['output']))
24+
else:
25+
raise click.UsageError('Need "--alert-id" to list notes.')

alertaclient/models/note.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from datetime import datetime
2+
3+
from alertaclient.utils import DateTime
4+
5+
6+
class Note:
7+
8+
def __init__(self, text, user, note_type, **kwargs):
9+
10+
self.id = kwargs.get('id', None)
11+
self.text = text
12+
self.user = user
13+
self.note_type = note_type
14+
self.attributes = kwargs.get('attributes', None) or dict()
15+
self.create_time = kwargs['create_time'] if 'create_time' in kwargs else datetime.utcnow()
16+
self.update_time = kwargs.get('update_time')
17+
self.alert = kwargs.get('alert')
18+
self.customer = kwargs.get('customer')
19+
20+
@classmethod
21+
def parse(cls, json):
22+
return Note(
23+
id=json.get('id', None),
24+
text=json.get('text', None),
25+
user=json.get('user', None),
26+
attributes=json.get('attributes', dict()),
27+
note_type=json.get('type', None),
28+
create_time=DateTime.parse(json['createTime']) if 'createTime' in json else None,
29+
update_time=DateTime.parse(json['updateTime']) if 'updateTime' in json else None,
30+
alert=json.get('related', {}).get('alert'),
31+
customer=json.get('customer', None)
32+
)
33+
34+
def __repr__(self):
35+
return 'Note(id={!r}, text={!r}, user={!r}, type={!r}, customer={!r})'.format(
36+
self.id, self.text, self.user, self.note_type, self.customer
37+
)
38+
39+
def tabular(self, timezone=None):
40+
note = {
41+
'id': self.id,
42+
'text': self.text,
43+
'user': self.user,
44+
# 'attributes': self.attributes,
45+
'type': self.note_type,
46+
'createTime': DateTime.localtime(self.create_time, timezone),
47+
'updateTime': DateTime.localtime(self.update_time, timezone),
48+
'related': self.alert,
49+
'customer': self.customer
50+
}
51+
return note

tests/test_notes.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ class NotesTestCase(unittest.TestCase):
1010
def setUp(self):
1111
self.client = Client()
1212

13-
self.key = """
13+
self.note = """
1414
{
1515
"status": "ok"
1616
}
1717
"""
1818

1919
@requests_mock.mock()
2020
def test_add_note(self, m):
21-
m.put('http://localhost:8080/alert/e7020428-5dad-4a41-9bfe-78e9d55cda06/note', text=self.key)
22-
r = self.client.add_note(id='e7020428-5dad-4a41-9bfe-78e9d55cda06', note='this is a test note')
21+
m.put('http://localhost:8080/alert/e7020428-5dad-4a41-9bfe-78e9d55cda06/note', text=self.note)
22+
r = self.client.alert_note(id='e7020428-5dad-4a41-9bfe-78e9d55cda06', note='this is a test note')
2323
self.assertEqual(r['status'], 'ok')

0 commit comments

Comments
 (0)