moira-python-client 4.3.0__tar.gz → 4.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/CHANGELOG.md +8 -0
  2. {moira_python_client-4.3.0/moira_python_client.egg-info → moira_python_client-4.3.2}/PKG-INFO +10 -2
  3. moira_python_client-4.3.2/VERSION.txt +1 -0
  4. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/client.py +26 -4
  5. moira_python_client-4.3.2/moira_client/models/team/__init__.py +8 -0
  6. moira_python_client-4.3.2/moira_client/models/team/_managers.py +96 -0
  7. moira_python_client-4.3.2/moira_client/models/team/_models.py +19 -0
  8. moira_python_client-4.3.2/moira_client/models/team/contact/__init__.py +5 -0
  9. moira_python_client-4.3.2/moira_client/models/team/contact/_managers.py +24 -0
  10. moira_python_client-4.3.2/moira_client/models/team/settings/__init__.py +7 -0
  11. moira_python_client-4.3.2/moira_client/models/team/settings/_managers.py +23 -0
  12. moira_python_client-4.3.2/moira_client/models/team/settings/_models.py +11 -0
  13. moira_python_client-4.3.2/moira_client/models/team/subscription/__init__.py +5 -0
  14. moira_python_client-4.3.2/moira_client/models/team/subscription/_managers.py +30 -0
  15. moira_python_client-4.3.2/moira_client/models/team/user/__init__.py +7 -0
  16. moira_python_client-4.3.2/moira_client/models/team/user/_managers.py +43 -0
  17. moira_python_client-4.3.2/moira_client/models/team/user/_models.py +6 -0
  18. {moira_python_client-4.3.0 → moira_python_client-4.3.2/moira_python_client.egg-info}/PKG-INFO +10 -2
  19. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_python_client.egg-info/SOURCES.txt +13 -0
  20. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/setup.py +6 -1
  21. moira_python_client-4.3.0/VERSION.txt +0 -1
  22. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/LICENSE +0 -0
  23. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/MANIFEST.in +0 -0
  24. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/README.md +0 -0
  25. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/__init__.py +0 -0
  26. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/__init__.py +0 -0
  27. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/base.py +0 -0
  28. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/config.py +0 -0
  29. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/contact.py +0 -0
  30. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/event.py +0 -0
  31. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/health.py +0 -0
  32. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/notification.py +0 -0
  33. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/pattern.py +0 -0
  34. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/subscription.py +0 -0
  35. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/tag.py +0 -0
  36. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/trigger.py +0 -0
  37. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/models/user.py +0 -0
  38. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_client/moira.py +0 -0
  39. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_python_client.egg-info/dependency_links.txt +0 -0
  40. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_python_client.egg-info/requires.txt +0 -0
  41. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/moira_python_client.egg-info/top_level.txt +0 -0
  42. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/requirements.txt +0 -0
  43. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/setup.cfg +0 -0
  44. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/test-requirements.txt +0 -0
  45. {moira_python_client-4.3.0 → moira_python_client-4.3.2}/tests/test_client.py +0 -0
@@ -1,3 +1,11 @@
1
+ # 4.3.2
2
+
3
+ The PATCH method should be used to update a team
4
+
5
+ # 4.3.1
6
+
7
+ Fix package issues
8
+
1
9
  # 4.3.0
2
10
 
3
11
  Add support for Team APIs
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: moira-python-client
3
- Version: 4.3.0
3
+ Version: 4.3.2
4
4
  Summary: Client for Moira - Alerting system based on Graphite data
5
5
  Home-page: https://github.com/moira-alert/python-moira-client
6
6
  Author: Alexander Lukyanchenko
@@ -20,6 +20,14 @@ Classifier: Topic :: System :: Monitoring
20
20
  Classifier: License :: OSI Approved :: MIT License
21
21
  License-File: LICENSE
22
22
  Requires-Dist: requests>=2.4.3
