qontract-reconcile 0.10.2.dev185__py3-none-any.whl → 0.10.2.dev186__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qontract-reconcile
3
- Version: 0.10.2.dev185
3
+ Version: 0.10.2.dev186
4
4
  Summary: Collection of tools to reconcile services with their desired state as defined in the app-interface DB.
5
5
  Project-URL: homepage, https://github.com/app-sre/qontract-reconcile
6
6
  Project-URL: repository, https://github.com/app-sre/qontract-reconcile
@@ -99,7 +99,6 @@ OpenShift templates can be found [here](/openshift/qontract-reconcile.yaml). In
99
99
  `qontract-reconcile` includes the following integrations:
100
100
 
101
101
  ```text
102
- acs-notifiers Manages RHACS notifier configurations
103
102
  acs-policies Manages RHACS security policy configurations
104
103
  acs-rbac Manages RHACS rbac configuration
105
104
  advanced-upgrade-scheduler Manage Cluster Upgrade Policy schedules in
@@ -1,6 +1,5 @@
1
1
  reconcile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- reconcile/acs_notifiers.py,sha256=YIV9TrgWjBD8nFbrBvvU8-9s-AdezY4X5t90bFROCtM,4451
3
- reconcile/acs_policies.py,sha256=xNbhIlwE1u2URbEQcX-3C-pTu--XjrKAqGj0-Wd85dY,9152
2
+ reconcile/acs_policies.py,sha256=pwFKP3afmRbpRq-7FRAosI-A60yfufE2vvXBjOMgsCU,8653
4
3
  reconcile/acs_rbac.py,sha256=15vNfNzdG_DeXaJ-f5m8DSaJh__LUK766_xAECqyTsg,22657
5
4
  reconcile/aws_ami_share.py,sha256=M_gT7y3cSAyT_Pm90PBCNDSmbZtqREqe2jNETh0i9Qs,3808
6
5
  reconcile/aws_ecr_image_pull_secrets.py,sha256=F58PtX1GlB9XHqj8hGy9ItiTznXLAAKTNlWD9iT2MWI,2593
@@ -10,7 +9,7 @@ reconcile/aws_iam_password_reset.py,sha256=O0JX2N5kNRKs3u2xzu4NNrI6p0ag5JWy3MTsv
10
9
  reconcile/aws_support_cases_sos.py,sha256=PDhilxQ4TBxVnxUPIUdTbKEaNUI0wzPiEsB91oHT2fY,3384
11
10
  reconcile/blackbox_exporter_endpoint_monitoring.py,sha256=O1wFp52EyF538c6txaWBs8eMtUIy19gyHZ6VzJ6QXS8,3512
12
11
  reconcile/checkpoint.py,sha256=_JhMxrye5BgkRMxWYuf7Upli6XayPINKSsuo3ynHTRc,5010
13
- reconcile/cli.py,sha256=xyVnxNyq3IPISWwFlB9j4HAFjowXYv3EdsEGIMFhTy0,108438
12
+ reconcile/cli.py,sha256=-WTtuEtxDuHdZ-GIGtklu4p6r8YdR7QfRqdK6rHl2gY,108163
14
13
  reconcile/closedbox_endpoint_monitoring_base.py,sha256=al7m8EgnnYx90rY1REryW3byN_ItfJfAzEeLtjbCfi0,4921
15
14
  reconcile/cluster_deployment_mapper.py,sha256=5gumAaRCcFXsabUJ1dnuUy9WrP_FEEM5JnOnE8ch9sE,2326
16
15
  reconcile/dashdotdb_base.py,sha256=83ZWIf5JJk3P_D69y2TmXRcQr6ELJGlv10OM0h7fJVs,4767
@@ -230,7 +229,7 @@ reconcile/gql_definitions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
230
229
  reconcile/gql_definitions/introspection.json,sha256=MT1HCR90ZahZxjrgaBEp34JNhjaEiDRblQK-qfSrfF0,2316277
231
230
  reconcile/gql_definitions/acs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
231
  reconcile/gql_definitions/acs/acs_instances.py,sha256=L91WW9LbhJbBSrECqShQpFtjoBOsmNIYLRpMbx1io5o,2181
233
- reconcile/gql_definitions/acs/acs_policies.py,sha256=9IFpGAcrZ8nTFC05q3-12nwkNOEkquHB2-XbVq5_jy4,7219
232
+ reconcile/gql_definitions/acs/acs_policies.py,sha256=Ygpfl2-VkYLSlJvHgp_dJBfb66K_Rwfdfpsa18w1v1s,4338
234
233
  reconcile/gql_definitions/acs/acs_rbac.py,sha256=cZsIlCWliPQdQHgmBsIMx54fJNOtkdRXLzmOKZmJNHk,3009
235
234
  reconcile/gql_definitions/advanced_upgrade_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
235
  reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py,sha256=230uwBoBaaVz686d_WNZT9eAw6BX2VpoQX0mKhf5UcM,4390
@@ -675,7 +674,6 @@ reconcile/utils/vaultsecretref.py,sha256=0KUSzuvTRxPyKY919TO3-B_eYg4_76fzKvMF8j5
675
674
  reconcile/utils/vcs.py,sha256=AK35vIjx9bXYclKmvNekpaG_OETt-ZybibwV-m123xc,10186
676
675
  reconcile/utils/acs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
677
676
  reconcile/utils/acs/base.py,sha256=4UsDrCpAOuddL3PKNuIQYoJP1BtZQNNB8_KEX0lXneg,2532
678
- reconcile/utils/acs/notifiers.py,sha256=DlzTDM9arWQlBSiDy70y5Mf38OKVs9V0FzFe2LfOKXA,5046
679
677
  reconcile/utils/acs/policies.py,sha256=jpbi3qpGkBD_X6MfzsX12dPajUbmACmhIOz_0rDvYzs,5489
680
678
  reconcile/utils/acs/rbac.py,sha256=ugsLM9Pb7FbUbdq85E3VzXGMaB9ZovXob7tdWCxwqZ8,8808
681
679
  reconcile/utils/aws_api_typed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -807,7 +805,7 @@ tools/saas_promotion_state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
807
805
  tools/saas_promotion_state/saas_promotion_state.py,sha256=UfwwRLS5Ya4_Nh1w5n1dvoYtchQvYE9yj1VANt2IKqI,3925
808
806
  tools/sre_checkpoints/__init__.py,sha256=CDaDaywJnmRCLyl_NCcvxi-Zc0hTi_3OdwKiFOyS39I,145
809
807
  tools/sre_checkpoints/util.py,sha256=zEDbGr18ZeHNQwW8pUsr2JRjuXIPz--WAGJxZo9sv_Y,894
810
- qontract_reconcile-0.10.2.dev185.dist-info/METADATA,sha256=-GBtujthD8qi9Bdj1oIRUOc5iAeTf-Xa5Lp5jpTyTPE,24627
811
- qontract_reconcile-0.10.2.dev185.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
812
- qontract_reconcile-0.10.2.dev185.dist-info/entry_points.txt,sha256=5i9l54La3vQrDLAdwDKQWC0iG4sV9RRfOb1BpvzOWLc,698
813
- qontract_reconcile-0.10.2.dev185.dist-info/RECORD,,
808
+ qontract_reconcile-0.10.2.dev186.dist-info/METADATA,sha256=0hGybBCljHc9z_10Wcq6RvjgFFVSF7GPG9w5yhdMTTM,24555
809
+ qontract_reconcile-0.10.2.dev186.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
810
+ qontract_reconcile-0.10.2.dev186.dist-info/entry_points.txt,sha256=5i9l54La3vQrDLAdwDKQWC0iG4sV9RRfOb1BpvzOWLc,698
811
+ qontract_reconcile-0.10.2.dev186.dist-info/RECORD,,
reconcile/acs_policies.py CHANGED
@@ -8,7 +8,6 @@ from reconcile.gql_definitions.acs.acs_policies import (
8
8
  AcsPolicyV1,
9
9
  )
10
10
  from reconcile.utils import gql
11
- from reconcile.utils.acs.notifiers import JiraNotifier
12
11
  from reconcile.utils.acs.policies import AcsPolicyApi, Policy, PolicyCondition, Scope
13
12
  from reconcile.utils.differ import diff_iterables
14
13
  from reconcile.utils.runtime.integration import (
@@ -63,21 +62,10 @@ class AcsPoliciesIntegration(QontractReconcileIntegration[NoParams]):
63
62
  conditions = [
64
63
  pc for c in gql_policy.conditions if (pc := self._build_policy_condition(c))
65
64
  ]
66
- jira_notifier = (
67
- notifier_name_to_id.get(
68
- JiraNotifier.from_escalation_policy(
69
- gql_policy.integrations.notifiers.jira.escalation_policy
70
- ).name
71
- )
72
- if gql_policy.integrations
73
- and gql_policy.integrations.notifiers
74
- and gql_policy.integrations.notifiers.jira
75
- else None
76
- )
77
65
  return Policy(
78
66
  name=gql_policy.name,
79
67
  description=gql_policy.description,
80
- notifiers=[jira_notifier] if jira_notifier else [],
68
+ notifiers=[],
81
69
  severity=f"{gql_policy.severity.upper()}_SEVERITY", # align with acs api severity value format
82
70
  scope=sorted(
83
71
  [
reconcile/cli.py CHANGED
@@ -3719,17 +3719,6 @@ def acs_policies(ctx):
3719
3719
  )
3720
3720
 
3721
3721
 
3722
- @integration.command(short_help="Manages RHACS notifier configurations")
3723
- @click.pass_context
3724
- def acs_notifiers(ctx):
3725
- from reconcile import acs_notifiers
3726
-
3727
- run_class_integration(
3728
- integration=acs_notifiers.AcsNotifiersIntegration(),
3729
- ctx=ctx.obj,
3730
- )
3731
-
3732
-
3733
3722
  @integration.command(short_help="Manage Unleash feature toggles.")
3734
3723
  @click.option("--instance", help="Reconcile just this Unlash instance.", default=None)
3735
3724
  @click.pass_context
@@ -24,40 +24,6 @@ query AcsPolicy {
24
24
  name
25
25
  description
26
26
  severity
27
- integrations {
28
- notifiers {
29
- jira {
30
- escalationPolicy {
31
- name
32
- channels {
33
- jiraBoard {
34
- name
35
- server {
36
- serverUrl
37
- }
38
- severityPriorityMappings {
39
- name
40
- mappings {
41
- severity
42
- priority
43
- }
44
- }
45
- issueType
46
- issueFields {
47
- name
48
- value
49
- }
50
- disable {
51
- integrations
52
- }
53
- }
54
- jiraComponent
55
- jiraLabels
56
- }
57
- }
58
- }
59
- }
60
- }
61
27
  categories
62
28
  scope {
63
29
  level
@@ -107,61 +73,6 @@ class ConfiguredBaseModel(BaseModel):
107
73
  extra=Extra.forbid
108
74
 
109
75
 
110
- class JiraServerV1(ConfiguredBaseModel):
111
- server_url: str = Field(..., alias="serverUrl")
112
-
113
-
114
- class SeverityPriorityMappingV1(ConfiguredBaseModel):
115
- severity: str = Field(..., alias="severity")
116
- priority: str = Field(..., alias="priority")
117
-
118
-
119
- class JiraSeverityPriorityMappingsV1(ConfiguredBaseModel):
120
- name: str = Field(..., alias="name")
121
- mappings: list[SeverityPriorityMappingV1] = Field(..., alias="mappings")
122
-
123
-
124
- class JiraBoardIssueFieldV1(ConfiguredBaseModel):
125
- name: str = Field(..., alias="name")
126
- value: str = Field(..., alias="value")
127
-
128
-
129
- class DisableJiraBoardAutomationsV1(ConfiguredBaseModel):
130
- integrations: Optional[list[str]] = Field(..., alias="integrations")
131
-
132
-
133
- class JiraBoardV1(ConfiguredBaseModel):
134
- name: str = Field(..., alias="name")
135
- server: JiraServerV1 = Field(..., alias="server")
136
- severity_priority_mappings: JiraSeverityPriorityMappingsV1 = Field(..., alias="severityPriorityMappings")
137
- issue_type: Optional[str] = Field(..., alias="issueType")
138
- issue_fields: Optional[list[JiraBoardIssueFieldV1]] = Field(..., alias="issueFields")
139
- disable: Optional[DisableJiraBoardAutomationsV1] = Field(..., alias="disable")
140
-
141
-
142
- class AppEscalationPolicyChannelsV1(ConfiguredBaseModel):
143
- jira_board: list[JiraBoardV1] = Field(..., alias="jiraBoard")
144
- jira_component: Optional[str] = Field(..., alias="jiraComponent")
145
- jira_labels: Optional[list[str]] = Field(..., alias="jiraLabels")
146
-
147
-
148
- class AppEscalationPolicyV1(ConfiguredBaseModel):
149
- name: str = Field(..., alias="name")
150
- channels: AppEscalationPolicyChannelsV1 = Field(..., alias="channels")
151
-
152
-
153
- class AcsPolicyIntegrationNotifierJiraV1(ConfiguredBaseModel):
154
- escalation_policy: AppEscalationPolicyV1 = Field(..., alias="escalationPolicy")
155
-
156
-
157
- class AcsPolicyIntegrationNotifiersV1(ConfiguredBaseModel):
158
- jira: Optional[AcsPolicyIntegrationNotifierJiraV1] = Field(..., alias="jira")
159
-
160
-
161
- class AcsPolicyIntegrationsV1(ConfiguredBaseModel):
162
- notifiers: Optional[AcsPolicyIntegrationNotifiersV1] = Field(..., alias="notifiers")
163
-
164
-
165
76
  class AcsPolicyScopeV1(ConfiguredBaseModel):
166
77
  level: str = Field(..., alias="level")
167
78
 
@@ -218,7 +129,6 @@ class AcsPolicyV1(ConfiguredBaseModel):
218
129
  name: str = Field(..., alias="name")
219
130
  description: Optional[str] = Field(..., alias="description")
220
131
  severity: str = Field(..., alias="severity")
221
- integrations: Optional[AcsPolicyIntegrationsV1] = Field(..., alias="integrations")
222
132
  categories: list[str] = Field(..., alias="categories")
223
133
  scope: Union[AcsPolicyScopeClusterV1, AcsPolicyScopeNamespaceV1, AcsPolicyScopeV1] = Field(..., alias="scope")
224
134
  conditions: list[Union[AcsPolicyConditionsCvssV1, AcsPolicyConditionsSeverityV1, AcsPolicyConditionsImageTagV1, AcsPolicyConditionsCveV1, AcsPolicyConditionsImageAgeV1, AcsPolicyConditionsV1]] = Field(..., alias="conditions")
@@ -1,126 +0,0 @@
1
- import logging
2
-
3
- import reconcile.gql_definitions.acs.acs_policies as gql_acs_policies
4
- from reconcile.gql_definitions.jira.jira_servers import (
5
- JiraServerV1,
6
- )
7
- from reconcile.gql_definitions.jira.jira_servers import (
8
- query as query_jira_servers,
9
- )
10
- from reconcile.utils import gql
11
- from reconcile.utils.acs.notifiers import (
12
- AcsNotifiersApi,
13
- JiraCredentials,
14
- JiraNotifier,
15
- )
16
- from reconcile.utils.differ import diff_iterables
17
- from reconcile.utils.disabled_integrations import integration_is_enabled
18
- from reconcile.utils.runtime.integration import (
19
- NoParams,
20
- QontractReconcileIntegration,
21
- )
22
- from reconcile.utils.semver_helper import make_semver
23
-
24
-
25
- class AcsNotifiersIntegration(QontractReconcileIntegration[NoParams]):
26
- def __init__(self) -> None:
27
- super().__init__(NoParams())
28
- self.qontract_integration = "acs-notifiers"
29
- self.qontract_integration_version = make_semver(0, 1, 0)
30
-
31
- @property
32
- def name(self) -> str:
33
- return self.qontract_integration
34
-
35
- def _get_escalation_policies(
36
- self, acs_policies: list[gql_acs_policies.AcsPolicyV1]
37
- ) -> list[gql_acs_policies.AppEscalationPolicyV1]:
38
- return list(
39
- {
40
- p.integrations.notifiers.jira.escalation_policy.name: p.integrations.notifiers.jira.escalation_policy
41
- for p in acs_policies
42
- if p.integrations
43
- and p.integrations.notifiers
44
- and p.integrations.notifiers.jira
45
- and integration_is_enabled(
46
- self.qontract_integration,
47
- p.integrations.notifiers.jira.escalation_policy.channels.jira_board[
48
- 0
49
- ],
50
- )
51
- }.values()
52
- )
53
-
54
- def get_desired_state(
55
- self, acs_policies: list[gql_acs_policies.AcsPolicyV1]
56
- ) -> list[JiraNotifier]:
57
- return [
58
- JiraNotifier.from_escalation_policy(ep)
59
- for ep in self._get_escalation_policies(acs_policies)
60
- ]
61
-
62
- def get_jira_credentials(
63
- self, jira_servers: list[JiraServerV1]
64
- ) -> dict[str, JiraCredentials]:
65
- return {
66
- server.server_url: JiraCredentials(
67
- url=server.server_url,
68
- username=server.username,
69
- token=self.secret_reader.read_secret(server.token),
70
- )
71
- for server in jira_servers
72
- }
73
-
74
- def reconcile(
75
- self,
76
- current_state: list[JiraNotifier],
77
- desired_state: list[JiraNotifier],
78
- acs_api: AcsNotifiersApi,
79
- jira_credentials: dict[str, JiraCredentials],
80
- dry_run: bool,
81
- ) -> None:
82
- diff = diff_iterables(
83
- current=current_state, desired=desired_state, key=lambda x: x.name
84
- )
85
- for a in diff.add.values():
86
- logging.info(f"Create Jira notifier: {a.name}")
87
- if not dry_run:
88
- acs_api.create_jira_notifier(
89
- a,
90
- jira_credentials=jira_credentials[a.url],
91
- )
92
- for c in diff.change.values():
93
- logging.info(f"Update Jira notifier: {c.desired.name}")
94
- if not dry_run:
95
- acs_api.update_jira_notifier(
96
- c.desired,
97
- jira_credentials=jira_credentials[c.desired.url],
98
- )
99
- for d in diff.delete.values():
100
- logging.info(f"Delete Jira notifier: {d.name}")
101
- if not dry_run:
102
- acs_api.delete_jira_notifier(d)
103
-
104
- def run(
105
- self,
106
- dry_run: bool,
107
- ) -> None:
108
- gql_api_query = gql.get_api().query
109
- jira_credentials = self.get_jira_credentials(
110
- query_jira_servers(query_func=gql_api_query).jira_servers or []
111
- )
112
- desired_state = self.get_desired_state(
113
- gql_acs_policies.query(query_func=gql_api_query).acs_policies or []
114
- )
115
- instance = AcsNotifiersApi.get_acs_instance(query_func=gql_api_query)
116
- with AcsNotifiersApi(
117
- url=instance.url, token=self.secret_reader.read_secret(instance.credentials)
118
- ) as acs_api:
119
- current_state = acs_api.get_jira_notifiers()
120
- self.reconcile(
121
- current_state=current_state,
122
- desired_state=desired_state,
123
- acs_api=acs_api,
124
- jira_credentials=jira_credentials,
125
- dry_run=dry_run,
126
- )
@@ -1,145 +0,0 @@
1
- import json
2
- from typing import Any
3
-
4
- from pydantic import BaseModel
5
-
6
- from reconcile.gql_definitions.acs.acs_policies import AppEscalationPolicyV1
7
- from reconcile.utils.acs.base import AcsBaseApi
8
-
9
-
10
- class JiraCredentials(BaseModel):
11
- url: str
12
- username: str
13
- token: str
14
-
15
-
16
- class SeverityPriorityMapping(BaseModel):
17
- severity: str
18
- priority: str
19
-
20
- @staticmethod
21
- def from_api(mapping: dict[str, str]) -> "SeverityPriorityMapping":
22
- return SeverityPriorityMapping(
23
- severity=mapping["severity"].replace("_SEVERITY", "").lower(),
24
- priority=mapping["priorityName"],
25
- )
26
-
27
- def to_api(self) -> Any:
28
- return {
29
- "severity": f"{self.severity.upper()}_SEVERITY",
30
- "priorityName": self.priority,
31
- }
32
-
33
-
34
- class JiraNotifier(BaseModel):
35
- name: str
36
- board: str
37
- url: str
38
- issue_type: str | None
39
- severity_priority_mappings: list[SeverityPriorityMapping]
40
- custom_fields: dict[str, Any] | None
41
-
42
- @staticmethod
43
- def from_api(notifier: dict[str, Any]) -> "JiraNotifier":
44
- notifier_jira = notifier["jira"]
45
- return JiraNotifier(
46
- name=notifier["name"],
47
- board=notifier["labelDefault"],
48
- url=notifier_jira["url"],
49
- issue_type=notifier_jira["issueType"],
50
- severity_priority_mappings=sorted(
51
- [
52
- SeverityPriorityMapping.from_api(mapping)
53
- for mapping in notifier_jira["priorityMappings"]
54
- ],
55
- key=lambda m: m.severity,
56
- ),
57
- custom_fields=json.loads(notifier_jira.get("defaultFieldsJson") or "{}"),
58
- )
59
-
60
- def to_api(self, ui_endpoint: str, jira_credentials: JiraCredentials) -> Any:
61
- return {
62
- "name": self.name,
63
- "type": "jira",
64
- "uiEndpoint": ui_endpoint,
65
- "labelDefault": self.board,
66
- "jira": {
67
- "url": jira_credentials.url,
68
- "username": jira_credentials.username,
69
- "password": jira_credentials.token,
70
- "issueType": self.issue_type or "Task",
71
- "priorityMappings": [
72
- mapping.to_api() for mapping in self.severity_priority_mappings
73
- ],
74
- "defaultFieldsJson": json.dumps(self.custom_fields or {}),
75
- },
76
- }
77
-
78
- @staticmethod
79
- def from_escalation_policy(
80
- escalation_policy: AppEscalationPolicyV1,
81
- ) -> "JiraNotifier":
82
- jira_board = escalation_policy.channels.jira_board[0]
83
-
84
- custom_fields: dict[str, Any] = {}
85
- for field in jira_board.issue_fields or []:
86
- if field.name == "Security Level":
87
- custom_fields["security"] = {"name": field.value}
88
-
89
- if escalation_policy.channels.jira_component:
90
- custom_fields["components"] = [
91
- {"name": escalation_policy.channels.jira_component}
92
- ]
93
- if escalation_policy.channels.jira_labels:
94
- custom_fields["labels"] = escalation_policy.channels.jira_labels
95
-
96
- return JiraNotifier(
97
- name=f"jira-{escalation_policy.name}",
98
- board=jira_board.name,
99
- url=jira_board.server.server_url,
100
- issue_type=jira_board.issue_type or "Task",
101
- severity_priority_mappings=sorted(
102
- [
103
- SeverityPriorityMapping(**vars(sp))
104
- for sp in jira_board.severity_priority_mappings.mappings
105
- ],
106
- key=lambda m: m.severity,
107
- ),
108
- custom_fields=custom_fields,
109
- )
110
-
111
-
112
- class AcsNotifiersApi(AcsBaseApi):
113
- """
114
- Implements methods to support reconcile operations against the ACS NotifiersService api
115
- """
116
-
117
- def get_notifiers(self) -> list[Any]:
118
- return self.generic_request_json("/v1/notifiers", "GET")["notifiers"]
119
-
120
- def get_jira_notifiers(self) -> list[JiraNotifier]:
121
- return [
122
- JiraNotifier.from_api(notifier)
123
- for notifier in self.get_notifiers()
124
- if notifier["type"] == "jira"
125
- ]
126
-
127
- def get_notifier_id_by_name(self, name: str) -> str:
128
- return next(n["id"] for n in self.get_notifiers() if n["name"] == name)
129
-
130
- def update_jira_notifier(
131
- self, jira_notifier: JiraNotifier, jira_credentials: JiraCredentials
132
- ) -> None:
133
- notifier_id = self.get_notifier_id_by_name(jira_notifier.name)
134
- body = jira_notifier.to_api(self.url, jira_credentials)
135
- self.generic_request(f"/v1/notifiers/{notifier_id}", "PUT", body)
136
-
137
- def create_jira_notifier(
138
- self, jira_notifier: JiraNotifier, jira_credentials: JiraCredentials
139
- ) -> None:
140
- body = jira_notifier.to_api(self.url, jira_credentials)
141
- self.generic_request("/v1/notifiers", "POST", body)
142
-
143
- def delete_jira_notifier(self, jira_notifier: JiraNotifier) -> None:
144
- notifier_id = self.get_notifier_id_by_name(jira_notifier.name)
145
- self.generic_request(f"/v1/notifiers/{notifier_id}", "DELETE")