1#
2# Copyright (c) 2014 NSONE, Inc.
3#
4# License under The MIT License (MIT). See LICENSE in project root.
5#
6
7from ns1.rest.monitoring import Monitors
8
9
10class MonitorException(Exception):
11    pass
12
13
14class Monitor(object):
15
16    """
17    High level object representing a Monitor
18    """
19
20    def __init__(self, config, data=None):
21        """
22        Create a new high level Monitor object
23
24        :param ns1.config.Config config: config object
25        """
26        self._rest = Monitors(config)
27        self.config = config
28        if data:
29            self.data = data
30        else:
31            self.data = None
32
33    def __repr__(self):
34        return "<Monitor monitor=%s with id=%s>" % (
35            self.data["name"],
36            self.data["id"],
37        )
38
39    def __getitem__(self, item):
40        return self.data.get(item, None)
41
42    def reload(self, callback=None, errback=None):
43        """
44        Reload monitor data from the API.
45        """
46        return self.load(reload=True, callback=callback, errback=errback)
47
48    def load(self, callback=None, errback=None, reload=False):
49        """
50        Load monitor data from the API.
51        """
52        if not reload and self.data:
53            raise MonitorException("monitor already loaded")
54
55        def success(result, *args):
56            self.data = result
57            if callback:
58                return callback(self)
59            else:
60                return self
61
62        return self._rest.retrieve(
63            self.data["id"], callback=success, errback=errback
64        )
65
66    def delete(self, callback=None, errback=None):
67        """
68        Delete the monitor
69        """
70        return self._rest.delete(
71            self.data["id"], callback=callback, errback=errback
72        )
73
74    def update(self, callback=None, errback=None, **kwargs):
75        """
76        Update monitor configuration. Pass a list of keywords and their values to
77        update.
78        """
79        if not self.data:
80            raise MonitorException("monitor not loaded")
81
82        def success(result, *args):
83            self.data = result
84            if callback:
85                return callback(self)
86            else:
87                return self
88
89        return self._rest.update(
90            self.data["id"], {}, callback=success, errback=errback, **kwargs
91        )
92
93    def create(self, callback=None, errback=None, **kwargs):
94        """
95        Create a new monitoring job. Pass a list of keywords and their values to
96        configure
97        """
98        if self.data:
99            raise MonitorException("monitor already loaded")
100
101        def success(result, *args):
102            self.data = result
103            if callback:
104                return callback(self)
105            else:
106                return self
107
108        return self._rest.create(
109            {}, callback=success, errback=errback, **kwargs
110        )
111