ETCD is distributed key value store used as a core component in CoreOS. I've already send a post earlier this week. Here is a page describing how to use ETCD basic commands = ETCD API. Code snippets placed in a page mostly use put, but ETCD allows to use post as well. Most of us understand differences between those two commands in a notion of a REST(ful) service, but how does it work in key value store?
curl -v http://127.0.0.1:2379/v2/keys/test -XPOST -D value="some value"
So ETCD adds an index value and put it into resulting key - which is also path to the value. For instance:
curl -v http://127.0.0.1:2379/v2/keys/test/194 -XGET
I don't want to see revision - index - numbers within keys so post command is not useful here. ETCD brings prevExist parameter for this use cases.
I want to perform add method which expect that there is no content on given key. I'll use following statement:
curl -v http://127.0.0.1:2379/v2/keys/test?prevExist=false -XPUT -D value="some value"
When you did not delete the key, as I did not, you can get following error:
On the other hand, use false to express update existing entity.
curl -v http://127.0.0.1:2379/v2/keys/test?prevExist=true -XPUT -D value="some value"
The repository uses put for both add and update methods but value for prevExist is the difference.
POST
Example over many words.curl -v http://127.0.0.1:2379/v2/keys/test -XPOST -D value="some value"
curl -v http://127.0.0.1:2379/v2/keys/test -XPOST -D value="some value"
Two same command result into following content:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { "action": "get", "node": { "key": "/test", "dir": true, "nodes": [ { "key": "/test/194", "value": "", "modifiedIndex": 194, "createdIndex": 194 }, { "key": "/test/195", "value": "", "modifiedIndex": 195, "createdIndex": 195 } ], "modifiedIndex": 194, "createdIndex": 194 } } |
So ETCD adds an index value and put it into resulting key - which is also path to the value. For instance:
curl -v http://127.0.0.1:2379/v2/keys/test/194 -XGET
Allows you to get the specific key. The index is explicitly expressed in the url.
PUT
Put command just add or update given key. Let say I would use following example:
curl -v http://127.0.0.1:2379/v2/keys/test -XPUT -D value="some value"
Resulting content on test key is expected.
1 2 3 4 5 6 7 8 9 | { "action": "get", "node": { "key": "/test", "value": "", "modifiedIndex": 198, "createdIndex": 198 } } |
How to Model Add and Update Method?
My current task is to model and implement repository using ETCD under the hood. Usual repository contains CRUD methods for particular set of entities. Reasonable approach is to separate add from update to do not replace existing object, e.g. when using optimistic locking.I don't want to see revision - index - numbers within keys so post command is not useful here. ETCD brings prevExist parameter for this use cases.
I want to perform add method which expect that there is no content on given key. I'll use following statement:
curl -v http://127.0.0.1:2379/v2/keys/test?prevExist=false -XPUT -D value="some value"
1 2 3 4 5 6 | { "errorCode": 105, "message": "Key already exists", "cause": "/test", "index": 198 } |
On the other hand, use false to express update existing entity.
curl -v http://127.0.0.1:2379/v2/keys/test?prevExist=true -XPUT -D value="some value"
This command results into positive response.
< HTTP/1.1 200 OK
The repository uses put for both add and update methods but value for prevExist is the difference.