<div dir="ltr"><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Hello, Stackers.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Trove wiki and launchpad pages are stating that, it is a scalable database service that allows users to quickly and easily utilize the features of a relational database without the burden of handling complex administrative tasks. Trove already can provision single instances of certain databases.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">How does developers can integrate new datastores?</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Each datastore requires its own option group. What does it mean?</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">For each datastore developer has</span><a href="https://github.com/openstack/trove/blob/master/trove/common/cfg.py#L270-L436" style="text-decoration:none"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> to </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">defined</span></a><a href="https://wiki.openstack.org/wiki/Oslo/Config" style="text-decoration:none"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">oslo option group</span></a><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">. It contains a set of required configuration parameters that are being used at various stages of provisioning/management.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Group content</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Each group contains options that are being used by regular Trove services such as Trove-api, Trove-taskmanager and one very specific Trove-guestagent.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Options that are required by API and Taskmanager service:</span></p>
<br><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">tcp_ports</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - a list of TCP ports that would be used as basis for building rules for data security group assigned for instance.</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">upd_ports</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - a list of UDP ports that would be used as basis for building rules for data security group assigned for instance.</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">root_on_create</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - Enable the automatic creation of the root user for the service during instance-create. The generated password for the root user is immediately returned in the response of "instance-create as the 'password' field.</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">usage_timeout - </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Timeout to wait for a guest to become active.</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">backup_strategy</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - specific class that responsible for backup creation</span></p>
</li></ul><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Options that are required by Trove-guestagent:</span></p>
<br><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">backup_strategy</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - specific class that responsible for backup creation</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">mount_point</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - FS path to mount block storage volume.</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">backup_namespace</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - backup namespace where backup_strategy defined</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">restore_namespace</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> - restore namespace where restore strategy defined</span></p>
</li></ul><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">For now all this options (for all services) are defined within one configuration group.</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">So, here comes first suggestion. We need to split each datastore group onto two:</span></p>
<ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">server-side datastore options</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">guest-side datastore options</span></p>
</li></ul><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Benefits. Refactoring would give an ability to split guest per-datastore options and extract guest from codebase completely.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Now let’s take a look how does Trove-guestagent works.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Trove-guestagent is a RPC service with per-datastore manager. Each time instance provisioning gets initiated server-side injects configuration files, one of them contains significant option for guest - datastore_manager option. It’s used to load specific datastore manager implementation.</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">This is how it works:</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Type of configuration attribute</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">: </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">dictionary</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Name</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">: </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">datastore_registry_ext</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Example</span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">:</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline">datastore_registry_ext = {percona: trove.guestagent.datastore.mysql.manager.Manager,</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline"> mysql: trove.guestagent.datastore.mysql.manager.Manager,</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline"> cassandra: trove.guestagent.datastore.cassandra.manager.Manager,}</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> </span><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Here comes an issue - each guest contains tons for files specific to each datastore. For development reasons - it’s totally fine, but for production requirements - it’s not good at all. Guest should be lightweight, it should be small, etc.</span></p>
<br><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">How can we simplify datastore integration?</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">I’d like to propose to integrate </span><a href="http://stevedore.readthedocs.org/en/latest/" style="text-decoration:none"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">stevedore</span></a><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"> into Trove services. </span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">From Trove-guestagent perspective. According to description above we have two separate entities that are needed to be injected during guest deployment (while preparing image for specific datastore):</span></p>
<ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">datastore configuration options</span></p>
</li><li dir="ltr" style="list-style-type:disc;font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">manager implementation</span></p>
</li></ul><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Basically, those entities can be merged into one, since manager implementation relays on datastore configuration options.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">From Trove-API and Trove-taskmanager perspective we need to inject per-datastore attributes which are mentioned above.</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Implementation details</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">This topic mostly touches guestagent. Stevedore integration will forces us to define new abstract layer for datastore manager - BaseDatastore manager.</span></p>
<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Benefits? For now only mysql datastore manager can handle 100% of API calls (see [1]) but other datastores would not support certain API calls (see [2] - [5]). So, abstract layer would reduce size of certain manager implementation (it would not contain calls like [6] ). Another one benefit - we don’t need to handle managers registry - each new datastore manager can be included from 3d party packages through guests` setup.cfg</span></p>
<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">So, i’d like to initiate discussion with all of you folks before submitting BP and requesting for review procedure.</span></p>
<br><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt;text-indent:36pt;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Thoughts?</span></p>
<div style="margin-left:40px"><br></div><p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[1] </span><a href="https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mysql/manager.py" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mysql/manager.py</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[2] </span><a href="https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mongodb/manager.py" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mongodb/manager.py</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[3] </span><a href="https://github.com/openstack/trove/blhttps://github.com/openstack/trove/blob/master/trove/guestagent/datastore/couchbase/manager.pyob/master/trove/guestagent/datastore/mysql/manager.py" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/couchbase/manager.py</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[4] </span><a href="https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/redis/manager.py" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/redis/manager.py</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[5] </span><a href="https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/cassandra/manager.py" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/cassandra/manager.py</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">[6] </span><a href="https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mongodb/manager.py#L96-L160" style="text-decoration:none"><span style="font-size:13px;font-family:'Times New Roman';color:rgb(17,85,204);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline">https://github.com/openstack/trove/blob/master/trove/guestagent/datastore/mongodb/manager.py#L96-L160</span></a></p>
<p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"><br>
</span></p><p dir="ltr" style="line-height:1.15;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"><br>
</span></p><p style="line-height:1.15;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Best regards,</span></p>
<p style="line-height:1.15;text-align:justify"><span style="font-size:17px;font-family:'Times New Roman';color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline">Denis Makogon</span></p>
<br><br><br></div>