<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<base href="https://issues.jboss.org">
<title>Message Title</title>
</head>
<body class="jira" style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt" bgcolor="#f5f5f5">
<!-- header here -->
<tbody>
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tbody>
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px" width="32"> <img id="header-avatar-image" class="image_fix" src="https://static.jboss.org/developer/gravatar/84386cc35cecf75d5eed5c9142e5f154?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top"> </td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="davidmartin" id="email_davidmartin" href="https://issues.jboss.org/secure/ViewProfile.jspa?name=davidmartin" style="color:#3b73af;; color: #3b73af; text-decoration: none">David Martin</a> <strong>edited a comment</strong> on <a href="https://issues.jboss.org/browse/AGDROID-708" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-avatar-56fad50f-3eac-41bd-92d5-b0dc1dec3799" height="16" width="16" border="0" align="absmiddle" alt="Task"> AGDROID-708</a> </td>
</tr>
</tbody>
</table> </td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tbody>
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #ffffff; padding: 0 15px 0 16px; height: 15px; background-color: #ffffff; border-left: 1px solid #cccccc; border-top: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly" height="10" bgcolor="#ffffff"> </td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff" bgcolor="#ffffff">
<table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tbody>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://issues.jboss.org/browse/AGDROID-708" style="color: #3b73af; text-decoration: none">Re: Investigate & evaluate couchbase-lite-android & the sync_gateway as a data storage & sync solution</a> </span> </td>
</tr>
</tbody>
</table> </td>
</tr>
<tr>
<td id="text-paragraph-pattern-top" class="email-content-main mobile-expand comment-top-special-margin comment-top-pattern" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff; border-bottom: none; padding-bottom: 0" bgcolor="#ffffff">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tbody>
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0; padding-top: 10px"> <span class="diffcontext">Progressing investigation in https://github.com/david-martin/CouchbaseTest.<br>WIll update this comment with more info as I go along.<br>The majority of below is based on what I disovered while using the Android SDK.<br><br>h2. Licensing of components<br><br>* Apache-2.0 - https://github.com/couchbase/couchbase-lite-android<br>* Apache-2.0 - https://github.com/couchbase/couchbase-lite-ios<br>* MIT - https://github.com/couchbase/couchbase-lite-net<br>* Apache-2.0 - https://github.com/couchbase/sync_gateway<br><br>More repos: https://github.com/couchbase<br><br>Info on differences between 'Enterprise' & 'Community' https://www.couchbase.com/products/editions<br><br>h2. Mobile API<br><br>API documentation https://developer.couchbase.com/documentation/mobile/1.5/references/couchbase-lite/couchbase-lite/index.html<br><br>The API looks to be the same across SDK platforms.<br>A `Manager` is used to create/access a `Database` on device.<br>You can create/modify a `Document` in the `Database`.<br>You can get a `View` of a set of `Documents` based on a `Query`.<br>A `Replication` can be setup to push and pull `Database` changes to the Sync Gateway.<br>An `Authenticator` can be configured for auth when doing replication.<br><br>It is possible to save binary data by creating 1 or more `Attachment`s and linking them to a `Document`. https://developer.couchbase.com/documentation/mobile/1.5/guides/couchbase-lite/native-api/attachment/index.html<br><br>h2. Mobile platforms<br><br>* Android - https://github.com/couchbase/couchbase-lite-android<br>* iOS - https://github.com/couchbase/couchbase-lite-ios<br>* .NET - https://github.com/couchbase/couchbase-lite-net<br>* Phonegap/Cordova - https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin<br><br>h2. Syncing mechanism to a remote database & other mobile apps<br><br>The `Repliation` class is responsible for replicating/syncing data between a local & remote `Database`.<br>https://developer.couchbase.com/documentation/mobile/1.5/references/couchbase-lite/couchbase-lite/replication/replication/index.html<br>Mobile Apps talk to the Sync Gateway, which notifies any interested connected clients of changes to `Documents`.<br>This is done in realtime through a `_changes` API that notifies clients of any changes to documents they are interested in.<br><br>For iOS, a websocket is used.<br>For Android, long polling is used. However, there is an open issue to add websocket support for Android, but this shouldn't be too difficult given there's a reference in iOS.<br>https://github.com/couchbase/couchbase-lite-java-core/issues/493<br><br>h2. Offline capability<br><br>The Mobile SDKs include/allow access to a lightweight database (sqlite or forestdb).<br>The developer has full access to this database while offline. <br>The database gets 'replicated' to/from the sync gateway by creating a Push & Pull Replication instance.<br><br>h2. Conflicts<br><br>There's documentation on how to programatically list conflicts and ways to resolve them<br>https://developer.couchbase.com/documentation/mobile/current/guides/sync-gateway/resolving-conflicts/index.html<br>https://developer.couchbase.com/documentation/mobile/current/guides/couchbase-lite/native-api/document/index.html#document-conflict-faq<br><br>For the server, it seems possible to have automated timestamp based conflict resolution.<br>https://developer.couchbase.com/documentation/server/current/xdcr/xdcr-timestamp-based-conflict-resolution.html<br><br>h2. Authentication & Authorisation (e.g. OIDC integration)<br><br>The Sync Gateway has the ability to manage users & permissions.<br><br>It is also possible to integrate with an external OIDC provider.<br>https://developer.couchbase.com/documentation/mobile/1.5/guides/authentication/openid/index.html<br><br>Couchbase docs has general info on OIDC and examples with cloud providers.<br>As part of investigation, the sample Android App has Keycloak working for authentication https://github.com/david-martin/CouchbaseTest.<br>Also, I got the couchbase Grocery Store example working with Keycloak https://github.com/couchbaselabs/GrocerySync-Android. The main changes required were in the sync gateway config for the keycloak client & validation key/secret.<br><br>For dynamic authorisation, there is a 'sync function' that can be defined.<br>https://developer.couchbase.com/documentation/mobile/1.5/guides/sync-gateway/sync-function-api-guide/index.html<br>"The sync function is the core API you interact with on Sync Gateway. For simple applications it might be the only server-side code you need to write. For more complex applications it is still a primary touchpoint for managing data routing and access control."<br><br>I don't fully understand the scope of what can be done with the sync function.<br>However, there is a tool to help generate a sync function based on defintions for access & validation.<br>https://github.com/Kashoo/synctos<br><br>There is also scope for an app server sitting in front of the sync gateway (as a proxy) to provide authentication.<br>More info at https://developer.couchbase.com/documentation/mobile/1.5/guides/authentication/custom-authentication/index.html.<br>Again, I'm not sure how much is possible this way. For example, is it possible to define 'middleware' in your own server that could check keycloak roles of the user to see if they are authorised to access/modify certain data.<br><br>(Possibly needs a spike to see whats possible around custom authorisation)<br><br>h2. Data Source Integrations (Backend integrations)<br><br>There is nothing</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> obvious available or no obvious examples for how to add external data sources that</span> <span class="diffaddedchars" style="background-color:#ddfade;"> built into the</span> <span class="diffcontext"> sync</span> <span class="diffaddedchars" style="background-color:#ddfade;"> gateway to allow storing</span> <span class="diffcontext">/</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;">replicate</span> <span class="diffaddedchars" style="background-color:#ddfade;">syncing data</span> <span class="diffcontext"> to</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> the</span> <span class="diffaddedchars" style="background-color:#ddfade;"> a different backend db other than</span> <span class="diffcontext"> couchbase</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> server</span> <span class="diffcontext">. However, there are 2</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> potential</span> <span class="diffaddedchars" style="background-color:#ddfade;"> alternative</span> <span class="diffcontext"> ways to</span> <span class="diffremovedchars" style="background-color:#ffe7e7;text-decoration:line-through;"> do</span> <span class="diffaddedchars" style="background-color:#ddfade;"> approach a solution to</span> <span class="diffcontext"> this</span> <span class="diffaddedchars" style="background-color:#ddfade;"> problem</span> <span class="diffcontext">.<br><br>1: Write a custom service that uses one of the couchbase-lite clients (e.g. java, python, ruby). That service could perform the necessary data translation between couchbase server and the external data source.</span> <span class="diffaddedchars" style="background-color:#ddfade;"> There is also a node.js example that shows importing and exporting data by using a swagger client and the sync gateway Admin API https://developer.couchbase.com/documentation/mobile/1.5/guides/sync-gateway/integrating-external-stores/index.html</span> <span class="diffcontext"><br><br>2: Use JBoss Fuse and Apache Camel (following 1 or more Enterprise Integration Patterns) to connect and translate data between couchbase server & the external data source.</span> <span class="diffaddedchars" style="background-color:#ddfade;"> This suggestion is from [~wtrocki], and sounds reasonable. However, I don't have experience in this area and cant comment beyond that.</span> <span class="diffcontext"><br><br>h2. Using with an API Gateway (e.g 3scale)<br><br>If using longpolling, there should be no issue having an API Gateway in front of the sync gateway. If using websockets, it should be possible, but would have to be tried out. There is an example of using websockets with apicast here https://github.com/VinayBhalerao/apicast-examples/tree/master/apicast-websockets.<br><br>h2. Monitoring/Metris<br><br>Couchbase server doesn't seem to have a built in prometheus metrics endpoint.<br>However it does have very detailed statistics monitoring https://developer.couchbase.com/documentation/server/current/monitoring/ui-monitoring-statistics.html.<br>There are also a number of examples of prometheus exporters for couchbase. Here are 2:<br><br>* https://pypi.python.org/pypi/prometheus-couchbase-exporter/1.0.0<br>* https://github.com/Zumata/couchbase_exporter<br><br>I haven't tried these out, but I'd imagnine its possible to get hooks into the stats (e.g. disk queues, resources, buckets)<br><br>h2. Alerting/Hooks<br><br>Couchbase has built in admin alerting. See https://developer.couchbase.com/documentation/server/5.0/settings/configure-alerts.html#topic_yq2_qqn_vs for the full list.<br><br>It is possible to define webhooks and 'hook' into the changes feed for specific dbs i.e. define event handlers and filter functions. https://developer.couchbase.com/documentation/mobile/current/guides/sync-gateway/server-integration/index.html<br>This could allow for custom alerting based on user defined events.<br><br>h2. Compatibility with Kubernetes/OpenShift<br><br>Docker images compatible with OpenShift were created as a result of a partnership with Couchbase. This was demoed in Red Hat Summit 2017. Kubernetes templates are also available from this demo.<br><br>* https://www.youtube.com/watch?v=fxox6DD96HQ<br>* https://github.com/couchbase-partners/redhat-openshift<br>* https://github.com/couchbase-partners/couchbase-kubernetes-openshift<br><br>I haven't tried this out.<br>However, it might be a good way to proceed i.e. try create an APB that uses these images & templates, and allows couchbase-lite-android to hook up to it.<br><br>This could be extended, if successful, to try use the mobile cli & mobile-config.json along with the Aerogear Android Core SDK to hook up automatically to what the APB provisions.<br><br>It could be extended further to add authentication to the App leveraging Keycloak. This would involve updating the sync gateway's sync-config.json file to add keycloak client/secret details when keycloak and couchbase are bound.</span> </td>
</tr>
</tbody>
</table> </td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #ffffff" bgcolor="#ffffff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tbody>
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tbody>
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0; vertical-align: middle"> <a href="https://issues.jboss.org/browse/AGDROID-708#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-f16425f0-3ebf-4a85-b9b0-3723a0eeee4f" alt="Add Comment" title="Add Comment" height="16" width="16" border="0" style="vertical-align: middle"> </a> </td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://issues.jboss.org/browse/AGDROID-708#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a> </td>
</tr>
</tbody>
</table> </td>
</tr>
</tbody>
</table> </td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #ffffff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #ffffff; border-top: 0; border-left: 1px solid #cccccc; border-bottom: 1px solid #cccccc; border-right: 1px solid #cccccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly" height="5" bgcolor="#ffffff"> </td>
</tr>
</tbody>
</table> </td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tbody>
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> This message was sent by Atlassian JIRA <span id="footer-build-information">(v7.5.0#75005-<span title="fd8c849d4e278dd8bbaccc61e707a716ad697024" data-commit-id="fd8c849d4e278dd8bbaccc61e707a716ad697024}">sha1:fd8c849</span>)</span> </td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tbody>
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="cid:jira-generated-image-static-footer-desktop-logo-75f08240-898d-4634-a001-37400d861498" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix"> </td>
</tr>
</tbody>
</table> </td>
</tr>
</tbody>
</table> </td>
</tr>
</tbody>
</table>
</body>
</html>