23
+ Dynamic: author
24
+ Dynamic: author-email
25
+ Dynamic: classifier
26
+ Dynamic: description
27
+ Dynamic: home-page
28
+ Dynamic: keywords
29
+ Dynamic: requires-dist
30
+ Dynamic: summary
23
31
 
24
32
 
25
33
  Moira is a real-time alerting tool, based on Graphite data.
@@ -0,0 +1 @@
1
+ 4.3.2
@@ -68,7 +68,7 @@ class Client:
68
68
  :param kwargs: additional parameters for request
69
69
  :return: dict response
70
70
 
71
- :raises: HTTPError
71
+ :raises: MoiraApiError
72
72
  :raises: InvalidJSONError
73
73
  """
74
74
  r = requests.get(self._path_join(path), headers=self.headers, auth=self.auth, **kwargs)
@@ -90,7 +90,7 @@ class Client:
90
90
  :param kwargs: additional parameters for request
91
91
  :return: dict response
92
92
 
93
- :raises: HTTPError
93
+ :raises: MoiraApiError
94
94
  :raises: InvalidJSONError
95
95
  """
96
96
  r = requests.delete(self._path_join(path), headers=self.headers, auth=self.auth, **kwargs)
@@ -112,7 +112,7 @@ class Client:
112
112
  :param kwargs: additional parameters for request
113
113
  :return: dict response
114
114
 
115
- :raises: HTTPError
115
+ :raises: MoiraApiError
116
116
  :raises: InvalidJSONError
117
117
  """
118
118
  r = requests.put(self._path_join(path), headers=self.headers, auth=self.auth, **kwargs)
@@ -127,6 +127,28 @@ class Client:
127
127
  except ValueError:
128
128
  raise InvalidJSONError(r.content)
129
129
 
130
+ def patch(self, path='', **kwargs):
131
+ """
132
+
133
+ :param path: str api path
134
+ :param kwargs: additional parameters for request
135
+ :return: dict response
136
+
137
+ :raises: MoiraApiError
138
+ :raises: InvalidJSONError
139
+ """
140
+ r = requests.patch(self._path_join(path), headers=self.headers, auth=self.auth, **kwargs)
141
+
142
+ try:
143
+ r.raise_for_status()
144
+ except requests.exceptions.HTTPError as err:
145
+ raise MoiraApiError(r.content)
146
+
147
+ try:
148
+ return r.json()
149
+ except ValueError:
150
+ raise InvalidJSONError(r.content)
151
+
130
152
  def post(self, path='', **kwargs):
131
153
  """
132
154
 
@@ -134,7 +156,7 @@ class Client:
134
156
  :param kwargs: additional parameters for request
135
157
  :return: dict response
136
158
 
137
- :raises: HTTPError
159
+ :raises: MoiraApiError
138
160
  :raises: InvalidJSONError
