-
Notifications
You must be signed in to change notification settings - Fork 305
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[dashboard list] Add new endpoints + dog cmd for dashboard lists #252
Changes from 1 commit
e1785bd
656fd0c
469d395
d57c5c7
d418810
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
from datadog.api.resources import ( | ||
ActionAPIResource, | ||
CreateableAPIResource, | ||
DeletableAPIResource, | ||
GetableAPIResource, | ||
ListableAPIResource, | ||
UpdatableAPIResource | ||
) | ||
|
||
class DashboardList(ActionAPIResource, CreateableAPIResource, DeletableAPIResource, GetableAPIResource, | ||
ListableAPIResource, UpdatableAPIResource): | ||
""" | ||
A wrapper around Dashboard List HTTP API. | ||
""" | ||
_class_url = '/dashboard/lists/manual' | ||
|
||
@classmethod | ||
def get_dashboards(cls, id, **params): | ||
""" | ||
Get dashboards for a dashboard list. | ||
|
||
:returns: Dictionary representing the API's JSON response | ||
""" | ||
return super(DashboardList, cls)._trigger_class_action('GET', 'dashboards', id, params) | ||
|
||
@classmethod | ||
def add_dashboards(cls, id, **body): | ||
""" | ||
Add dashboards to a dashboard list. | ||
|
||
:param dashboards: dashboards to add to the dashboard list | ||
:type dashboards: list of dashboard dicts, e.g. [{"type": "custom_timeboard", "id": 1104}] | ||
|
||
:returns: Dictionary representing the API's JSON response | ||
""" | ||
return super(DashboardList, cls)._trigger_class_action('POST', 'dashboards', id, params=None, **body) | ||
|
||
@classmethod | ||
def delete_dashboards(cls, id, **body): | ||
""" | ||
Delete dashboards from a dashboard list. | ||
|
||
:param dashboards: dashboards to delete from the dashboard list | ||
:type dashboards: list of dashboard dicts, e.g. [{"type": "custom_timeboard", "id": 1234}] | ||
|
||
:returns: Dictionary representing the API's JSON response | ||
""" | ||
return super(DashboardList, cls)._trigger_class_action('DELETE', 'dashboards', id, params=None, **body) |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,7 +8,7 @@ class Host(ActionAPIResource): | |
_class_url = '/host' | ||
|
||
@classmethod | ||
def mute(cls, host_name, **params): | ||
def mute(cls, host_name, **body): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
""" | ||
Mute a host. | ||
|
||
|
@@ -28,7 +28,7 @@ def mute(cls, host_name, **params): | |
:returns: Dictionary representing the API's JSON response | ||
|
||
""" | ||
return super(Host, cls)._trigger_class_action('POST', 'mute', host_name, **params) | ||
return super(Host, cls)._trigger_class_action('POST', 'mute', host_name, **body) | ||
|
||
@classmethod | ||
def unmute(cls, host_name): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -169,7 +169,7 @@ class ActionAPIResource(object): | |
Actionable API Resource | ||
""" | ||
@classmethod | ||
def _trigger_class_action(cls, method, name, id=None, **params): | ||
def _trigger_class_action(cls, method, name, id=None, params=None, **body): | ||
""" | ||
Trigger an action | ||
|
||
|
@@ -185,15 +185,20 @@ def _trigger_class_action(cls, method, name, id=None, **params): | |
:param params: action parameters | ||
:type params: dictionary | ||
|
||
:param body: action body | ||
:type body: dictionary | ||
|
||
:returns: Dictionary representing the API's JSON response | ||
""" | ||
if params is None: | ||
params = {} | ||
if id is None: | ||
return APIClient.submit(method, cls._class_url + "/" + name, params) | ||
return APIClient.submit(method, cls._class_url + "/" + name, body, **params) | ||
else: | ||
return APIClient.submit(method, cls._class_url + "/" + str(id) + "/" + name, params) | ||
return APIClient.submit(method, cls._class_url + "/" + str(id) + "/" + name, body, **params) | ||
|
||
@classmethod | ||
def _trigger_action(cls, method, name, id=None, **params): | ||
def _trigger_action(cls, method, name, id=None, **body): | ||
""" | ||
Trigger an action | ||
|
||
|
@@ -206,12 +211,12 @@ def _trigger_action(cls, method, name, id=None, **params): | |
:param id: trigger the action for the specified resource object | ||
:type id: id | ||
|
||
:param params: action parameters | ||
:type params: dictionary | ||
:param body: action body | ||
:type body: dictionary | ||
|
||
:returns: Dictionary representing the API's JSON response | ||
""" | ||
if id is None: | ||
return APIClient.submit(method, name, params) | ||
return APIClient.submit(method, name, body) | ||
else: | ||
return APIClient.submit(method, name + "/" + str(id), params) | ||
return APIClient.submit(method, name + "/" + str(id), body) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🍰 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
# 3p | ||
from datadog.util.format import pretty_json | ||
|
||
# datadog | ||
from datadog import api | ||
from datadog.dogshell.common import report_errors, report_warnings | ||
from datadog.util.compat import json | ||
|
||
class DashboardListClient(object): | ||
|
||
@classmethod | ||
def setup_parser(cls, subparsers): | ||
parser = subparsers.add_parser('dashboard_list', help="Create, edit, and delete dashboard lists") | ||
parser.add_argument('--string_ids', action='store_true', dest='string_ids', | ||
help="Represent dashboard list IDs as strings instead of ints in JSON") | ||
|
||
verb_parsers = parser.add_subparsers(title='Verbs', dest='verb') | ||
verb_parsers.required = True | ||
|
||
# Create Dashboard List parser | ||
post_parser = verb_parsers.add_parser('post', help="Create a dashboard list") | ||
post_parser.add_argument('name', help="Name for the dashboard list") | ||
post_parser.set_defaults(func=cls._post) | ||
|
||
# Update Dashboard List parser | ||
update_parser = verb_parsers.add_parser('update', help="Update existing dashboard list") | ||
update_parser.add_argument('dashboard_list_id', help="Dashboard list to replace with the new definition") | ||
update_parser.add_argument('name', help="Name for the dashboard list") | ||
update_parser.set_defaults(func=cls._update) | ||
|
||
# Show Dashboard List parser | ||
show_parser = verb_parsers.add_parser('show', help="Show a dashboard list definition") | ||
show_parser.add_argument('dashboard_list_id', help="Dashboard list to show") | ||
show_parser.set_defaults(func=cls._show) | ||
|
||
# Show All Dashboard Lists parser | ||
show_all_parser = verb_parsers.add_parser('show_all', help="Show a list of all dashboard lists") | ||
show_all_parser.set_defaults(func=cls._show_all) | ||
|
||
# Delete Dashboard List parser | ||
delete_parser = verb_parsers.add_parser('delete', help="Delete existing dashboard list") | ||
delete_parser.add_argument('dashboard_list_id', help="Dashboard list to delete") | ||
delete_parser.set_defaults(func=cls._delete) | ||
|
||
# Get Dashboards for Dashboard List parser | ||
get_dashboards_parser = verb_parsers.add_parser('show_dashboards', | ||
help="Show a list of all dashboards for an existing dashboard list") | ||
get_dashboards_parser.add_argument('dashboard_list_id', help="Dashboard list to show dashboards from") | ||
get_dashboards_parser.set_defaults(func=cls._show_dashboards) | ||
|
||
# Add Dashboards to Dashboard List parser | ||
add_dashboards_parser = verb_parsers.add_parser('add_dashboards', | ||
help="Add dashboards to an existing dashboard list") | ||
add_dashboards_parser.add_argument('dashboard_list_id', help="Dashboard list to add dashboards to") | ||
add_dashboards_parser.add_argument('dashboards', | ||
help='A JSON list of dashboard dicts, e.g. ' + | ||
'[{"type": "custom_timeboard", "id": 1234}, {"type": "custom_screenboard", "id": 123}]') | ||
add_dashboards_parser.set_defaults(func=cls._add_dashboards) | ||
|
||
# Delete Dashboards from Dashboard List parser | ||
delete_dashboards_parser = verb_parsers.add_parser('delete_dashboards', | ||
help="Delete dashboards from an existing dashboard list") | ||
delete_dashboards_parser.add_argument('dashboard_list_id', help="Dashboard list to delete dashboards from") | ||
delete_dashboards_parser.add_argument('dashboards', | ||
help='A JSON list of dashboard dicts, e.g. ' + | ||
'[{"type": "custom_timeboard", "id": 1234}, {"type": "custom_screenboard", "id": 123}]') | ||
delete_dashboards_parser.set_defaults(func=cls._delete_dashboards) | ||
|
||
@classmethod | ||
def _post(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
name = args.name | ||
|
||
res = api.DashboardList.create(name=name) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _update(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
name = args.name | ||
|
||
res = api.DashboardList.update(dashboard_list_id, name=name) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _show(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
|
||
res = api.DashboardList.get(dashboard_list_id) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if args.string_ids: | ||
res['id'] = str(res['id']) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _show_all(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
|
||
res = api.DashboardList.get_all() | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if args.string_ids: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've chatted with @yannmh about this logic, it's definitely a legacy behavior, I think there is little benefit in adding more instances of it. Let's not include it. |
||
for dashboard_list in res['dashboard_lists']: | ||
dashboard_list['id'] = str(dashboard_list['id']) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _delete(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
|
||
res = api.DashboardList.delete(dashboard_list_id) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _show_dashboards(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
|
||
res = api.DashboardList.get_dashboards(dashboard_list_id) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if args.string_ids: | ||
for dashboard in res['dashboards']: | ||
dashboard['id'] = str(dashboard['id']) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _add_dashboards(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
dashboards = json.loads(args.dashboards) | ||
|
||
res = api.DashboardList.add_dashboards(dashboard_list_id, dashboards=dashboards) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
||
@classmethod | ||
def _delete_dashboards(cls, args): | ||
api._timeout = args.timeout | ||
format = args.format | ||
dashboard_list_id = args.dashboard_list_id | ||
dashboards = json.loads(args.dashboards) | ||
|
||
res = api.DashboardList.delete_dashboards(dashboard_list_id, dashboards=dashboards) | ||
report_warnings(res) | ||
report_errors(res) | ||
|
||
if format == 'pretty': | ||
print(pretty_json(res)) | ||
else: | ||
print(json.dumps(res)) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should add a
PUT
method (..PATCH
ideally but it's better to be consistent with other api).This would allow people to modify dashboards in a list in an atomic way, without callling delete first. It comes in handy when people have lists stored somewhere in source control and want to make sure Datadog resources are in sync with what they have.