Add basic revision diffing
This includes additions to the design doc and functional tests Change-Id: I7281d8888fb259402646f211dd20f0bfdbd82b75
This commit is contained in:
parent
daeb5f8774
commit
063aa01374
225
deckhand/tests/functional/gabbits/revision-diff-success.yaml
Normal file
225
deckhand/tests/functional/gabbits/revision-diff-success.yaml
Normal file
@ -0,0 +1,225 @@
|
||||
# Test success path for rollback with a single bucket.
|
||||
#
|
||||
# 1. Purges existing data to ensure test isolation
|
||||
# 2. Creates some initial documents (via 4 requests for different buckets)
|
||||
# 3. Verify expected diffs for null revision
|
||||
# - Each of the 4 initial document PUTs vs null
|
||||
# - null vs itself
|
||||
# 4. Modify bucket c
|
||||
# 5. Delete bucket b
|
||||
# 6. Create bucket f
|
||||
# 7. Remove bucket f
|
||||
# 8. Create bucket e
|
||||
# 9. Verify diff between create_d and create_e
|
||||
# 10. Verify diff of final state with null
|
||||
|
||||
defaults:
|
||||
request_headers:
|
||||
content-type: application/x-yaml
|
||||
response_headers:
|
||||
content-type: application/x-yaml
|
||||
|
||||
tests:
|
||||
- name: purge
|
||||
desc: Begin testing from known state.
|
||||
DELETE: /api/v1.0/revisions
|
||||
status: 204
|
||||
|
||||
- name: create_a
|
||||
desc: Create documents in bucket a
|
||||
PUT: /api/v1.0/bucket/bucket_a/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-a
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 1
|
||||
...
|
||||
|
||||
- name: create_b
|
||||
desc: Create documents in bucket b
|
||||
PUT: /api/v1.0/bucket/bucket_b/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-b
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 2
|
||||
...
|
||||
|
||||
- name: create_c
|
||||
desc: Create documents in bucket c
|
||||
PUT: /api/v1.0/bucket/bucket_c/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-c
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 3
|
||||
...
|
||||
|
||||
- name: create_d
|
||||
desc: Create documents in bucket d
|
||||
PUT: /api/v1.0/bucket/bucket_d/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-d
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 4
|
||||
...
|
||||
|
||||
- name: verify_null_first_revision
|
||||
desc: Validates response for null diff for first revision
|
||||
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_a'].$RESPONSE['$.[0].status.revision']
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]:
|
||||
bucket_a: created
|
||||
skip: Not implemented.
|
||||
|
||||
- name: verify_null_second_revision
|
||||
desc: Validates response for null diff for second revision
|
||||
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_b'].$RESPONSE['$.[0].status.revision']
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]:
|
||||
bucket_a: created
|
||||
bucket_b: created
|
||||
skip: Not implemented.
|
||||
|
||||
- name: verify_null_third_revision
|
||||
desc: Validates response for null diff for third revision
|
||||
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_c'].$RESPONSE['$.[0].status.revision']
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]:
|
||||
bucket_a: created
|
||||
bucket_b: created
|
||||
bucket_c: created
|
||||
skip: Not implemented.
|
||||
|
||||
- name: verify_null_fourth_revision
|
||||
desc: Validates response for null diff for fourth revision
|
||||
GET: /api/v1.0/revisions/0/diff/$HISTORY['create_d'].$RESPONSE['$.[0].status.revision']
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]:
|
||||
bucket_a: created
|
||||
bucket_b: created
|
||||
bucket_c: created
|
||||
bucket_d: created
|
||||
skip: Not implemented.
|
||||
|
||||
- name: verify_null_self
|
||||
desc: Validates response for null diff for fourth revision
|
||||
GET: /api/v1.0/revisions/0/diff/0
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]: {}
|
||||
skip: Not implemented.
|
||||
|
||||
- name: update_c
|
||||
desc: Update document in bucket c
|
||||
PUT: /api/v1.0/bucket/bucket_c/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-c
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
new_value: 7
|
||||
...
|
||||
skip: Not implemented.
|
||||
|
||||
- name: delete_b
|
||||
desc: Delete documents from bucket b
|
||||
PUT: /api/v1.0/bucket/bucket_b/documents
|
||||
status: 200
|
||||
data: ""
|
||||
skip: Not implemented.
|
||||
|
||||
- name: create_f
|
||||
desc: Create documents in bucket f
|
||||
PUT: /api/v1.0/bucket/bucket_e/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-f
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 5
|
||||
...
|
||||
skip: Not implemented.
|
||||
|
||||
- name: delete_f
|
||||
desc: Delete documents from bucket b
|
||||
PUT: /api/v1.0/bucket/bucket_f/documents
|
||||
status: 200
|
||||
data: ""
|
||||
skip: Not implemented.
|
||||
|
||||
- name: create_e
|
||||
desc: Create documents in bucket e
|
||||
PUT: /api/v1.0/bucket/bucket_e/documents
|
||||
status: 200
|
||||
data: |-
|
||||
---
|
||||
schema: example/Kind/v1
|
||||
metadata:
|
||||
schema: metadata/Document/v1
|
||||
name: doc-e
|
||||
layeringDefinition:
|
||||
abstract: false
|
||||
layer: site
|
||||
data:
|
||||
value: 6
|
||||
...
|
||||
skip: Not implemented.
|
||||
|
||||
- name: verify_diff_between_initial_4_buckets_and_present
|
||||
desc: Validates response for null diff between the first 4 buckets and now
|
||||
GET: /api/v1.0/revisions/$HISTORY['create_d'].$RESPONSE['$.[0].status.revision']/diff/$HISTORY['create_e'].$RESPONSE['$.[0].status.revision']
|
||||
status: 200
|
||||
response_multidoc_jsonpaths:
|
||||
$.[0]:
|
||||
bucket_a: unmodified
|
||||
bucket_b: deleted
|
||||
bucket_c: modified
|
||||
bucket_d: unmodified
|
||||
bucket_e: created
|
||||
skip: Not implemented.
|
@ -777,6 +777,79 @@ of `expired` indicates that the validation had succeeded, but the
|
||||
|
||||
This endpoint uses the `read_revision` action.
|
||||
|
||||
### GET `/revisions/{{revision_id}}/diff/{{comparison_revision_id}}`
|
||||
|
||||
This endpoint provides a basic comparison of revisions in terms of how the
|
||||
buckets involved have changed. Only buckets with existing documents in either
|
||||
of the two revisions in question will be reported; buckets with documents that
|
||||
are only present in revisions between the two being compared are omitted from
|
||||
this report.
|
||||
|
||||
The response will contain a status of `created`, `deleted`, `modified`, or
|
||||
`unmodified` for each bucket.
|
||||
|
||||
The ordering of the two revision ids is not important.
|
||||
|
||||
For the purposes of diffing, the `revision_id` "0" is treated as a revision
|
||||
with no documents, so queries comparing revision "0" to any other revision will
|
||||
report "created" for each bucket in the compared revision.
|
||||
|
||||
Diffing a revision against itself will respond with the each of the buckets in
|
||||
the revision as `unmodified`.
|
||||
|
||||
Diffing revision "0" against itself results in an empty dictionary as the response.
|
||||
|
||||
#### Examples
|
||||
A response for a typical case, `GET /api/v1.0/revisions/6/diff/3` (or
|
||||
equivalently `GET /api/v1.0/revisions/3/diff/6`).
|
||||
|
||||
```yaml
|
||||
---
|
||||
bucket_a: created
|
||||
bucket_b: deleted
|
||||
bucket_c: modified
|
||||
bucket_d: unmodified
|
||||
...
|
||||
```
|
||||
|
||||
A response for diffing against an empty revision, `GET /api/v1.0/revisions/0/diff/6`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
bucket_a: created
|
||||
bucket_c: created
|
||||
bucket_d: created
|
||||
...
|
||||
```
|
||||
|
||||
A response for diffing a revision against itself, `GET /api/v1.0/revisions/6/diff/6`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
bucket_a: unmodified
|
||||
bucket_c: unmodified
|
||||
bucket_d: unmodified
|
||||
...
|
||||
```
|
||||
|
||||
Diffing two revisions that contain the same documents, `GET /api/v1.0/revisions/8/diff/11`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
bucket_e: unmodified
|
||||
bucket_f: unmodified
|
||||
bucket_d: unmodified
|
||||
...
|
||||
```
|
||||
|
||||
Diffing revision zero with itself, `GET /api/v1.0/revisions/0/diff/0`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
{}
|
||||
...
|
||||
```
|
||||
|
||||
### POST `/revisions/{{revision_id}}/validations/{{name}}`
|
||||
|
||||
Add the results of a validation for a particular revision.
|
||||
|
Loading…
x
Reference in New Issue
Block a user