<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;"><div><br></div><span id="OLK_SRC_BODY_SECTION"><div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt"><span style="font-weight:bold">From: </span> Tim Hinrichs <<a href="mailto:tim@styra.com">tim@styra.com</a>><br><span style="font-weight:bold">Date: </span> Monday, January 8, 2018 at 7:31 AM<br><span style="font-weight:bold">To: </span> Eric Kao <<a href="mailto:ekcs.openstack@gmail.com">ekcs.openstack@gmail.com</a>><br><span style="font-weight:bold">Cc: </span> "OpenStack Development Mailing List (not for usage questions)" <<a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a>><br><span style="font-weight:bold">Subject: </span> Re: [congress] generic push driver<br></div><div><br></div><blockquote id="MAC_OUTLOOK_ATTRIBUTION_BLOCKQUOTE" style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;"><div dir="ltr">It's probably worth considering PATCH instead of PUT for updating the table.</div></blockquote></span><div>Ah right of course. PATCH makes more sense here.</div><span id="OLK_SRC_BODY_SECTION"><blockquote id="MAC_OUTLOOK_ATTRIBUTION_BLOCKQUOTE" style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;"><div dir="ltr"><div><br></div><div><a href="http://restcookbook.com/HTTP%20Methods/patch/">http://restcookbook.com/HTTP%20Methods/patch/</a><br><div><br></div><div>You could also think about using JSON-patch to describe the requested update.  It provides fine-grained update semantics:</div></div></div></blockquote></span><span id="OLK_SRC_BODY_SECTION"><blockquote id="MAC_OUTLOOK_ATTRIBUTION_BLOCKQUOTE" style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;"><div dir="ltr"><div><div><br></div><div><a href="https://tools.ietf.org/html/rfc6902">https://tools.ietf.org/html/rfc6902</a> </div></div></div></blockquote></span><div><div>Hmm it would be very nice to follow an existing standard. Unfortunately the json patch path specifications seem like an awkward fit with the set semantics of congress tables. Removal, for example, must be done by specifying the array index of the row to be removed. But perhaps we can borrow the style of json patch for patching sets. For example:</div><div><div>PATCH '/v1/data-sources/vitrage/tables/alarms' with body:</div><div>[</div><div>  {</div><div>    "op":"add",</div><div>    "path":"/",</div><div>    "value":{</div><div>      "id":"1-1",</div><div>      "name":"name1",</div><div>      "state":"active",</div><div>      "severity":1</div><div>    }</div><div>  },</div><div>  {</div><div>    "op":"add",</div><div>    "path":"/",</div><div>    "value":[</div><div>      "1-2",</div><div>      "name2",</div><div>      "active",</div><div>      2</div><div>    ]</div><div>  },</div><div>  {</div><div>    "op":"remove",</div><div>    "path":"/",</div><div>    "value":[</div><div>      "1-2",</div><div>      "name2",</div><div>      "active",</div><div>      2</div><div>    ]</div><div>  }</div><div>]</div></div></div><div><br></div><div>Would that work well? At least there will be well-defined semantic based on sequential operation.</div><span id="OLK_SRC_BODY_SECTION"><blockquote id="MAC_OUTLOOK_ATTRIBUTION_BLOCKQUOTE" style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;"><div dir="ltr"><div><div><br></div><div>Tim</div><div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jan 5, 2018 at 5:50 PM Eric K <<a href="mailto:ekcs.openstack@gmail.com">ekcs.openstack@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>We've been discussing generic push drivers for Congress for quite a while. Finally sketching out something concrete and looking for some preliminary feedback. Below are sample interactions with a proposed generic push driver. A generic push driver could be used to receive push updates from vitrage, monasca, and many other sources.</div><div><br></div><div>1. creating a datasource:</div><div><br></div><div>congress datasource create generic_push_driver vitrage --config schema='</div><div>{</div><div>  "tables":[</div><div>    {</div><div>      "name":"alarms",</div><div>      "columns":[</div><div>        "id",</div><div>        "name",</div><div>        "state",</div><div>        "severity",</div><div>      ]</div><div>    }</div><div>  ]</div><div>}</div><div>'</div><div><br></div><div>2. Update an entire table:</div><div><br></div><div>PUT '/v1/data-sources/vitrage/tables/alarms' with body:</div><div>{</div><div>  "rows":[</div><div>    {</div><div>      "id":"1-1",</div><div>      "name":"name1",</div><div>      "state":"active",</div><div>      "severity":1</div><div>    },</div><div>    [</div><div>      "1-2",</div><div>      "name2",</div><div>      "active",</div><div>      2</div><div>    ]</div><div>  ]</div><div>}</div><div>Note that a row can be either a {} or []</div><div><br></div><div><br></div><div>3. perform differential update:</div><div><br></div><div>PUT '/v1/data-sources/vitrage/tables/alarms' with body:</div><div>{</div><div>  "addrows":[</div><div>    {</div><div>      "id":"1-1",</div><div>      "name":"name1",</div><div>      "state":"active",</div><div>      "severity":1</div><div>    },</div><div>    [</div><div>      "1-2",</div><div>      "name2",</div><div>      "active",</div><div>      2</div><div>    ]</div><div>  ]</div><div>}</div><div><br></div><div>OR</div><div><br></div><div>{</div><div>  "deleterows":[</div><div>    {</div><div>      "id":"1-1",</div><div>      "name":"name1",</div><div>      "state":"active",</div><div>      "severity":1</div><div>    },</div><div>    [</div><div>      "1-2",</div><div>      "name2",</div><div>      "active",</div><div>      2</div><div>    ]</div><div>  ]</div><div>}</div><div><br></div><div>Note 1: we may allow 'rows', 'addrows', and 'deleterows' to be used together with some well defined semantics. Alternatively we may mandate that each request can have only one of the three pieces.</div><div><br></div><div>Note 2: we leave it as the responsibility of the sender to send and confirm the requests for differential updates in correct order. We could add sequencing in future work.</div></div></blockquote></div></div></div></div></blockquote></span></body></html>