Merge ~sbeattie/ubuntu-cve-tracker/+git/ubuntu-cve-tracker:publish-cves-notes-test-json into ubuntu-cve-tracker:master

Proposed by Steve Beattie
Status: Merged
Merged at revision: c0ddff552cd8fd498129542068e16aa450628965
Proposed branch: ~sbeattie/ubuntu-cve-tracker/+git/ubuntu-cve-tracker:publish-cves-notes-test-json
Merge into: ubuntu-cve-tracker:master
Diff against target: 534 lines (+333/-139)
8 files modified
scripts/publish-cves-to-website-api.py (+3/-2)
test/website_api/use_esm_status_for_eol_releases.json (+45/-25)
test/website_api/use_esm_status_if_esm_release.json (+57/-33)
test/website_api/use_notes (+27/-0)
test/website_api/use_notes.json (+60/-0)
test/website_api/use_public_status_for_no_eol_releases.json (+45/-25)
test/website_api/use_public_status_if_public_release.json (+51/-29)
test/website_api/use_ros-esm_status.json (+45/-25)
Reviewer Review Type Date Requested Status
Alex Murray Approve
Review via email: mp+448958@code.launchpad.net

Commit message

publish-cves-to-website-api: fix json output, add notes test

As part of developing testcases for the merge request
https://code.launchpad.net/~pfsmorigo/ubuntu-cve-tracker/+git/ubuntu-cve-tracker/+merge/448821
I added a testcase that added notes field, and discovered that the pprint() output is not guaranteed to be valid json.

This pull request adds a basic notes field test along with the invalid json example output generated by the publish-cves-to-website-api.py script and used by the test_publish-cves-to-website-api.py for validation. It then converts the publish-cves-to-website-api.py verbose output to (mostly) valid exported json along with regenerating the expected output results in the testcases.

(The output is not actually valid json, because a summary statement is prepended to the output, invaldiating it, but the tests end up discarding that.)

Steve Beattie (2):
      * [0f33dc25a92] publish-cves-to-website-api.py: add notes test
      * [91180197a70] publish-cves-to-website-api.py: convert verbose output to valid json

Description of the change

This is how the scripts/test_publish-cves-to-website-api.py fails with just the first commit in this series applied:

====================================== test session starts =======================================
collected 6 items

scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_public_status_if
_public_release] PASSED [ 16%]
scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_esm_status_if_es
m_release] PASSED [ 33%]
scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_public_status_fo
r_no_eol_releases] PASSED [ 50%]
scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_ros-esm_status]
PASSED [ 66%]
scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_esm_status_for_e
ol_releases] PASSED [ 83%]
scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_notes] FAILED [1
00%]

============================================ FAILURES ============================================
___________________________ TestWebSiteAPI.test_simple_okay[use_notes] ___________________________

self = <test_publish-cves-to-website-api.TestWebSiteAPI object at 0x7f6b70b26990>
cve_test_file = 'use_notes'

    @pytest.mark.parametrize("cve_test_file", PARSE_OKAY_TESTS)
    def test_simple_okay(self, cve_test_file):
> self.__check_simple_okay(cve_test_file)

scripts/test_publish-cves-to-website-api.py:28:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
scripts/test_publish-cves-to-website-api.py:22: in __check_simple_okay
    payload_json = json.load(f)
/usr/lib/python3.11/json/__init__.py:293: in load
    return loads(fp.read(),
/usr/lib/python3.11/json/__init__.py:346: in loads
    return _default_decoder.decode(s)
/usr/lib/python3.11/json/decoder.py:337: in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <json.decoder.JSONDecoder object at 0x7f6bf5e3c150>
s = '[{"bugs": [""],\n "cvss3": null,\n "description": "\\nPublish CVEs to Website API tests",\n
  "id": "CVE-2020-1234",...re.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],\n "status": "active",
\n "tags": {},\n "ubuntu_description": ""}]\n'
idx = 0

    def raw_decode(self, s, idx=0):
        """Decode a JSON document from ``s`` (a ``str`` beginning with
        a JSON document) and return a 2-tuple of the Python
        representation and the index in ``s`` where the document ended.

        This can be used to decode a JSON document from a string that may
        have extraneous data at the end.

        """
        try:
> obj, end = self.scan_once(s, idx)
E json.decoder.JSONDecodeError: Expecting ',' delimiter: line 9 column 22 (char 334)