139
161
  """
140
162
  r = requests.post(self._path_join(path), headers=self.headers, auth=self.auth, **kwargs)
@@ -0,0 +1,8 @@
1
+ from ._managers import TeamManager
2
+ from ._models import TeamModel
3
+
4
+
5
+ __all__ = [
6
+ "TeamManager",
7
+ "TeamModel",
8
+ ]
@@ -0,0 +1,96 @@
1
+ from typing import Optional
2
+
3
+ from ._models import TeamModel, UserTeams, SaveTeamResponse
4
+ from .contact import TeamContactManager
5
+ from .settings import TeamSettingsManager
6
+ from .subscription import TeamSubscriptionManager
7
+ from .user import TeamUserManager
8
+ from ...client import Client
9
+
10
+
11
+ class TeamManager:
12
+ def __init__(self, client: Client) -> None:
13
+ self._client = client
14
+ self._user = None # type: Optional[TeamUserManager]
15
+ self._settings = None # type: Optional[TeamSettingsManager]
16
+ self._subscription = None # type: Optional[TeamSubscriptionManager]
17
+ self._contact = None # type: Optional[TeamContactManager]
18
+
19
+ def get_all(self) -> UserTeams:
20
+ """Get all teams"""
21
+ response = self._client.get(self._full_path())
22
+
23
+ return UserTeams(teams=[TeamModel(**team) for team in response["teams"]])
24
+
25
+ def create(self, team: TeamModel) -> SaveTeamResponse:
26
+ """Create a new team"""
27
+ payload = {
28
+ "name": team.name,
29
+ "description": team.description,
30
+ }
31
+
32
+ response = self._client.post(self._full_path(), json=payload)
33
+
34
+ return SaveTeamResponse(**response)
35
+
36
+ def delete(self, team_id: str) -> SaveTeamResponse:
37
+ """Delete a team"""
38
+ response = self._client.delete(self._full_path(team_id))
39
+
40
+ return SaveTeamResponse(**response)
41
+
42
+ def get(self, team_id: str) -> TeamModel:
43
+ """Get a team by ID"""
44
+ response = self._client.get(self._full_path(team_id))
45
+
46
+ return TeamModel(**response)
47
+
48
+ def update(self, team_id: str, team: TeamModel) -> SaveTeamResponse:
49
+ """Update existing team"""
50
+ payload = {
51
+ "name": team.name,
52
+ "description": team.description,
53
+ }
54
+
55
+ response = self._client.patch(self._full_path(team_id), json=payload)
56
+
57
+ return SaveTeamResponse(**response)
58
+
59
+ @property
60
+ def user(self) -> TeamUserManager:
61
+ """Get team user manager"""
62
+ if self._user is None:
63
+ self._user = TeamUserManager(self._client)
64
+
65
+ return self._user
66
+
67
+ @property
68
+ def settings(self) -> TeamSettingsManager:
69
+ """Get team settings manager"""
70
+ if self._settings is None:
71
+ self._settings = TeamSettingsManager(self._client)
72
+
73
+ return self._settings
74
+
75
+ @property
76
+ def subscription(self) -> TeamSubscriptionManager:
77
+ """Get team subscription manager"""
78
+ if self._subscription is None:
79
+ self._subscription = TeamSubscriptionManager(self._client)
80
+
81
+ return self._subscription
82
+
83
+ @property
84
+ def contact(self) -> TeamContactManager:
85
+ """Get team contact manager"""
86
+ if self._contact is None:
87
+ self._contact = TeamContactManager(self._client)
88
+
89
+ return self._contact
90
+
91
+ @staticmethod
92
+ def _full_path(team_id: Optional[str] = None) -> str:
93
+ if team_id is None:
94
+ return "teams"
95
+
96
+ return "teams/{team_id}".format(team_id=team_id)
@@ -0,0 +1,19 @@
1
+ from ..base import Base
2
+ from typing import List
3
+
4
+
5
+ class TeamModel(Base):
6
+ def __init__(self, description: str, name: str, **kwargs):
7
+ self.description = description
8
+ self.name = name
9
+ self._id = kwargs.get("id", None)
10
+
11
+
12
+ class UserTeams:
13
+ def __init__(self, teams: List[TeamModel]):
14
+ self.teams = teams
15
+
16
+
17
+ class SaveTeamResponse(Base):
18
+ def __init__(self, **kwargs):
19
+ self._id = kwargs.get("id")
@@ -0,0 +1,5 @@
1
+ from ._managers import TeamContactManager
2
+
3
+ __all__ = [
4
+ "TeamContactManager",
5
+ ]
@@ -0,0 +1,24 @@
1
+ from ...contact import Contact
2
+ from ....client import Client
3
+
4
+
5
+ class TeamContactManager:
6
+ def __init__(self, client: Client) -> None:
7
+ self._client = client
8
+
9
+ def create(self, team_id: str, contact: Contact) -> Contact:
10
+ """Create a new team contact"""
11
+ payload = {
12
+ "team_id": team_id,
13
+ "name": contact.name,
14
+ "type": contact.type,
15
+ "value": contact.value,
16
+ }
17
+
18
+ response = self._client.post(self._full_path(team_id), json=payload)
19
+
20
+ return Contact(**response)
21
+
22
+ @staticmethod
23
+ def _full_path(team_id: str) -> str:
24
+ return "teams/{team_id}/contacts".format(team_id=team_id)
@@ -0,0 +1,7 @@
1
+ from ._managers import TeamSettingsManager
2
+ from ._models import TeamSettings
3
+
4
+ __all__ = [
5
+ "TeamSettings",
6
+ "TeamSettingsManager",
7
+ ]
@@ -0,0 +1,23 @@
1
+ from ._models import TeamSettings
2
+ from ...contact import Contact
3
+ from ...subscription import Subscription
4
+ from ....client import Client
5
+
6
+
7
+ class TeamSettingsManager:
8
+ def __init__(self, client: Client) -> None:
9
+ self._client = client
10
+
11
+ def get(self, team_id: str) -> TeamSettings:
12
+ """Get team settings"""
13
+ response = self._client.get(self._full_path(team_id))
14
+
15
+ return TeamSettings(
16
+ contacts=[Contact(**contact) for contact in response["contacts"]],
17
+ subscriptions=[Subscription(self._client, **subscription) for subscription in response["subscriptions"]],
18
+ team_id=response["team_id"],
19
+ )
20
+
21
+ @staticmethod
22
+ def _full_path(team_id: str) -> str:
23
+ return "teams/{team_id}/settings".format(team_id=team_id)
@@ -0,0 +1,11 @@
1
+ from typing import List
2
+
3
+ from ...contact import Contact
4
+ from ...subscription import Subscription
5
+
6
+
7
+ class TeamSettings:
8
+ def __init__(self, contacts: List[Contact], subscriptions: List[Subscription], team_id: str) -> None:
9
+ self.contacts = contacts
10
+ self.subscriptions = subscriptions
11
+ self.team_id = team_id
@@ -0,0 +1,5 @@
1
+ from ._managers import TeamSubscriptionManager
2
+
3
+ __all__ = [
4
+ "TeamSubscriptionManager",
5
+ ]
@@ -0,0 +1,30 @@
1
+ from ...subscription import SubscriptionModel, Subscription
2
+ from ....client import Client
3
+
4
+
5
+ class TeamSubscriptionManager:
6
+ def __init__(self, client: Client) -> None:
7
+ self._client = client
8
+
9
+ def create(self, team_id: str, subscription: SubscriptionModel) -> Subscription:
10
+ """Create a new team subscription"""
11
+ payload = {
12
+ "team_id": team_id,
13
+ "contacts": subscription.contacts,
14
+ "tags": subscription.tags,
15
+ "enabled": subscription.enabled,
16
+ "any_tags": subscription.any_tags,
17
+ "throttling": subscription.throttling,
18
+ "sched": subscription.sched,
19
+ "ignore_warnings": subscription.ignore_warnings,
20
+ "ignore_recoverings": subscription.ignore_recoverings,
21
+ "plotting": subscription.plotting,
22
+ }
23
+
24
+ response = self._client.post(self._full_path(team_id), json=payload)
25
+
26
+ return Subscription(self._client, **response)
27
+
28
+ @staticmethod
29
+ def _full_path(team_id: str) -> str:
30
+ return "teams/{team_id}/subscriptions".format(team_id=team_id)
@@ -0,0 +1,7 @@
1
+ from ._managers import TeamUserManager
2
+ from ._models import TeamMembers
3
+
4
+ __all__ = [
5
+ "TeamMembers",
6
+ "TeamUserManager",
7
+ ]
@@ -0,0 +1,43 @@
1
+ from ._models import TeamMembers
2
+ from ....client import Client
3
+ from typing import Optional
4
+
5
+
6
+ class TeamUserManager:
7
+ def __init__(self, client: Client) -> None:
8
+ self._client = client
9
+
10
+ def get(self, team_id: str) -> TeamMembers:
11
+ """Get users of a team"""
12
+ response = self._client.get(self._full_path(team_id))
13
+
14
+ return TeamMembers(**response)
15
+
16
+ def add(self, team_id: str, members: TeamMembers) -> TeamMembers:
17
+ """Add users to a team"""
18
+ payload = {"usernames": members.usernames}
19
+
20
+ response = self._client.post(self._full_path(team_id), json=payload)
21
+
22
+ return TeamMembers(**response)
23
+
24
+ def set(self, team_id: str, members: TeamMembers) -> TeamMembers:
25
+ """Set users of a team"""
26
+ payload = {"usernames": members.usernames}
27
+
28
+ response = self._client.put(self._full_path(team_id), json=payload)
29
+
30
+ return TeamMembers(**response)
31
+
32
+ def delete(self, team_id: str, team_user_id: str) -> TeamMembers:
33
+ """Delete a user from a team"""
34
+ response = self._client.delete(self._full_path(team_id, team_user_id))
35
+
36
+ return TeamMembers(**response)
37
+
38
+ @staticmethod
39
+ def _full_path(team_id: str, team_user_id: Optional[str] = None) -> str:
40
+ if team_user_id is None:
41
+ return "teams/{team_id}/users".format(team_id=team_id)
42
+
43
+ return "teams/{team_id}/users/{team_user_id}".format(team_id=team_id, team_user_id=team_user_id)
@@ -0,0 +1,6 @@
1
+ from typing import List
2
+
3
+
4
+ class TeamMembers:
5
+ def __init__(self, usernames: List[str]) -> None:
6
+ self.usernames = usernames
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: moira-python-client
3
- Version: 4.3.0
3
+ Version: 4.3.2
4
4
  Summary: Client for Moira - Alerting system based on Graphite data
5
5
  Home-page: https://github.com/moira-alert/python-moira-client
6
6
  Author: Alexander Lukyanchenko
@@ -20,6 +20,14 @@ Classifier: Topic :: System :: Monitoring
20
20
  Classifier: License :: OSI Approved :: MIT License
21
21
  License-File: LICENSE
22
22
  Requires-Dist: requests>=2.4.3
23
+ Dynamic: author
24
+ Dynamic: author-email
25
+ Dynamic: classifier
26
+ Dynamic: description
27
+ Dynamic: home-page
28
+ Dynamic: keywords
29
+ Dynamic: requires-dist
30
+ Dynamic: summary
23
31
 
24
32
 
25
33
  Moira is a real-time alerting tool, based on Graphite data.
@@ -22,6 +22,19 @@ moira_client/models/subscription.py
22
22
  moira_client/models/tag.py
23
23
  moira_client/models/trigger.py
24
24
  moira_client/models/user.py
25
+ moira_client/models/team/__init__.py
26
+ moira_client/models/team/_managers.py
27
+ moira_client/models/team/_models.py
28
+ moira_client/models/team/contact/__init__.py
29
+ moira_client/models/team/contact/_managers.py
30
+ moira_client/models/team/settings/__init__.py
31
+ moira_client/models/team/settings/_managers.py
32
+ moira_client/models/team/settings/_models.py
33
+ moira_client/models/team/subscription/__init__.py
34
+ moira_client/models/team/subscription/_managers.py
35
+ moira_client/models/team/user/__init__.py
36
+ moira_client/models/team/user/_managers.py
37
+ moira_client/models/team/user/_models.py
25
38
  moira_python_client.egg-info/PKG-INFO
26
39
  moira_python_client.egg-info/SOURCES.txt
27
40
  moira_python_client.egg-info/dependency_links.txt
@@ -23,7 +23,12 @@ setup(
23
23
  author_email = 'al.lukyanchenko@gmail.com',
24
24
  packages=[
25
25
  'moira_client',
26
- 'moira_client.models'
26
+ 'moira_client.models',
27
+ 'moira_client.models.team',
28
+ 'moira_client.models.team.contact',
29
+ 'moira_client.models.team.settings',
30
+ 'moira_client.models.team.subscription',
31
+ 'moira_client.models.team.user',
27
32
  ],
28
33
  classifiers=[
29
34
  'Development Status :: 4 - Beta',
@@ -1 +0,0 @@
1
- 4.3.0