Merge pull request #282 from jzelinskie/layer-sort-id
api/v1: indexed layers for notifications
This commit is contained in:
commit
5396396ff7
@ -39,11 +39,13 @@ The HTTP status code of the response should indicate what type of failure occurr
|
|||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 400 Bad Request
|
HTTP/1.1 400 Bad Request
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Error": {
|
"Error": {
|
||||||
"Message": "example error message"
|
"Message": "example error message"
|
||||||
@ -67,9 +69,11 @@ The Authorization field is an optional value whose contents will fill the Author
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
POST http://localhost:6060/v1/layers HTTP/1.1
|
POST http://localhost:6060/v1/layers HTTP/1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Layer": {
|
"Layer": {
|
||||||
"Name": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6",
|
"Name": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6",
|
||||||
@ -85,11 +89,13 @@ POST http://localhost:6060/v1/layers HTTP/1.1
|
|||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 201 Created
|
HTTP/1.1 201 Created
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Layer": {
|
"Layer": {
|
||||||
"Name": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6",
|
"Name": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6",
|
||||||
@ -119,17 +125,19 @@ The GET route for the Layers resource displays a Layer and optionally all of its
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```
|
```http
|
||||||
GET http://localhost:6060/v1/layers/17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52?features&vulnerabilities HTTP/1.1
|
GET http://localhost:6060/v1/layers/17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52?features&vulnerabilities HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Layer": {
|
"Layer": {
|
||||||
"Name": "17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52",
|
"Name": "17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52",
|
||||||
@ -165,13 +173,13 @@ The DELETE route for the Layers resource removes a Layer and all of its children
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
DELETE http://localhost:6060/v1/layers/17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52 HTTP/1.1
|
DELETE http://localhost:6060/v1/layers/17675ec01494d651e1ccf81dc9cf63959ebfeed4f978fddb1666b6ead008ed52 HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
```
|
```
|
||||||
@ -187,17 +195,19 @@ The GET route for the Namespaces resource displays a list of namespaces currentl
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/namespaces HTTP/1.1
|
GET http://localhost:6060/v1/namespaces HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Namespaces": [
|
"Namespaces": [
|
||||||
{ "Name": "debian:8" },
|
{ "Name": "debian:8" },
|
||||||
@ -223,17 +233,19 @@ The GET route for the Vulnerabilities resource displays the vulnerabilities data
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities?limit=2 HTTP/1.1
|
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities?limit=2 HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerabilities": [
|
"Vulnerabilities": [
|
||||||
{
|
{
|
||||||
@ -271,9 +283,11 @@ The POST route for the Vulnerabilities resource creates a new Vulnerability.
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
POST http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities HTTP/1.1
|
POST http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities HTTP/1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerability": {
|
"Vulnerability": {
|
||||||
"Name": "CVE-2014-9471",
|
"Name": "CVE-2014-9471",
|
||||||
@ -302,11 +316,13 @@ POST http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities HTTP/1.1
|
|||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 201 Created
|
HTTP/1.1 201 Created
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerability": {
|
"Vulnerability": {
|
||||||
"Name": "CVE-2014-9471",
|
"Name": "CVE-2014-9471",
|
||||||
@ -347,17 +363,19 @@ The GET route for the Vulnerabilities resource displays the current data for a g
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471?fixedIn HTTP/1.1
|
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471?fixedIn HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerability": {
|
"Vulnerability": {
|
||||||
"Name": "CVE-2014-9471",
|
"Name": "CVE-2014-9471",
|
||||||
@ -395,9 +413,11 @@ If this vulnerability was inserted by a Fetcher, changes may be lost when the Fe
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471
|
PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerability": {
|
"Vulnerability": {
|
||||||
"Name": "CVE-2014-9471",
|
"Name": "CVE-2014-9471",
|
||||||
@ -419,10 +439,12 @@ PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471
|
|||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Vulnerability": {
|
"Vulnerability": {
|
||||||
"Name": "CVE-2014-9471",
|
"Name": "CVE-2014-9471",
|
||||||
@ -452,13 +474,13 @@ If this vulnerability was inserted by a Fetcher, it may be re-inserted when the
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471 HTTP/1.1
|
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471 HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
```
|
```
|
||||||
@ -473,17 +495,19 @@ The GET route for the Fixes resource displays the list of Features that fix the
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes HTTP/1.1
|
GET http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Features": [
|
"Features": [
|
||||||
{
|
{
|
||||||
@ -503,9 +527,11 @@ The PUT route for the Fixes resource updates a Feature that is the fix for a giv
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes/coreutils HTTP/1.1
|
PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes/coreutils HTTP/1.1
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Feature": {
|
"Feature": {
|
||||||
"Name": "coreutils",
|
"Name": "coreutils",
|
||||||
@ -517,10 +543,12 @@ PUT http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471
|
|||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Feature": {
|
"Feature": {
|
||||||
"Name": "coreutils",
|
"Name": "coreutils",
|
||||||
@ -538,13 +566,13 @@ The DELETE route for the Fixes resource removes a Feature as fix for the given V
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
DELETE http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes/coreutils
|
DELETE http://localhost:6060/v1/namespaces/debian%3A8/vulnerabilities/CVE-2014-9471/fixes/coreutils
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
```
|
```
|
||||||
@ -556,7 +584,8 @@ Server: clair
|
|||||||
#### Description
|
#### Description
|
||||||
|
|
||||||
The GET route for the Notifications resource displays a notification that a Vulnerability has been updated.
|
The GET route for the Notifications resource displays a notification that a Vulnerability has been updated.
|
||||||
This route supports simultaneous pagination for both the `Old` and `New` Vulnerabilities' `LayersIntroducingVulnerability` property which can be extremely long.
|
This route supports simultaneous pagination for both the `Old` and `New` Vulnerabilities' `OrderedLayersIntroducingVulnerability` which can be extremely long.
|
||||||
|
The `LayersIntroducingVulnerability` property is deprecated and will eventually be removed from the API.
|
||||||
|
|
||||||
#### Query Parameters
|
#### Query Parameters
|
||||||
|
|
||||||
@ -567,17 +596,19 @@ This route supports simultaneous pagination for both the `Old` and `New` Vulnera
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
GET http://localhost:6060/v1/notifications/ec45ec87-bfc8-4129-a1c3-d2b82622175a?limit=2 HTTP/1.1
|
GET http://localhost:6060/v1/notifications/ec45ec87-bfc8-4129-a1c3-d2b82622175a?limit=2 HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: application/json;charset=utf-8
|
Content-Type: application/json;charset=utf-8
|
||||||
Server: clair
|
Server: clair
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
{
|
{
|
||||||
"Notification": {
|
"Notification": {
|
||||||
"Name": "ec45ec87-bfc8-4129-a1c3-d2b82622175a",
|
"Name": "ec45ec87-bfc8-4129-a1c3-d2b82622175a",
|
||||||
@ -600,9 +631,19 @@ Server: clair
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"OrderedLayersIntroducingVulnerability": [
|
||||||
|
{
|
||||||
|
"Index": 1,
|
||||||
|
"LayerName": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Index": 2,
|
||||||
|
"LayerName": "3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d3f4be1916b12d"
|
||||||
|
}
|
||||||
|
],
|
||||||
"LayersIntroducingVulnerability": [
|
"LayersIntroducingVulnerability": [
|
||||||
"3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d3f4be1916b12d.9673fdf7-b81a-4b3e-acf8-e551ef155449",
|
"523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6",
|
||||||
"523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6"
|
"3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d182371916b12d"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"Old": {
|
"Old": {
|
||||||
@ -613,8 +654,18 @@ Server: clair
|
|||||||
"Severity": "Low",
|
"Severity": "Low",
|
||||||
"FixedIn": []
|
"FixedIn": []
|
||||||
},
|
},
|
||||||
|
"OrderedLayersIntroducingVulnerability": [
|
||||||
|
{
|
||||||
|
"Index": 1,
|
||||||
|
"LayerName": "523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Index": 2,
|
||||||
|
"LayerName": "3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d3f4be1916b12d"
|
||||||
|
}
|
||||||
|
],
|
||||||
"LayersIntroducingVulnerability": [
|
"LayersIntroducingVulnerability": [
|
||||||
"3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d3f4be1916b12d.9673fdf7-b81a-4b3e-acf8-e551ef155449",
|
"3b59c795b34670618fbcace4dac7a27c5ecec156812c9e2c90d3f4be1916b12d",
|
||||||
"523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6"
|
"523ef1d23f222195488575f52a39c729c76a8c5630c9a194139cb246fb212da6"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -632,13 +683,13 @@ The time at which this Notification was marked as read can be seen in the `Notif
|
|||||||
|
|
||||||
#### Example Request
|
#### Example Request
|
||||||
|
|
||||||
```json
|
```http
|
||||||
DELETE http://localhost:6060/v1/notification/ec45ec87-bfc8-4129-a1c3-d2b82622175a HTTP/1.1
|
DELETE http://localhost:6060/v1/notification/ec45ec87-bfc8-4129-a1c3-d2b82622175a HTTP/1.1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Example Response
|
#### Example Response
|
||||||
|
|
||||||
```json
|
```http
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Server: clair
|
Server: clair
|
||||||
```
|
```
|
||||||
|
@ -252,19 +252,36 @@ func NotificationFromDatabaseModel(dbNotification database.VulnerabilityNotifica
|
|||||||
|
|
||||||
type VulnerabilityWithLayers struct {
|
type VulnerabilityWithLayers struct {
|
||||||
Vulnerability *Vulnerability `json:"Vulnerability,omitempty"`
|
Vulnerability *Vulnerability `json:"Vulnerability,omitempty"`
|
||||||
|
|
||||||
|
// This field is guaranteed to be in order only for pagination.
|
||||||
|
// Indices from different notifications may not be comparable.
|
||||||
|
OrderedLayersIntroducingVulnerability []OrderedLayerName `json:"OrderedLayersIntroducingVulnerability,omitempty"`
|
||||||
|
|
||||||
|
// This field is deprecated.
|
||||||
LayersIntroducingVulnerability []string `json:"LayersIntroducingVulnerability,omitempty"`
|
LayersIntroducingVulnerability []string `json:"LayersIntroducingVulnerability,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OrderedLayerName struct {
|
||||||
|
Index int `json:"Index"`
|
||||||
|
LayerName string `json:"LayerName"`
|
||||||
|
}
|
||||||
|
|
||||||
func VulnerabilityWithLayersFromDatabaseModel(dbVuln database.Vulnerability) VulnerabilityWithLayers {
|
func VulnerabilityWithLayersFromDatabaseModel(dbVuln database.Vulnerability) VulnerabilityWithLayers {
|
||||||
vuln := VulnerabilityFromDatabaseModel(dbVuln, true)
|
vuln := VulnerabilityFromDatabaseModel(dbVuln, true)
|
||||||
|
|
||||||
var layers []string
|
var layers []string
|
||||||
|
var orderedLayers []OrderedLayerName
|
||||||
for _, layer := range dbVuln.LayersIntroducingVulnerability {
|
for _, layer := range dbVuln.LayersIntroducingVulnerability {
|
||||||
layers = append(layers, layer.Name)
|
layers = append(layers, layer.Name)
|
||||||
|
orderedLayers = append(orderedLayers, OrderedLayerName{
|
||||||
|
Index: layer.ID,
|
||||||
|
LayerName: layer.Name,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return VulnerabilityWithLayers{
|
return VulnerabilityWithLayers{
|
||||||
Vulnerability: &vuln,
|
Vulnerability: &vuln,
|
||||||
|
OrderedLayersIntroducingVulnerability: orderedLayers,
|
||||||
LayersIntroducingVulnerability: layers,
|
LayersIntroducingVulnerability: layers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user