/usr/lib/python3.11/json/decoder.py:353: JSONDecodeError
-------------------------------------- Captured stdout call --------------------------------------
1 total CVEs
==================================== short test summary info =====================================
FAILED scripts/test_publish-cves-to-website-api.py::TestWebSiteAPI::test_simple_okay[use_notes] -
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 9 column 22 (char 334)
================================== 1 failed, 5 passed in 0.52s ===================================

To post a comment you must log in.
Revision history for this message
Alex Murray (alexmurray) wrote :

LGTM! - thanks Steve.

review: Approve
Revision history for this message
Paulo Flabiano Smorigo (pfsmorigo) wrote :

LGTM

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/scripts/publish-cves-to-website-api.py b/scripts/publish-cves-to-website-api.py
2index d6af0e7..34a532b 100755
3--- a/scripts/publish-cves-to-website-api.py
4+++ b/scripts/publish-cves-to-website-api.py
5@@ -6,6 +6,7 @@ import sys
6 import cve_lib
7 import re
8 import argparse
9+import json
10 from http.cookiejar import MozillaCookieJar
11
12 # Local
13@@ -336,7 +337,7 @@ def main(argv=None):
14
15 def push_chunks(args, url, chunk):
16 if args.verbose:
17- pprint.pprint(chunk)
18+ print(json.dumps(chunk, indent=2))
19 if args.dry_run:
20 return
21 resp = authentication("PUT", f"{url}{security_website_endpoint}", chunk)
22@@ -349,7 +350,7 @@ def push_chunks(args, url, chunk):
23 def push_individual_cves(args, url, chunk):
24 for cve in chunk:
25 if args.verbose:
26- pprint.pprint(cve)
27+ print(json.dumps(cve, indent=2))
28 if args.dry_run:
29 continue
30 resp = authentication("PUT", f"{url}{security_website_endpoint}", [cve])
31diff --git a/test/website_api/use_esm_status_for_eol_releases.json b/test/website_api/use_esm_status_for_eol_releases.json
32index 095e819..0671231 100644
33--- a/test/website_api/use_esm_status_for_eol_releases.json
34+++ b/test/website_api/use_esm_status_for_eol_releases.json
35@@ -1,25 +1,45 @@
36-[{"bugs": [""],
37- "cvss3": null,
38- "description": "\nPublish CVEs to Website API tests",
39- "id": "CVE-2020-1234",
40- "mitigation": "",
41- "notes": [],
42- "packages": [{"debian": "https://tracker.debian.org/pkg/package",
43- "name": "package",
44- "source": "https://launchpad.net/ubuntu/+source/package",
45- "statuses": [{"description": "",
46- "pocket": "security",
47- "release_codename": "trusty",
48- "status": "needed"},
49- {"description": "",
50- "pocket": "security",
51- "release_codename": "upstream",
52- "status": "needs-triage"}],
53- "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package"}],
54- "patches": {"package": []},
55- "priority": "medium",
56- "published": "2020-08-04 17:00:00 UTC",
57- "references": ["https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],
58- "status": "active",
59- "tags": {},
60- "ubuntu_description": ""}]
61+[
62+ {
63+ "id": "CVE-2020-1234",
64+ "description": "\nPublish CVEs to Website API tests",
65+ "ubuntu_description": "",
66+ "mitigation": "",
67+ "notes": [],
68+ "priority": "medium",
69+ "cvss3": null,
70+ "references": [
71+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
72+ ],
73+ "bugs": [
74+ ""
75+ ],
76+ "packages": [
77+ {
78+ "name": "package",
79+ "source": "https://launchpad.net/ubuntu/+source/package",
80+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
81+ "debian": "https://tracker.debian.org/pkg/package",
82+ "statuses": [
83+ {
84+ "release_codename": "trusty",
85+ "status": "needed",
86+ "description": "",
87+ "pocket": "security"
88+ },
89+ {
90+ "release_codename": "upstream",
91+ "status": "needs-triage",
92+ "description": "",
93+ "pocket": "security"
94+ }
95+ ]
96+ }
97+ ],
98+ "status": "active",
99+ "tags": {},
100+ "patches": {
101+ "package": []
102+ },
103+ "published": "2020-08-04 17:00:00 UTC"
104+ }
105+]
106diff --git a/test/website_api/use_esm_status_if_esm_release.json b/test/website_api/use_esm_status_if_esm_release.json
107index 4ea6d3f..e59f044 100644
108--- a/test/website_api/use_esm_status_if_esm_release.json
109+++ b/test/website_api/use_esm_status_if_esm_release.json
110@@ -1,33 +1,57 @@
111-[{"bugs": [""],
112- "cvss3": null,
113- "description": "\nPublish CVEs to Website API tests",
114- "id": "CVE-2020-1234",
115- "mitigation": "",
116- "notes": [],
117- "packages": [{"debian": "https://tracker.debian.org/pkg/package",
118- "name": "package",
119- "source": "https://launchpad.net/ubuntu/+source/package",
120- "statuses": [{"description": "1.0.0~esm1",
121- "pocket": "esm-infra",
122- "release_codename": "trusty",
123- "status": "released"},
124- {"description": "1.2.3~esm1",
125- "pocket": "esm-apps",
126- "release_codename": "focal",
127- "status": "released"},
128- {"description": "1.2.4~esm1",
129- "pocket": "esm-apps",
130- "release_codename": "jammy",
131- "status": "released"},
132- {"description": "",
133- "pocket": "security",
134- "release_codename": "upstream",
135- "status": "needs-triage"}],
136- "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package"}],
137- "patches": {"package": []},
138- "priority": "medium",
139- "published": "2020-08-04 17:00:00 UTC",
140- "references": ["https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],
141- "status": "active",
142- "tags": {},
143- "ubuntu_description": ""}]
144+[
145+ {
146+ "id": "CVE-2020-1234",
147+ "description": "\nPublish CVEs to Website API tests",
148+ "ubuntu_description": "",
149+ "mitigation": "",
150+ "notes": [],
151+ "priority": "medium",
152+ "cvss3": null,
153+ "references": [
154+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
155+ ],
156+ "bugs": [
157+ ""
158+ ],
159+ "packages": [
160+ {
161+ "name": "package",
162+ "source": "https://launchpad.net/ubuntu/+source/package",
163+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
164+ "debian": "https://tracker.debian.org/pkg/package",
165+ "statuses": [
166+ {
167+ "release_codename": "trusty",
168+ "status": "released",
169+ "description": "1.0.0~esm1",
170+ "pocket": "esm-infra"
171+ },
172+ {
173+ "release_codename": "focal",
174+ "status": "released",
175+ "description": "1.2.3~esm1",
176+ "pocket": "esm-apps"
177+ },
178+ {
179+ "release_codename": "jammy",
180+ "status": "released",
181+ "description": "1.2.4~esm1",
182+ "pocket": "esm-apps"
183+ },
184+ {
185+ "release_codename": "upstream",
186+ "status": "needs-triage",
187+ "description": "",
188+ "pocket": "security"
189+ }
190+ ]
191+ }
192+ ],
193+ "status": "active",
194+ "tags": {},
195+ "patches": {
196+ "package": []
197+ },
198+ "published": "2020-08-04 17:00:00 UTC"
199+ }
200+]
201diff --git a/test/website_api/use_notes b/test/website_api/use_notes
202new file mode 100644
203index 0000000..454d026
204--- /dev/null
205+++ b/test/website_api/use_notes
206@@ -0,0 +1,27 @@
207+PublicDateAtUSN: 2020-08-04 17:00:00 UTC
208+Candidate: CVE-2020-1234
209+CRD: 2020-08-04 17:00:00 UTC
210+PublicDate: 2020-08-04 17:00:00 UTC
211+References:
212+ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234
213+Description:
214+ Publish CVEs to Website API tests
215+Ubuntu-Description:
216+Notes:
217+ pfsmorigo> this is a note
218+ sbeattie> this is another note. It contains far too many words for a
219+ note. Why are there so many words in this note?
220+Mitigation:
221+Bugs:
222+Priority: medium
223+Discovered-by:
224+Assigned-to:
225+CVSS:
226+
227+
228+Patches_package:
229+upstream_package: needs-triage
230+trusty_package: released (1.2.3)
231+trusty/esm_package: not-affected (1.2.3)
232+jammy_package: released (4.5.6)
233+esm-apps/jammy_package: not-affected (4.5.6)
234diff --git a/test/website_api/use_notes.json b/test/website_api/use_notes.json
235new file mode 100644
236index 0000000..09679e3
237--- /dev/null
238+++ b/test/website_api/use_notes.json
239@@ -0,0 +1,60 @@
240+[
241+ {
242+ "id": "CVE-2020-1234",
243+ "description": "\nPublish CVEs to Website API tests",
244+ "ubuntu_description": "",
245+ "mitigation": "",
246+ "notes": [
247+ {
248+ "author": "pfsmorigo",
249+ "note": "this is a note"
250+ },
251+ {
252+ "author": "sbeattie",
253+ "note": "this is another note. It contains far too many words for a\nnote. Why are there so many words in this note?"
254+ }
255+ ],
256+ "priority": "medium",
257+ "cvss3": null,
258+ "references": [
259+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
260+ ],
261+ "bugs": [
262+ ""
263+ ],
264+ "packages": [
265+ {
266+ "name": "package",
267+ "source": "https://launchpad.net/ubuntu/+source/package",
268+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
269+ "debian": "https://tracker.debian.org/pkg/package",
270+ "statuses": [
271+ {
272+ "release_codename": "trusty",
273+ "status": "released",
274+ "description": "1.2.3",
275+ "pocket": "security"
276+ },
277+ {
278+ "release_codename": "jammy",
279+ "status": "released",
280+ "description": "4.5.6",
281+ "pocket": "security"
282+ },
283+ {
284+ "release_codename": "upstream",
285+ "status": "needs-triage",
286+ "description": "",
287+ "pocket": "security"
288+ }
289+ ]
290+ }
291+ ],
292+ "status": "active",
293+ "tags": {},
294+ "patches": {
295+ "package": []
296+ },
297+ "published": "2020-08-04 17:00:00 UTC"
298+ }
299+]
300diff --git a/test/website_api/use_public_status_for_no_eol_releases.json b/test/website_api/use_public_status_for_no_eol_releases.json
301index 0ea071c..ef0bc1a 100644
302--- a/test/website_api/use_public_status_for_no_eol_releases.json
303+++ b/test/website_api/use_public_status_for_no_eol_releases.json
304@@ -1,25 +1,45 @@
305-[{"bugs": [""],
306- "cvss3": null,
307- "description": "\nPublish CVEs to Website API tests",
308- "id": "CVE-2020-1234",
309- "mitigation": "",
310- "notes": [],
311- "packages": [{"debian": "https://tracker.debian.org/pkg/package",
312- "name": "package",
313- "source": "https://launchpad.net/ubuntu/+source/package",
314- "statuses": [{"description": "",
315- "pocket": "security",
316- "release_codename": "jammy",
317- "status": "needed"},
318- {"description": "",
319- "pocket": "security",
320- "release_codename": "upstream",
321- "status": "needs-triage"}],
322- "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package"}],
323- "patches": {"package": []},
324- "priority": "medium",
325- "published": "2020-08-04 17:00:00 UTC",
326- "references": ["https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],
327- "status": "active",
328- "tags": {},
329- "ubuntu_description": ""}]
330+[
331+ {
332+ "id": "CVE-2020-1234",
333+ "description": "\nPublish CVEs to Website API tests",
334+ "ubuntu_description": "",
335+ "mitigation": "",
336+ "notes": [],
337+ "priority": "medium",
338+ "cvss3": null,
339+ "references": [
340+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
341+ ],
342+ "bugs": [
343+ ""
344+ ],
345+ "packages": [
346+ {
347+ "name": "package",
348+ "source": "https://launchpad.net/ubuntu/+source/package",
349+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
350+ "debian": "https://tracker.debian.org/pkg/package",
351+ "statuses": [
352+ {
353+ "release_codename": "jammy",
354+ "status": "needed",
355+ "description": "",
356+ "pocket": "security"
357+ },
358+ {
359+ "release_codename": "upstream",
360+ "status": "needs-triage",
361+ "description": "",
362+ "pocket": "security"
363+ }
364+ ]
365+ }
366+ ],
367+ "status": "active",
368+ "tags": {},
369+ "patches": {
370+ "package": []
371+ },
372+ "published": "2020-08-04 17:00:00 UTC"
373+ }
374+]
375diff --git a/test/website_api/use_public_status_if_public_release.json b/test/website_api/use_public_status_if_public_release.json
376index e813ffa..82d8541 100644
377--- a/test/website_api/use_public_status_if_public_release.json
378+++ b/test/website_api/use_public_status_if_public_release.json
379@@ -1,29 +1,51 @@
380-[{"bugs": [""],
381- "cvss3": null,
382- "description": "\nPublish CVEs to Website API tests",
383- "id": "CVE-2020-1234",
384- "mitigation": "",
385- "notes": [],
386- "packages": [{"debian": "https://tracker.debian.org/pkg/package",
387- "name": "package",
388- "source": "https://launchpad.net/ubuntu/+source/package",
389- "statuses": [{"description": "1.2.3",
390- "pocket": "security",
391- "release_codename": "trusty",
392- "status": "released"},
393- {"description": "4.5.6",
394- "pocket": "security",
395- "release_codename": "jammy",
396- "status": "released"},
397- {"description": "",
398- "pocket": "security",
399- "release_codename": "upstream",
400- "status": "needs-triage"}],
401- "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package"}],
402- "patches": {"package": []},
403- "priority": "medium",
404- "published": "2020-08-04 17:00:00 UTC",
405- "references": ["https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],
406- "status": "active",
407- "tags": {},
408- "ubuntu_description": ""}]
409+[
410+ {
411+ "id": "CVE-2020-1234",
412+ "description": "\nPublish CVEs to Website API tests",
413+ "ubuntu_description": "",
414+ "mitigation": "",
415+ "notes": [],
416+ "priority": "medium",
417+ "cvss3": null,
418+ "references": [
419+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
420+ ],
421+ "bugs": [
422+ ""
423+ ],
424+ "packages": [
425+ {
426+ "name": "package",
427+ "source": "https://launchpad.net/ubuntu/+source/package",
428+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
429+ "debian": "https://tracker.debian.org/pkg/package",
430+ "statuses": [
431+ {
432+ "release_codename": "trusty",
433+ "status": "released",
434+ "description": "1.2.3",
435+ "pocket": "security"
436+ },
437+ {
438+ "release_codename": "jammy",
439+ "status": "released",
440+ "description": "4.5.6",
441+ "pocket": "security"
442+ },
443+ {
444+ "release_codename": "upstream",
445+ "status": "needs-triage",
446+ "description": "",
447+ "pocket": "security"
448+ }
449+ ]
450+ }
451+ ],
452+ "status": "active",
453+ "tags": {},
454+ "patches": {
455+ "package": []
456+ },
457+ "published": "2020-08-04 17:00:00 UTC"
458+ }
459+]
460diff --git a/test/website_api/use_ros-esm_status.json b/test/website_api/use_ros-esm_status.json
461index 6588aa7..e2ec94f 100644
462--- a/test/website_api/use_ros-esm_status.json
463+++ b/test/website_api/use_ros-esm_status.json
464@@ -1,25 +1,45 @@
465-[{"bugs": [""],
466- "cvss3": null,
467- "description": "\nPublish CVEs to Website API tests",
468- "id": "CVE-2020-1234",
469- "mitigation": "",
470- "notes": [],
471- "packages": [{"debian": "https://tracker.debian.org/pkg/package",
472- "name": "package",
473- "source": "https://launchpad.net/ubuntu/+source/package",
474- "statuses": [{"description": "1.2.3",
475- "pocket": "ros-esm",
476- "release_codename": "bionic",
477- "status": "released"},
478- {"description": "",
479- "pocket": "security",
480- "release_codename": "upstream",
481- "status": "needs-triage"}],
482- "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package"}],
483- "patches": {"package": []},
484- "priority": "medium",
485- "published": "2020-08-04 17:00:00 UTC",
486- "references": ["https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"],
487- "status": "active",
488- "tags": {},
489- "ubuntu_description": ""}]
490+[
491+ {
492+ "id": "CVE-2020-1234",
493+ "description": "\nPublish CVEs to Website API tests",
494+ "ubuntu_description": "",
495+ "mitigation": "",
496+ "notes": [],
497+ "priority": "medium",
498+ "cvss3": null,
499+ "references": [
500+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1234"
501+ ],
502+ "bugs": [
503+ ""
504+ ],
505+ "packages": [
506+ {
507+ "name": "package",
508+ "source": "https://launchpad.net/ubuntu/+source/package",
509+ "ubuntu": "https://packages.ubuntu.com/search?suite=all&section=all&arch=any&searchon=sourcenames&keywords=package",
510+ "debian": "https://tracker.debian.org/pkg/package",
511+ "statuses": [
512+ {
513+ "release_codename": "bionic",
514+ "status": "released",
515+ "description": "1.2.3",
516+ "pocket": "ros-esm"
517+ },
518+ {
519+ "release_codename": "upstream",
520+ "status": "needs-triage",
521+ "description": "",
522+ "pocket": "security"
523+ }
524+ ]
525+ }
526+ ],
527+ "status": "active",
528+ "tags": {},
529+ "patches": {
530+ "package": []
531+ },
532+ "published": "2020-08-04 17:00:00 UTC"
533+ }
534+]

Subscribers

People subscribed via source and target branches