<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"><channel><title>trove-specs</title><link>https://specs.openstack.org/openstack/trove-specs</link><description /><copyright>2013, OpenStack Foundation</copyright><item><title>Cassandra Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/cassandra-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Cassandra datastore currently does not support configuration groups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement configuration groups for Cassandra 2.1.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The configuration template will be updated to the default template for the
target platform.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;templates/cassandra/config.template&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Cassandra stores its configuration in ‘cassandra.yaml’ file
(commonly in ‘/etc/cassandra’).
The node (datastore service) has to be restarted for any changes to the
configuration file to take effect. All configuration changes will therefore be
requiring database restart and ‘apply_overrides’ will be implemented as no-op.&lt;/p&gt;
&lt;p&gt;Overrides will be implemented by replacing the current file with an
updated one.
The old file will be backed up in the same directory (as &lt;em&gt;*.old&lt;/em&gt;) and
restored on configuration reset.&lt;/p&gt;
&lt;p&gt;Most configuration properties will be available via configuration groups.
Some, however, do not make sense in the Trove context.&lt;/p&gt;
&lt;p&gt;These include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;irrelevant options (like automatic snapshots, since the Trove user cannot
retrieve them)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guestagent specific (e.g. file paths, passwords)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;items that Trove needs to control (replication/clustering properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; for the full list of supported
options.&lt;/p&gt;
&lt;p&gt;The user should be able to specify configurations properties as standard Python
YAML objects - key-value pairs and dicts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="available-configuration-properties"&gt;
&lt;h3&gt;Available Configuration Properties&lt;/h3&gt;
&lt;p&gt;Properties not included in the lists are kept at their default values
and are not configurable via Trove.&lt;/p&gt;
&lt;p&gt;The properties configurable by the user via the Trove API:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cluster_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;listen_address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commit_failure_policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;disk_failure_policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;endpoint_snitch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;seed_provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compaction_throughput_mb_per_sec&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_total_space_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;concurrent_reads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;concurrent_writes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;phi_convict_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commitlog_sync&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commitlog_segment_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commitlog_total_space_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compaction_preheat_key_cache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;concurrent_compactors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;in_memory_compaction_limit_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;preheat_kernel_page_cache&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sstable_preemptive_open_interval_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_allocation_type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_cleanup_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;file_cache_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_flush_queue_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_flush_writers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_heap_space_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memtable_offheap_space_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;column_index_size_in_kb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;index_summary_capacity_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;index_summary_resize_interval_in_minutes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduce_cache_capacity_to&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reduce_cache_sizes_at&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;stream_throughput_outbound_megabits_per_sec&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inter_dc_stream_throughput_outbound_megabits_per_sec&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trickle_fsync&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trickle_fsync_interval_in_kb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auto_bootstrap&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;batch_size_warn_threshold_in_kb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;broadcast_address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;initial_token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;initial_token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;num_tokens&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;partitioner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;key_cache_keys_to_save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;key_cache_save_period&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;key_cache_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;row_cache_keys_to_save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;row_cache_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;row_cache_save_period&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memory_allocator&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;counter_cache_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;counter_cache_save_period&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;counter_cache_keys_to_save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;counter_cache_keys_to_save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tombstone_warn_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tombstone_failure_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;range_request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;read_request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;counter_write_request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cas_contention_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;truncate_request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write_request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cross_node_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internode_send_buff_size_in_bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internode_recv_buff_size_in_bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internode_compression&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inter_dc_tcp_nodelay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;streaming_socket_timeout_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;native_transport_max_threads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;native_transport_max_frame_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;broadcast_rpc_address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_keepalive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_max_threads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_min_threads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_recv_buff_size_in_bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_send_buff_size_in_bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rpc_server_type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dynamic_snitch_badness_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dynamic_snitch_reset_interval_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dynamic_snitch_update_interval_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hinted_handoff_enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hinted_handoff_throttle_in_kb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_hint_window_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_hints_delivery_threads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;batchlog_replay_throttle_in_kb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request_scheduler&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request_scheduler_id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request_scheduler_options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;thrift_framed_transport_size_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;thrift_max_message_length_in_mb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions_validity_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;permissions_update_interval_in_ms&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Non-configurable properties with updated default values:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;authenticator&lt;/em&gt;: &lt;strong&gt;org.apache.cassandra.auth.PasswordAuthenticator&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;authorizer&lt;/em&gt;: &lt;strong&gt;org.apache.cassandra.auth.CassandraAuthorizer&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;snapshot_before_compaction&lt;/em&gt;: &lt;strong&gt;false&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;auto_snapshot&lt;/em&gt;: &lt;strong&gt;false&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;rpc_address&lt;/em&gt;: &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;broadcast_rpc_address&lt;/em&gt;: &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;listen_address&lt;/em&gt;: &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;seed_provider.parameters.seeds&lt;/em&gt;: &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement functionality to handle (read/write/update) YAML files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement configuration-related manager API calls.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The patch set will be building on functionality implemented in blueprint:
cassandra-database-user-functions&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests will be added to validate implemented functions and non-trivial
codepaths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Documentation on Cassandra 2.1: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html&lt;/a&gt;
Documentation on Cassandra 2.1 configuration properties: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/configuration/configTOC.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/configuration/configTOC.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Cassandra Database and User Functions</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/cassandra-database-user-functions.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-database-user-functions"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-database-user-functions&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Cassandra datastore currently does not support keyspace &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;*&lt;/a&gt; and
user management features.&lt;/p&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;*&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;A keyspace is the outermost container for data in Cassandra,
corresponding closely to a relational database.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement the following keyspace and user related
functionality for Cassandra 2.1 &lt;a class="footnote-reference brackets" href="#id7" id="id3"&gt;2&lt;/a&gt; datastore:&lt;/p&gt;
&lt;p&gt;User Functions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create/delete/get user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change password&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grant/revoke/list access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update attributes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keyspace Functions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create/delete database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list databases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Cassandra stores its configuration in ‘cassandra.yaml’ file
(commonly in ‘/etc/cassandra’).
The node (datastore service) has to be restarted for any changes to the
configuration file to take effect.
The configuration template will have to be updated to enable authentication and
authorization in order to support datastore users and related functions.
Client-specific settings (authentication defaults) are stored in
‘~/.cassandra/cqlshrc’ where ‘~’ is the home directory of the Trove user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;The current implementation allows original anonymous connections therefore
making the datastore wide open for anybody with connection URL.
This has to be changed first as the user functions are not even enabled in this
setting.&lt;/p&gt;
&lt;p&gt;In Cassandra only SUPERUSERS can create other users and
grant permissions to database resources.
Trove uses the ‘cassandra’ superuser to perform its administrative
tasks.
The users it creates are all ‘normal’ (NOSUPERUSER) accounts.
The permissions it can grant are also limited to non-superuser
operations. This is to prevent anybody from creating a new superuser via
the Trove API.
Similarly, all list operations include only non-superuser accounts.
Updatable attributes include username and password.
We are not going to implement enabling superuser account in this patch set.&lt;/p&gt;
&lt;p&gt;The datastore configuration template had to be updated to enable authentication
and authorization support (original configuration allowed anonymous
connections). Default implementations used are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;authenticator: org.apache.cassandra.auth.PasswordAuthenticator&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;authorizer: org.apache.cassandra.auth.CassandraAuthorizer&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The superuser password needs to be changed from the default ‘cassandra’
to a random Trove password which is then stored in a Trove-read-only
file in ‘~/.cassandra/cqlshrc’ which is also the default location for
client settings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The current implementation uses the CQLSH &lt;a class="footnote-reference brackets" href="#id8" id="id4"&gt;3&lt;/a&gt; command line client to
interface with
the underlying database. Trove talks to the CQLSH client via the available
shell and relies on parsing the output of the client to determine the current
state of the datastore and status of the last operation.
It also requires Trove to provide the input as a formatted
(and sanitized) string accepted by the installed version of the client.
This is not very portable and poses numerous potential compatibility issues in
the future when the guest agent gets ported to other platforms.
It also completely bypasses the native exception handling implemented by the
Python client.
In order to make the guestagent communicate via the native Python API and
avoid future portability issues we reimplement the communication interface
using the the official open-source Python driver for Cassandra.
The native interface will be implemented in CassandraConnection and
will also be used to obtain the database status leveraging Python exceptions
framework.&lt;/p&gt;
&lt;p&gt;User-related functions require having the authorization and authentication
support enabled on the server. The configuration template will be updated to
reflect this requirement (see the section on ‘Public API Security’).&lt;/p&gt;
&lt;p&gt;The following section elaborates on keyspace &lt;em&gt;(“database”)&lt;/em&gt; functions.
Cassandra natively supports row replication. It can store a configurable number
of copies (replicas) of each row on multiple nodes to ensure reliability and
fault tolerance. All such replicas are equally important;
there is no primary or master.
It supports several replication strategies which determine how the replicated
rows get distributed across the entire Cassandra cluster.
The total number of row replicas in a cluster is referred to as the
replication factor.
The ‘create database’ implementation will be using ‘SimpleStrategy’
which is the only strategy that makes sense for a single node setup.
It is a very simplistic configuration with just a single copy (replica) on
the guest machine only good for the most basic
applications and demonstration purposes.
The following system keyspaces will be by-default excluded from database
operations and listing by having them included in the ‘ignore_dbs’ list:
‘system’, ‘system_auth’, ‘system_traces’&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement native-driver-based connection for Cassandra datastore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable authentication and authorization on server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement user-function API calls.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;The required native Python driver 2.0.x supports Cassandra 1.2 and higher.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Trove uses the official open-source Python driver &lt;a class="footnote-reference brackets" href="#id6" id="id5"&gt;1&lt;/a&gt; for Cassandra
to connect to the database and execute queries.
The driver already exists in OpenStack global requirements.
It does not have to be included in the ‘requirements.txt’ file, but
it will need to be added to ‘test-requirements.txt’ file to enable unit tests.
The image provider will be required to install it (‘cassandra-driver’)
in the Cassandra images.
The current Trove integration images will be updated to do that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests will be added to validate implemented functions and non-trivial
codepaths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Native Python Driver for Cassandra: &lt;a class="reference external" href="http://docs.datastax.com/en/developer/python-driver/2.5/common/drivers/introduction/introArchOverview_c.html"&gt;http://docs.datastax.com/en/developer/python-driver/2.5/common/drivers/introduction/introArchOverview_c.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on Cassandra 2.1: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;CQL Reference: &lt;a class="reference external" href="http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cqlReferenceTOC.html"&gt;http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cqlReferenceTOC.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Implement Percona cluster provisioning</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/percona-cluster.html</link><description>
 
&lt;p&gt;To continue the Trove HA story, high availability of database instances is
required in order to give users a peace of mind when running their production
workloads in Trove. Apart from replication, clustering makes the deployment
to be highly available by allowing data to be accessed from any node in the
cluster. It enhances system uptime, it prevents from data loss and makes the
architecture more scalable for future growth. Trove Clustering for the
Percona datastore will be based on the Percona XtraDB Cluster, which is a
true Multimaster Cluster based on synchronous replication.&lt;/p&gt;
&lt;p&gt;This change will focus on the Create, List, Show, and Delete of a Peronca
cluster. Grow and shrink of the cluster will be handled in a separate
blueprint.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/support-pxc-56"&gt;https://blueprints.launchpad.net/trove/+spec/support-pxc-56&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Percona datastore does not have support for clustering. Adding a cluster
implementation will allow users to create read and write scalable and highly
available deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Percona cluster will leverage the base cluster implementation that currently
exists in Trove by creating plugabble and configurable strategies.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The cluster should not have less than three nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initial cluster creation will start with 3 or more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cluster will return all IPs of its nodes.
This is done so that the cluster can be used for multi write and read.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The name of each instance will be automatically generated;
it will be the &amp;lt;cluster_name&amp;gt;-&amp;lt;instance_num&amp;gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The clusters shall have nodes of same volumes but not for flavors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clusters shall allow the instances/cluster members to be resizable for
volume and flavors. No validation will occur if a user resizes volumes
or flavors of an instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following will be changed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A percona-cluster implementation will be added to
common/strategies/cluster/experimental/mysql/xtradbcluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Task manager strategy to handle the cluster provisioning for percona.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guestagent strategy to handle the clustering provisioning,
configuration and execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new datastore configuration section will be added.  This initial
implementation will add no Percona-Cluster specific configuration
options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-integration"&gt;
&lt;h3&gt;Trove Integration&lt;/h3&gt;
&lt;p&gt;The Redstack script will create a datastore configuration for
percona-cluster to open ports 3306, 4444, 4567, and 4568.&lt;/p&gt;
&lt;p&gt;Elements will be added to support “redstack kick-start
percona-cluster-5.6”.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;This implementation will leverage the existing database schema for cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The API request for creating/deleting cluster will remain unchanged. However,
there will be subtle differences in the response. Percona clustering will
return all IPs of its nodes. This will be used for the user who wants to scale
read/write.&lt;/p&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dfbbd9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f78643e17998&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-instance"&gt;
&lt;h4&gt;Show Instance&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dfbbd9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f78643e17998&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;416&lt;/span&gt;&lt;span class="n"&gt;b0b16&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ba55&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4302&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bbd3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ff566032e1c1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.17&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-clusters"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"clusters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-cluster"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dfbbd9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f78643e17998&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt; &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No changes in the internal API yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No API changes in the guest agent. This feature will just be adding a new
strategy to support a different type of clustering.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following illustrates the clustering CLI&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-create

usage: trove cluster-create &amp;lt;name&amp;gt; &amp;lt;datastore&amp;gt; &amp;lt;datastore_version&amp;gt;
                            [--instance &amp;lt;instance&amp;gt;]

Creates a new cluster.

Positional arguments:
  &amp;lt;name&amp;gt;                Name of the cluster.
  &amp;lt;datastore&amp;gt;           A datastore name or UUID.
  &amp;lt;datastore_version&amp;gt;   A datastore version name or UUID.

Optional arguments:

  --instance &amp;lt;flavor_id=flavor_id,volume=volume,parameters=&amp;lt;key=value&amp;gt;&amp;gt;
                        Create an instance for the cluster. Specify
                        multiple times to create multiple instances.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-create products percona "5.5" \
  --instance flavor_id=7,volume=2 \
  --instance flavor_id=7,volume=2 \
  --instance flavor_id=7,volume=2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Property&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;percona&lt;/span&gt;                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;                                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;aa6ef0f5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dbef&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8952&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;573&lt;/span&gt;&lt;span class="n"&gt;ad881e717&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_description&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_name&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BUILDING&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The cluster-create command will create a cluster of functionally
equivalent trove instances.  Trove will choose a instance to start with
the –wsrep-new-cluster option, then the remaining instances will be
started sequentially.  The cluster will be marked ACTIVE when all
instances have started and the database is available for use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-show

usage: trove cluster-show &amp;lt;cluster&amp;gt;

Shows details of a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID or name of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-show aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Property&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;percona&lt;/span&gt;                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;                                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;aa6ef0f5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dbef&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8952&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;573&lt;/span&gt;&lt;span class="n"&gt;ad881e717&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_description&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_name&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NONE&lt;/span&gt;                                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster-instance"&gt;
&lt;h4&gt;Show Cluster Instance&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-instances

usage: trove cluster-instances &amp;lt;cluster&amp;gt;

Lists all instances of a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID or name of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-instances aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;                                  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;45532&lt;/span&gt;&lt;span class="n"&gt;fc4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;661&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4030&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;ca4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="n"&gt;f02a2b337&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7458&lt;/span&gt;&lt;span class="n"&gt;a98d&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;f89&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;dfd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bb61&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;cf1d65c121&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1557208&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;c23&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4537&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a9f2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="n"&gt;a9db38d3a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-list

usage: trove cluster-list [--limit &amp;lt;limit&amp;gt;] [--marker &amp;lt;ID&amp;gt;]

Lists all the clusters.

Optional arguments:
  --limit &amp;lt;limit&amp;gt;  Limit the number of results displayed.
  --marker &amp;lt;ID&amp;gt;    Begin displaying the results for IDs greater than the
                   specified marker. When used with --limit, set this to
                   the last ID displayed in the previous run.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-list
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;DsVersion&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;percona&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip1&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NONE&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;percona&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BUILDING&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-delete

usage: trove cluster-delete &amp;lt;cluster&amp;gt;

Deletes a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-delete aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="replication-impact"&gt;
&lt;h3&gt;Replication Impact&lt;/h3&gt;
&lt;p&gt;Due to the scope of adding a replica to a cluster this will be disabled
as part of this blueprint and added as a separate blueprint. &lt;a class="footnote-reference brackets" href="#id8" id="id5"&gt;4&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;???&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None defined yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;To enable MySQL cluster support, a different package will be needed to install
on the guest instance rather than the default. There are 2 ways to mitigate
this in an upgrade path.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Update the packages installed on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build a new image with the new package installed into the guest image.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 26%"/&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 34%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Launchpad Id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;IRC&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Email&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Steve Leon&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;steve-leon&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;esmute&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:kokhang%40gmail.com"&gt;kokhang&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Morgan Jones&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;6-morgan&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;vgnbkr&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:morgan%40tesora.com"&gt;morgan&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Craig Vyvial&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:cp16net%40gmail.com"&gt;cp16net&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove-integration change to add percona-xtradb-cluster-server package&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Taskmanager strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guestagent strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;There will be unit tests that test every components in the strategies.
There will be integration tests which will test end-to-end cluster features&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The response API will look different due to the nature of XtraDB clusters.
For example, the view will contain all the IPs of the instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;API strategy to handle clustering request for Percona. Besides the existing
API, there will be new API to grow/shrink cluster handled in another
blueprint. (bp/cluster-scaling &lt;a class="footnote-reference brackets" href="#id7" id="id6"&gt;1&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;Trove does not monitor the status of cluster instances.  Should an instance
in the cluster become detached from the primary instance it will be up to
the user to detect the situation and take corrective action. If the instance
does not re-attach to the cluster in a state where an Incremental State
Transfer (IST) is possible, it is suggested to delete the
instance and add a new node to the cluster. (In the future, a user will be
able to delete the instance from a cluster via the shrink action and add
a new instance to the cluster with the grow action.)&lt;/p&gt;
&lt;p&gt;In the event of a nova compute reboot, the nodes will automatically
restart, and the cluster will automatically recover provided that the
nodes can determine that the PRIMARY component can be properly
recovered.  In the case that the PRIMARY component cannot be
recovered, operator intervention would be required to manually restart
the cluster.&lt;/p&gt;
&lt;p&gt;List of other cluster related blueprints. These blueprints will likely cause
conflicts with changes.&lt;/p&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id6"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;bp/cluster-scaling: &lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cluster-scaling"&gt;https://blueprints.launchpad.net/trove/+spec/cluster-scaling&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;percona-xtradb-with-replica: &lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/percona-add-replica-of-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/percona-add-replica-of-cluster&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;bp/mysql-manager-refactor:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mysql-manager-refactor"&gt;https://blueprints.launchpad.net/trove/+spec/mysql-manager-refactor&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;bp/cluster-user-management:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cluster-user-management"&gt;https://blueprints.launchpad.net/trove/+spec/cluster-user-management&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Add MariaDB GTID Replication Strategy</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/mariadb-gtid-replication.html</link><description>
 
&lt;p&gt;Global Transaction ID (GTID) Replication support was added during
the Kilo release for MySQL 5.6 and later. The equivalent for MySQL 5.6,
MariaDB 10, has a different implementation of GTID. By creating a similar
strategy implementation we could get support for GTID Replication for the
MariaDB 10 datastore.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mariadb-gtid-replication"&gt;https://blueprints.launchpad.net/trove/+spec/mariadb-gtid-replication&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In order to create a replica of a MariaDB instance you can only use
binary logs based replication. GTID replication was added as an alternative
for replication for MySQL 5.6, but it’s not available
for the equivalent for it, MariaDB 10.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;We would need to create
trove/trove/guestagent/strategies/replication/experimental/mariadb_gtid.py
in order to support replication for MariaDB.&lt;/p&gt;
&lt;p&gt;The SQL issued to set a new empty slave server and replicate all of the
master’s binlog from the start is as follows &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;2&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;CHANGE MASTER TO master_host="%(host)s", master_port=%(port)s, \
master_user="%(user)s", master_password="%(password)s", \
master_use_gtid=current_pos;
START SLAVE;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;By default, the GTID position for a newly installed server is empty,
which makes the slave replicate from the start of the master’s binlogs. &lt;a class="footnote-reference brackets" href="#id6" id="id2"&gt;3&lt;/a&gt;
current_pos in the SQL query carries that position.&lt;/p&gt;
&lt;p&gt;It doesn’t differ too much on what is being done for MySQL &lt;a class="footnote-reference brackets" href="#id4" id="id3"&gt;1&lt;/a&gt;,
but doing a refactoring might not be the best call right now since
it would add unnecessary complexity to the existing strategy.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Don’t support GTID-based Replication for MariaDB.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vkmc
vgnbkr&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Mitaka-2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create MariaDB GTID Replication strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create integration tests for replication in MariaDB 10&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Integration tests will be added to cover this functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Docs explaining this new addition will be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/trove/blob/master/trove/guestagent/strategies/replication/mysql_gtid.py"&gt;https://github.com/openstack/trove/blob/master/trove/guestagent/strategies/replication/mysql_gtid.py&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://mariadb.com/kb/en/mariadb/gtid/"&gt;https://mariadb.com/kb/en/mariadb/gtid/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://mariadb.com/kb/en/mariadb/gtid/"&gt;https://mariadb.com/kb/en/mariadb/gtid/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>PostgreSQL Replication</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/pgsql-replication.html</link><description>
 
&lt;p&gt;From version 9.0 onwards, PostgreSQL ships with streaming replication as part
of the core product, reversing a long held policy of leaving replication to
third-party add-ons such as Slony or pgpool.&lt;/p&gt;
&lt;p&gt;This blueprint proposes to support streaming replication since it is shipped
with the core product, although a discussion of some of the other PostgreSQL
options can be found in the alternatives section.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/postgresql-replication"&gt;https://blueprints.launchpad.net/trove/+spec/postgresql-replication&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In order to achieve feature parity with MySQL, Trove should provide support for
at least one of the replication solutions for PostgreSQL.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The standard parameters for enabling replication strategies,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replication_strategy&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replication_namespace&lt;/span&gt;&lt;/code&gt;, will be added to point
to the strategy code for PostgreSQL guests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;As with other datastores that support replication, the create instance
operation will support the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replica_of&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replica_count&lt;/span&gt;&lt;/code&gt; fields for
PostgreSQL guests:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;flavor-id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"replica_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;master id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"replica_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;n&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For guests with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_rewind&lt;/span&gt;&lt;/code&gt; &lt;a class="footnote-reference brackets" href="#id17" id="id1"&gt;9&lt;/a&gt; support, the following instance actions are
supported:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"detach_replica"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"eject_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"promote_to_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;As with other datastores that support replication, this will enable the
commands:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;replica_of&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;master_inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;on PostgreSQL guests. With &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_rewind&lt;/span&gt;&lt;/code&gt; &lt;a class="footnote-reference brackets" href="#id17" id="id2"&gt;9&lt;/a&gt; support on the guest, failover
and reconfiguration commands are supported:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;eject&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;promote&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;div class="section" id="write-ahead-log-wal-and-continuous-shipping"&gt;
&lt;h4&gt;Write-Ahead Log (WAL) and Continuous Shipping&lt;/h4&gt;
&lt;p&gt;PostgreSQL provides both high performance and crash recovery capability through
the use of a write-ahead log. The WAL files are appended to for every change
to the database, with periodic checkpoints to purge the logs and integrate the
changes into the database files &lt;a class="footnote-reference brackets" href="#id14" id="id3"&gt;4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PostgreSQL streaming replication is built on top of the recovery system: a
master database operates in continuous archiving mode, sending the contents of
its WAL files to one or more slave servers. These slave servers, in turn,
operate in continuous recovery mode, “recovering” from the logs as they are
received. A slave can be promoted in place of a failed master, and can be
configured to support read-only transactions while in recovery mode.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="replication-interface"&gt;
&lt;h4&gt;Replication interface&lt;/h4&gt;
&lt;div class="section" id="replication-snapshots"&gt;
&lt;h5&gt;Replication Snapshots&lt;/h5&gt;
&lt;p&gt;The PostgreSQL guestagent currently provides a backup and restore strategy
which makes use of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_dump&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_restore&lt;/span&gt;&lt;/code&gt; commands. These produce
logical dumps which cannot be used as part of a replication system that
depends on continuous archiving. As such, a backup/restore strategy using the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_basebackup&lt;/span&gt;&lt;/code&gt; tool is a requirement for replication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enabling-a-master"&gt;
&lt;h5&gt;Enabling a master&lt;/h5&gt;
&lt;p&gt;In order to support hot standby slaves, a PostgreSQL master must have
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;wal_level&lt;/span&gt;&lt;/code&gt; set to hot_standby, which is the most verbose mode. Replication
is handled through the use of a user that has been given REPLICATION privilege
&lt;a class="footnote-reference brackets" href="#id15" id="id4"&gt;6&lt;/a&gt; and has been explicitly allowed to access the special replication
database in the pg_hba.conf file. After enabling these changes, a
configuration reload is done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enabling-a-slave"&gt;
&lt;h5&gt;Enabling a slave&lt;/h5&gt;
&lt;p&gt;Enabling a slave requires a recent backup to be restored. Since streaming
replication bootstraps the recovery system, a recovery.conf file is written to
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PGDATA&lt;/span&gt;&lt;/code&gt; directory containing the connection details for the master that
should be replicated from. A restart is required to enable continuous recovery
mode.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="detaching-a-slave"&gt;
&lt;h5&gt;Detaching a slave&lt;/h5&gt;
&lt;p&gt;To detach a slave in PostgreSQL means to stop recovery mode. This is done by
writing a special trigger file, configured with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trigger_file&lt;/span&gt;&lt;/code&gt; option in
the recovery configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="demote-master"&gt;
&lt;h5&gt;Demote master&lt;/h5&gt;
&lt;p&gt;To demote a master requires no special action other than to revert
configuration changes to their defaults.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="failover-and-failback"&gt;
&lt;h4&gt;Failover and Failback&lt;/h4&gt;
&lt;p&gt;The failover process in Trove is controlled by the task-manager, but the guest
agent must implement functions that allow the task manager to determine the
best slave to promote and when it can proceed.&lt;/p&gt;
&lt;div class="section" id="global-transactions"&gt;
&lt;h5&gt;Global Transactions&lt;/h5&gt;
&lt;p&gt;Standard PostgreSQL does not support an equivalent of the GTID in MySQL, so the
combination of host + WAL location &lt;a class="footnote-reference brackets" href="#id16" id="id5"&gt;8&lt;/a&gt; will be used as a transaction
identifier where necessary.&lt;/p&gt;
&lt;p&gt;A simple polling mechanism will be implemented to determine when a slave has
caught up to the point of a particular change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="reattaching-slaves"&gt;
&lt;h5&gt;Reattaching Slaves&lt;/h5&gt;
&lt;p&gt;Failback in postgresql is complicated by recovery timelines &lt;a class="footnote-reference brackets" href="#id12" id="id6"&gt;2&lt;/a&gt; . When a slave
is triggered out of recovery mode, it jumps to a new timeline, generating new
WAL data into a “fork” of the previous database state. This can be seen in the
example of these 24-character WAL filenames:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;000000010000000000000006&lt;/span&gt;
&lt;span class="mi"&gt;000000020000000000000007&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These represent WAL files 6 and 7, but the 7th file is on a second timeline
forked from the first.&lt;/p&gt;
&lt;p&gt;When a master is demoted, however, it does not change timelines, and so in
order to safely reattach this demoted master to a newly-promoted slave, a
timeline resync is required.&lt;/p&gt;
&lt;p&gt;This can only be done safely through the use of the tool pg_rewind &lt;a class="footnote-reference brackets" href="#id17" id="id7"&gt;9&lt;/a&gt;. This
tool is supported for PostgreSQL 9.4, but must be compiled separately. In
PostgreSQL 9.5 it will be shipped with the core product.&lt;/p&gt;
&lt;p&gt;For guests that have pg_rewind available, failback can be done, otherwise a
manual recreate of another slave from the master is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;A number of third-party replication options exist for PostgreSQL, including
Slony, pgpool-II and a number of commercially-available solutions &lt;a class="footnote-reference brackets" href="#id11" id="id8"&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;pgpool-II depends on middleware that inserts itself between the client and the
underlying database instances. It provides the benefit of multi-master
replication, however conflict-resolution may be required in some cases.&lt;/p&gt;
&lt;p&gt;Slony provides master-slave replication using table-level triggers. It has
greater overhead on the master database than standard streaming replication,
but has the benefit of table-level granularity.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee: atomic77&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Target Milestone for completion:&lt;/p&gt;
&lt;p&gt;mitaka-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implement basic streaming replication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement failover-related APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add postgresql-specific hooks as necessary to enable generic int-tests for
replication to run against PostgreSQL guests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;pg_basebackup incremental backup and restore strategy for PostgreSQL.
&lt;a class="footnote-reference brackets" href="#id13" id="id9"&gt;3&lt;/a&gt; &lt;a class="footnote-reference brackets" href="#id18" id="id10"&gt;10&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Postgresql-specific hooks to the generic int-test framework will be added as
necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation will need to be updated to indicate that the PostgreSQL guest
supports replication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id11"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id8"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/9.4/static/different-replication-solutions.html"&gt;http://www.postgresql.org/docs/9.4/static/different-replication-solutions.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id12"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id6"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/9.4/static/continuous-archiving.html"&gt;http://www.postgresql.org/docs/9.4/static/continuous-archiving.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id13"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id9"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/current/static/app-pgbasebackup.html"&gt;http://www.postgresql.org/docs/current/static/app-pgbasebackup.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id14"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/9.0/static/wal-configuration.html"&gt;http://www.postgresql.org/docs/9.0/static/wal-configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;[5] &lt;a class="reference external" href="http://www.postgresql.org/docs/9.4/static/warm-standby-failover.html"&gt;http://www.postgresql.org/docs/9.4/static/warm-standby-failover.html&lt;/a&gt;&lt;/p&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id15"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;6&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/current/static/sql-createrole.html"&gt;http://www.postgresql.org/docs/current/static/sql-createrole.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;[7] &lt;a class="reference external" href="http://www.postgresql.org/message-id/flat/CA+TgmobWQJ-GCa_tWUc4=80A"&gt;http://www.postgresql.org/message-id/flat/CA+TgmobWQJ-GCa_tWUc4=80A&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:1RJ2_+Rq3w_MqaVguk_q018dqw%40mail.gmail.com#CA+TgmobWQJ-GCa_tWUc4=80A1RJ"&gt;1RJ2_+Rq3w_MqaVguk_q018dqw&lt;span&gt;@&lt;/span&gt;mail&lt;span&gt;.&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com#CA+TgmobWQJ-GCa_tWUc4=80A1RJ&lt;/a&gt;
&lt;a class="reference external" href="mailto:2_+Rq3w_MqaVguk_q018dqw%40mail.gmail.com"&gt;2_+Rq3w_MqaVguk_q018dqw&lt;span&gt;@&lt;/span&gt;mail&lt;span&gt;.&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id16"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;8&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;By “WAL location” we mean the position in the WAL file, as would be
returned by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_current_xlog_location()&lt;/span&gt;&lt;/code&gt; system
administration function&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id17"&gt;&lt;span class="brackets"&gt;9&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id2"&gt;2&lt;/a&gt;,&lt;a href="#id7"&gt;3&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/vmware/pg_rewind/tree/REL9_4_STABLE"&gt;https://github.com/vmware/pg_rewind/tree/REL9_4_STABLE&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id18"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id10"&gt;10&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/postgresql-incremental-backup"&gt;https://blueprints.launchpad.net/trove/+spec/postgresql-incremental-backup&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Percona XtraDB Cluster Grow and Shrink Support</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/pxc-grow-shrink-cluster.html</link><description>
 
&lt;p&gt;For the Percona XtraDB Cluster (pxc) datastore we need the ability to grow
and shrink a cluster. This will add these 2 core features to the pxc solution
we currently have.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/pxc-grow-shrink-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/pxc-grow-shrink-cluster&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;PXC is lacking support for grow and shrink clusters. This will allow a user
to create a new instance in the cluster and delete an existing instance from
the cluster.&lt;/p&gt;
&lt;p&gt;An example use case would be if an instance in the cluster is having issues
due to the underlying hardware, network, or other issues then a user can
remove the instance and create a new one to keep the cluster healthy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;PXC will use the existing grow and shrink API calls and implement them for the
pxc manager. This change will allow the cluster to be heterogeneous when
needing to grow or shrink the cluster. A heterogeneous cluster means that the
flavor and volume may not all be the same for every instance in a cluster.&lt;/p&gt;
&lt;p&gt;Requirements for grow:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A new instance in the cluster can be any valid flavor size.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new instance in the cluster must have a volume of the smallest size of
the instances in the cluster or larger. This is to make sure that new
instances created in the cluster have enough volume space to operate with
the rest of the cluster instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quota validation that user has the capacity to grow the cluster by the number
of instances and volume space in their account.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Requirements for shrink:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There must be at least 2 instances in the cluster in order to shrink a
cluster. A cluster instance count must have at least 1 instance to operate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few new guestagent API calls will be needed in order for grow to work.&lt;/p&gt;
&lt;p&gt;PXC handles joining a cluster automatically when given an ip address of one of
the nodes in the existing cluster. When given all the ips of the existing
cluster instances PXC will sequentially attempt to connect to the ips in the
list and attempt to join the cluster. If one of the instances in the list is
not up (crash or network or otherwise and issue) then PXC will try the next
ip in the list. This will help allow a user to join a new instance to the
cluster so that they can then shrink or remove the problematic instance from
the cluster.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No configuration changes are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The following public API calls will be made available to the PXC datastore.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Cluster Grow - The existing call payload will not be changed. Implementing
the grow cluster feature will add the new instances to the existing cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cluster Shrink - The existing call payload will not be changed. Implementing
the shrink cluster feature will allow a user to remove instances from their
existing cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Support for the following existing CLI calls.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cluster-grow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-shrink&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No changes should be nessesary to accomplish these actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;There are few new guestagent calls that will need to be made to get the data
from the existing instances in the cluster as well as updating the
cluster configuration on the existing instances. &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The process of growing the cluster or adding a new instance(s) to the cluster:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;First set the cluster state to GROWING&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Boot a new pxc instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the instance is up then we get the configuration setting of the
existing cluster from one of the instances in the cluster. These setting
include the cluster name, replication settings, and ips of the existing
cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the configuration on the new instance(s) is set then we start mysql on
each instance. The new instance(s) find the cluster from the ips set and the
cluster name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After mysql is started up on the new instance(s) the cluster recognizes
the new instances in the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At this point the cluster is in a good state but in order to be able to help
recover or restart an instance in the cluster we push down a new
configuration that includes the new ip address of the new instance(s) to all
the instances in the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After all the instances in the cluster have the new configuration there is no
need to restart the mysql process again because the cluster already
recognizes all the instances in the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then we set the task state of the cluster to complete or NONE.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The process of shrinking a cluster is removing a given instance(s) from the
cluster:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;First we set the task state to SHRINKING.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then stop mysql on the given instance(s)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then delete these instance(s) as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next the existing instance(s) in the cluster need to have their
configurations updated to match the current state of the cluster. This will
entail just updating the ips of the current instance(s) in the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No need for a restart after this since the cluster automatically knows about
the active instance(s) in the cluster. The configuration update is for
recovery and restart if needed later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After the configuration update is done then we can reset the task state of
the cluster to completed or NONE.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Like mentioned above in the Internal API section there will be a few new
guestagent calls to support grow and shrink.&lt;/p&gt;
&lt;p&gt;Methods added to the Guest Agent&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;write_cluster_configuration_overrides - This method will write out the
updated cluster configuration changes needed for the cluster to be grown or
shrunk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get_cluster_context - This method will return the context of the current
cluster. The context is the information that is used to connect the new
instances to the existing cluster setup. Context includes cluster settings
and replication settings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No calls will be deprecated in order to complete this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Not to support grow and shrink of a pxc cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 26%"/&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 34%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Launchpad Id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;IRC&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Email&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Craig Vyvial&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:cp16net%40gmail.com"&gt;cp16net&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Targeting this for milestone:
Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;This work will be broken up into 2 separate items.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Grow a cluster (adding new instance(s) to cluster)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shrink a cluster (removing instance(s) from cluster)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;The guestagents on the existing cluster instances must be updated prior to
calling the grow or shrink API calls. Otherwise the cluster may get stuck
in a GROWING_CLUSTER or SHRINKING_CLUSTER state, because the guestagent will
not have the calls to support growing or shrinking a cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;There will be unit tests that test the new calls for the strategy.&lt;/p&gt;
&lt;p&gt;There will be integration tests which will test grow and shrink cluster
features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We need to update the docs to show support for grow and shrink clusters for
the pxc manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.percona.com/doc/percona-xtradb-cluster/5.5/howtos/ubuntu_howto.html"&gt;https://www.percona.com/doc/percona-xtradb-cluster/5.5/howtos/ubuntu_howto.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.percona.com/doc/percona-xtradb-cluster/5.5/manual/bootstrap.html#bootstrap"&gt;https://www.percona.com/doc/percona-xtradb-cluster/5.5/manual/bootstrap.html#bootstrap&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Remove SQL Schema Downgrades</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/remove-sql-schema-downgrades.html</link><description>
 
&lt;p&gt;Trove still has the downgrade method on its migration files. Following the
cross-project spec &lt;a class="reference external" href="https://review.openstack.org/#/c/152337/"&gt;https://review.openstack.org/#/c/152337/&lt;/a&gt; we are supposed to
remove the downgrade to avoid data inconsistency, lack of integrity, etc.
This approach was already done in many projects like Keystone, Magnum, Nova
and others [2][3][4][5].&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/remove-sql-schema-downgrades"&gt;https://blueprints.launchpad.net/trove/+spec/remove-sql-schema-downgrades&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Downgrades are not the best idea when thinking about data integrity. A cross
project spec was proposed to start removing downgrades and it was already done
in many projects. We need to delete downgrade from migration files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Remove downgrades from migration files and remove the command from
trove-manage.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;&amp;lt;tellesmvn&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;This work is basically removing downgrades, removing the command from
trove-manage and update the tests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;We need to update the tests so they will not fail when trying to downgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/152337/"&gt;https://review.openstack.org/#/c/152337/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/167554/2"&gt;https://review.openstack.org/#/c/167554/2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/167834/"&gt;https://review.openstack.org/#/c/167834/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/167189/2"&gt;https://review.openstack.org/#/c/167189/2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/165740/"&gt;https://review.openstack.org/#/c/165740/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Add ‘volume_type’ parameter to instance create</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/volume-type-on-create.html</link><description>
 
&lt;p&gt;Cinder allows for multiple storage backends.
When creating a volume, the ‘volume_type’ parameter will be used in
determining which type of backend to send to. &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;
The user should be allowed to specify the backends for Trove volumes on
instance/cluster creation.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/volume-type-on-create"&gt;https://blueprints.launchpad.net/trove/+spec/volume-type-on-create&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove operators would like to expose different types of storage to their Trove
users to provide more flexibility in the types of configurations they can use
for their database instances and database clusters&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;An optional ‘volume_type’ property will be added to the volume information
accepted by the API for instance and cluster create API calls.
This property will be passed to the Cinder client when a new Trove volume gets
created. Default configuration value will be used if no volume_type is
specified by the user.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;An optional ‘volume_type’ property will be added to the volume information
structure accepted by the instance and cluster create API calls.&lt;/p&gt;
&lt;p&gt;API payload defining a volume of size ‘1’ and Cinder volume type ‘my-type-1’:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;'volume': {'size': '1', 'type': 'my-type-1'}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;API payload defining a volume of size ‘1’ and no Cinder volume type:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;'volume': {'size': '1', 'type': None}
'volume': {'size': '1'}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The volume_type value is a string name of the volume type as returned by
the ‘cinder type-list’ command. The value won’t be validated on the client
site.&lt;/p&gt;
&lt;p&gt;For instance creation an optional ‘–volume_type’ argument will be added.
The volume type will be appended to the volume size in the volume
information structure. If volume support is disabled or ‘–size’ argument
is not specified on instance create the ‘volume_type’ argument will be ignored.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove create ... --size &lt;span class="m"&gt;1&lt;/span&gt; --volume_type my-type-1 ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For cluster creation the ‘–instance’ argument will be extended with a
‘volume_type’ option. If volume support is not enabled or volume size is not
specified the ‘volume_type’ option will be ignored.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove cluster-create ... --instance &lt;span class="nv"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,volume_type&lt;span class="o"&gt;=&lt;/span&gt;my-type-1 ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;A new ‘volume_type’ argument will be added where necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;&amp;lt;pmalik&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;This work will consist of updates to the Trove client and server
code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The existing Trove tests will be extended to test the ‘volume_type’ argument.
New client tests will be added to cover the added arguments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new ‘volume_type’ arguments on instance and cluster create commands need
to be documented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Cinder-multi-backend"&gt;https://wiki.openstack.org/wiki/Cinder-multi-backend&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>CouchDB Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/couchdb-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/couchdb-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/couchdb-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The CouchDB datastore currently does not support configuration groups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement configuration groups for CouchDB.&lt;/p&gt;
&lt;p&gt;CouchDB stores its configuration in ‘local.ini’ file.&lt;/p&gt;
&lt;p&gt;Most configuration properties will be available via configuration groups.
Some, however, do not make sense in the Trove context.&lt;/p&gt;
&lt;p&gt;These include (will be documented in the configuration template):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;guestagent specific (e.g. file paths, passwords, file access rules)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;items that Trove needs to control (replication/clustering/log properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; for the full list of supported
options.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;This work will enable the following client commands:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement &lt;em&gt;update_overrides&lt;/em&gt; and &lt;em&gt;apply_overrides&lt;/em&gt; in
the &lt;em&gt;manager&lt;/em&gt; and &lt;em&gt;service&lt;/em&gt; modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A configuration template and validation rules with changes noted in
&lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; will be provided.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The existing ‘IniCodec’ implementation will be reused to handle
text-file operations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Sonali Goyal &amp;lt;&lt;a class="reference external" href="mailto:sonaligoyal654321%40gmail.com"&gt;sonaligoyal654321&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;
Victoria Martinez de la Cruz &amp;lt;&lt;a class="reference external" href="mailto:victoria%40redhat.com"&gt;victoria&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Netwon-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;All changes will be done in the context of a single task.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Implement configuration-related manager API calls:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The patch set will be building on functionality implemented in blueprint:
couchdb-database-user-functions&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The change is largely covered by the existing configuration tests.
Unit tests will be added to validate any CouchDB-specific codepaths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Documentation on CouchDB configuration: &lt;a class="reference external" href="http://docs.couchdb.org/en/stable/config/index.html"&gt;http://docs.couchdb.org/en/stable/config/index.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;div class="section" id="available-configuration-properties"&gt;
&lt;h3&gt;Available Configuration Properties&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;The properties configurable by the user via the Trove API:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;[attachments]
- compressible_types
- compression_level
[couchdb]
- delayed_commits
- max_attachment_chunk_size
- attachment_stream_buffer_size
- max_dbs_open
- max_document_size
- os_process_timeout
[daemons]
- auth_cache
- db_update_notifier
- external_manager
- httpd
- httpsd
- query_servers
- stats_aggregator
- stats_collector
- uuids
- view_manager
- vhosts
[httpd]
- allow_jsonp
- authentication_handlers
- changes_timeout
- config_whitelist
- default_handler
- enable_cors
- log_max_chunk_size
- redirect_vhost_handler
- secure_rewrites
- server_options
- socket_options
- vhost_global_handlers
- x_forwarded_host
- x_forwarded_proto
- x_forwarded_ssl
[replicator]
- checkpoint_interval
- connection_timeout
- db
- http_connections
- max_replication_retry_count
- retries_per_request
- socket_options
- ssl_certificate_max_depth
- ssl_trusted_certificates_file
- use_checkpoints
- verify_ssl_certificates
- worker_batch_size
- worker_processes
[query_server_config]
- commit_freq
- os_process_limit
- reduce_limit
[os_daemon_settings]
- max_retries
- retry_time
[couch_httpd_auth]
- allow_persistent_cookies
- auth_cache_size
- authentication_db
- authentication_redirect
- iterations
- max_iterations
- min_iterations
- proxy_use_secret
- public_fields
- require_valid_user
- secret
- timeout
- users_db_public
- x_auth_roles
- x_auth_token
- x_auth_username
- use_users_db
[compaction_daemon]
- check_interval
- min_file_size
[database_compaction]
- doc_buffer_size
- checkpoint_after
[log]
- include_sasl
- level
[view_compaction]
- keyvalue_buffer_size&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Guestagent-controlled properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[httpd]
- port
- bind_address
[log]
- file
[couchdb]
- uri_file
- util_driver_dir
- view_index_dir
- database_dir&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Limit volume types for database instances</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/datastore-version-volume-type-support.html</link><description>
 
&lt;p&gt;Different volume types have different cost and performance
characteristics. Operators would like the flexibility to limit
specific databases to specific volume types similar to the way in
which databases can be limited to specific Nova flavors.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/associate-volume-type-datastore"&gt;https://blueprints.launchpad.net/trove/+spec/associate-volume-type-datastore&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Operators can create different volume types and a user can specify a
volume type on a create instance request. Operators would like the
ability to limit the volume types that can be used for a specific
datastore-version in the same way that they can limit Nova flavors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The implentation that associated flavors with datastores &lt;a class="footnote-reference brackets" href="#id3" id="id1"&gt;1&lt;/a&gt; &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;2&lt;/a&gt;
created a generic framework that provided for the specification of
datastore-version-metadata. This metadata was stored into a table in
the database called datastore_version_metadata.&lt;/p&gt;
&lt;div class="highlight-sql notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_version_metadata&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;deleted&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="n"&gt;tinyint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;deleted_at&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;UQ_datastore_version_metadata_datastore_version_id_key_value&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_version_metadata_ibfk_1&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;
&lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_versions&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_versions&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;image_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;511&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="n"&gt;tinyint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ds_versions&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_versions_ibfk_1&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;
&lt;span class="k"&gt;FOREIGN&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastore_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastores&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;datastores&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;default_version_id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The code populates flavor to datastore-version mappings by using a key
of ‘flavor’ in the table datastore_version_metadata. We propose to
extend this capability by using a key of ‘volume-type’ in the same
table.&lt;/p&gt;
&lt;p&gt;We extend the trove-manage command and provide two new commands to add
and delete a volume-type mapping. In addition it is proposed that two
new commands be added to list existing associations. These list
commands will exploit an existing method (list datastore version
flavor associations).&lt;/p&gt;
&lt;p&gt;Changes will be made to add a new mapping, see the section below on
Public API for details. The endpoint will provide a list of all
volume types allowed for a given tenant_id, datastore, and datastore
version.&lt;/p&gt;
&lt;p&gt;Suitable error messages will be provided by adding new exception
classes. One error will be for a missing mapping between a given
datastore-version and a volume-type, and the other will be for a
situation where a mapping already exists.&lt;/p&gt;
&lt;p&gt;The datastore version metadata model (trove/datastore/models.py) has
code for handling the existing flavor mappings. This code will be
refactored to extend the metadata mappings to also support volume
type.&lt;/p&gt;
&lt;p&gt;The service class that will be referenced in the WSGI endpoint will be
added.&lt;/p&gt;
&lt;p&gt;As we will be extending the existing metadata capability, no new
database tables will be required.&lt;/p&gt;
&lt;p&gt;During instance creation, a check will be added for the volme type
being specified. If the volume type provided is not found to be a
valid volume type for the specified datastore version, an error will
be reported.&lt;/p&gt;
&lt;p&gt;Currently volume type support does not extend to the cluster create
API.&lt;/p&gt;
&lt;p&gt;Since this change will return volume type information, service, model
and view for VolumeType and VolumeTypes will be added.&lt;/p&gt;
&lt;p&gt;If no datastore/version/volume-type has been configured then all
volume-types known to cinder are allowed.&lt;/p&gt;
&lt;p&gt;A python-troveclient command to list datastore/version/volume-type
associations will be provided. It will call the new public API and show
the results.&lt;/p&gt;
&lt;p&gt;A trove-manage command to list datastore/version/volume-type
associations will be provided. It will list only the associations in
the database and not intersect with valid cinder volume-types.&lt;/p&gt;
&lt;p&gt;The trove-manage command performs no validations, it does not check
with cinder whether a volume-type being specified is actually a
volume-type known to cinder or not. And the volume-type, once defined
in trove could be deleted by cinder at a later time. It is therefore
possible that the volume type association in the trove metadata table
could become stale. Therefore, the implementation relies on the
concept of defined mappings and allowed mappings.&lt;/p&gt;
&lt;p&gt;A defined mapping is something specified by the user in the metadata
table. An allowed mapping is the intersection of the defined mapping
and valid cinder volume types.&lt;/p&gt;
&lt;p&gt;If a datastore does not support volumes, all of the checking described
in this specification is moot.&lt;/p&gt;
&lt;p&gt;When the user has defined mappings for a particular datastore and
version, (and volume support is enabled), we look to see whether any
allowed mappings exist. If not, a distinct error message is generated
indicating that no valid volume types could be found.&lt;/p&gt;
&lt;p&gt;If there are defined volume types, we ensure that volume type is
specified and is one of the allowed volume types.&lt;/p&gt;
&lt;p&gt;New APIs will also be added to list all volume types available in cinder
and also to show the details of a specified volume type.&lt;/p&gt;
&lt;p&gt;Tests will be added to exercise the new code paths.&lt;/p&gt;
&lt;div class="section" id="issues"&gt;
&lt;h3&gt;Issues&lt;/h3&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;In the present flavor implementation (that is used as the template
for this volume_type) implementation, there is a discrepancy
between the values returned by the
list_datastore_version_flavor_associations (datastore/models.py)
method, and the flavors that will be accepted in the check found in
the create() call.&lt;/p&gt;
&lt;p&gt;This has been addressed in the code for volume type by instead
calling the datastore/models method to list valid volume type
associations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The volume type was never stored with the instance and therefore
when you show an instance, you can’t tell what volume_type was
specified on create.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_type is not required in the create call. If an association
is present for datastore/version/volume_type and no volume_type is
specified for the create, then the cinder default is used. The
option would be to make the volume_type required which would be a
change to the API.&lt;/p&gt;
&lt;p&gt;As implemented, if a volume_type is specified in create, it must be
in the list of allowed volume types. Guessing the volume type is
the alternative, and if more than one is allowed, a default would
have to be provided. This has not been implemented.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No database changes will be required.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;This change will add the following Public APIs:&lt;/p&gt;
&lt;div class="section" id="list-all-volume-types"&gt;
&lt;h4&gt;List all volume types&lt;/h4&gt;
&lt;p&gt;This API will return all volume types as reported by cinder.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"volume_types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"is_public"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Example volume type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"example_volume_type"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-volume-type-details"&gt;
&lt;h4&gt;Show volume type details&lt;/h4&gt;
&lt;p&gt;This API will return the specified volume type’s details as reported by
cinder.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"volume_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"is_public"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"53c71e3d-ef8f-4967-8b16-8a0ee6380d66"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"lvmdriver-1"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-allowed-datastore-version-volume-types"&gt;
&lt;h4&gt;List allowed datastore version volume types&lt;/h4&gt;
&lt;p&gt;This API will return all supported volume-types for the given
combination of tenant_id, datastore, and datastore vesion. If no association
has been configured then all volume types known to cinder are returned.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastores&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"volume_types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"is_public"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Example volume type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"example_volume_type"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;There are no API security issues associated with this change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;No changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The trove-manage command will be the only affected as described above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One alternative that was considered was to associate datastores with
supported volume types (not datastore-versions). This would have
resulted in almost completely reimplementing the metadata linking
scheme that was created for flavors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The create dialog volume type dropdown will be filtered to show only valid
values based on the selected datastore version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;mvandijk&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;N-Release-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;As described above in detail in the “Proposed Change” section.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;There are no upgrade implications. We aren’t adding or changing the
structure of any existing tables. The existing code can’t create
mappings that could conflict with this proposed feature (all existing
code creates mappings with a key of ‘flavor’).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;New tests will be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Yes, documentation of the mechanism to add, delete and list mappings will be
provided.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id3"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://specs.openstack.org/openstack/trove-specs/specs/kilo/associate-flavors-datastores.html"&gt;http://specs.openstack.org/openstack/trove-specs/specs/kilo/associate-flavors-datastores.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/109824/"&gt;https://review.openstack.org/#/c/109824/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Configuration Group Management for DB2</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/db2-config-groups.html</link><description>
 
&lt;p&gt;This spec talks about how to enable configuration group management
for DB2.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/db2-config-group"&gt;https://blueprints.launchpad.net/trove/+spec/db2-config-group&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove supports configuration group management but this feature has not been
implemented for DB2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;DB2 supports both database manager configuration parameters and database
configuration parameters. The database manager configuration parameters
apply to an instance whereas the database configuration parameter applies
to each database. In this spec, we talk about implementing configuration
management for the DB2 database manager.&lt;/p&gt;
&lt;p&gt;The database manager configuration parameters are stored in the db2systm file
under the sqllib directory. To update the configuration parameters, DB2
recommends using the UPDATE DBM CONFIGURATION and RESET DBM CONFIGURATION
commands instead of directly updating the config file. To see a complete list
of configuration parameters, check the Appendix section.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Implement update_overrides and apply_overrides in the manager and service
modules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The following files will be updated:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following file will be added:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;validation&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This will fit into the existing configuration manager framework. The existing
‘PropertiesCodec’ implementation will be reused to handle text-file operations.
Configuration overrides will be implemented using the ‘ImportStrategy’ of the
guestagent configuration manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="mailto:mariamj%40us.ibm.com"&gt;mariamj&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Newton&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Implement configuration-related manager API calls&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Write unit tests/integration tests were applicable&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests will be added to test the new functionality&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation will be updated to reflect the new features supported by
Trove for DB2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id1"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.config.doc/doc/c0060794.html"&gt;https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.config.doc/doc/c0060794.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;The database manager configuration parameters have been listed below. For a
detailed description of each parameter, please refer[1]_. The parameters listed
below are the ones that are relevant for the DB2 Express-C version. The link
referenced in &lt;a class="footnote-reference brackets" href="#id1" id="id2"&gt;1&lt;/a&gt; gives a complete list of parameters for the DB2 enterprise
edition:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;AGENTPRI&lt;/span&gt;
&lt;span class="n"&gt;AGENT_STACK_SZ&lt;/span&gt;
&lt;span class="n"&gt;ALTERNATE_AUTH_ENC&lt;/span&gt;
&lt;span class="n"&gt;ASLHEAPSZ&lt;/span&gt;
&lt;span class="n"&gt;AUDIT_BUF_SZ&lt;/span&gt;
&lt;span class="n"&gt;CATALOG_NOAUTH&lt;/span&gt;
&lt;span class="n"&gt;CLNT_KRB_PLUGIN&lt;/span&gt;
&lt;span class="n"&gt;CLNT_PW_PLUGIN&lt;/span&gt;
&lt;span class="n"&gt;COMM_EXIT_LIST&lt;/span&gt;
&lt;span class="n"&gt;CUR_EFF_ARCH_LVL&lt;/span&gt;
&lt;span class="n"&gt;CUR_EFF_CODE_LVL&lt;/span&gt;
&lt;span class="n"&gt;DFT_ACCOUNT_STR&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_BUFPOOL&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_LOCK&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_SORT&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_STMT&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_TABLE&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_TIMESTAMP&lt;/span&gt;
&lt;span class="n"&gt;DFT_MON_UOW&lt;/span&gt;
&lt;span class="n"&gt;DIAGLEVEL&lt;/span&gt;
&lt;span class="n"&gt;DIAGSIZE&lt;/span&gt;
&lt;span class="n"&gt;DIR_CACHE&lt;/span&gt;
&lt;span class="n"&gt;DISCOVER&lt;/span&gt;
&lt;span class="n"&gt;DISCOVER_INST&lt;/span&gt;
&lt;span class="n"&gt;FCM_NUM_BUFFERS&lt;/span&gt;
&lt;span class="n"&gt;FCM_NUM_CHANNELS&lt;/span&gt;
&lt;span class="n"&gt;FEDERATED&lt;/span&gt;
&lt;span class="n"&gt;FED_NOAUTH&lt;/span&gt;
&lt;span class="n"&gt;FENCED_POOL&lt;/span&gt;
&lt;span class="n"&gt;GROUP_PLUGIN&lt;/span&gt;
&lt;span class="n"&gt;HEALTH_MON&lt;/span&gt;
&lt;span class="n"&gt;INDEXREC&lt;/span&gt;
&lt;span class="n"&gt;INTRA_PARALLEL&lt;/span&gt;
&lt;span class="n"&gt;JAVA_HEAP_SZ&lt;/span&gt;
&lt;span class="n"&gt;KEEPFENCED&lt;/span&gt;
&lt;span class="n"&gt;KEYSTORE_TYPE&lt;/span&gt;
&lt;span class="n"&gt;LOCAL_GSSPLUGIN&lt;/span&gt;
&lt;span class="n"&gt;MAX_CONNECTIONS&lt;/span&gt;
&lt;span class="n"&gt;MAX_COORDAGENTS&lt;/span&gt;
&lt;span class="n"&gt;MAX_QUERYDEGREE&lt;/span&gt;
&lt;span class="n"&gt;MON_HEAP_SZ&lt;/span&gt;
&lt;span class="n"&gt;NOTIFYLEVEL&lt;/span&gt;
&lt;span class="n"&gt;NUMDB&lt;/span&gt;
&lt;span class="n"&gt;NUM_INITAGENTS&lt;/span&gt;
&lt;span class="n"&gt;NUM_INITFENCED&lt;/span&gt;
&lt;span class="n"&gt;NUM_POOLAGENTS&lt;/span&gt;
&lt;span class="n"&gt;RESYNC_INTERVAL&lt;/span&gt;
&lt;span class="n"&gt;RQRIOBLK&lt;/span&gt;
&lt;span class="n"&gt;SHEAPTHRES&lt;/span&gt;
&lt;span class="n"&gt;SPM_LOG_FILE_SZ&lt;/span&gt;
&lt;span class="n"&gt;SPM_MAX_RESYNC&lt;/span&gt;
&lt;span class="n"&gt;SRVCON_AUTH&lt;/span&gt;
&lt;span class="n"&gt;SRVCON_GSSPLUGIN_LIST&lt;/span&gt;
&lt;span class="n"&gt;SRVCON_PW_PLUGIN&lt;/span&gt;
&lt;span class="n"&gt;SRV_PLUGIN_MODE&lt;/span&gt;
&lt;span class="n"&gt;SSL_CIPHERSPECS&lt;/span&gt;
&lt;span class="n"&gt;SSL_CLNT_KEYDB&lt;/span&gt;
&lt;span class="n"&gt;SSL_CLNT_STASH&lt;/span&gt;
&lt;span class="n"&gt;SSL_SVCENAME&lt;/span&gt;
&lt;span class="n"&gt;SSL_SVR_KEYDB&lt;/span&gt;
&lt;span class="n"&gt;SSL_SVR_LABEL&lt;/span&gt;
&lt;span class="n"&gt;SSL_SVR_STASH&lt;/span&gt;
&lt;span class="n"&gt;SSL_VERSIONS&lt;/span&gt;
&lt;span class="n"&gt;START_STOP_TIME&lt;/span&gt;
&lt;span class="n"&gt;SYSADM_GROUP&lt;/span&gt;
&lt;span class="n"&gt;SYSCTRL_GROUP&lt;/span&gt;
&lt;span class="n"&gt;SYSMAINT_GROUP&lt;/span&gt;
&lt;span class="n"&gt;SYSMON_GROUP&lt;/span&gt;
&lt;span class="n"&gt;TM_DATABASE&lt;/span&gt;
&lt;span class="n"&gt;TP_MON_NAME&lt;/span&gt;
&lt;span class="n"&gt;TRUST_ALLCLNTS&lt;/span&gt;
&lt;span class="n"&gt;TRUST_CLNTAUTH&lt;/span&gt;
&lt;span class="n"&gt;UTIL_IMPACT_LIM&lt;/span&gt;
&lt;span class="n"&gt;WLM_DISPATCHER&lt;/span&gt;
&lt;span class="n"&gt;WLM_DISP_CONCUR&lt;/span&gt;
&lt;span class="n"&gt;WLM_DISP_CPU_SHARES&lt;/span&gt;
&lt;span class="n"&gt;WLM_DISP_MIN_UTIL&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Guest agent controlled parameters:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;ALT_DIAGPATH&lt;/span&gt;
&lt;span class="n"&gt;AUTHENTICATION&lt;/span&gt;
&lt;span class="n"&gt;DFTDBPATH&lt;/span&gt;
&lt;span class="n"&gt;DIAGPATH&lt;/span&gt;
&lt;span class="n"&gt;JDK_PATH&lt;/span&gt;
&lt;span class="n"&gt;KEYSTORE_LOCATION&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>DB2 Full Online Backup and Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/db2-online-backup.html</link><description>
 
&lt;p&gt;Currently in Trove, we support full offline backups for DB2 which is the
default backup mechanism for DB2. This enables users to take full backups of
DB2 databases when no applications are connected to or using these databases.
While useful for cases where this downtime is okay, it is not very useful in
a production type environment were applications are expected to be online all
the time. DB2 provides a way to do online backups and this spec outlines how
we can implement a full online backup mechanism in Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/db2-online-backup"&gt;https://blueprints.launchpad.net/trove/+spec/db2-online-backup&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There are two types of backups we can perform using DB2 - offline and online.
Offline backups require users and applications to be disconnected from the
databases thereby requiring a certain down time. Online backups on the other
hand, can be performed while users are still connected to databases. Trove
currently supports full offline backups for DB2. In this spec, we explain
how to enable full online backups for DB2 in Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;As mentioned above, the difference between offline and online backup is that
in the former case all applications must disconnect from the database while
in the latter, applications can still be connected to databases while backup
is being taken. In order to enable online backups, archive logging needs to
be enabled. This allows applications to use the database even while backups
are being taken. Any updates made to the database is recorded in the logs.&lt;/p&gt;
&lt;p&gt;Logging is a mechanism where every updates to a database is recorded to
transaction logs (also called active logs) as the data is being modified.
There are 2 types of logging mechanism - circular and archive logging. By
default, circular logging is enabled which means that after the last active
log is filled, the first active log is overwritten. With circular logging
as the default logging mechanism, only offline backups can be taken.&lt;/p&gt;
&lt;p&gt;Using archive logging, the logs are stored in sequence and as logs get full,
they are archived. Archive logging allows users to restore databases by roll
forwarding to a particular point in time or a point before failure. Hence,
users can restore a database from a backup image and roll forward to a
particular point using logs thus getting it to a consistent state. For an
introduction to archive logging, please refer &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt; and for an overview of how
transactional logging works in DB2, please refer &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To enable full online backup for Trove, the following steps need to be taken:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Create a directory to store the backups and archive logs -
/home/db2inst1/db2inst1/backup/ArchiveLogs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a database is created, if online backups is configured for DB2(through
the backup_strategy config property), then configure the following database
configuration parameter: ‘LOGARCHMETH1’ to   point to a location where the
archive logs can be stored using the command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;db2 update database configuration for &amp;lt;db&amp;gt; using LOGARCHMETH1
‘DISK:/home/db2inst1/backup/ArchiveLogs’&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Setting this database configuration parameter enables archive logging and
stores the archive logs in a location different from the primary/active
logs.Once this change is made, a full offline backup needs to be taken
before any connections can be made to the database (this is because the
database goes into a ‘BACKUP_PENDING’ state when this configuration
change is made).&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;db2 backup database &amp;lt;db&amp;gt; to /home/db2inst1/db2inst1/backup&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This backup can be deleted from the backup directory after this operation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl&gt;
&lt;dt&gt;The online backup strategy for DB2 will comprise of the following actions:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check if archive logging is enabled for each database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if there is enough space to store backups (which will include
database and archived logs). The get_dbsize_info function that DB2
provides can be used to get the size of the database directory. We can
query the SYSIBMADM.LOG_UTILIZATION table to get the log space used for
each database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do an online backup of the database and include the archive logs along
with the backup image itself:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;db2 backup database &amp;lt;db&amp;gt; ONLINE to
/home/db2inst1/db2inst1/backup INCLUDE LOGS&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the backup is complete, compress/encrypt the backup inside the volume
storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The compressed/encrypted file can then be stored in Swift under the
database_backups container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the backups are stored in Swift, we can go ahead and delete the backup
files and archive logs from the backup directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Restoring a database includes restoring from an online backup image and
rolling forward the logs to the end of the backup to make sure the database is
in a consistent state.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Create a directory where the backup files and archive logs can be stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the backup from storage to the proper location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the following commands to restore the database and ensure it is in a
consistent state:
- db2 RESTORE DATABASE &amp;lt;db&amp;gt; FROM &amp;lt;backup_dir&amp;gt; LOGTARGET &amp;lt;log_dir&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The above command restores the database from the specified online backup
directory and extracts the archive log files into the log_dir&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;db2 ROLLFORWARD DATABASE &amp;lt;db&amp;gt; TO END OF BACKLOG AND COMPLETE&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;This command will roll forward the restored database to a consistent state
by applying the archive logs. To see more details on the ROLLFORWARD
command, please refer &lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The default configuration values of the following will need to change to
correspond to the respective DB2 locations.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore_namespace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The DB2 guestagent will be modified to add support for full online backup
and restore functionality. In addition, new strategies will also be added
to support these new features.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;The following guestagent files will be modified:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/datastore/experimental/db2/service.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/datastore/experimental/db2/system.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;and the following new strategy files will be modified to add a new class
for online backups:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/strategies/backup/experimental/db2_impl.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/strategies/restore/experimental/db2_impl.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;New classes will be added for online backup strategy and the existing
class needs to be renamed from DB2Backup -&amp;gt; DB2OfflineBackup&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Mariam John (johnma)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Newton&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;There will only be one work item for this feature. This includes implementing
the strategies for DB2 online backup and restore and make the necessary
guestagent changes. This will also include test-cases necessary to test the
new functionalities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add new test cases to test online backup and restore functionality for DB2:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new unit tests to test the newly implemented functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new DB2 helper class to the existing integration-test framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0051344.html"&gt;https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0051344.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.ibm.com/developerworks/data/library/techarticle/0301kline/0301kline.html"&gt;http://www.ibm.com/developerworks/data/library/techarticle/0301kline/0301kline.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html"&gt;https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Implement Couchbase cluster provisioning</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/couchbase-cluster.html</link><description>
 
&lt;p&gt;Implement Couchbase cluster provisioning.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/couchbase-cluster-support"&gt;https://blueprints.launchpad.net/trove/+spec/couchbase-cluster-support&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Couchbase is by nature a distributed database.
Documents are distributed evenly across all nodes based on the hash of the
document key.
There are no query routers or configuration servers like in some other
databases (MongoDB).
Each document may have up to three replicas in addition to the active copy.
What this means is that there will be three extra copies of that data
within the cluster.
Couchbase clients are provided with an updated ‘cluster map’ which they use to
lookup data.&lt;/p&gt;
&lt;p&gt;When a node gets added to the cluster the existing documents are incrementally
redistributed within the cluster (process also known as rebalancing).
Updated cluster maps are continuously provided to the clients.
Any active client connections should not be interrupted throughout the process.&lt;/p&gt;
&lt;p&gt;When a node gets removed from the cluster the replicas on the other nodes
are promoted to the active and cluster maps updated so that the clients can
keep serving the requests. The promoted documents are then re-replicated within
the remaining nodes (rebalanced).&lt;/p&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#references"&gt;References&lt;/a&gt; section for further details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This specification proposes the following cluster-related actions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shrink&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;upgrade&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Couchbase imposes cluster wide quota on the memory that get
evenly distributed between node services.
All nodes (including future nodes) need to be able to accommodate
this quota.
We therefore require the cluster to be homogeneous.
The quota size is configurable by ‘cluster_ramsize_pc’ Trove configuration as
the percentage of the total node RAM.&lt;/p&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h3&gt;Create Cluster&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provision a requested number of instances while initializing them as
Couchbase nodes (all nodes receive the same randomly generated Administrative
credentials from the API).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the instances to become active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute cluster initialization on the first node (coordinator).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the remaining nodes to the cluster via the coordinator node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the cluster rebalance to finish.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="grow-cluster"&gt;
&lt;h3&gt;Grow Cluster&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Retrieve the current Administrative credentials from the first
node (coordinator) of the existing cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provision and initialize a requested number of instances as Couchbase nodes
with the current credentials (above).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the instances to become active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the new nodes to the cluster via the coordinator node.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the cluster rebalance to finish.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="shrink-cluster"&gt;
&lt;h3&gt;Shrink Cluster&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Load the removed instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select one of the remaining nodes and use it as the coordinator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the nodes from the cluster via the coordinator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the cluster rebalance to finish.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete decommissioned instances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The following configuration values will be implemented in the Couchbase
configuration group:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoolOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cluster_support'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Enable clusters to be created and managed.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental.'&lt;/span&gt;
           &lt;span class="s1"&gt;'couchbase.api.CouchbaseAPIStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific API logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'taskmanager_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental'&lt;/span&gt;
           &lt;span class="s1"&gt;'.couchbase.taskmanager.CouchbaseTaskManagerStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific task manager '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'guestagent_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental'&lt;/span&gt;
           &lt;span class="s1"&gt;'.couchbase.guestagent.CouchbaseGuestAgentStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific Guest Agent API '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cluster_ramsize_pc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Per node RAM quota in for the Data service expressed as a'&lt;/span&gt;
           &lt;span class="s1"&gt;' percentage of the available memory.'&lt;/span&gt;
           &lt;span class="s1"&gt;' Minimum of 256MB will be used if the given percentage amounts'&lt;/span&gt;
           &lt;span class="s1"&gt;' for less.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The work will require some preliminary refactoring of the guest manager.
This may also include tasks such that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;providing a common framework for executing Couchbase CLI calls
The guest-agent currently executes only two CLI commands hardcoded in
‘system.py’ file. We will need to execute a greater variety of commands.
This would include CouchbaseAdmin to execute CLI calls and handle results in
a generic way. It will also facilitate reducing ‘system.py’
which we have been moving away from in other guests as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;making the ramsize quota relative to the node’s total RAM
Couchbase 3 requires a parameter to cluster-init is RAMSIZE quota.
The valid value is between 256MB and 80% of available RAM.
Make the default % a Trove variable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;using appropriate guestagent models for the Couchbase administrative user
Couchbase should be using it’s own User model rather than relying on
generic MySQL-object.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The following methods will be implemented in the CouchbaseGuestAgentAPI:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize_cluster&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Configuring cluster parameters via node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"initialize_cluster"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cluster_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving cluster password from node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_cluster_password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cluster_rebalance_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving status of current cluster rebalance via node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
              &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_cluster_rebalance_status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Adding nodes to the cluster: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'add_nodes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Removing nodes from the cluster: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'remove_nodes'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Sending a setup completion notification for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
              &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cluster_complete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;Will need to enable Couchbase as a clustering datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Ocata&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The preliminary work in the guest manager and cluster strategy itself
may be delivered in two separate commits if it facilitates smoother review
process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Manager unittests will be added where appropriate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The scenario tests already cover implemented functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Datastore documentation for Couchbase will need to be updated to reflect
clustering support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Couchbase cluster management: &lt;a class="reference external" href="http://docs.couchbase.com/admin/admin/Tasks/cluster-management.html"&gt;http://docs.couchbase.com/admin/admin/Tasks/cluster-management.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Couchbase CLI reference: &lt;a class="reference external" href="http://developer.couchbase.com/documentation/server/4.0/cli/cli-intro.html"&gt;http://developer.couchbase.com/documentation/server/4.0/cli/cli-intro.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Couchbase cluster API: &lt;a class="reference external" href="http://docs.couchbase.com/admin/admin/REST/rest-cluster-intro.html"&gt;http://docs.couchbase.com/admin/admin/REST/rest-cluster-intro.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Trove Extended Filesystem Support</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/extended-filesystems.html</link><description>
 
&lt;p&gt;Trove currently only supports a single volume on a guest instance, and
that volume must be a block device.  This spec outlines a proposal for
supporting multiple volumes, both block devices and filesystems, on
the guest.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/extended-filesystems"&gt;https://blueprints.launchpad.net/trove/+spec/extended-filesystems&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In the current implementation, during instance creation the
taskmanager allocates a single cinder volume and informs the guest
during the prepare phase.  The guest then formats the volume and
mounts it as a volume to hold the data for the database.&lt;/p&gt;
&lt;p&gt;Additional functionality is required:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Some datastores require more than a single volume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guests should support both block devices and preformatted filesystems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To support this new functionality, the taskmanager will pass to the
guest a collection of volumes, each tagged as to their type and
intended use.  The taskmanager will be responsible for configuring the
types of volumes to be attached to a guest and how those volumes will
be provisioned with Cinder or Nova; the guest will be responsible
for preparing the block device, if required, and connecting the device
to the filesystem on the guest operating system.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Three configuration values will be used to assist in attaching volumes
to instances.&lt;/p&gt;
&lt;div class="section" id="cg-volumes"&gt;
&lt;h4&gt;cg_volumes&lt;/h4&gt;
&lt;p&gt;The global &lt;em&gt;cg_volumes&lt;/em&gt; configuration setting in the DEFAULT section
of the taskmanager.conf file will contain a list of volume_types which
support consistency groups.  In future feature development, only
volume types which support consistency groups will be available for
snapshots and backups.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nv"&gt;cg_volumes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; NETAPP,SCALEIO
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For Openstack allocated volumes, the values of the &lt;em&gt;cg_volumes&lt;/em&gt;
setting should correspond to the &lt;em&gt;provider_type&lt;/em&gt; parameters in the
sections that follow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-device-type"&gt;
&lt;h4&gt;guest_device_type&lt;/h4&gt;
&lt;p&gt;The global &lt;em&gt;guest_device_type&lt;/em&gt; configuration setting describes how the
guest instance should deal with devices provided to it by the taskmanager.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'guest_device_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Dictionary of device types with help"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'block_ext4'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Block storage to be formatted and managed by guest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'shared'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Shared storage, typically NFS, to be mounted as is"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="available-volume-kind"&gt;
&lt;h4&gt;available_volume_kind&lt;/h4&gt;
&lt;p&gt;The per-datastore &lt;em&gt;available_volume_kind&lt;/em&gt; configuration setting configures
the volume_kinds available to a specific datastore:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'available_volume_kind'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Dictionary of available volume types with help"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Storage volume for the database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'binlog'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Volume to hold binary logs for the database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'user_log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Volume to hold user and error logs"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In the initial implementation, this setting will be used to prevent
spinning up a collection of instances in a cluster, only to find that
an inappropriate volume configuration was selected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="etc-trove-guest-conf"&gt;
&lt;h4&gt;/etc/trove/guest.conf&lt;/h4&gt;
&lt;p&gt;A new olso config file will be introduced on the guest.  This file is
to be installed on the guest image by the DIB elements and will
contain configuration options specific to the operating system and
database software installed on the guest.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;device_type&lt;/em&gt; configuration setting describes how the guest
instance should prepare a volume before mounting, plus any other
device specific configuration.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;volume_mapping&lt;/em&gt; configuration setting configures for each
operating system how the guest should handle the volumes provided to
it.  The most common setting here would be where in the filesystem the
device should be mounted.  The &lt;em&gt;mount_priority&lt;/em&gt; option, if supplied,
is used to configure mount order in the event that devices need to be
mounted beneath each other.&lt;/p&gt;
&lt;p&gt;This description outlines the set of options defined specifically for
extended filesystem support:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;oslo_config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;

&lt;span class="n"&gt;device_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'block_ext4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Block device to be formatted by guest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'raw_block_device'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'format_options'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ext4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ext4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_options'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'-o rw'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'shared'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Shared filesystem (NFS) to be used as is"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'raw_block_device'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'nfs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_options'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'-o rw'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;volume_mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Storage volume for the database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_point'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'/var/lib/mysql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_priority'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'binlog'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Volume to hold binary logs for the database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_point'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'/var/lib/mysql/binlog'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_priority'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DictOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Volume to hold user and error logs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_point'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'/var/lib/mysql/userlog'&lt;/span&gt;
            &lt;span class="s1"&gt;'mount_priority'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;A new table &lt;em&gt;volume_config&lt;/em&gt; will be created to describe the volumes to
be configured.  Each volume configuration will detail each volume to
be attached to an instance.  The &lt;em&gt;volume_config&lt;/em&gt; table will have the
following columns:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 22%"/&gt;
&lt;col style="width: 78%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;uuid identifier&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name of volume configuration&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;volume_kind&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;intended use - defined by datastore (data, binlog, userlog)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;size&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;size of volume (unless overridden by user)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;provider&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Openstack component providing volume (“cinder”, “nova”)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;provider_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Volume type passed to Cinder/Nova&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;device_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Indicates to guest how to prepare volume&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For example, an instance which requires its data to be stored on a
block device and its logs to be stored on a different volume would be
configured as follows:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 11%"/&gt;
&lt;col style="width: 11%"/&gt;
&lt;col style="width: 18%"/&gt;
&lt;col style="width: 7%"/&gt;
&lt;col style="width: 13%"/&gt;
&lt;col style="width: 21%"/&gt;
&lt;col style="width: 18%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;volume_kind&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;size&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;provider&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;provider_type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;device_type&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;uuid0&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vc1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vtype1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;uuid1&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vc1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;data&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vtype1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;block_ext4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;uuid2&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vc1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;binlog&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vtype1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;block_ext4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Instances which do not specify a volume_config to use in allocating
the instance will use the volume_config named “default”.  If no such
volume_config exists, the instance will default to the current single
Cinder volume.&lt;/p&gt;
&lt;p&gt;Each volume defined in the volume_config will have a size specified
for it.  This size can be overridden by the user, either by the
“–sysvol:&amp;lt;volume_kind&amp;gt;,size=&amp;lt;n&amp;gt;” option, or by the “–size” option
for the data volume.  This eliminates the current requirement that the
“–size” option be specified for “trove create” or “trove
cluster-create”; note that this means that should the user specify
neither volume_config nor size when no “default” volume config is
defined, the create call will fail in the taskmanager rather than the
current behaviour of catching the discrepancy in the shell.&lt;/p&gt;
&lt;p&gt;Two volume providers will initially be supported.  If the “cinder”
provider is selected, the volume will be allocated through the Cinder
API.  If the “nova” provider is specified, root volumes will be
alloced on a root disk on the compute host and volumes with a
volume_kind other than “root” will be allocated on Ephemeral storage.
An error will be raised by Nova should the allocated volume sizes
exceed the amount of storage configured in the instance flavor
selected.  Future volume provide support may include support for
Manila volumes and/or multi-attach Cinder volumes.&lt;/p&gt;
&lt;p&gt;A new table &lt;em&gt;instance_volumes&lt;/em&gt; will be added to track the volumes
associated with an instance.  This will include both volumes created
by the taskmanager based on the datastore volume configuration and
volumes specified by the user.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 22%"/&gt;
&lt;col style="width: 78%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;instance_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Id of instance to which volumes are associated&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;volume_kind&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;intended use - defined by datastore (data, binlog, userlog)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;volume_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Id of volume in Cinder or Manila (Null for ephemeral)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;provider&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Component providing volume (“cinder”, “nova”, “manila”)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;device_type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Indicates to guest how to prepare volume&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;An instance configured as above would be represented by the following
entries in the &lt;em&gt;instance_volumes&lt;/em&gt; table:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 18%"/&gt;
&lt;col style="width: 22%"/&gt;
&lt;col style="width: 22%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 22%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;volume_id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;instance_id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;volume_kind&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;provider&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;device_type&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;volid0&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&amp;lt;inst1&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;root&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;volid1&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&amp;lt;inst1&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;data&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;block_ext4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&amp;lt;volid2&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&amp;lt;inst1&amp;gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;binlog&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;cinder&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;block_ext4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For backward compatibility, instances which have no entries in the
&lt;em&gt;instance_volumes&lt;/em&gt; table will be assumed to have their root volume
allocated on Nova local storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;volume_config&lt;/em&gt; and &lt;em&gt;volume_list&lt;/em&gt; parameters will be added to the&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;payload of the following REST APIs:&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster grow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;em&gt;volume_config&lt;/em&gt; parameter, if specified, will select the volume
configuration to select from the volume_config table.  If not
specified, a root volume on Nova storage and a single Cinder data
volume will be configured.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;volume_list&lt;/em&gt; will encapsulate the information from the &lt;em&gt;–sysvol&lt;/em&gt;
options.  For each of these options, for backward compatibility, if
the &lt;em&gt;volume_list&lt;/em&gt; parameter is not included in the API payload, it
will be computed from the &lt;em&gt;volume&lt;/em&gt; parameter.  It will be an error if
both &lt;em&gt;volume&lt;/em&gt; and &lt;em&gt;volume_list&lt;/em&gt; (or neither) are specified.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;resize_volume&lt;/em&gt; API will be updated to include the volume_kind of
the volume to be resized.  For backwards compatibility, if no
volume_kind is specified, the “data” volume will be resized.  An error
will be returned if the provider does not support the resize operation
on the specified volume.&lt;/p&gt;
&lt;p&gt;There will additionally be a new “GET volume_configs” API which will
return a list of available volume configurations.  These volume
configurations will be the valid values to be specified for the above
&lt;em&gt;volume_config&lt;/em&gt; parameter.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume_configs&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ora_prod"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Plus a new “GET volume_configs/&amp;lt;config&amp;gt;” API which will return details
about a given volume_config.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volume_configs&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"volume_kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"volume_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"cinder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"device_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"block_ext4"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Plus a new “GET instance/&amp;lt;instance_id&amp;gt;/volumes” API which will return
details about the volumes attached to a given instance.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_uuid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;volid0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'size'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_kind'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'provider'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cinder'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'device_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;volid1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'size'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_kind'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'data'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'provider'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cinder'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'device_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'block_ext4'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;volid2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'size'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'volume_kind'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'binlog'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'provider'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'cinder'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'device_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'block_ext4'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;&lt;em&gt;volume_config&lt;/em&gt; and &lt;em&gt;volume_list&lt;/em&gt; parameters will be added to the&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;following python APIs:&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Instance.create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cluster.create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cluster.grow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See above for descriptions of the &lt;em&gt;volume_config&lt;/em&gt; and &lt;em&gt;volume_list&lt;/em&gt;
parameters.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;volume&lt;/em&gt; parameter will be deprecated in the above APIs.&lt;/p&gt;
&lt;p&gt;The Instance.resize_volume python API will be updated to include the
volume_kind of the volume to be resized.&lt;/p&gt;
&lt;p&gt;A new &lt;em&gt;volume_configs&lt;/em&gt; object will be added to the Trove python API.
This client API will implement “list” and “show” methods.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Three new sub-commands will be added to the trove-manage command to
support associating volumes with datastore versions:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove-manage volume-config-add &amp;lt;name&amp;gt; &amp;lt;volume_kind&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
            &amp;lt;provider&amp;gt; &amp;lt;provider_type&amp;gt; &amp;lt;device_type&amp;gt; &amp;lt;required&amp;gt;

$ trove-manage volume-config-delete &amp;lt;name&amp;gt; &amp;lt;volume_kind&amp;gt;

$ trove-manage volume-config-list &amp;lt;name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For example, to configure a volume configuration “ora_prod” to have a data
volume and an optional binlog volume, both Cinder block devices, the
following commands would be executed:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove-manage volume-config-add ora_prod &lt;span class="se"&gt;\&lt;/span&gt;
            data cinder ram_backed block_ext4 True
$ trove-manage volume-config-volume-add ora_prod &lt;span class="se"&gt;\&lt;/span&gt;
            binlog cinder ram_backed block_ext4 False
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A new &lt;em&gt;–sysvol&lt;/em&gt; option will be added to several trove CLI commands to
support the configuration of volumes created by the taskmanager.  The
&lt;em&gt;–sysvol&lt;/em&gt; option may be specified multiple times to configure
multiple volumes.  Each specification will include the &lt;em&gt;volume_kind&lt;/em&gt;
for which a specification is being made followed by a colon separated
list of configuration options - for the initial implementation, only
size will be supported.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove create mydb myflavor --datastore&lt;span class="o"&gt;=&lt;/span&gt;foo --datastore_version&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.0 &lt;span class="se"&gt;\&lt;/span&gt;
            --volume_config&lt;span class="o"&gt;=&lt;/span&gt;ora_prod &lt;span class="se"&gt;\&lt;/span&gt;
            --sysvol&lt;span class="o"&gt;=&lt;/span&gt;data:size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; --sysvol&lt;span class="o"&gt;=&lt;/span&gt;binlog:size&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For backwards compatibility, an alternative to this command would be
one which specifies the size of the data volume with the “–size”
option, though this may be deprecated in future releases:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;$ trove create mydb myflavor –datastore=foo –datastore_version=1.0 &lt;/dt&gt;&lt;dd&gt;&lt;p&gt;–volume_config=ora_prod –size=5 –sysvol=binlog:size=2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;A new option will be added to the resize-volume command to support
specifying which of the volumes attached to the instance are to be
resized:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove resize-volume my_inst &lt;span class="m"&gt;3&lt;/span&gt; --volume_kind binlog
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For backwards compatibility, if the –volume_kind option is not
specified, the volume of type “data” will be resized.&lt;/p&gt;
&lt;p&gt;A new “trove volume-config-list” CLI command will be added to return a
list of the names of the available volume_configs.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove volume-config-list
+&lt;span class="o"&gt;==============&lt;/span&gt;+
&lt;span class="p"&gt;|&lt;/span&gt; VolumeConfig &lt;span class="p"&gt;|&lt;/span&gt;
+&lt;span class="o"&gt;==============&lt;/span&gt;+
&lt;span class="p"&gt;|&lt;/span&gt; default      &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; ora_prod     &lt;span class="p"&gt;|&lt;/span&gt;
+&lt;span class="o"&gt;==============&lt;/span&gt;+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And a corresponding new “trove volume-config-show”.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove volume-config-show &lt;span class="nv"&gt;ora_prod&lt;/span&gt;
&lt;span class="o"&gt;===========&lt;/span&gt;  &lt;span class="o"&gt;====&lt;/span&gt;  &lt;span class="o"&gt;========&lt;/span&gt;  &lt;span class="o"&gt;=============&lt;/span&gt;  &lt;span class="o"&gt;===========&lt;/span&gt;
volume_kind  size  provider  provider_type  &lt;span class="nv"&gt;device_type&lt;/span&gt;
&lt;span class="o"&gt;===========&lt;/span&gt;  &lt;span class="o"&gt;====&lt;/span&gt;  &lt;span class="o"&gt;========&lt;/span&gt;  &lt;span class="o"&gt;=============&lt;/span&gt;  &lt;span class="o"&gt;===========&lt;/span&gt;
root         &lt;span class="m"&gt;3&lt;/span&gt;     cinder    vtype1         root
data         &lt;span class="m"&gt;10&lt;/span&gt;    cinder    vtype1         block_ext4
binlog       &lt;span class="m"&gt;2&lt;/span&gt;     cinder    vtype1         &lt;span class="nv"&gt;block_ext4&lt;/span&gt;
&lt;span class="o"&gt;===========&lt;/span&gt;  &lt;span class="o"&gt;====&lt;/span&gt;  &lt;span class="o"&gt;========&lt;/span&gt;  &lt;span class="o"&gt;=============&lt;/span&gt;  &lt;span class="o"&gt;===========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And of course a command to show which volumes are attached to a
specific instance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ trove volumes-list &amp;lt;instance&amp;gt;
===========  ===========  ========  ===========  =========
volume_kind  size         provider  device_type  volume_id
===========  ===========  ========  ===========  =========
root         8            cinder    root         &amp;lt;volid0&amp;gt;
data         50           cinder    block_ext4   &amp;lt;volid1&amp;gt;
binlog       2            cinder    block_ext4   &amp;lt;volid2&amp;gt;
===========  ===========  ========  ===========  =========&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;create_instance&lt;/em&gt; API will be updated to include the &lt;em&gt;volume_info&lt;/em&gt;
parameter.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;resize_volume&lt;/em&gt; API will be updated to include the id and
volume_kind of the volume to be resized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;A new prepare call will be implemented which replaces the device_path
and mount_point parameters with a new &lt;em&gt;device_config&lt;/em&gt; list.  The
&lt;em&gt;device_config&lt;/em&gt; will supply information about the number and types of
volumes to be configured on the guest:&lt;/p&gt;
&lt;div class="highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;[
    {
        'volume_kind': 'data',
        'device_type': 'block_ext4',
        'device_path': '/dev/vdb1'
    },
    {
        'volume_kind': 'binlog',
        'device_type': 'block_ext4',
        'device_path': '/dev/vdb2'
    },
]
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To support backwards compatibility when the guest is upgraded before
the guestagent API, the guest agent’s prepare method will take both
old and new parameters.  The correct behaviour will be deduced based
on the values of the paramaters.&lt;/p&gt;
&lt;p&gt;It is up to each datastore to define what volumes are supported, the
meaning of each value of the volume_kind, and where each volume
will be mounted on the local filesystem.&lt;/p&gt;
&lt;p&gt;The guestagent resize_fs API will be updated to include the
&lt;em&gt;volume_kind&lt;/em&gt; parameter.  The &lt;em&gt;mount_point&lt;/em&gt; parameter will be ignored
when the &lt;em&gt;volume_kind&lt;/em&gt; parameter is specified.&lt;/p&gt;
&lt;p&gt;As the parameter to the &lt;em&gt;post_upgrade&lt;/em&gt; RPC endpoint is a dict, it will
be updated to remain compatible with both old and new guests,
providing both the mount point of the data volume plus the full
&lt;em&gt;device_config&lt;/em&gt; context.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Not available.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The dashboard would be changed to allow the user to specify the
volume_config on the instance.create, cluster.create, and cluster.grow
functions.  A volume.configs.list method will be added to the Python
API to facilite this functionality.&lt;/p&gt;
&lt;p&gt;A new panel/action will be added to the instance panel to show the
volumes configured for a particular instance.&lt;/p&gt;
&lt;p&gt;The volume_resize functionality will be updated to allow the user to
specify the volume_kind that they wish to resize.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;post ocata&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implement taskmanager changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement base guestagent and guestagent.api changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adapt  datastores to new APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;develop unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;Backward compatibility for this feature will be dependent on the new
RPC versioning feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;na&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;An int-test should be developed to test adding multiple volumes for at
least one datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This feature will affect the following documents:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Installation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building Guest Images for Openstack Trove&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;na&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Any additional technical information and data.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 19 Apr 2020 00:00:00 </pubDate></item><item><title>Adapt to file injection deprecation in nova</title><link>https://specs.openstack.org/openstack/trove-specs/specs/rocky/adapt-to-file-injection-deprecation-in-nova.html</link><description>
 
&lt;p&gt;Trove currently uses &lt;cite&gt;–personality&lt;/cite&gt; to inject files while booting an instance
via Nova api. Unfortunately, this parameter is deprecated from Queens release,
nova microversion 2.57. As bp &lt;cite&gt;Deprecate file injection&lt;/cite&gt; &lt;a class="footnote-reference brackets" href="#id6" id="id1"&gt;1&lt;/a&gt; mentioned,
the code to support it would remain, but having a microversion boundary would
give Nova the ability to eventually remove the code in the future. In
this spec, we try to adapt to file injection deprecation and implement another
way to inject files into instance.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/adapt-to-file-injection-deprecation-in-nova"&gt;https://blueprints.launchpad.net/trove/+spec/adapt-to-file-injection-deprecation-in-nova&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Nova deprecates file injection by popping out &lt;cite&gt;–personality&lt;/cite&gt; parameter in
request schema of microversion 2.57, then no value of &lt;cite&gt;–personality&lt;/cite&gt; would
be passed to Nova api service. It’s the current way using this parameter to
inject files in Trove. We’re facing the risk that it would break Trove
completely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Using &lt;cite&gt;–user-data&lt;/cite&gt; is one of the alternatives to inject files while booting
an instance.&lt;/p&gt;
&lt;p&gt;Here is what we are going to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reorganize function &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.instance.models.BaseInstance#get_injected_files&lt;/span&gt;&lt;/code&gt;
to get the files contents, injected path, owner and permission, then build an
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;InjectedFile&lt;/span&gt;&lt;/code&gt; object. In case of injecting multiple files into instance,
we should build and return an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;InjectedFile&lt;/span&gt;&lt;/code&gt; object list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.taskmanager.models.FreshInstanceTasks#_prepare_userdata&lt;/span&gt;&lt;/code&gt;.
Build cloud-config scripts based on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;InjectedFile&lt;/span&gt;&lt;/code&gt; object list. If there is
a &lt;cite&gt;&amp;lt;datastore_manager&amp;gt;.cloudinit&lt;/cite&gt; script, e.g, mysql.cloudinit, we should
detect the format of the script, and then convert it alongside with
&lt;cite&gt;cloud-config scripts&lt;/cite&gt; &lt;a class="footnote-reference brackets" href="#id7" id="id2"&gt;2&lt;/a&gt; into a mime multi part file &lt;a class="footnote-reference brackets" href="#id8" id="id3"&gt;3&lt;/a&gt; in case that
we have to pass more than one type of data to cloud-init. So here should be
two main helpers, one for organizing cloud-config scripts which looks like
below:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;   &lt;span class="nt"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;b64&lt;/span&gt;
    &lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4...&lt;/span&gt;
    &lt;span class="nt"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;trove:trove&lt;/span&gt;
    &lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/trove/trove.conf&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;the other one for generating mime messages if there is any &lt;cite&gt;*.cloudinit&lt;/cite&gt;
scripts.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Noted that currently we’re going to support &lt;strong&gt;ONLY&lt;/strong&gt; two formats for
&lt;cite&gt;*.cloudinit&lt;/cite&gt; file, cloud-config and user-data script &lt;a class="footnote-reference brackets" href="#id9" id="id4"&gt;4&lt;/a&gt;. It may be
difficult for us to organize one user-data scripts based on one
mime multi-part file or gzip compressed content, and other formats
may not be used a lot. As for formats reference, please see &lt;a class="footnote-reference brackets" href="#id10" id="id5"&gt;5&lt;/a&gt; .&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;cite&gt;–user-data&lt;/cite&gt; to pass the parameter we build above while booting an
instance, then we can inject files into instance’s specified location,
with proper owner and permission. One thing to clarify here is that
according to configuration item:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoolOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'use_nova_server_config_drive'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Use config drive for file injection when booting '&lt;/span&gt;
            &lt;span class="s1"&gt;'instance.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;we enable &lt;cite&gt;–config-drive&lt;/cite&gt; when calling novaclient to create
a server by default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove unused and deprecated codes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Fan Zhang &amp;lt;&lt;a class="reference external" href="mailto:zh.f%40outlook.com"&gt;zh&lt;span&gt;.&lt;/span&gt;f&lt;span&gt;@&lt;/span&gt;outlook&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Rocky-R2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new &lt;cite&gt;InjectedFile&lt;/cite&gt; object.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new helper functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify current code, including deprecating files parameter and changing
to user-data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify related code which uses &lt;cite&gt;–personality&lt;/cite&gt; parameter to boot an instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Current functional tests should cover the creating instance scenario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Would need some new unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Docs needed for new configuration item usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/deprecate-file-injection.html"&gt;https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/deprecate-file-injection.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://cloudinit.readthedocs.io/en/latest/topics/format.html#cloud-config-data"&gt;http://cloudinit.readthedocs.io/en/latest/topics/format.html#cloud-config-data&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive"&gt;http://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id9"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://cloudinit.readthedocs.io/en/latest/topics/format.html#user-data-script"&gt;http://cloudinit.readthedocs.io/en/latest/topics/format.html#user-data-script&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;5&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://cloudinit.readthedocs.io/en/latest/topics/format.html#formats"&gt;http://cloudinit.readthedocs.io/en/latest/topics/format.html#formats&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Thu, 29 Mar 2018 00:00:00 </pubDate></item><item><title>Implement root-enable/root-disable/root-show for Redis</title><link>https://specs.openstack.org/openstack/trove-specs/specs/queens/impelment-root-enable-for-redis.html</link><description>
 
&lt;p&gt;Trove currently has support for enabling root user, disabling root user
and showing root-enabled status for database instances, but that functionality
is lacking for redis. This blueprint outlines a framework and API for
implementing authentication management for redis.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/root-enable-in-redis"&gt;https://blueprints.launchpad.net/trove/+spec/root-enable-in-redis&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove does not currently support root-enable, root-disable, root-show for
redis instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Implement root-enable, root-disable and root-show API for redis. It will
support two scenarios including redis single instance and redis replica
instances which these operations only support master instance but can make
effect on slave instances.&lt;/p&gt;
&lt;p&gt;This implementation does not support a cluster of redis instances.&lt;/p&gt;
&lt;p&gt;Here are the details:&lt;/p&gt;
&lt;div class="section" id="root-enable"&gt;
&lt;h3&gt;Root-enable&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Precondition checks to make sure that it’s not cluster or slave instance to
execute this action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get slave instances of given instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try to get original auth password for the sake of rolling back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do root enable for given instance. Considering it’s a single instance or
a master of redis replica sets, roll back once using original auth password
and raise exception if any error occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If things go well, and there are some slave instances, get root password and
use root password above to do root enable. Get failed slave instances’ id
if any, store them into a list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Return redis root created view alongside the failed slave instances’ id list.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="root-disable"&gt;
&lt;h3&gt;Root-disable&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Precondition checks to make sure that it’s not cluster or slave instance to
execute this action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get slave instances of given instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try to get original auth password for the sake of rolling back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do root disable for given instance. Considering it’s a single instance or
a master of redis replica sets, roll back once using original auth password
and raise exception if any error occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If things go well, and there are some slave instances, do root disable. Get
failed slave instances’ id if any, store them into a list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If there are any failed slaves, return http code 200 with failed slaves list.
If not, just return None with http code 204.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="root-show"&gt;
&lt;h3&gt;Root-show&lt;/h3&gt;
&lt;p&gt;Using root-show of mysql. It can satisfy what we ask for.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Changing the follow configuration value:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'root_controller'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.extensions.redis.service.RedisRootController'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Root controller implementation for redis.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Remove requirepass in trove/templates/redis/validation-rules.json to avoid
modifying authentication by configuration group.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;Change the return contents of root-enable and root-disable. Since redis does
not have a root user, just show ‘-‘ as user name. Return failed slaves if any.
For example:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"failed_slaves"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"67c2f6d6-7c01-4ce9-bb18-aa951ca5a39b"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bdQhBXVpk7TE689aGgqdNmJmg4qHdpdBegae"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"-"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Change the return content to meet API above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The work will require some implementation of the guest manager:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add requirepass and masterauth into redis.conf when executing root enable,
and apply overrides to bring into effect without restarting redis service.
Rebuild admin client to make sure guest agent can still talk to task manager
after adding enabling/disabling root in redis, which has been done in this
patch &lt;a class="footnote-reference brackets" href="#id3" id="id1"&gt;1&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove requirepass and masterauth in redis.conf when executing root disable,
and apply overrides to bring into effect without restarting redis service.
Still, rebuild admin client.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We can achieve authentication management for redis by configuration group, but
it looks like less convenient than using root-enable and root-disable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;fanzhang &amp;lt;&lt;a class="reference external" href="mailto:zh.f%40outlook.com"&gt;zh&lt;span&gt;.&lt;/span&gt;f&lt;span&gt;@&lt;/span&gt;outlook&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Queens-Q2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement redis root controller, service, models and views.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement redis guest agent, including manager, service and models.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Inside the int_tests.py, root_actions_groups will be added to redis supported
groups in order to reuse some scenario tests with proper modification to meet
the root actions functionality of redis.&lt;/p&gt;
&lt;p&gt;Unittests will be added to test the derived controller functionality, for
example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Test root-enable on single redis instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test root-enable on master instance of redis replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test root-enable on slave instance of redis replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test root-enable with is_cluster=True.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test root-delete in the cases of above.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unittests will be also added to test the implemented functions inside guest-
agent including enable_root and disable_root.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;2&lt;/a&gt; should be updated to add the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Successful response examples of enabling/disabling root in redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Failed response examples of enabling/disabling root in redis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But it is not mandatory to add.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id3"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/trove/+bug/1708376"&gt;https://bugs.launchpad.net/trove/+bug/1708376&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://developer.openstack.org/api-ref/database/#users-users"&gt;https://developer.openstack.org/api-ref/database/#users-users&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 25 Oct 2017 00:00:00 </pubDate></item><item><title>Sample Pike Spec for Trove</title><link>https://specs.openstack.org/openstack/trove-specs/specs/pike/sample.html</link><description>
 
&lt;p&gt;Introduction paragraph – what is the motivation for the spec/blueprint?
(Don’t forget to change the title above to something more relevant.)&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/name-of-blueprint"&gt;https://blueprints.launchpad.net/trove/+spec/name-of-blueprint&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Here is where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Trove REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Code snippets, etc. should be placed in appropriately marked blocks:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# This is a bash command&lt;/span&gt;
ls -lf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# sample code&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Does this impact any configuration files? If so, which ones?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;Does this impact any existing tables? If so, which ones?
Are the changes forward and backward compatible?
Be sure to include the expected migration process&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;Does this change any API that an end-user has access to?
Are there any exceptions in terms of consistency with other APIs?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;If this change proposes a new API, or if this change relates to
security on an existing API, provide details here.&lt;/p&gt;
&lt;p&gt;What are the expectations of, and implications to security on the
Public API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Does this change the Python API? If anything was removed, has it
been properly marked as deprecated?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Will the Trove CLI need to be modified?  If the CLI will just implement
the changes mentioned in the Python API section, it may be enough to
just mention it here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Does this change any internal messages between API and Task Manager or Task
Manager to Guest?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Does this change behavior on the Guest Agent? If so, is it backwards compatible
with API and Task Manager?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;This section should detail how the dashboard (Horizon) should display the new
changes, if relevant.  For example, if adding cluster support for Redis, this
section could say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Enabling&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;clustering&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;simply&lt;/span&gt; &lt;span class="n"&gt;reuse&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt; &lt;span class="n"&gt;pulldown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;selects&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="n"&gt;dialog&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;dynamically&lt;/span&gt;
&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="n"&gt;overview&lt;/span&gt; &lt;span class="n"&gt;panel&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="n"&gt;specific&lt;/span&gt;
&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt;
&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a spec where you’re throwing
it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can list additional ids if they intend on doing substantial implementation work
on this spec.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Liberty-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;In this section, describe the upgrade implications (if any) of the
proposed change. This could include such details as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;changes to location of files, or layout of the source tree if this
impacts configuration files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;invalidates old backups,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;changes the CLI in a manner that could impact existing scripting,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;eliminates or adds new notifications (events),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any changes that an operator or user must perform as part of the
upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the change has upgrade implications, also remember to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add the DocImpact keyword to the commit, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provide sufficient information in the commit message or in the
documentation bug that gets created.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about the DocImpact keyword, refer to
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Documentation/DocImpact"&gt;https://wiki.openstack.org/wiki/Documentation/DocImpact&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: Documentation for the CLI commands are automatically generated
from the help strings when a new version of the CLI is released, so
a DocImpact keyword is not typically required for python-troveclient
changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Include specific references to specs and/or blueprints in Trove, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Please discuss how the change will be tested. We especially want to know what
int tests and tempest tests will be added. It is assumed that unit
test coverage will be added so that doesn’t need to be mentioned
explicitly, but discussion of why you think unit tests are sufficient
and we don’t need to add more tempest tests would need to be included.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;What is the impact on the docs team of this change? Some changes might require
donating resources to the docs team to have the documentation updated. Don’t
repeat details discussed above, but please reference them here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Please add any useful references here. You are not required to have any
references. Moreover, this specification should still make sense when your
references are unavailable. Examples of what you could include are &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;1&lt;/a&gt;,
&lt;a class="footnote-reference brackets" href="#id6" id="id2"&gt;2&lt;/a&gt;, &lt;a class="footnote-reference brackets" href="#id7" id="id3"&gt;3&lt;/a&gt; and &lt;a class="footnote-reference brackets" href="#id8" id="id4"&gt;4&lt;/a&gt;.&lt;/p&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to mailing list or IRC discussions&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to notes from a summit session&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to relevant research, if appropriate&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Anything else you feel it is worthwhile to refer to&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Any additional technical information and data.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Oct 2017 00:00:00 </pubDate></item><item><title>Trove support in python-openstackclient</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/trove-support-python-openstackclient.html</link><description>
 
&lt;p&gt;Implement a new set of trove commands as python-openstackclient plugins.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/trove-support-in-python-openstackclient"&gt;https://blueprints.launchpad.net/trove/+spec/trove-support-in-python-openstackclient&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;python-openstackclient is becoming the default command line client for many
OpenStack projects. Trove would benefit from implementing all of its client
commands as a single python-openstackclient plugin implemented in the
python-troveclient repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The intent of this spec is to identify the commands to be implemented and
establish conventions for command and argument names. This spec is not
intended to be a full and correct specification of command and argument names.
The details can be left to the code reviews for the commands themselves.&lt;/p&gt;
&lt;p&gt;The following conventions will be adopted for command names:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As per the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OpenStackClient&lt;/span&gt;&lt;/code&gt; convention, the command name shall always take
the following form:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;openstack &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;global-options&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; &amp;lt;object-1&amp;gt; &amp;lt;action&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;object-2&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
          &lt;span class="o"&gt;[&lt;/span&gt;command-arguments&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following conventions will be adopted for arguments and argument flags:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Single character flags will be avoided as per the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt; convention,
except for very common arguments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the database or cluster name and ID are specified it will be the first
and second positional arguments respectively after the full command names.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When an argument is required it will be a positional argument.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove&lt;/span&gt;&lt;/code&gt; commands are already implemented for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove secgroup-add-rule
openstack security group rule create

trove secgroup-delete-rule
openstack security group rule delete

trove secgroup-list
openstack security group list

trove secgroup-list-rules
openstack security group rule list
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove&lt;/span&gt;&lt;/code&gt; commands will be implemented for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;openstack&lt;/span&gt;&lt;/code&gt;
initially suggesting these command names:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove backup-create &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database backup create &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;

trove backup-delete &amp;lt;backup&amp;gt;
openstack database backup delete &amp;lt;backup&amp;gt;

trove backup-list
openstack database backup list

trove backup-list-instance &amp;lt;instance&amp;gt;
openstack database backup list &amp;lt;instance&amp;gt;

trove backup-show &amp;lt;backup&amp;gt;
openstack database backup show &amp;lt;backup&amp;gt;

trove cluster-create &amp;lt;name&amp;gt; &amp;lt;datastore&amp;gt; &amp;lt;datastore_version&amp;gt;
openstack database cluster create &amp;lt;name&amp;gt; &amp;lt;datastore&amp;gt; &amp;lt;datastore_version&amp;gt;

trove cluster-delete &amp;lt;cluster&amp;gt;
openstack database cluster delete &amp;lt;cluster&amp;gt;

trove cluster-list
openstack database cluster list

trove cluster-modules &amp;lt;cluster&amp;gt;
openstack database module list cluster &amp;lt;cluster&amp;gt;

trove cluster-show &amp;lt;cluster&amp;gt;
openstack database cluster show &amp;lt;cluster&amp;gt;

trove configuration-attach &amp;lt;instance&amp;gt; &amp;lt;configuration&amp;gt;
openstack database configuration add &amp;lt;instance&amp;gt; &amp;lt;configuration&amp;gt;

trove configuration-create &amp;lt;name&amp;gt; &amp;lt;values&amp;gt;
openstack database configuration create &amp;lt;name&amp;gt; &amp;lt;values&amp;gt;

trove configuration-default &amp;lt;instance&amp;gt;
openstack database configuration show &amp;lt;instance&amp;gt;

trove configuration-delete &amp;lt;configuration_group&amp;gt;
openstack database configuration delete &amp;lt;configuration_group&amp;gt;

trove configuration-detach &amp;lt;instance&amp;gt;
openstack database configuration remove &amp;lt;instance&amp;gt;

trove configuration-instances &amp;lt;configuration_group&amp;gt;
openstack database configuration list --instance &amp;lt;configuration_group&amp;gt;

trove configuration-list
openstack database configuration list

trove configuration-parameter-list &amp;lt;datastore_version&amp;gt;
openstack database configuration parameter list &amp;lt;datastore_version&amp;gt;

trove configuration-parameter-show &amp;lt;datastore_version&amp;gt; &amp;lt;parameter&amp;gt;
openstack database configuration parameter show &amp;lt;datastore_version&amp;gt; &amp;lt;parameter&amp;gt;

trove configuration-patch &amp;lt;configuration_group&amp;gt; &amp;lt;values&amp;gt;
openstack database configuration &lt;span class="nb"&gt;set&lt;/span&gt; --patch &amp;lt;configuration_group&amp;gt; &amp;lt;values&amp;gt;

trove configuration-show &amp;lt;configuration_group&amp;gt;
openstack database configuration show &amp;lt;configuration_group&amp;gt;

trove configuration-update &amp;lt;configuration_group&amp;gt; &amp;lt;values&amp;gt;
openstack database configuration &lt;span class="nb"&gt;set&lt;/span&gt; &amp;lt;configuration_group&amp;gt; &amp;lt;values&amp;gt;

trove create &amp;lt;name&amp;gt; &amp;lt;flavor&amp;gt;
openstack database cluster create &amp;lt;name&amp;gt; &amp;lt;datastore&amp;gt; &amp;lt;datastore_version&amp;gt;

trove database-create &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database add &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;

trove database-delete &amp;lt;instance&amp;gt; &amp;lt;database&amp;gt;
openstack database remove &amp;lt;instance&amp;gt; &amp;lt;database&amp;gt;

trove database-list &amp;lt;instance&amp;gt;
openstack database list &amp;lt;instance&amp;gt;

trove datastore-list
openstack datastore list

trove datastore-show &amp;lt;datastore&amp;gt;
openstack datastore show &amp;lt;datastore&amp;gt;

trove datastore-version-list &amp;lt;datastore&amp;gt;
openstack datastore version list &amp;lt;datastore&amp;gt;

trove datastore-version-show &amp;lt;datastore_version&amp;gt;
openstack datastore version show &amp;lt;datastore_version&amp;gt;

trove delete &amp;lt;instance&amp;gt;
openstack database cluster delete &amp;lt;cluster&amp;gt;

trove detach-replica &amp;lt;instance&amp;gt;
openstack database replica &lt;span class="nb"&gt;unset&lt;/span&gt; &amp;lt;instance&amp;gt;

trove flavor-list
openstack database flavor list

trove flavor-show &amp;lt;flavor&amp;gt;
openstack database flavor show &amp;lt;flavor&amp;gt;

trove limit-list
openstack database limits list

trove list
openstack database instance list
openstack database cluster list

trove module-apply &amp;lt;instance&amp;gt; &amp;lt;module&amp;gt;
openstack database instance &lt;span class="nb"&gt;set&lt;/span&gt; module &amp;lt;instance&amp;gt; &amp;lt;module&amp;gt;

trove module-create &amp;lt;name&amp;gt; &amp;lt;type&amp;gt; &amp;lt;filename&amp;gt;
openstack database module create &amp;lt;name&amp;gt; &amp;lt;type&amp;gt; &amp;lt;filename&amp;gt;

trove module-delete &amp;lt;module&amp;gt;
openstack database module delete &amp;lt;module&amp;gt;

trove module-instances &amp;lt;module&amp;gt;
openstack database instance list module &amp;lt;module&amp;gt;

trove module-list
openstack database module list

trove module-list-instance &amp;lt;instance&amp;gt;
openstack database module list instance &amp;lt;instance&amp;gt;

trove module-query &amp;lt;instance&amp;gt;
openstack database instance list module &amp;lt;instance&amp;gt; --status

trove module-remove &amp;lt;instance&amp;gt; &amp;lt;module&amp;gt;
openstack database instance remove module &amp;lt;instance&amp;gt; &amp;lt;module&amp;gt;

trove module-retrieve &amp;lt;instance&amp;gt;
openstack database instance show module &amp;lt;instance&amp;gt;

trove module-show &amp;lt;module&amp;gt;
openstack database module show &amp;lt;module&amp;gt;

trove module-update &amp;lt;module&amp;gt;
openstack database module &lt;span class="nb"&gt;set&lt;/span&gt; &amp;lt;module&amp;gt;

trove resize-instance &amp;lt;instance&amp;gt; &amp;lt;flavor&amp;gt;
openstack database instance resize &amp;lt;instance&amp;gt; &amp;lt;flavor&amp;gt;
openstack database cluster resize &amp;lt;cluster&amp;gt; &amp;lt;flavor&amp;gt;

trove resize-volume &amp;lt;instance&amp;gt; &amp;lt;size&amp;gt;
openstack database instance volume resize &amp;lt;instance&amp;gt; &amp;lt;size&amp;gt;
openstack database cluster volume resize &amp;lt;cluster&amp;gt; &amp;lt;size&amp;gt;

trove restart &amp;lt;instance&amp;gt;
openstack database instance restart &amp;lt;instance&amp;gt;
openstack database cluster restart &amp;lt;cluster&amp;gt;

trove root-enable &amp;lt;instance_or_cluster&amp;gt;
openstack database &lt;span class="nb"&gt;set&lt;/span&gt; --root &amp;lt;instance_or_cluster&amp;gt;

trove root-show &amp;lt;instance_or_cluster&amp;gt;
openstack database show --root &amp;lt;instance_or_cluster&amp;gt;

trove show &amp;lt;instance&amp;gt;
openstack database cluster show &amp;lt;cluster&amp;gt;

trove update &amp;lt;instance&amp;gt;
openstack database cluster &lt;span class="nb"&gt;set&lt;/span&gt; &amp;lt;cluster&amp;gt;

trove user-create &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;password&amp;gt;
openstack database user create &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;password&amp;gt;

trove user-delete &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database user delete &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;

trove user-grant-access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;databases&amp;gt;
openstack database user add --access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;databases&amp;gt;

trove user-list &amp;lt;instance&amp;gt;
openstack database user list &amp;lt;instance&amp;gt;

trove user-revoke-access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;database&amp;gt;
openstack database user remove --access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt; &amp;lt;database&amp;gt;

trove user-show &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database user show &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;

trove user-show-access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database user show --access &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;

trove user-update-attributes &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
openstack database user &lt;span class="nb"&gt;set&lt;/span&gt; --attributes &amp;lt;instance&amp;gt; &amp;lt;name&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;A new directory named osc will be created under /troveclient/osc
for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OpenStackClient&lt;/span&gt;&lt;/code&gt; plugin and the commands mentioned above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;twm2016&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;None&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Ocata-3&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;CLI commands as stated above.
Integration tests
Functional tests&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;python-openstackclient
osc-lib&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Functional tests will be located in: /troveclient/tests/osc/
Functional testing will test the inputs and outputs of listed commands.
Integration tests will verify the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OpenStackClient&lt;/span&gt;&lt;/code&gt; plugin is working with
other projects. These should be placed in /trove/tests/tempest/tests/api&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;OpenStack Client adoption list will be updated to include python-troveclient.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/python-openstackclient/commands.html"&gt;http://docs.openstack.org/developer/python-openstackclient/commands.html&lt;/a&gt;
&lt;a class="reference external" href="http://docs.openstack.org/cli-reference/trove.html"&gt;http://docs.openstack.org/cli-reference/trove.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 31 Oct 2016 00:00:00 </pubDate></item><item><title>&lt;span class="sectnum"&gt;1&lt;/span&gt; Secure oslo.messaging.rpc message</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/secure-oslo-messaging-messages.html</link><description>
 
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="auto-toc simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#secure-oslo-messaging-rpc-message" id="id1"&gt;&lt;span class="sectnum"&gt;1&lt;/span&gt; Secure oslo.messaging.rpc message&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#problem-description" id="id2"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-change" id="id3"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#how-does-troverpcdispatcher-verify-legitimacy-of-a-message" id="id4"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; How does TroveRPCDispatcher verify legitimacy of a message&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#securing-the-response" id="id5"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Securing the response&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#contol-plane-key" id="id6"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; Contol plane key&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#getting-keys-to-the-guest-instance" id="id7"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Getting keys to the guest instance&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#why-is-this-secure" id="id8"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Why is this secure?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#configuration" id="id9"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#database" id="id10"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api" id="id11"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; Public API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api-security" id="id12"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python-api" id="id13"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Python API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cli-python-troveclient" id="id14"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-api" id="id15"&gt;&lt;span class="sectnum"&gt;1.2.12&lt;/span&gt; Internal API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#guest-agent" id="id16"&gt;&lt;span class="sectnum"&gt;1.2.13&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#alternatives" id="id17"&gt;&lt;span class="sectnum"&gt;1.2.14&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dashboard-impact-ux" id="id18"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#implementation" id="id19"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#assignee-s" id="id20"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#milestones" id="id21"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#work-items" id="id22"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#upgrade-implications" id="id23"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dependencies" id="id24"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#testing" id="id25"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#documentation-impact" id="id26"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#references" id="id27"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#appendix" id="id28"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Trove utilizes oslo_messaging.rpc to perform RPC calls and the
transport underlying this is oslo_messaging. Messages sent on
oslo.messaging are currently treated as genuine. There is a benefit to
adding a layer of validation that will ensure that the RPC calls are
in fact genuine. We propose that the RPC calls be encrypted with
unique keys.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/secure-oslo-messaging-messages"&gt;https://blueprints.launchpad.net/trove/+spec/secure-oslo-messaging-messages&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Messages sent on oslo.messaging are currently treated as genuine by
the recipient. Given that the names of the topics used are
predictable, it is possible for a person with sufficient knowledge of
Trove to, for example, compromise a guest instance or otherwise obtain
credentials to connect to RabbitMQ (or the underlying transport to
oslo-messaging) and then generate messages to, for example, the task
manager by impersonating the API service. While there are already
safeguards in place to contain the scope of this, such as by requiring
that the message contain a valid keystone token with the appropriate
access, this is still a point of vulnerability.&lt;/p&gt;
&lt;p&gt;Currently, when a client wishes to make an asynchronous RPC (cast()),
the method name and parameters are marshalled and sent down to
oslo_messaging.rpc. It is the responsibility of oslo_messaging.rpc to
transmit the information to the remote side, and then find and invoke
the method specified. After the cast() is invoked on the client side,
the next thing that is seen by the consumer of oslo_messaging.rpc is
an invocation of the desired method on the server side.&lt;/p&gt;
&lt;p&gt;The same thing happens for a synchronous RPC (call()) with the
additional step of the client blocking, the server completing the
operation and sending a response to the client, and the client
receiving that and unblocking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After experimenting with several other alternative approaches, we
propose to implement custom serializers (and deserializers) which can
be provided to oslo_messaging.rpc.&lt;/p&gt;
&lt;p&gt;All messages sent and return values in RPC call() will be serialized
through these custom methods which will encrypt the content. Due to a
bug &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Failure&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;use&lt;/span&gt; &lt;span class="pre"&gt;serializer&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;exception&lt;/span&gt;&lt;/code&gt; if an RPC function
throws an exception, the exception is not encrypted.&lt;/p&gt;
&lt;div class="section" id="how-does-troverpcdispatcher-verify-legitimacy-of-a-message"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id4"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; How does TroveRPCDispatcher verify legitimacy of a message&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The proposed implementation relies on cryptography and unique keys for
the control plane and the guests. We propose to use symmetric keys for
the purpose of encryption.&lt;/p&gt;
&lt;p&gt;Trove has the following entities who are party to RPC invocations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Trove API Service (client)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove Taskmanager Service (client and server)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove Conductor Service (server)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove Guestagent (client and server)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When an RPC call() or cast() is made, the client invokes the
serializer which will encrypt all arguments. When received on the
server side, oslo_messaging.rpc will invoke the deserializer which
will decrypt the arguments.&lt;/p&gt;
&lt;p&gt;It is assumed that the control plane is secure and the control plane
symmetric key is secure. If it is compromised, then all bets are off.&lt;/p&gt;
&lt;p&gt;In communication with the guest agent, each guest has a unique
symmetric key that is generated by the control plane and passed to the
guest at launch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="securing-the-response"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id5"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Securing the response&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As described earlier, a response to a call() method will be secured in
the same way as the request. As observed earlier, due to a bug, an
exception thrown by an RPC function is not (currently) being
serialized and will therefore be returned unencrypted. When (if) that
bug is fixed in oslo_messaging.rpc, this exposure is minimized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="contol-plane-key"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id6"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; Contol plane key&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The control plane key is constructed at system initialization
time. The key is stored on the control plane (in the configuration
file).&lt;/p&gt;
&lt;p&gt;If the control plane consists of multiple machines, then the control
plane services on all machines must have access to the control plane
key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="getting-keys-to-the-guest-instance"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id7"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Getting keys to the guest instance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On instance launch, the guest key is created and passed to the guest
as an injected file. We assume that the mechanism for file injection
is secure in that it cannot be intercepted and compromised by a bad
actor.&lt;/p&gt;
&lt;p&gt;A unique key is created for each instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="why-is-this-secure"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id8"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Why is this secure?&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We make two assumptions above; these are:&lt;/p&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;&lt;p&gt;The control plane is secure, the control plane key is not
compromised, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The transmission of the guest key to the guest is secure and is
not compromised.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are, meaningful and reasonable assumptions to make given the
architecture of an OpenStack system.&lt;/p&gt;
&lt;p&gt;Should a guest be compromised, the bad actor can connect to the
underlying transport (say Rabbit) but all they will be able to see are
encrypted messages that they cannot decrypt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id9"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The control plane key is stored on the control plane in a secure way
and there are configuration options to tell each service where to find
it.&lt;/p&gt;
&lt;p&gt;Each guest instance will have a key and that will be stored securely
on the instance and a configuraiton setting will tell the guestagent
where to find it.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'tm_rpc_encr_key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'bzH6y0SGmjuoY0FNSTptrhgieGXNDX6PIhvz'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'OpenSSL aes_cbc key for taskmanager RPC encryption.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'inst_rpc_key_encr_key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'emYjgHFqfXNB1NGehAFIUeoyw4V4XwWHEaKP'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'OpenSSL aes_cbc key to encrypt instance keys in DB.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'instance_rpc_encr_key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'OpenSSL aes_cbc key for instance RPC encryption.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id10"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Database&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The guest key for each guest instance will be stored in the
database. A table instance_keys is proposed for this.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 27%"/&gt;
&lt;col style="width: 25%"/&gt;
&lt;col style="width: 11%"/&gt;
&lt;col style="width: 9%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 13%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Field&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Null&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Key&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Default&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Extra&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id
instance_id
encrypted_key
created
updated
deleted
deleted_at&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(64)
varchar(64)
varchar(255)
datetime
datetime
tinyint(1)
datetime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;NO
NO
NO
NO
NO
NO
YES&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;PRI
UNI&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;NULL
NULL
NULL
NULL
NULL
NULL
NULL&lt;/p&gt;&lt;/td&gt;
&lt;td/&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The guest instance keys are encrypted and stored in the encrypted_key
column. A foreign key constraint links instance_id with
instances.id. A unique constraint on instance_id is placed on this
table.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id11"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; Public API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes to the public API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id12"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id13"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Python API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id14"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id15"&gt;&lt;span class="sectnum"&gt;1.2.12&lt;/span&gt; Internal API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The internal API (from the perspective of developers, and invocations)
will remain unaffected by this change as the implementation seeks to
work below the Trove code entirely. As a result, the internal API will
be radically different, and code must be in place to ensure that
encrypting and non-encrypting clients and servers know how to
interoperate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id16"&gt;&lt;span class="sectnum"&gt;1.2.13&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The guestagent will receive its key as a part of the configdrive/boot
process and can use it to decrypt all messages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id17"&gt;&lt;span class="sectnum"&gt;1.2.14&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Several alternatives were considered, prototyped, and abandoned. A
short summary of each is provided below.&lt;/p&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;&lt;p&gt;We proposed to the oslo_messaging.rpc team to implement a
lightweight message signing and encryption mechanism in their code
by providing a mechanism of callbacks which would allow the
consumer (trove) to perform the signing and encryption. The
oslo_messaging team did not want to go this route as they felt
that the message included other private data structures which we
(the consumer) could modify and cause unexpected behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We proposed that that oslo_messaging.rpc allow consumers to
provide a custom dispatcher for messages on the receiver
side. With this implementation, a signature or message encryption
could be performed on the client side and intercepted on the
server side and reversed allowing us to have minimal changes on
the server side. Again, the oslo_messaging.rpc team felt that the
dispatcher was a private data structure and they did not feel that
we should be encapsulating it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We prototyped and experimented with a change where each RPC
endpoint would be decorated and the decorator would provide a
mechanism to construct the proper parameters and the invocation to
the RPC method. The client side change would be identical to (b)
but the server side change would involve a change to every RPC
method to add the decorator. In addition, the call context would
not be encrypted in this approach and it was abandoned.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We were advised that we should NOT be using oslo_messaging.rpc the
way we are using it as it was only intended for use on the control
plane. And that we should instead make the guest an RPC
server. Unfortunately that’s not what we need? In Trove, the guest
agent is an extension of the control plane and not well suited to
a REST based communication strategy. What we need is an RPC
mechanism, and it is sad that oslo_messaging.rpc can’t seem to
provide a secure one.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id18"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id19"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id20"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;amrith&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;none&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id21"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ocata-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id22"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implementing code on control plane and guest&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement changes to devstack plugin to create control plane key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement upgrade handling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update documentation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id23"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Minimal upgrade implications are anticipated, code is proposed that
handles this transition.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;The control plane key will be generated and persisted on all
control plane nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When guests are upgraded a key will be sent to them as part of the
nova migrate process.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The API’s will be rev’ed one major version to account for this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id24"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is an assumed dependency on the RPC API versioning which has now
merged.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id25"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oh yeah, we’ll need some of this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id26"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And some of this; details to follow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id27"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Failure&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;use&lt;/span&gt; &lt;span class="pre"&gt;serializer&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;exception&lt;/span&gt;&lt;/code&gt;: &lt;a class="reference external" href="https://bugs.launchpad.net/oslo.messaging/+bug/1648254"&gt;https://bugs.launchpad.net/oslo.messaging/+bug/1648254&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id28"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Any additional technical information and data.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Sun, 30 Oct 2016 00:00:00 </pubDate></item><item><title>Trove Policy Support</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/trove-policy.html</link><description>
 
&lt;p&gt;Trove needs to provide users with more fine-grained control over which
users/roles can access which APIs.
The Oslo Policy library provides support for RBAC policy enforcement across all
OpenStack services.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/trove-policy"&gt;https://blueprints.launchpad.net/trove/+spec/trove-policy&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove currently does not have a unified way of role-based access control.
It needs to provide users with more fine-grained control over which
users/roles can access which APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add Oslo policy check calls on all user-facing APIs. &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;
Also see &lt;a class="reference internal" href="#appendix"&gt;Appendix&lt;/a&gt; for the list of proposed rules.&lt;/p&gt;
&lt;p&gt;The checks will be implemented by means of Oslo policy ‘enforce’ call
at the beginning of each Trove API.&lt;/p&gt;
&lt;p&gt;The call will be given extra information, parent ‘tenant_id’ (AKA the owner),
on the target object (e.g. deleted instance in trove-delete API,
updated configuration group in configuration-patch API).
This will allow users to use this information within their rules.&lt;/p&gt;
&lt;p&gt;Actions that do not have a particular target (e.g. trove-create, trove-list)
will get the tenant itself as the target.&lt;/p&gt;
&lt;p&gt;Actions that involve multiple rules will check all of them simultaneously.
One good example of this is trove-create. If the policy does not allow creating
users or applying modules the end user should not be allowed to create a
new instance with initial users and modules applied either.&lt;/p&gt;
&lt;p&gt;The Policy engine used will be &amp;gt;= 1.9.0 which supports new registered policy
rules. While being fully backwards-compatible the registered rules allow for
more robust development.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;All API calls may rise ‘PolicyNotAuthorized’ (HTTP 403) if the request
is not authorized by the policy framework.
The default access rules will be set to mimic the current behavior
(i.e. users can freely execute operations on their own tenant).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Ocata-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work will be delivered in a single patch set.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Python library ‘oslo.policy&amp;gt;=1.9.0’ will be required.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests will be added to cover the policy framework.
Scenario tests will be testing the default behavior
(matching the existing behavior).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The exposed policy rules and policy.json file should be documented
(see &lt;a class="reference internal" href="#appendix"&gt;Appendix&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Information on the rule engine and policy.json file &lt;a class="reference external" href="http://docs.openstack.org/mitaka/config-reference/policy-json-file.html"&gt;http://docs.openstack.org/mitaka/config-reference/policy-json-file.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Proposed contents of ‘policy.json’
(Note: datastore and flavor APIs are unrestricted by default):&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="s2"&gt;"role:admin or is_admin:True or tenant:&lt;/span&gt;&lt;span class="si"&gt;%(tenant)s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule: admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"instance:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:edit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:restart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:resize_volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:resize_flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:reset_password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:promote_to_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:eject_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:configuration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:guest_log_list"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:backups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:module_list"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:module_apply"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:module_remove"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"instance:extension:root:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:root:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:root:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"instance:extension:user:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user:update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user:update_all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"instance:extension:user_access:update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user_access:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:user_access:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"instance:extension:database:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:database:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:database:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instance:extension:database:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"cluster:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:show_instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"cluster:extension:root:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:extension:root:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster:extension:root:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"backup:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"backup:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"backup:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"backup:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"configuration:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration:edit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"configuration-parameter:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration-parameter:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration-parameter:index_by_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"configuration-parameter:show_by_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"datastore:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:version_show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:version_show_by_uuid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:version_index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:list_associated_flavors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore:list_associated_volume_types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"flavor:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"flavor:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"limits:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="s2"&gt;"module:create"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"module:delete"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"module:index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"module:show"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"module:instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"module:update"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rule:admin_or_owner"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Tue, 25 Oct 2016 00:00:00 </pubDate></item><item><title>&lt;span class="sectnum"&gt;1&lt;/span&gt; Eliminate trove-integration and redstack</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/trove-integration-redstack.html</link><description>
 
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="auto-toc simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#eliminate-trove-integration-and-redstack" id="id1"&gt;&lt;span class="sectnum"&gt;1&lt;/span&gt; Eliminate trove-integration and redstack&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#problem-description" id="id2"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-change" id="id3"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-end-state" id="id4"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; Proposed End State&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#configuration" id="id5"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#how-we-get-there" id="id6"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; How we get there&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#database" id="id7"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api" id="id8"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Public API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api-security" id="id9"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python-api" id="id10"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Python API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cli-python-troveclient" id="id11"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-api" id="id12"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Internal API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#guest-agent" id="id13"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#alternatives" id="id14"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dashboard-impact-ux" id="id15"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#implementation" id="id16"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#assignee-s" id="id17"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#milestones" id="id18"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#work-items" id="id19"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#upgrade-implications" id="id20"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dependencies" id="id21"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#testing" id="id22"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#documentation-impact" id="id23"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#references" id="id24"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#appendix" id="id25"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;In the very beginning, when Trove was integrated into OpenStack, one
of the subjects of some contention was the redstack tool, and the fact
that Trove had a somewhat non-standard structure in the form of a
trove-integration repository.&lt;/p&gt;
&lt;p&gt;It was, I understand, one of the stipulations of the Technical
Committee at the time that this be normalized.&lt;/p&gt;
&lt;p&gt;For a number of reasons, (which we will describe in the Problem
Description section) this structure is proving to be quite a nusiance
and it would be beneficial to the project to do this now.&lt;/p&gt;
&lt;p&gt;The goal of this project is to eliminate the trove-integration project
and the redstack tool through a normal process of deprecation. That is
to say that existing releases, through Newton, will continue to be
driven and may (I stress, may) use the tool, but new versions from
Ocata will not.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/eliminate-trove-integration-and-redstack"&gt;https://blueprints.launchpad.net/trove/+spec/eliminate-trove-integration-and-redstack&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The trove-integration project was created as a place to store scripts
to create, manipulate and test DBaaS vm’s, and to house the scripts
used to manage the development environment. The redstack tool was the
swiss army knife, it could provision your development environment,
make guest images, load them, and later run tests as well.&lt;/p&gt;
&lt;p&gt;On the whole, a very useful thing, there is no doubt about that.&lt;/p&gt;
&lt;p&gt;It did introduce several serious problems.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;trove-integration is not versioned&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It has only a master branch. Therefore all code that is version
sensitive has to accomplish that through crafty branching constructs.&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;trove-integration is a repository outside the trove repository&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This brings with it dependencies on the trove repository, such as when
a new datastore needs to be added, or a new version of a datastore is
to be added. Trove ‘elements’ go into trove-integration but get used
by trove.&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;The CI is very painful&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since trove-integration isn’t branched, we have to test each
trove-integration branch against not just master, but also stable
branches.&lt;/p&gt;
&lt;ol class="arabic simple" start="4"&gt;
&lt;li&gt;&lt;p&gt;The versioning just got more complex&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We now have to deal with multiple operating systems (ubuntu and
fedora), multiple versions (liberty, mitaka, newton, ocata, …),
different versions of operating systems (trusty, and now xenial). The
code is now convoluted enough that attempting to add support for
xenial (as I had to do for SQL Server) became a nightmare.&lt;/p&gt;
&lt;ol class="arabic simple" start="5"&gt;
&lt;li&gt;&lt;p&gt;There is no easy way to build images&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the #1 problem faced by users of Trove; how do I build
images. A solution was proposed
(&lt;a class="reference external" href="https://review.openstack.org/#/c/312806/"&gt;https://review.openstack.org/#/c/312806/&lt;/a&gt;) that would address this
through the creation of a trove-image-builder repository. This
solution has some merits and demerits, we choose here to propose a
different solution (see second bullet in proposed end state) that will
address that problem as well.&lt;/p&gt;
&lt;ol class="arabic simple" start="6"&gt;
&lt;li&gt;&lt;p&gt;redstack is ‘non-standard’&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The current mode/phase approach provided by devstack is standardized
across all projects, and redstack is one of the few (if not the only)
non-standard approach. We already support the devstack plugin and
redstack (in the provisioning a stack use-case) is nothing more than a
thin veneer on devstack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The proposed change is in multiple parts, and several of the sections
don’t match the typical headings one expects in a blueprint that is
aimed at a new feature or function in Trove. Therefore the sections
may be marked as Not Applicable. Additional sections have been added
where required.&lt;/p&gt;
&lt;p&gt;One thing that is important to highlight is that while this change is
highly disruptive, and moves a whole lot of code around, we are
largely talking about moving around a couple of hundred files
(elements) from one place to another, and leveraging a devstack plugin
that we already use extensively. There will be an impact on the tests
that are in trove-integration but we already do most of our testing
out of the trove repository.&lt;/p&gt;
&lt;p&gt;Changes that have been proposed in the trove-integration repository;
which are pending review and merge will be negatively impacted. But
that will be the case no matter when we choose to make a change like
this. Most of the elements are highly parameterized and the changes
actually required to make this all work are minimal.&lt;/p&gt;
&lt;p&gt;I feel that the best way to describe this proposed change is to begin
with a description of the proposed ‘end-state’.&lt;/p&gt;
&lt;div class="section" id="proposed-end-state"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id4"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; Proposed End State&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The elements from trove-integration will get folded into the trove
repository&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The elements will now be versioned along with the server, they are
in the same repository. Tagging the Ocata release will also cause
the release of a set of elements for the release and similarly the
tagging of the Pike release will cause the release of a set of
elements for that release.&lt;/p&gt;
&lt;p&gt;A set of tools will be provided that will make this easier, more
description of that below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A set of sample configuration files will be provided that will cause
devstack to install and configure Trove. A user can copy these into
their own localrc, or use the commands to set the right environment
variables before invoking devstack/stack.sh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The trove devstack plugin will have additional code in the
stack/extra step that will build and load a set of guest images of
the users choosing. This image or images will be built using the
elements from the trove repository.&lt;/p&gt;
&lt;p&gt;This will cause the standard demo user to be used (not alt_demo).&lt;/p&gt;
&lt;p&gt;In running devstack, one must configure a configuration file for
devstack and one specifies the datastore whose image is to be built
and loaded in that configuration file. I was initially contemplating
allowing for the specification of a comma-seperated list but a
single datastore may be a good place to start. This datastore would
also be set as the default.&lt;/p&gt;
&lt;p&gt;One devstack environment can operate with multiple datastores. Three
commands (trove-image-builder.bash, load-trove-image.bash and
activate-trove-image.bash) will be provided. The first will build
the image for you. The second will load it into glance and register
it with Trove, the third will set a specified datastore/version to
the default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The trove devstack plugin will have additional code in the
stack/post-config phase that will configure the Trove test
environment, add the right flavors, and do the other things that are
required for Trove testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scenario tests that are already in the trove repository will be run
without the use of the redstack tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Releases Newton and before may continue to use trove-integration and
redstack, releases Ocata and forward shall not use trove-integration
and redstack. For example, new elements for Ocata and the future
will not go into trove-integration. This means that during this
transition (which may last for two releases) some changes may have
to go to both trove-integration, and trove.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Ocata CI will have a new set of jobs that will leverage this new
state, no longer using redstack for its provisioning, and the cross
version testing that is going on in trove-integration will no longer
need to be supported.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id5"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Some sample configuration files will be provided and these will help
a user configure their localrc before running stack.sh. This will
cause devstack to completely provision Trove, and additionally build
and load guest images as instructed by the user.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="how-we-get-there"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id6"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; How we get there&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Getting to the desired end state will be a multi-step exercise.&lt;/p&gt;
&lt;p&gt;Step 1&lt;/p&gt;
&lt;p&gt;Take everything in the trove-integration repository at some specific
point in time and drop it into the trove repository. For convenience,
I’m going to drop it into a folder called integration.&lt;/p&gt;
&lt;p&gt;It would be nice to do this and preserve history but that is going to
be quite a pain to accomplish. An email has been sent to the infra
mailing list requesting help with this but in the intermin, the commit
&lt;a class="reference external" href="https://review.openstack.org/#/c/384195/"&gt;https://review.openstack.org/#/c/384195/&lt;/a&gt; does what we need (sans
histories).&lt;/p&gt;
&lt;p&gt;Step 2&lt;/p&gt;
&lt;p&gt;Make changes to the stuff now in the trove repository and make it such
that the redstack command (which will be renamed to trovestack) can be
executed just as it used to be in the trove-integration branch. This
also includes some small amendments to the documentation.&lt;/p&gt;
&lt;p&gt;Commit &lt;a class="reference external" href="https://review.openstack.org/#/c/384746/"&gt;https://review.openstack.org/#/c/384746/&lt;/a&gt; does this.&lt;/p&gt;
&lt;p&gt;Step 3&lt;/p&gt;
&lt;p&gt;Refactor the CI jobs to use trovestack in the trove tree instead of
redstack from the trove-integration tree. This means all the CI jobs
(or maybe most) will become legacy jobs and new jobs will be created
for Ocata and higher.&lt;/p&gt;
&lt;p&gt;Step 4&lt;/p&gt;
&lt;p&gt;There is a huge amount of cruft in trovestack that handled the fact
that redstack in trove-integration was not versioned and released with
each OpenStack version. We should do this cleanup because sooner
rather than later as we will soon have to handle the Ubuntu 16.04
transition and having that dimension in addition to the OpenStack
version dimension will be very difficult to manage.&lt;/p&gt;
&lt;p&gt;Step 5&lt;/p&gt;
&lt;p&gt;Take the image build aspect of trovestack (formerly redstack) and make
it an independent tool. &lt;a class="reference external" href="https://review.openstack.org/#/c/374952/"&gt;https://review.openstack.org/#/c/374952/&lt;/a&gt; began
this process and took the elements out of the place where they were
copied in from trove-integration and starts to make it a standalone
tool. We will update trovestack to use this tool and avoid the
duplication of the image building logic.&lt;/p&gt;
&lt;p&gt;Take the image loading logic (including the setting of the default
datastore) and make that a standalone tool and modify trovestack to
use that tool.&lt;/p&gt;
&lt;p&gt;Step 6&lt;/p&gt;
&lt;p&gt;Refactor the CI to automatically build images for different datastores
and verify that the image build process is proper. This will be a new job.&lt;/p&gt;
&lt;p&gt;Step 7&lt;/p&gt;
&lt;p&gt;Refactor the integration tests into the tests directory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id7"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Database&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id8"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Public API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id9"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id10"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Python API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id11"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id12"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Internal API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not applicable&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id13"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The guest agent is already part of the trove repository and will
remain there. It will now be in the same versioned repository as the
server code which has dependencies on it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id14"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are several options that have been considered, some at great
length.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Do nothing&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Well, we’ve done that for three years and it hasn’t been fun. I think
we can safely say that there are strong reasons to disqualify this
option.&lt;/p&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;Just get the image build out of redstack, leave the rest&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This was part (at least) of the approach behind setting up the
trove-image-builder repository. It would be an improvement over the
present state but still would have cross repository
dependencies. Considering that there is no clear justification for
releasing trove-image-builder at a different cadence than trove, I see
no justification in having an independent repository.&lt;/p&gt;
&lt;p&gt;We know that there is a tight coupling, and there likely will be one
for a long time longer, between the server side of Trove and the guest
agent/images. Having two repositories just makes handling that a pain.&lt;/p&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;&lt;p&gt;Use the trove-image-builder approach that was proposed earlier.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We could use the approach that was proposed earlier
(&lt;a class="reference external" href="https://review.openstack.org/#/c/312806/"&gt;https://review.openstack.org/#/c/312806/&lt;/a&gt;) but this solution has the
same kind(s) of challenges that one faces with trove-integration. Two
repositories, releasing them in sync, etc.,&lt;/p&gt;
&lt;p&gt;Having elements in the trove repository is a better alternative.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id15"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No dashboard impact is expected.&lt;/p&gt;
&lt;p&gt;The dashboard will be enabled (if the user enables the plugin). Code
already exists for that in the trove plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id16"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id17"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;amrith&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;none&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id18"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Ocata-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id19"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move elements from trove-integration to trove&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write wrapper (trove-image-builder) script for simplicity of use&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create sample configuration file settings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify CI jobs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id20"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This change has no upgrade implications as we are talking largely
about refactoring a development infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id21"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id22"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We will test the creation of each of the images, and putting them
through their paces in the CI with our existing scenario tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id23"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Internal (developer) documentation will need to be updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id24"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id25"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Fri, 21 Oct 2016 00:00:00 </pubDate></item><item><title>Datastore-specific API controllers</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/datastore-specific-api-controllers.html</link><description>
 
&lt;p&gt;Improve user and database API extensions to handle datastore-specific
properties and allow them to work with clusters.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/datastore-specific-api-extensions"&gt;https://blueprints.launchpad.net/trove/+spec/datastore-specific-api-extensions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also see &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;User and database commands are currently routed through MySQL-specific
API extensions. This causes several problems with input validation which
is MySQL-specific and does not work well with other datastores.
It also forces MySQL-specific properties on models and views which do not have
(or have different) meaning on non-MySQL-like datastores.&lt;/p&gt;
&lt;p&gt;Another long-lasting problem has been that the above APIs do not work with
cluster instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This document proposes introduction of generic API controllers.&lt;/p&gt;
&lt;p&gt;Any datastore-specific parsing, handling and validations would be provided
in derived classes. Trove would load the appropriate derived-controller
dynamically based on the target datastore of the API call.&lt;/p&gt;
&lt;p&gt;The goal is to provide a consistent experience to the Trove user.
The base controller implementations would provide the execution flow and handle
common Trove validations (e.g. check for existence, duplicates) and
notifications.&lt;/p&gt;
&lt;p&gt;The derived classes would provide datastore-specific parsing and model
validations (e.g. username validation, parsing datastore-specific properties
from the payload).
Datastore-specific views would map models properties on the output payload.&lt;/p&gt;
&lt;p&gt;The default controller would also include cluster interface which would,
by default, route all request to one (controller) instance of the cluster
leaving the rest on the cluster itself. This strategy proved successful with
many if not all currently existing datastores.
Datastores may override the node selection or entirely re-implement
any of the calls shall it be necessary.&lt;/p&gt;
&lt;p&gt;We would avoid introduction of new (cluster) API endpoints
(e.g. trove cluster-user-create) at this time.
It is not clear whether that is required at all for the above APIs and
it draws yet another distinction between clusters and single Trove instances
which may not be warranted.&lt;/p&gt;
&lt;p&gt;This work would be entirely internal to the API engine.
The existing endpoints (guest-agent or user facing) would not be affected.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;There would be a datastore-specific property for each controller
implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The CLI would be modified to accept cluster IDs for the related commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;There can be only a single controller per ReST API endpoint.&lt;/p&gt;
&lt;p&gt;This would be a Rounting Controller. This controller would
be responsible for detecting the target instance’s datastore and loading
the derived controller implementation for it (see &lt;a class="reference internal" href="#configuration"&gt;Configuration&lt;/a&gt;).
It would then simply pass the request on this derived controller.&lt;/p&gt;
&lt;p&gt;The derived controller would extend the Base implementation with the same
interface.
Generally it would just parse the payload and construct datastore-specific
model objects and views.
The base implementation would handle the generic validations and execution
flow.&lt;/p&gt;
&lt;p&gt;The base implementation would also be responsible for detecting the instance
type (i.e. single or cluster) and routing the cluster requests to the
cluster interface which would then pass it down to one (controller) instance
from the cluster.
The controller instance would be selected from the nodes exposed by the
cluster strategy (i.e. nodes displayed by “trove cluster-instances” command).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Ocata-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the base controllers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement derived controllers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch datastores to use their respective derived controllers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests will be added to test the base and derived controller functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Related bug: &lt;a class="reference external" href="https://bugs.launchpad.net/trove/+bug/1498573"&gt;https://bugs.launchpad.net/trove/+bug/1498573&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 18 Oct 2016 00:00:00 </pubDate></item><item><title>Cluster Upgrade</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/cluster-upgrade.html</link><description>
 
&lt;p&gt;Trove currently has support for upgrading since instances from one
datastore version to another, but that functionality is lacking for
clusters.  This blueprint outlines a framework and API for
implementing upgrades for clusters.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cluster-upgrade"&gt;https://blueprints.launchpad.net/trove/+spec/cluster-upgrade&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove does not currently support upgrading clusters to new datastore
versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Implement a new cluster-upgrade API for upgrading a cluster to a new
datastore version.&lt;/p&gt;
&lt;p&gt;This blueprint will outline only the framework and API for
implementing cluster upgrades.  It will not detail the implementation
of upgrade for any specific datastore as the implementation for each
datastore may be different.&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Trove REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Code snippets, etc. should be placed in appropriately marked blocks:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# This is a bash command&lt;/span&gt;
ls -lf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# sample code&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No datastore agnostic configuration settings are envisioned.  Setting
for specific datastores will be detailed in the specifications for
each datastore implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No database changes are envisioned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;A new REST API will be implemented for cluster-upgrade:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cluster_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;datastore_version_uuid&amp;gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;REST return codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;understand&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No security implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;A new method will be implemented in the trove API.  This method will
upgrade a cluster to the image specified by the provided
datastore_version.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the cluster to upgrade&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the datastore version, or its id, to which the
trove cluster will be upgraded&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;A new CLI call will be implemented.  This new call will upgrade a
cluster to the image specified by the provided datastore_version.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove cluster-upgrade &amp;lt;cluster&amp;gt; &amp;lt;datastore_version&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the cluster to upgrade&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the datastore version to which the instance will
be upgraded&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The implementation of upgrade for single instances will be used to
upgrade the guest agent on an instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;For the initial implementation it is expected that the existing pre
and post upgrade methods will suffice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;A new cluster action will be implemented to allow a cluster to be
upgraded.  Said functionality will be similar to the functionality for
a single instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Liberty-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The implementation of this has been posted and is ready for review
subject to this spec being approved.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;No upgrade implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;No int tests will be included with this change as this is only a
framework without implementations for specific datastores.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;What is the impact on the docs team of this change? Some changes might require
donating resources to the docs team to have the documentation updated. Don’t
repeat details discussed above, but please reference them here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Fri, 12 Aug 2016 00:00:00 </pubDate></item><item><title>Module Management Ordering</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/module-mangement-ordering.html</link><description>
 
&lt;p&gt;Modules currently are applied in any order, however operators may wish to
control the order that modules are applied to ensure proper functionality.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/module-management-ordering"&gt;https://blueprints.launchpad.net/trove/+spec/module-management-ordering&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove now supports module management, in that ‘modules’ containing a payload
can be applied to running Trove instances.  This allows end users the ability
to ‘bring your own license’ for datastores (among other things), as long as
a corresponding driver plugin exists.  The original implementation doesn’t
take into account the case where one module must be applied before another
(for example, if multiple licenses must be applied in the correct sequence).&lt;/p&gt;
&lt;p&gt;The ability for an operator to ensure that ‘admin’ modules are applied before
user modules is also lacking.&lt;/p&gt;
&lt;p&gt;This spec addresses these shortcomings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A method for specifying ‘priority’ modules, plus a way to rank the order in
which modules are applied would be created.  Two new attributes
‘priority_apply’ and ‘apply_order’ would need to be added to the payload
on create and update.  In addition, an is_admin flag will be added as an
automatic attribute, set when someone with admin credentials creates a
module.  This will allow better control on the driver plugin side with
regards to security concerns, etc.&lt;/p&gt;
&lt;p&gt;The default for ‘priority_apply’ will be False and the default for
‘apply_order’ will be 5.  This will allow modules to be ordered before or
after if the options are not supplied.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No new configuration changes are required.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;New columns will be added to the modules table of the Trove schema:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 17%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 43%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Allow Nulls&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;priority_apply&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Should this module be applied
before all non-priority ones.
Admin only option.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;apply_order&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;int(11)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Order that modules should be
applied in.  Value between
0-9 with lower order numbers
applied first.  Priority
modules can also ordered this
way.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;is_admin&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;This module was created or
updated by a user with admin
credentials.  Once this flag
is set, only an admin user
can subsequently update the
module.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Creating modules that have ‘priority’ will require admin credentials.  All
priority modules will be applied before non-priority ones, and will follow the
same apply_order sequence.&lt;/p&gt;
&lt;p&gt;For example, given modules with the following priority/order, they will be
applied in the following order:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;==============&lt;/span&gt;      &lt;span class="o"&gt;===========&lt;/span&gt;
&lt;span class="n"&gt;Priority&lt;/span&gt; &lt;span class="n"&gt;Apply&lt;/span&gt;      &lt;span class="n"&gt;Apply&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;
&lt;span class="o"&gt;==============&lt;/span&gt;      &lt;span class="o"&gt;===========&lt;/span&gt;
&lt;span class="n"&gt;Yes&lt;/span&gt;                 &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Yes&lt;/span&gt;                 &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;Yes&lt;/span&gt;                 &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt;                  &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt;                  &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt;                  &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="o"&gt;==============&lt;/span&gt;      &lt;span class="o"&gt;===========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The following new options will be added to the payload of the module-create
and module-update ReST APIs:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'priority_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'apply_order'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'priority_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'apply_order'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;codes&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;remain&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The is_admin flag will be set automatically, and as such will not need
to be passed in the payload.  If a module created by a non-admin is
updated by an admin, the is_admin flag will be set but only if an ‘admin-only’
option is turned on.  Once a module is designated as ‘admin’ then only
a user with admin credentials can modify it from that time forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;This change is not expected to introduce any security concerns.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;New arguments to the module create and update methods will be added to
facilitate the ordering.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;all_tenants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;live_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;priority_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apply_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Create a new module."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;all_tenants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;live_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;priority_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apply_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Update an existing module."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following Trove CLI commands will support two new arguments,
priority_apply and apply_order.  priority_apply will be a flag
that requires admin credentials, and apply_order will be restricted
to an integer between 0-9.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;module-create        Creates a new module resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;module-update        Updates module details for a particular module&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;resource.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The internal API will change in that new fields will be included in the
module structure.  No coding changes are anticipated though.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;In the Guest Agent, the modules will be ordered based on the priority and
order values.  No other changes are anticipated with the exception that
the is_admin flag will now be taken from the module payload (if it exists)
instead of being inferred from other attributes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The module detail panel will need to have two new attributes: priority-apply
and apply-order.  The first as a flag (defaulting to false) and the second
restricted to integer values between 0 and 9.  These should be added to the
python call to create or update a module.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;[peterstac]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Newton&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be undertaken with the following tasks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Client (Python and CLI) changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guest Agent changes to ensure the modules are ordered
correctly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;No upgrade issues are expected, however the Trove database will need
to be updated for the feature to work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Scenario tests will be enhanced to include ordering (including
at least one priority module).  It may be difficult to test
that the ordering is adhered to (since this would require some
sort of dependency and there is only a ping driver plugin) so
this may have to be handled by unit tests only.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The fact that modules can now be ordered should be added to the
documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 12 Jul 2016 00:00:00 </pubDate></item><item><title>Quota Management</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/quota-management.html</link><description>
 
&lt;p&gt;A proposal to expose the existing Quota.update API from the management
API to the user through the non-management API.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/quota-management"&gt;https://blueprints.launchpad.net/trove/+spec/quota-management&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There is a Quota.update API in the management API to allow an operator
to change the quota allocation for a resource.  Unfortunately, there
is no CLI to access that call.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add the v1.Quotas class to the v1.client so that an operator can
execute a command to change the allocation for a resource.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No impact (the REST API already exists).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;The added call will be restricted to admin users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Adds client.quotas.update to the python client:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quotas&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Set limits for quotas."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This call takes a dict indicating the change to be made:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;trove_client.quotas.update(project.id, {‘instances’: 10})&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Also adds client.quotas.show to the python client:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Shows usage information for quota managed resources."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This call takes the id of the project and returns all resources with
their usage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;trove_client.quotas.show(project.id)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Two new shell commands will be added:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove quota-show &amp;lt;project id&amp;gt;

$ trove quota-update &amp;lt;project id&amp;gt; volumes 50
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No Impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;This will be available only via the command line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Newton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Patch already delivered to gerrit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Tests already exist for this functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Any additional technical information and data.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 22 Jun 2016 00:00:00 </pubDate></item><item><title>Scheduled Backups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/scheduled-backup.html</link><description>
 
&lt;p&gt;Trove currently has no way to schedule backups of instances.  This
document proposes to implement scheduled backups by utilizing Mistral
workflows.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/scheduled-backup"&gt;https://blueprints.launchpad.net/trove/+spec/scheduled-backup&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove does not support scheduled backups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Scheduled backups will be supported by utilizing Mistral workflows &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt;.
The Trove python API will be extended to provide a Trove centric
interface to Mistral workflows.&lt;/p&gt;
&lt;p&gt;A Trove workbook will be loaded into Mistral to support calling the
trove.backup_create python API via a schedule.  Trove python API
methods will be added to support scheduling backups and listing
scheduled backups and their executions.  Using these Trove commands a user
will be able to manage backup schedules (create/delete/list, etc.) and view the
executions of said schedules.  Like is done with Nova flavors however, Trove
will not actually execute any commands itself, just pass them down to Mistral.
Any errors that occur will be visible when viewing the executions, however
will be limited to whatever Mistral exposes.&lt;/p&gt;
&lt;p&gt;All changes will be within the python-troveclient module with the exception
of the workbook.  This will be available in the Trove repo to (possibly)
be loaded by the devstack plugin if Mistral is enabled.&lt;/p&gt;
&lt;p&gt;See the &lt;a class="reference internal" href="#appendix"&gt;Appendix&lt;/a&gt; for a sample Trove workbook.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No configuration changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No changes to the REST API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No security impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Note: The referenced ‘cron pattern’ is the standard cron expression. &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;2&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Create a new schedule to backup the given instance.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: instance to backup.&lt;/span&gt;
&lt;span class="sd"&gt;    :param pattern: cron pattern for schedule.&lt;/span&gt;
&lt;span class="sd"&gt;    :param name: name for backup.&lt;/span&gt;
&lt;span class="sd"&gt;    :param description: (optional).&lt;/span&gt;
&lt;span class="sd"&gt;    :param parent_id: base for incremental backup (optional).&lt;/span&gt;
&lt;span class="sd"&gt;    :returns: :class:`Backups`&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get a list of all backup schedules for an instance.&lt;/span&gt;

&lt;span class="sd"&gt;    :param: instance for which to list schedules.&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: list of :class:`Schedule`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get details of a backup schedule.&lt;/span&gt;

&lt;span class="sd"&gt;    :param: schedule to show.&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: :class:`Schedule`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;schedule_delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Remove a given backup schedule.&lt;/span&gt;

&lt;span class="sd"&gt;    :param schedule: schedule to delete.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execution_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get a list of all executions of a scheduled backup.&lt;/span&gt;

&lt;span class="sd"&gt;    :param: schedule for which to list executions.&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: list of :class:`ScheduleExecution`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execution_delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mistral_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Remove a given schedule execution.&lt;/span&gt;

&lt;span class="sd"&gt;    :param execution: id of execution to remove.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;div class="section" id="load-trove-workbook"&gt;
&lt;h4&gt;Load trove workbook&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ mistral workbook-create ~/mwj/mistral/trove.yaml
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="create-schedule"&gt;
&lt;h4&gt;Create Schedule&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove schedule-create m &lt;span class="s2"&gt;"*/2 * * * *"&lt;/span&gt; myback
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; Property            &lt;span class="p"&gt;|&lt;/span&gt; Value                                                                                                          &lt;span class="p"&gt;|&lt;/span&gt;
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; created_at          &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;14&lt;/span&gt;:47:16.865731                                                                                     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; id                  &lt;span class="p"&gt;|&lt;/span&gt; fb149a29-be9b-49c1-a2f7-ca6c1213896f                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; input               &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"instance"&lt;/span&gt;: &lt;span class="s2"&gt;"5328f62a-d999-4be3-90bb-83cc6af4469c"&lt;/span&gt;, &lt;span class="s2"&gt;"description"&lt;/span&gt;: null, &lt;span class="s2"&gt;"parent_id"&lt;/span&gt;: null, &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"myback"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; instance            &lt;span class="p"&gt;|&lt;/span&gt; 5328f62a-d999-4be3-90bb-83cc6af4469c                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; name                &lt;span class="p"&gt;|&lt;/span&gt; myback                                                                                                         &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; next_execution_time &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;07&lt;/span&gt;:48:00                                                                                            &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; parent_id           &lt;span class="p"&gt;|&lt;/span&gt; None                                                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; pattern             &lt;span class="p"&gt;|&lt;/span&gt; */2 * * * *                                                                                                    &lt;span class="p"&gt;|&lt;/span&gt;
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-schedule"&gt;
&lt;h4&gt;List Schedule&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove schedule-list m
+--------------------------------------+--------+-------------+---------------------+
&lt;span class="p"&gt;|&lt;/span&gt; ID                                   &lt;span class="p"&gt;|&lt;/span&gt; Name   &lt;span class="p"&gt;|&lt;/span&gt; Pattern     &lt;span class="p"&gt;|&lt;/span&gt; Next Execution Time &lt;span class="p"&gt;|&lt;/span&gt;
+--------------------------------------+--------+-------------+---------------------+
&lt;span class="p"&gt;|&lt;/span&gt; fb149a29-be9b-49c1-a2f7-ca6c1213896f &lt;span class="p"&gt;|&lt;/span&gt; myback &lt;span class="p"&gt;|&lt;/span&gt; */2 * * * * &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;07&lt;/span&gt;:50:00 &lt;span class="p"&gt;|&lt;/span&gt;
+--------------------------------------+--------+-------------+---------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-schedule"&gt;
&lt;h4&gt;Show Schedule&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove schedule-show fb149a29-be9b-49c1-a2f7-ca6c1213896f
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; Property            &lt;span class="p"&gt;|&lt;/span&gt; Value                                                                                                          &lt;span class="p"&gt;|&lt;/span&gt;
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; created_at          &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;14&lt;/span&gt;:47:16                                                                                            &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; id                  &lt;span class="p"&gt;|&lt;/span&gt; fb149a29-be9b-49c1-a2f7-ca6c1213896f                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; input               &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"instance"&lt;/span&gt;: &lt;span class="s2"&gt;"5328f62a-d999-4be3-90bb-83cc6af4469c"&lt;/span&gt;, &lt;span class="s2"&gt;"description"&lt;/span&gt;: null, &lt;span class="s2"&gt;"parent_id"&lt;/span&gt;: null, &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"myback"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; instance            &lt;span class="p"&gt;|&lt;/span&gt; 5328f62a-d999-4be3-90bb-83cc6af4469c                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; name                &lt;span class="p"&gt;|&lt;/span&gt; myback                                                                                                         &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; next_execution_time &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;07&lt;/span&gt;:52:00                                                                                            &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; parent_id           &lt;span class="p"&gt;|&lt;/span&gt; None                                                                                                           &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; pattern             &lt;span class="p"&gt;|&lt;/span&gt; */2 * * * *                                                                                                    &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; updated_at          &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;14&lt;/span&gt;:49:59                                                                                            &lt;span class="p"&gt;|&lt;/span&gt;
+---------------------+----------------------------------------------------------------------------------------------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-schedule"&gt;
&lt;h4&gt;Delete Schedule&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove schedule-delete fb149a29-be9b-49c1-a2f7-ca6c1213896f
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-executions"&gt;
&lt;h4&gt;List Executions&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove execution-list fb149a29-be9b-49c1-a2f7-ca6c1213896f
+--------------------------------------+---------------------+---------+-------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; ID                                   &lt;span class="p"&gt;|&lt;/span&gt; Execution Time      &lt;span class="p"&gt;|&lt;/span&gt; State   &lt;span class="p"&gt;|&lt;/span&gt; Output                        &lt;span class="p"&gt;|&lt;/span&gt;
+--------------------------------------+---------------------+---------+-------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; 38ef2289-4330-4554-8574-4b5351f69713 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;14&lt;/span&gt;:49:59 &lt;span class="p"&gt;|&lt;/span&gt; SUCCESS &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;: &lt;span class="s2"&gt;"Backup complete"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; 3713355a-b65e-44e0-ac43-150b863a6e6e &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-06-14 &lt;span class="m"&gt;14&lt;/span&gt;:51:59 &lt;span class="p"&gt;|&lt;/span&gt; SUCCESS &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;: &lt;span class="s2"&gt;"Backup complete"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
+--------------------------------------+---------------------+---------+-------------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-executions"&gt;
&lt;h4&gt;Delete Executions&lt;/h4&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove execution-delete 3713355a-b65e-44e0-ac43-150b863a6e6e
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No guest changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative would be for Trove to implement its own scheduling mechanism.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;An action will be added to the instance actions pulldown to show the
scheduled backups for an instance.  This will lead to a chain of
panels for scheduled backups, details of a schedule, and executions of
a schedule.  The scheduled backups list will have an option to create
a new schedule.  The panels which list schedules and executions will
have an action to delete the corresponding resource.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;duktesora&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Newton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;already prototyped &lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement unit tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;No upgrade implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;If we add support in scenario tests (through the python API) that would
mean we’d require Mistral to be installed.  As such, no scenario tests
will be created.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;New python API methods and CLI commands would need to be documented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Mistral"&gt;https://wiki.openstack.org/wiki/Mistral&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Cron#CRON_expression"&gt;https://en.wikipedia.org/wiki/Cron#CRON_expression&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/329160/"&gt;https://review.openstack.org/#/c/329160/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;This is an idea of what the Trove workbook for Mistral would look like:&lt;/p&gt;
&lt;div class="highlight-yaml notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'2.0'&lt;/span&gt;

&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;trove&lt;/span&gt;

&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Trove Workflows&lt;/span&gt;

&lt;span class="nt"&gt;workflows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="nt"&gt;backup_create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;instance&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;parent_id&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
    &lt;span class="nt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;lt;% $.message %&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nt"&gt;backup_create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;trove.backups_create instance=&amp;lt;% $.instance %&amp;gt; name=&amp;lt;% $.name %&amp;gt; description=&amp;lt;% $.description %&amp;gt; parent_id=&amp;lt;% $.parent_id %&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="nt"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;&amp;lt;% 'Backup complete' %&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Tue, 14 Jun 2016 00:00:00 </pubDate></item><item><title>Instance Upgrade</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/instance-upgrade.html</link><description>
 
&lt;p&gt;Trove needs to address how guest instances will update their database
software, the Trove guest agent, and the underlying operating system.
This blueprint proposes a technique which will allow guest instances
to be updated by migrating the data volume to a new instance based on
an updated guest image.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/instance-upgrade"&gt;https://blueprints.launchpad.net/trove/+spec/instance-upgrade&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove creates a database instance by creating a nova instance from a
provided operating system image and attaching a volume to the instance
to hold the user’s data.  By using a known image with the database
software preconfigured, an operator can ensure that the user will
receive a known version of database software, configured with an
operating system certified to work with that version of database
software.  This technique eliminates many of the ambiguities of
provisioning applications, allowing an operator to provide a published
level of service to the database user.&lt;/p&gt;
&lt;p&gt;Unfortunately, running database instances aren’t static over their
lifetimes.  Over time, it may be necessary for an instance to be
upgraded with security patches, new database software, or updates to
the Trove guest agent.  The cloud operator and the end user must be
provided with a way to migrate their databases to new operating
environments.&lt;/p&gt;
&lt;p&gt;In summary, there are a number of changes that a database instance
might be subjected to over time, and this spec addresses applying
these types of changes.  These include (but are not necessarily
limited to):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;operating system security patches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database security patches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database version upgrades&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove guest agent upgrades&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenStack version upgrades&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;operating system upgrades&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The traditional approach to system upgrades is to simply execute
system utilities such as “apt-get upgrade” to upgrade all or parts of a
running system.  For large installations, this technique could be
automated by tools such as Ansible or Salt to apply the changes
to many systems.  This approach isn’t ideal for
database-as-a-service as there is little control over which components
are upgraded, and to which version; an update could leave a database
instance in a state where the database does not operate properly, or
could even cause the data itself to become corrupted.&lt;/p&gt;
&lt;p&gt;It is crucial that Trove develop a method to update instances which
provides a high probability of leaving the database in a safe,
consistent, and usable state.&lt;/p&gt;
&lt;p&gt;To ensure a safe, consistent state, this blueprint proposes a
technique for upgrading an instance which transitions it from one
known image to a new known image running updated software.  The full
state of each instance state will be known.  At its core, this
technique will involve detaching the volume containing the
database data and attaching it to a new instance based on a different
(updated) image.&lt;/p&gt;
&lt;p&gt;The bulk of the “variable” data on a Trove instance exists on the
attached volume where the database stores its data.  There is also
some operating system state which must be preserved during this
transition, consisting primarily of networking data (the instance name
and ip address), some Trove configuration data (guest_info.conf and
trove-guestagent.conf), and the database configuration data (such as
/etc/mysql).&lt;/p&gt;
&lt;p&gt;The core of this technique will be based on the rebuild API provided
by Nova.  The Nova rebuild function upgrades a running instance to a
new image, ensuring that the networking configuration is applied to
the new instance.  The newly created instance will come up with the
same network configuration (ip, hostname, and Neutron configuration)
as the instance from which it was created.  Trove guest functionality
will be added to allow the guest to capture additional state about the
instance (primarily database configuration), and re-apply that state
to the system after rebuild.  The result will be a running,
connectable database provisioned on a new instance running updated
software.&lt;/p&gt;
&lt;p&gt;The selection of image to upgrade to will be based on the current
datastore_version mechanism.  Essentially, the user will be allowed to
upgrade an instance to a newer datastore_version of its datastore.
Safeguards will be put in place to ensure that the user is selecting
an appropriate datastore_version to upgrade to; for example, the user
would only be allowed to upgrade a mysql instance from
datastore_version 5.5 to 5.6, not to 5.0 or 6.7.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No configuration changes are planned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;A future blueprint will outline the changes necessary to support the
upgrade constraints on datastore_versions; this specification will
be limited to implementing the upgrade functionality without the
constraints.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;A new REST API call will be added in support of this functionality.&lt;/p&gt;
&lt;p&gt;REST API: PATCH /instances/&amp;lt;instance id&amp;gt;
REST body:&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;"datastore_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;datastore_version_uuid&amp;gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;REST result:&lt;/p&gt;
&lt;div class="highlight-json notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;REST return codes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;202 - Accepted.
400 - BadRequest. Server could not understand request.
404 - Not Found. &amp;lt;datastore_version_id&amp;gt; not found.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;There are no envisioned security implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;A new method will be implemented in the trove API.  This method will
upgrade a instance to the image specified by the provided
datastore_version.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the instance to upgrade&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the datastore version, or its id, to which the
trove instance will be upgraded&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;A new CLI call will be implemented.  This new call will upgrade a
instance to the image specified by the provided datastore_version.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove upgrade &amp;lt;instance&amp;gt; &amp;lt;datastore_version&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the instance to upgrade&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the datastore version to which the instance will
be upgraded&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;A new method will be added in support of this functionality.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Making async call to upgrade guest to &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;
              &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;cctxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cctxt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Two new operations will be implemented in the guest agent API.  It is
expected that each datastore will (optionally) override these methods
to implement any needed functionality before and after the image
upgrade proceeds.  Mysql, for example, would use these methods to copy
its configuration data from /etc/mysql to the data volume before the
image upgrade, copying them back and restarting the mysql server after
the image upgrade.&lt;/p&gt;
&lt;p&gt;It is expected that the pre_upgrade method will validate that it is
possible to perform the requested upgrade; for example, there may be a
configuration override specified for an instance which is not
compatible with the new datastore_version.  In the event that an
upgrade cannot be performed, the pre_upgrade method will raise an
exception - any exception will cause the taskmanager to abort the
upgrade process for that instance.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pre_upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Prepare the guest for upgrade."""&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Sending the call to prepare the guest for upgrade."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pre_upgrade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;post_upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upgrade_info&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Recover the guest after upgrading the guest's image."""&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Recover the guest after upgrading the guest's image."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"post_upgrade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Two mechanisms are available for the pre_upgrade to communicate
information to the post_upgrade.  First, the value returned from the
pre_upgrade step is passed to the post_upgrade step as the
&lt;em&gt;upgrade_info&lt;/em&gt; parameter; the guest is free to use this value as it
sees fit, though it would typically be used to exchange a dictionary
of configuration data.  The second mechanism the guest will use to
pass information beween phases is by storing configuration data on the
data volume; this would typically be used for large configuration
files.&lt;/p&gt;
&lt;p&gt;It is expected that if the Nova rebuild command does not return an
exception before beginning the rebuild process, the rebuild will
succeed.  Should the rebuild fail, the instance will be moved to an
ERROR state and no attempt will be made to recover the instance;
operator intervention will be required.  Should the post_upgrade
return an exception, the instance will be transitioned to an ERROR
state.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The alternative to upgrading images is to upgrade via apt-get or yum
in the running instance.  While this is the normal procedure for
upgrading instances, it has undesired implications for Trove.  Trove
aims to provide a known service level, but upgrading a running
instance has the potential to leave an instance in an unknown state.
There could also be issues around installations which don’t allow
trove instances to access the internet directly as trove would have to
provide some mechanism for delivering all of the deb/rpm packages
required to update an instance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Newton&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;This feature has been already been prototyped.  The work required to
bring the prototype in line with this spec is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The prototype uses image id rather than datastore_version&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add trove.upgrade.start/end/error notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement unit tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;investigate if int-tests need to be updated for this feature&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;document the upgrade procedure&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added as appropriate.&lt;/p&gt;
&lt;p&gt;An int-test will be added that tests upgrading an instance to the
image that it is already running.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The “trove upgrade” command, and its corresponding python API, will
need to be documented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Apr 2016 00:00:00 </pubDate></item><item><title>Persist Error Message</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/persist-error-message.html</link><description>
 
&lt;p&gt;Errors that occur in Trove should be easy to retrieve so that the end user
can see exactly what is happening with their database instance.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/persist-error-message"&gt;https://blueprints.launchpad.net/trove/+spec/persist-error-message&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Historically it has been very difficult to determine the cause of a failure in
Trove. This is due to the fact that errors may be logged in multiple places,
none of which are available to the end user. With the advent of Notifications
in Trove, however, it is now feasible to persist error messages in the db so
that they can be retrieved and displayed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Each server will register a callback with the notification framework.
Whenever a notification is sent, this callback will be fired off and
any errors that occur can then be saved in the database. This information
can then be recalled by the user using the ‘trove show’ command.&lt;/p&gt;
&lt;p&gt;For errors that occur outside the framework of notifications, a direct call
will be made to persist the error. Not all errors will need to be persisted, so
an initial set will be proposed that can be enhanced over time as the need
arises.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No configuration changes are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;A new table (instance_faults) will be added to the Trove schema:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 17%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 43%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Allow Nulls&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(64)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of fault (autogenerated)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;instance_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(64)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of instance that the fault
occurred on&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;message&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(255)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Error message of the fault&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;details&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;text(65535)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Extra details (i.e. stack
trace)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;created&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Created date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;updated&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Updated date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;deleted&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted flag&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;deleted_at&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The only change to the public API will be the addition of a ‘fault’ data
structure that is returned when requesting instance details. This will
look like:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s1"&gt;'fault'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'error message'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'details'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'potential stack trace'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ‘details’ value will only be available if the request is done by an admin
user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No security issues are anticipated. Since the messages persisted are all
exception messages that are broadcast as notifications, none should contain
sensitive information. If any are found to, they should be treated as bugs
and modified accordingly (none have been discovered as of yet).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;No changes are anticipated to the python API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The ‘show’ Trove CLI command may now have new data displayed:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;+-------------------+----------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; Property          &lt;span class="p"&gt;|&lt;/span&gt; Value                                              &lt;span class="p"&gt;|&lt;/span&gt;
+-------------------+----------------------------------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; created           &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-05-06T21:28:53                                &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; datastore         &lt;span class="p"&gt;|&lt;/span&gt; mysql                                              &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; datastore_version &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;.6                                                &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; fault_date        &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-05-06T21:30:06                                &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; fault_details     &lt;span class="p"&gt;|&lt;/span&gt; Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:                 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;                   &lt;span class="p"&gt;|&lt;/span&gt;   File &lt;span class="s2"&gt;"/&amp;lt;snip&amp;gt;/manager.py"&lt;/span&gt;, line &lt;span class="m"&gt;265&lt;/span&gt;, in prepare  &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;                   &lt;span class="p"&gt;|&lt;/span&gt;     cluster_config, snapshot, modules&lt;span class="o"&gt;)&lt;/span&gt;             &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;                   &lt;span class="p"&gt;|&lt;/span&gt;   File &lt;span class="s2"&gt;"/&amp;lt;snip&amp;gt;/manager.py"&lt;/span&gt;, line &lt;span class="m"&gt;355&lt;/span&gt;, in _prepare &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;                   &lt;span class="p"&gt;|&lt;/span&gt;     raise RuntimeError&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A  guest error occurred"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;                   &lt;span class="p"&gt;|&lt;/span&gt; RuntimeError: A guest error occurred               &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; fault_message     &lt;span class="p"&gt;|&lt;/span&gt; A guest error occured                              &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; flavor            &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;                                                 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; id                &lt;span class="p"&gt;|&lt;/span&gt; 73cfc462-dd59-4dc1-9d32-95954171775f               &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; ip                &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;.66.25.8                                         &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; name              &lt;span class="p"&gt;|&lt;/span&gt; myinst2                                            &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; status            &lt;span class="p"&gt;|&lt;/span&gt; ACTIVE                                             &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; updated           &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2016&lt;/span&gt;-05-06T21:28:58                                &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; volume            &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;                                                  &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; volume_used       &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;.1                                                &lt;span class="p"&gt;|&lt;/span&gt;
+-------------------+----------------------------------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No changes need to be made to this API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No changes need to be made to the guest agent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could continue to require access to the logs and/or Nova instances to
determine what happened when an error occurs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The relevant fields need to be exposed during the ‘show’ command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;[peterstac]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Newton&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be undertaken within a single task.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;No upgrade issues are expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Scenario tests will be enhanced to verify that errors are persisted in the
database and can be retrieved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This is a net-new feature, and as such will require documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 29 Mar 2016 00:00:00 </pubDate></item><item><title>Replication/Cluster Locality</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/replication-cluster-locality.html</link><description>
 
&lt;p&gt;Nova has the ability to control whether new instances are created on the same
hypervisor (affinity) or on different hypervisors (anti-affinity).  This
behaviour is useful when setting up replication networks or clusters, so it is
proposed to add support for it into Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/replication-cluster-locality"&gt;https://blueprints.launchpad.net/trove/+spec/replication-cluster-locality&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At times it is desirable to control where replicas in a replication set are
created.  In the case of read slaves, there may be a requirement to ensure that
all replicas are on the same hypervisor, whereas for high availability it may
be desired that all replicas are created on different hypervisors.&lt;/p&gt;
&lt;p&gt;By the same token, clusters would benefit from having instances on different
hypervisors.&lt;/p&gt;
&lt;p&gt;Replication/cluster locality seeks to address this issue.  (Granted,
anti-affinity seems more relevant - and desirable - however the two go
hand-in-hand as will be seen in the next section.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Nova has the capability of placing new instances on the same hypervisor, or on
different ones.  Within Nova this is handled through the use of ‘server
groups.’ &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;  Using this feature of Nova will require sending a server_group
‘hint’ to the nova_client.servers.create call.  This functionality will be used
‘under the covers’ similar to how secgroups are managed now.&lt;/p&gt;
&lt;p&gt;Trove will perform the following actions to accomplish this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The create_instance method in the Task Manager will be changed to include
a ‘locality’ argument.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;image_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;availability_zone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slave_of_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locality&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The create method in cluster/models.py will likewise be modified to include
a ‘locality’ argument.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extended_properties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locality&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The locality argument will be used to create a server group with the
corresponding policy (affinity or anti-affinity).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The server group details will be converted to a Nova ‘hint.’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This hint will be passed into the Nova client in the create call in
taskmanager/models.py.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: If affinity is chosen and the hypervisor does not have enough resources,
then some of the instances will fail to create.  The same goes for choosing
anti-affinity and there are not enough available hypervisors.  There may be
other cases where Nova is unable to create the instance (affinity chosen, but
different AZ’s); in these cases the new instance will likely fail to spawn as
well.&lt;/p&gt;
&lt;p&gt;The Trove show and cluster-show commands will also be modified to show the
‘locality’ value (i.e.  the server_group policy), if it exists.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No changes&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No changes.  The server_group id will be obtained from Nova when it’s needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;An attribute ‘locality’ will be added to the data payload sent during a
‘create’ command.  The request/response will look like:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"myinst"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"replica_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"locality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"affinity"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-13T12:36:59"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"myinst"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://10.240.64.151:8779/v1.0/&amp;lt;tenant&amp;gt;/instances/&amp;lt;id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://10.240.64.151:8779/instances/&amp;lt;id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-13T12:36:59"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://10.240.64.151:8779/v1.0/&amp;lt;tenant&amp;gt;/flavors/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://10.240.64.151:8779/flavors/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"locality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"affinity"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ‘show’ and ‘cluster-show’ commands will also now return an attribute
‘locality’ that will look like the one returned from their respective create
commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No impact&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;A new argument ‘locality’ will be added to the Trove create command (this will
be passed through to the Nova client as a hint by the Task Manager, after
creating the corresponding server group).  The new Python API signature will
be:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flavor_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;restorePoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;availability_zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;replica_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slave_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replica_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;locality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Python API signature for cluster-create will be:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;locality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The create command will now accept a –locality flag that can be one of two
values: affinity and anti-affinity.  The command would look like:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove create my_instance &lt;span class="m"&gt;7&lt;/span&gt; --size &lt;span class="m"&gt;1&lt;/span&gt; --locality affinity
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For clusters it will be:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove cluster-create my_cluster mysql &lt;span class="m"&gt;5&lt;/span&gt;.6 --locality affinity &lt;span class="se"&gt;\&lt;/span&gt;
                                          --instance &lt;span class="nv"&gt;flavor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;,volume&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                                          --instance &lt;span class="nv"&gt;flavor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;,volume&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                                          --instance &lt;span class="nv"&gt;flavor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;,volume&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replicas can then be created in the usual fashion, with all following the
locality setting of the master node.  If adding replicas to an existing set,
an exception will be thrown if –locality is specified, as this flag
cannot be changed once it has been associated with an instance (this is a Nova
restriction in that servers can’t be added or removed from a group manually).
For example, the following command would fail:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove create my_replica &lt;span class="m"&gt;7&lt;/span&gt; --size &lt;span class="m"&gt;1&lt;/span&gt; --locality affinity --replica_of &amp;lt;id&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When growing a cluster, the same locality will be applied to any new instances
created. Because of this, the locality flag will not be available for
cluster-grow.&lt;/p&gt;
&lt;p&gt;The show and cluster-show commands will also display the locality value. For
example:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&amp;gt; trove show my_instance

+-------------------+-------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; Property          &lt;span class="p"&gt;|&lt;/span&gt; Value                   &lt;span class="p"&gt;|&lt;/span&gt;
+-------------------+-------------------------+
&lt;span class="p"&gt;|&lt;/span&gt; created           &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;-12-13T12:36:59     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; datastore         &lt;span class="p"&gt;|&lt;/span&gt; mysql                   &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; datastore_version &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;.6                     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; flavor            &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;                       &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; id                &lt;span class="p"&gt;|&lt;/span&gt; &amp;lt;id&amp;gt;                    &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; ip                &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;.64.151.6             &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; name              &lt;span class="p"&gt;|&lt;/span&gt; my_instance             &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; status            &lt;span class="p"&gt;|&lt;/span&gt; ACTIVE                  &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; updated           &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;-12-13T12:37:03     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; volume            &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;                       &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; volume_used       &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;.1                     &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt; locality          &lt;span class="p"&gt;|&lt;/span&gt; affinity                &lt;span class="p"&gt;|&lt;/span&gt;
+-------------------+-------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If locality is not specified, then no hint will be sent to Nova and it will
follow its default algorithm for deciding what hypervisor to use.&lt;/p&gt;
&lt;p&gt;For operator assistance in debugging issues the server group id could be
displayed through a management call, but will be kept hidden from end users
(just as the Nova instance id is not displayed).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The Task Manager is responsible for creating the replication and cluster
instances, so it will need to be aware of the locality flag.  The relevant
methods will be changed to include this, as described above.&lt;/p&gt;
&lt;p&gt;Once the flag is converted to a server group, a ‘hint’ will be created to pass
to the Nova client.  The converted hint data will be equivalent to the
corresponding ReST API values:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="s2"&gt;"os:scheduler_hints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"group"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;id&amp;gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Since the server group must be created before the Nova instance is created,
there are no anticipated Guest Agent changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The server_group id could be stored in the Trove database.  The trade-off to
any speed improvements (from not having to request the information from Nova)
would be that Trove would have to manage this field properly.  If it got out of
sync then Trove wouldn’t function as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;For each of the instance create and cluster create screens, a drop-down
for locality will need to be added. This drop-down will have ‘None’,
‘affinity’, and ‘anti-affinity’ in it. The value chosen will need
to be passed down into the respective create calls. The show commands
will need to be enhanced as well to recognize the new ‘locality’ element.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;peterstac&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Newton-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be undertaken with the following tasks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Client (Python and CLI) changes for replication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server (API and TaskManager) changes for replication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client (Python and CLI) changes for clustering&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server (API and TaskManager) changes for clustering&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;Since this change is completely backwards compatible, no upgrade issues are
expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The replication scenario test will be modified to use –locality=affinity and
the results verified (i.e. that the Trove ‘show’ command returns the right
value for the ‘locality’ attribute).  A negative test with anti-affinity will
also be created (since devstack runs on one hypervisor, this test should always
fail to create replicas). As far as it is feasible with respect to resources
consumed, this same pattern will be used in the cluster scenario tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This is a net-new feature, and as such will require documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Output from running ‘nova help server-group-create’&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 29 Mar 2016 00:00:00 </pubDate></item><item><title>Trove Image Builder</title><link>https://specs.openstack.org/openstack/trove-specs/specs/newton/trove-image-builder.html</link><description>
 
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-image-builder" id="id14"&gt;Trove Image Builder&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#problem-description" id="id15"&gt;Problem Description&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-change" id="id16"&gt;Proposed Change&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#configuration" id="id17"&gt;Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#database" id="id18"&gt;Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api" id="id19"&gt;Public API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api-security" id="id20"&gt;Public API Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python-api" id="id21"&gt;Python API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cli-python-troveclient" id="id22"&gt;CLI (python-troveclient)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-api" id="id23"&gt;Internal API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#guest-agent" id="id24"&gt;Guest Agent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#alternatives" id="id25"&gt;Alternatives&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dashboard-impact-ux" id="id26"&gt;Dashboard Impact (UX)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#implementation" id="id27"&gt;Implementation&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#assignee-s" id="id28"&gt;Assignee(s)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#milestones" id="id29"&gt;Milestones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#work-items" id="id30"&gt;Work Items&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#upgrade-implications" id="id31"&gt;Upgrade Implications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dependencies" id="id32"&gt;Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#testing" id="id33"&gt;Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#documentation-impact" id="id34"&gt;Documentation Impact&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#references" id="id35"&gt;References&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#appendix" id="id36"&gt;Appendix&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The development and user community needs a consistent and automated means of
generating Trove guest database images (simply “images”) for different
platforms and databases using an open source tool.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove-image-builder/+spec/trove-image-build-repo"&gt;https://blueprints.launchpad.net/trove-image-builder/+spec/trove-image-build-repo&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id15"&gt;Problem Description&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Trove users (new and experienced) typically run into problems in the last leg
of a datastore setup, that is the generation and loading of a compatible image
including the database and the Trove guestagent. There are significant
variations among the GNU/Linux distros, their native database packages, vendor
packages and assumptions built into the current Trove codebase. These
differences can together conspire to provide unusable Trove guest database
instances. An instance launched from an incorrectly assembled Trove image will
not properly prepare and register with the Trove control plane, potentially
remaining in BUILD state indefinitely, and the novice user will have little
information to go on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id16"&gt;Proposed Change&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This specification proposes to create a new Trove repository that will contain
source code artifacts for an image generation tool. The new tool will support
image generation for the same set of distros currently available from
“redstack kick-start”. However, a key difference here is that the new repo
will have a clear separation of concern from the trove-integration project:
no devstack nor test wrappers, just image building.&lt;/p&gt;
&lt;p&gt;The artifacts will essentially be a BASH script main driver which potentially
loads distro-specific argument parsing, settings, and functions. The driver
script will ultimately invoke DIB (diskimage-builder) &lt;a class="footnote-reference brackets" href="#id10" id="id1"&gt;0&lt;/a&gt; with arguments to
apply DIB file elements to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;install database packages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;install Trove guestagent code from one of several sources: Github tip of
master or stable release, distribution packages if applicable, community
packages such as RDO, or local file system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;apply any required database configuration path changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemd or init.d service enablement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;set SELinux labels or AppArmor profiles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;perform RHEL subscription registration and attachment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;optionally install SSH keys for debugging development and test images&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another parameterized option (e.g., command-line argument) should be whether
the script gets a base cloud image from the Internet, uses a cached version
(like redstack), or is simply pointed at an existing image on the local
filesystem.&lt;/p&gt;
&lt;p&gt;Other artifacts in the repository could include:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;external repository files for loading packages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemd scripts or other init files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cloud-init datasource specification&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This change proposes to start with existing DIB elements derived from the
trove-integration project. These currently comprise Ubuntu and Fedora (F22 or
higher). Work is underway to convert the existing Fedora elements to CentOS 7.
Proposed supported datastores (specific versions omitted since these will
change over time):&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 42%"/&gt;
&lt;col style="width: 25%"/&gt;
&lt;col style="width: 33%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;datastore&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Ubuntu&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;CentOS 7&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Cassandra&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Couchbase&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;CouchDB&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;TBD&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;DB2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;TBD&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;MariaDB&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;MongoDB&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;MySQL&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Percona&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;PostgreSQL&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;PXC&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Redis&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;TBD&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Vertica&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;TBD&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;NB: Datastores marked TBD for CentOS 7 currently lack public community yum
repos for install.&lt;/p&gt;
&lt;p&gt;The image build process should be independent of any specific OpenStack python
or other dependencies save for the DIB tool. Ideally, this new repo would not
be branched with OpenStack releases, just the same as trove-integration is not
branched today. However, trove-integration does rely on per-release
requirements files for pip. These are essentially trimmed down requirements to
service a pip install of the guestagent code. Some possible solutions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;fetch the existing trove-integration requirement files when doing a pip
install in the new builder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;going forward, have trove incorporate those files formally instead of
maintaining them externally (under a separate blueprint)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although this project could eventually be integrated with the redstack script
for use in development and testing, it should have no dependency on it nor
the trove or python-troveclient projects for execution, notwithstanding
inclusion of the existing guest requirement files.&lt;/p&gt;
&lt;p&gt;Although this proposal will be initially organized around the incumbent DIB
tool, it will not preclude additions and enhancements to support other image
build technologies as recognized by the OpenStack community. &lt;a class="footnote-reference brackets" href="#id11" id="id2"&gt;1&lt;/a&gt; For example,
a libguestfs &lt;a class="footnote-reference brackets" href="#id12" id="id3"&gt;2&lt;/a&gt; approach could be integrated into this same repository if
the community reviews and deems that technology to be advantageous at some
point in the future.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id17"&gt;Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None, this tool doesn’t make use of the configuration options used by the Trove
controller. In other words, it will not parse or otherwise attempt to make use
of Trove controller configuration settings for its image generation execution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id18"&gt;Database&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None, images created from this tool will be loaded into Glance and registered
as a Trove datastore the same as today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id19"&gt;Public API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None, image generation is not part of the Trove API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id20"&gt;Public API Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None, see above&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id21"&gt;Python API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None, image generation is not part of the Python API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id22"&gt;CLI (python-troveclient)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id23"&gt;Internal API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id24"&gt;Guest Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id25"&gt;Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Use other image image build and manipulation tools as recognized by OpenStack
governance &lt;a class="footnote-reference brackets" href="#id11" id="id4"&gt;1&lt;/a&gt;, such as libguestfs. &lt;a class="footnote-reference brackets" href="#id12" id="id5"&gt;2&lt;/a&gt; However, there are concerns about
the ability to successfully adopt these tools in areas such as gate checks
where DIB is currently used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rely on the limited image options provided by the trove-integration project
via the redstack tool. However, these images are specifically generated for
development testing and not appropriate for other environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manually follow the DIB-based procedure described in the existing
“Building Guest Images” document &lt;a class="footnote-reference brackets" href="#id13" id="id6"&gt;3&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use downstream providers which likely incurs a business relationship for
access and use of their proprietary tested images.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id26"&gt;Dashboard Impact (UX)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id27"&gt;Implementation&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id28"&gt;Assignee(s)&lt;/a&gt;&lt;/h3&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 41%"/&gt;
&lt;col style="width: 20%"/&gt;
&lt;col style="width: 11%"/&gt;
&lt;col style="width: 27%"/&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Launchpad Id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;IRC&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Email&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Victoria Martinez de la Cruz&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vkmc&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;vkmc&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:vimartin%40redhat.com"&gt;vimartin&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Peter MacKinnon&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;pmackinn&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;pmackinn&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:pmackinn%40redhat.com"&gt;pmackinn&lt;span&gt;@&lt;/span&gt;redhat&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id29"&gt;Milestones&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Newton-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id30"&gt;Work Items&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Have PTL create new project repository for image creation tool and supporting
data files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop and install artifacts into repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update existing docs to guide users to new image creation tool.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id31"&gt;Upgrade Implications&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id32"&gt;Dependencies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;DIB (diskimage-builder) &lt;a class="footnote-reference brackets" href="#id10" id="id7"&gt;0&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id33"&gt;Testing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Autonomous testing of the image builder likely involves inventory of installed
packages, file paths, etc. This could be done using other image tools such
as guestfish, virt-ls, and virt-cat. &lt;a class="footnote-reference brackets" href="#id12" id="id8"&gt;2&lt;/a&gt; For integration testing, we could
investigate configurable changes in redstack where instead of generating an
image, redstack invokes the new tool. A new CI job (likely initially a
non-voting job) could run devstack with trove, run the image generation,
configure the generated image and the related datastore, and run integration
tests and/or tempest. When the job is deemed stable by the community, it
could be considered for voting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id34"&gt;Documentation Impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;References to the new project should be added to the existing “Building Guest
Images” document &lt;a class="footnote-reference brackets" href="#id13" id="id9"&gt;3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id35"&gt;References&lt;/a&gt;&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;0&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id7"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/diskimage-builder"&gt;https://github.com/openstack/diskimage-builder&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id11"&gt;&lt;span class="brackets"&gt;1&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id2"&gt;1&lt;/a&gt;,&lt;a href="#id4"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/image-guide/modify-images.html"&gt;http://docs.openstack.org/image-guide/modify-images.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id12"&gt;&lt;span class="brackets"&gt;2&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id3"&gt;1&lt;/a&gt;,&lt;a href="#id5"&gt;2&lt;/a&gt;,&lt;a href="#id8"&gt;3&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://libguestfs.org/"&gt;http://libguestfs.org/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id13"&gt;&lt;span class="brackets"&gt;3&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id6"&gt;1&lt;/a&gt;,&lt;a href="#id9"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/openstack/trove/blob/master/doc/source/dev/building_guest_images.rst"&gt;https://github.com/openstack/trove/blob/master/doc/source/dev/building_guest_images.rst&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id36"&gt;Appendix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 29 Mar 2016 00:00:00 </pubDate></item><item><title>Multi-Region Trove</title><link>https://specs.openstack.org/openstack/trove-specs/specs/ocata/multi-region.html</link><description>
 
&lt;p&gt;Trove is currently able to deploy instances to multiple availability
zones within a region, but is limited to deployments within a single
Openstack region.  This specification outlines a proposal for allowing
Trove to deploy instances to multiple Openstack regions.&lt;/p&gt;
&lt;p&gt;There are three different approaches to implementing multi-region
support in Trove.  The first approach would be for each region to have
it’s own Trove controller and to implement a consistent view of Trove
instances across them; this would allow a user in any region to see
all trove instances within their region, regardless of which Trove
contoller created them.  The second approach would be to have a single
trove controller across all regions coordinated by a shared database
(such as Galera); this would allow users in any region to see all
trove instances in all regions.  The third approach would be to have
the Trove controller in each region to be independent, but able to
create instances in other regions; this would allow a user to see all
Trove instances created by the Trove controller in their region,
regardless of which region the instance is in, but they would not be
able to see Trove instances in their own region created by Trove
contollers in other regions.&lt;/p&gt;
&lt;p&gt;This specification outlines a proposal that would allow the second and
third alternatives to be implemented.  It is the author’s belief that
the first alternative would be far more complex, difficult to
implement, and error prone than the second and third options.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/multi-region"&gt;https://blueprints.launchpad.net/trove/+spec/multi-region&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove will be modified to be able to use Openstack’s cross-region
client access to implement support for creating Trove instances in
other regions.  Essentially, one Trove controller will be able to
access Nova and Cinder services in multiple Openstack regions.&lt;/p&gt;
&lt;p&gt;Multi-region support will require that the Keystone service be
federated between the regions, effectively allowing the Trove
controller to access services in multiple regions using a single,
common authentication.  This functionality is currently supported in
Openstack.&lt;/p&gt;
&lt;p&gt;Object storage (such as Swift) may be federated between the regions,
or each region may have an independent object storage service.  Where
regions represent physically distinct data centres, a single shared
implementation of object storage may be preferrable as it would allow
data to be shared efficiently between the regions, rather than being
transferred in it’s entirety upon each access.&lt;/p&gt;
&lt;p&gt;In the default configuration, each region will host an independent set
of Trove contoller services, with each region having it’s own Trove
API, Taskmanager, and Conductor services backed by a separate Trove
database for each region.  When a Taskmanager in one region needs to
allocate resources (compute and block storage) in a different region,
it will use the OS_REGION_NAME parameter to the Nova and Cinder
clients to access the appropriate Openstack services in the other
region.  The Trove instances allocated in the second region will only
be visible to trove cli commands executed in the first region.&lt;/p&gt;
&lt;p&gt;A second configuration will be possible where each region will host a
set of Trove services which share a common Trove database implemented
via a federated database product such as Galera clustering.  This will
allow users in each region to see all Trove instances, regardless of
in which region they are hosted, but may expose the Trove services to
the usual issues associated with running Openstack services on a
database which uses optimistic locking.  No testing of this
alternative is envisioned for the initial implementation of
multi-region support.&lt;/p&gt;
&lt;p&gt;Implementing multi-region support as described in this document will
require that the instances in each region be on a network shared
across all regions, and that the instances be able to access the
Rabbit network in each region.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Supporting multiple regions, as laid out in this document, will
primary consist of allowing the Trove services (API, Taskmanager, and
Guestagent) to provide an OS_REGION_NAME parameter when accessing the
clients for Nova and Cinder.  Adding this support will encompass the
following components:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add ‘region’ field to the Instances table in the Trove database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhance the CLI and REST API to allow ‘region name’ to be specified
for each instance to be created (both single instance and clusters)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add ‘region name’ to guest agent RPC calls as needed (backup_info
parameter of prepare call)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhance each datastore to use the ‘region name’ as appropriate&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When specifying that an instance be started in a different region,
Trove will need to ensure that an appropriate image is available in
the target region.  To do so, trove will contact the Glance service in
the other region to retrieve the metadata for the image of the same
name as specified in the datastore (in the first region).  The
checksums of the images in both regions will be compared to ensure
that the same image in installed in each region.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No changes to configuration files are envisioned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;A ‘region_name’ field will be added to the Trove ‘instances’ table.&lt;/p&gt;
&lt;p&gt;Migration scripts will be provided to add ‘region_name’ parameters to
the above listed tables during Openstack release upgrades.&lt;/p&gt;
&lt;p&gt;A  region_name property  will be  added  to the  DBInstance class  and
shadowed in the SimpleInstance class.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;A “region” parameter will be added to the following REST APIs to
indicate the region in which the specified resource should be created.
If the “region” parameter is not specified, the resource will be
created in the region in which the command is executed.&lt;/p&gt;
&lt;p&gt;Operations which do not create new resources, such as the list and
show APIs, do not require additional region parameters.  For those
APIs, the region would be specified via the –os-region-name
parameter.&lt;/p&gt;
&lt;p&gt;When the Taskmanager is requested to create an instance in a region
different than its own, it will need to ensure that a suitable image
is available in that region to create the instance (as it will not be
possible to tell the Nova in RegionB to use an image from RegionA).
To create an instance in RegionB, the Taskmanager in RegionA will
proceed as follows:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Retrieve the name of the appropriate image from the appropriate
datastore_version in RegionA&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the checksum from Glance for the image in RegionA&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that trove in RegionB has a datastore_version of the same
name, and that datastore_version specifies an image of the same
name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the checksum of the image from the Glance in RegionB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that the image in both regions have identical checksums&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow a procedure similar to that above to ensure that a similarly
named flavour exists in both regions and has similar properties&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask Nova in RegionB to create an instance with the appropriate
image name and flavour&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="instance-create"&gt;
&lt;h4&gt;Instance Create&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"replica_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"replica_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0d5e5bcc-5c60-4703-b4b3-17f32e0abe72"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2016-03-08T16:13:30"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.6"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;ip&amp;gt;:8779/v1.0/adbe7218e9f54369a0898f36d9c7a66d/flavors/11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;ip&amp;gt;:8779/flavors/11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0d5e5bcc-5c60-4703-b4b3-17f32e0abe64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;ip&amp;gt;:8779/v1.0/adbe7218e9f54369a0898f36d9c7a66d/instances/0d5e5bcc-5c60-4703-b4b3-17f32e0abe64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://&amp;lt;ip&amp;gt;:8779/instances/0d5e5bcc-5c60-4703-b4b3-17f32e0abe64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2016-03-08T16:13:30"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cluster-create"&gt;
&lt;h4&gt;Cluster Create&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"percona"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cluster-grow"&gt;
&lt;h4&gt;cluster-grow&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"slave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"slave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="s2"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"RegionB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;This change should not have security impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;“region” parameters will be added to the Instances.create(),
Clusters.create(), and Clusters.grow() calls.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;A “–region” option will be added to the “trove create” CLI command
corresponding to the “region” parameter in the Instances.create() Python API.&lt;/p&gt;
&lt;p&gt;A “region” option will be added to the “–instance” option of the
“trove cluster-create” and “trove cluster-grow” CLI commands
corresponding to the Clusters.create() and Clusters.grow() Python
APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The “region” parameter will be added to the appropriate Taskmanager
calls to support instance creation for both single instance and
cluster creation.&lt;/p&gt;
&lt;p&gt;The Trove Instance class already has a nova_client property that
creates a unique client connection for each guest instance.  That call
will be enhanced to specify the name of the region in which the
instance exists; the create_nova_client() method in remote.py will be
enhanced to optionally take a region name parameter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The only change to the guest agent should be to support initializing a
database with data stored in a different region.  This would occur
during the prepare process, and is to support creating a replica from
a backup of a master in a differnt region.&lt;/p&gt;
&lt;p&gt;The guest.prepare() call already takes a structure called backup_info
which contains details of the backup to be used to initialize the
database.  This change will add a member “region” to the backup_info
structure which will be the name of the region containing the backup.
That region name will be passed to the Swift client to tell Swift in
which region the backup was created; note, however, that it is
expected that Swift will normally be configured to be shared across
regions and so be able to optimize object access from all regions.&lt;/p&gt;
&lt;p&gt;When a taskmanager in RegionA creates an instance in RegionB, it will
pass a guestagent.conf to the new instance.  The new instance in
RegionB will use the rabbit configuration parameters in the conf file
to determine how to connect to the rabbit broker in RegionA.  No
changes should be required to the existing guest agent to support this
functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As indicated in the introduction, an alternative to the design
suggested here would be to have the trove controllers perform their
own synchronization giving each controller a view of every Trove
instance.  This would require that all operations be coordinated with
the Trove controllers in every region, either via some form of Two
Phase Commit or some Eventual Consistency mechanism.  Implementing
this would be quite complex and offer little benefit beyond the shared
database implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The user should be able to select the region in which a new instance
or cluster is to be created.&lt;/p&gt;
&lt;p&gt;Panels which display properties of instances or clusters should be
enhanced to display the region name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Liberty-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Already implemented, code awaiting spec approval.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;No upgrade implications are envisioned as a result of this change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No dependecies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;No int-tests will be developed for this feature due to the difficulty
of creating multiple regions within devstack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation will be necessary for the new parameters to the Trove
CLI commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Thu, 17 Mar 2016 00:00:00 </pubDate></item><item><title>Percona XtraDB Cluster Root Enable</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/pxc-root-enable.html</link><description>
 
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#percona-xtradb-cluster-root-enable" id="id1"&gt;Percona XtraDB Cluster Root Enable&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#problem-description" id="id2"&gt;Problem Description&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-change" id="id3"&gt;Proposed Change&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#configuration" id="id4"&gt;Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#database" id="id5"&gt;Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api" id="id6"&gt;Public API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api-security" id="id7"&gt;Public API Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python-api" id="id8"&gt;Python API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cli-python-troveclient" id="id9"&gt;CLI (python-troveclient)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-api" id="id10"&gt;Internal API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#guest-agent" id="id11"&gt;Guest Agent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#alternatives" id="id12"&gt;Alternatives&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dashboard-impact-ux" id="id13"&gt;Dashboard Impact (UX)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#implementation" id="id14"&gt;Implementation&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#assignee-s" id="id15"&gt;Assignee(s)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#milestones" id="id16"&gt;Milestones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#work-items" id="id17"&gt;Work Items&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#upgrade-implications" id="id18"&gt;Upgrade Implications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dependencies" id="id19"&gt;Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#testing" id="id20"&gt;Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#documentation-impact" id="id21"&gt;Documentation Impact&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#references" id="id22"&gt;References&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#appendix" id="id23"&gt;Appendix&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;For the Percona XtraDB Cluster (PXC) datastore we need the ability to enable
root for a cluster to be able to manage the datastore with a privileged user.
For example, in order to integrate a PXC datastore cluster with Cloud Foundry
it requires a root user to automatically manage the database users and
databases on the cluster. This will add root enable to the PXC solution
we currently have.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/pxc-root-enable"&gt;https://blueprints.launchpad.net/trove/+spec/pxc-root-enable&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2"&gt;Problem Description&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PXC is lacking support for root enable cluster. This will allow a user to
create a root user and either give a new random password or set the given
password for the root user across the cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3"&gt;Proposed Change&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PXC will use the existing root enable API call. This change will allow the
cluster to enable root within a cluster. The call will apply the root
user and password to a single node in the cluster and since the cluster
replicates to the other nodes they will get the same root user and password
set.&lt;/p&gt;
&lt;p&gt;Requirements for root enable:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A root enable api to a cluster resource shall apply the root credentials
to the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A user shall be able to connect to any instance in the cluster with the root
user and password to manage the datastore.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PXC will need to extend the existing root enable calls into its clustered
datastore implementation because currently the root enable calls raise an
exception if root enable is called with a cluster since most datastores do not
support this feature. This will require a configuration change for the
guestagent and will be outlined below.&lt;/p&gt;
&lt;p&gt;This change only involves adding the existing feature to the PXC datastore not
changing the existing functionality of other datastores. This will not add root
enabled at cluster create time because that functionality does not currently
exist in the api for cluster create.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id4"&gt;Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In order to allow a PXC cluster to enable root we need to update the
guestagent api to support this call. After looking over the other cluster
enabled datastores the only other cluster datastore that supports this feature
is Vertica. Much of this code can easily be reused and applied to PXC as well.
We will pull the majority of this code into a common location that can be used
by other datastores in the future as well as the PXC datastore today. The
Vertica datastore can extend this class with the additional changes it needs
specific to its datastore.&lt;/p&gt;
&lt;p&gt;The PXC configuration change will be with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;root_controller&lt;/span&gt;&lt;/code&gt; configuration
parameter where it uses the DefaultRootController today and instead point to
the new class called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ClusterRootController&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id5"&gt;Database&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id6"&gt;Public API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The following public API calls will be made available to the PXC datastore.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Cluster root enable - The existing call payload will not be changed.
Implementing the root enable of a cluster resource will allow a user to
enable root across all instances in the cluster, as well as allow the user
to specify a password that will be used to enable root on the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id7"&gt;Public API Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id8"&gt;Python API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id9"&gt;CLI (python-troveclient)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Support for the following existing CLI calls.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;root-enable&lt;/span&gt;&lt;/code&gt; with or without the –root_password given by user&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No changes should be necessary to accomplish these actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id10"&gt;Internal API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Vertica datastore already has this feature and much of the code is reusable
so we can move this code to a common location and build off of it.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.vertica.models.VerticaRoot&lt;/span&gt;&lt;/code&gt; class to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.common.models.ClusterRoot&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.vertica.service.VericaRootController&lt;/span&gt;&lt;/code&gt; class to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.common.service.ClusterRootController&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.vertica.service.VericaRootController&lt;/span&gt;&lt;/code&gt; class
extend the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove.extensions.common.service.ClusterRootController&lt;/span&gt;&lt;/code&gt; with
small change Vertica needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id11"&gt;Guest Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The PXC guest agent will need the methods to enable root as well with or
without a password. Since this feature didn’t exist prior to now we only need
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable_root_with_password&lt;/span&gt;&lt;/code&gt; and not the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable_root&lt;/span&gt;&lt;/code&gt; method in the
manager for PXC. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable_root_with_password&lt;/span&gt;&lt;/code&gt; method is the new version of
the root enable call. The old version that did not have a password was left for
backward compatibility.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add the enable_root_with_password method to the pxc manager.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No calls will be deprecated in order to complete this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id12"&gt;Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not to support root enable of a PXC cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id13"&gt;Dashboard Impact (UX)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The dashboard will need an update for this to be enabled for a PXC cluster.
This change will need to apply for only a cluster of datastore type pxc as
other datastores do not have this ability.&lt;/p&gt;
&lt;p&gt;Need a new option on a cluster dropdown to allow a user to enable root for a
given cluster. Greyed out if the cluster is not of datastore type pxc.&lt;/p&gt;
&lt;p&gt;There should be a dialog that allows the user to enter a password that they
would like to use for the root user or allow the system to randomly gererate a
password and display the password to them once so that they can copy and paste
it to what ever application needs root access.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id14"&gt;Implementation&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id15"&gt;Assignee(s)&lt;/a&gt;&lt;/h3&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 26%"/&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 34%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Launchpad Id&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;IRC&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Email&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Craig Vyvial&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;cp16net&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:cp16net%40gmail.com"&gt;cp16net&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id16"&gt;Milestones&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Targeting this for milestone:
Mitaka-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id17"&gt;Work Items&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Enable root for a PXC cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UX changes needed for root enable of a PXC cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id18"&gt;Upgrade Implications&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Just the common updates since this is a new feature the guestagent will need to
be updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id19"&gt;Dependencies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id20"&gt;Testing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There will be unit tests that test the new calls for the strategy.&lt;/p&gt;
&lt;p&gt;There will be integration tests added to the scenario tests that will test
enabling root on a cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id21"&gt;Documentation Impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We need to update the docs to show support for root enable on PXC clusters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id22"&gt;References&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id23"&gt;Appendix&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 13 Jan 2016 00:00:00 </pubDate></item><item><title>Module Management</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/module-management.html</link><description>
 
&lt;p&gt;Historically, Trove has supported open source databases.  As more datastores
were added it was inevitable that this would eventually change to include
proprietary databases as well.  Starting with the Liberty release this is the
case (support for Vertica and DB2 now being available) and with this comes the
issue of managing the licenses of said databases.  In addition, operators may
find it useful to include other software on their images that may require
‘activation’ by end-users (for example New Relic’s analytical suite).  A method
of activating this software is also needed.&lt;/p&gt;
&lt;p&gt;The concept of applying a ‘license’ or ‘activation’ or ‘configuration’ of this
third-party software is what is referred to herein as ‘module’ management.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/module-management"&gt;https://blueprints.launchpad.net/trove/+spec/module-management&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Users of a particular cloud may be willing to purchase a license to use a
datastore from the cloud vendor on a pay-as-you-go based model, and this is the
model assumed at the moment (as both Vertica and DB2 redstack images include a
fully-functional and licensed database).  It is also desirable, however, that
users be allowed to ‘bring their own license.’  In this scenario the user
provides a license file that the database requires, and as such a mechanism
needs to be in place to ‘activate’ and/or ‘renew’ the license through the use
of the user provided file.&lt;/p&gt;
&lt;p&gt;This same problem exists for any other proprietary software that an operator
may wish to include in their Trove images.  These software packages also
typically require activation through the use of a license key or file (such as
New Relic &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;1&lt;/a&gt;) or configuration of some kind.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Trove’s responsiblity towards module management will be restricted to the scope
of encrypting and storing the required data file (for example, a license file)
and providing a way to apply this data to a new or existing Trove instance or
cluster.  A mechanism will be put in place to allow end users the ability to
manage adding, deleting, listing, viewing and updating these module data files.&lt;/p&gt;
&lt;p&gt;Methods to apply, remove, query and retrieve the actual ‘module’ data file on
the Trove instance will also be provided.&lt;/p&gt;
&lt;p&gt;A repeatable option (–module) will be added to the create and cluster-create
commands to allow adhoc module selection.  In addition, modules can be set to
auto-apply, which will have the effect of the Guest Agent installing that
module on any instance created with the relevant datastore combination.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The following configuration changes are anticipated.&lt;/p&gt;
&lt;p&gt;A way of specifying valid module ‘types’ will be needed for proper validation
on module create:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'module_types'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'A list of module types supported.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A key will be needed in order to be able to encrypt the module data file before
storing it in the database:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'module_aes_cbc_key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'module_aes_cbc_key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'OpenSSL aes_cbc key for module encryption.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;A new table (modules) will be added to the Trove schema:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 17%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 43%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Allow Nulls&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of module (autogenerated)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(255)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Type of module.  This will
correlate directly to the
required plugin (i.e. a
plugin must exist of this
‘type’)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;tenant_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of tenant to apply
module to.  ‘all’ means module
applies to all tenants&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;datastore&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name of datastore to apply
module to.  ‘all’ means module
applies to all datastores&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;datastore_version&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name of datastore version to
apply module to.  ‘all’ means
module applies to all
datastores&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(255)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name of module&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;description&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(512)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Description of module&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;auto_apply&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Should this module be
automatically applied during
instance/cluster create.  Will
default to ‘no’ if not
provided&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;visible&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Should this module be
visible to non-admin users.
Will default to ‘yes’ if not
provided&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;live_update&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Can this module be updated
while applied-to instances
still exist.  If set to ‘no’
all instances must have the
corresponding module removed
before it can be updated.
Defaults to ‘no’&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;contents&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;blob&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Encrypted module contents&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;md5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(32)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;MD5 hash of module contents&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;created&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Created date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;updated&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Updated date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;deleted&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted flag&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;deleted_at&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;A unique index will be created from the (datastore, datastore_version, name)
fields, to allow easy determination of the correct module to apply to a
specific instance.&lt;/p&gt;
&lt;p&gt;An MD5 hash of the module contents will be stored in the module record as
well.  This hash will be reported back when querying the module from a
running instance, as the original module record could have been modified with
new contents after it was initially applied.&lt;/p&gt;
&lt;p&gt;On installing the module contents on a given instance, a file will be created
in a know location using &amp;lt;datastore&amp;gt;-&amp;lt;datastore_version&amp;gt;-&amp;lt;name&amp;gt;.lic as a
pattern.&lt;/p&gt;
&lt;p&gt;Creating modules that apply to ‘all’ tenants or ‘all’ datastores and ones that
are auto-applied will require admin credentials.&lt;/p&gt;
&lt;p&gt;Setting a module to ‘not’ visible is also an admin-only option.  This will
allow administrators to ‘hide’ modules from users if they so desire.  Modules
that are marked visible=False will not be returned in commands such as list or
show unless requested by an admin user.  Non-admin users won’t be able to apply
a non-visible module, however they will still be auto-applied if so designated.&lt;/p&gt;
&lt;p&gt;A new table (instance_modules) will be added to the Trove schema to track which
modules have been applied to each instance:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 24%"/&gt;
&lt;col style="width: 17%"/&gt;
&lt;col style="width: 16%"/&gt;
&lt;col style="width: 43%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Column&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Allow Nulls&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of association
(autogenerated)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;instance_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of instance&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;module_id&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(36)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ID of module&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;md5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;varchar(32)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;MD5 hash of module contents&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;created&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Created date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;updated&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Updated date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;deleted&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;tinyint(1)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted flag&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;deleted_at&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DateTime&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Deleted date&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;New ReST API calls will be added to the Trove infrastructure.  These fall into
two categories - ones to manage the maintenance of the actual modules, and
ones to handle the instance interactions.&lt;/p&gt;
&lt;p&gt;In addition, the create and cluster-create calls will be enhanced.&lt;/p&gt;
&lt;div class="section" id="module-maintenance"&gt;
&lt;h4&gt;Module Maintenance&lt;/h4&gt;
&lt;p&gt;To retrieve a list of all modules that can be applied, the following request
would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica_license'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Vertica license for 100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
            &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic_activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'New Relic activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
            &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that an admin user will receive the modules for all tenants, whereas
regular users will see modules for their tenant only.&lt;/p&gt;
&lt;p&gt;To retrieve a list of valid modules that can be applied to a specific
datastore, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastores&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datastore_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic_activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'New Relic activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
            &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To show the details of a particular module, the following request would be
made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic_activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'New Relic activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
    &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To create a module, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica_license'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Vertica license for 100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# admin-only option&lt;/span&gt;
    &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'contents'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module_contents&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica_license'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Vertica license for 100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
        &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt;  &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To update a module, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_datastore'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_datastore_version'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# admin-only option&lt;/span&gt;
    &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'contents'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module_contents&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'tenant'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_datastore'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_datastore_version'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'auto_apply'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'visible'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# returned for admin only&lt;/span&gt;
        &lt;span class="s1"&gt;'live_update'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;new_md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'created'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'updated'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt;  &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To delete a module, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To query which instances have a particular module applied, the following
request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'instance'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'installed'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'installed'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="instance-interaction"&gt;
&lt;h4&gt;Instance Interaction&lt;/h4&gt;
&lt;p&gt;To apply modules to an instance, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica_license'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt;  &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To query an instance about installed modules, the following request would be
made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica_license'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'100GB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'filename'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica-all-100GB.lic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'installed'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'OK'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'error_message'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic_activation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'datastore_version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'new_relic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'filename'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'all-all-new_relic.lic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'installed'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'FAILED'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'error_message'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'New Relic binaries not found'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To retrieve a module from an instance, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'filename'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'vertica-all-100GB.lic'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'contents'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module_contents&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'md5'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To delete a module from an instance, the following request would be made:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;module_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt;  &lt;span class="n"&gt;Success&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt;  &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="creation-enhancements"&gt;
&lt;h4&gt;Creation Enhancements&lt;/h4&gt;
&lt;p&gt;The instance create API will be enhanced to include a module field, containing
a list of modules to apply.  These will be sent down during the normal
‘prepare’ call and the appropriate plugin called once this instance has been
provisioned correctly.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'modules'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In a similar manner, the cluster create API will also be enhanced to include
module information in the instances field, as is currently done with flavors,
AZs, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;Since the file will be transmitted clear text across the management
network, there is a chance that the module can be intercepted if the network
is compromised.&lt;/p&gt;
&lt;p&gt;It should be ensured that each plugin created does not ‘execute’ the contents
of the supplied module data file, as this would present the opportunity for a
security breach.  This seems unlikely though (and will not be the case for the
proposed implementations) as most module data files will be passed to another
process for validation, and it is up to that process to ensure proper security
is maintained.  Code reviews will be vital to make sure no plugin accidentally
executes this data.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;New methods will be added to the Python API to facilitate the licensing.
A few existing methods will need to be extended as well.&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h4&gt;Module Maintenance&lt;/h4&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get a list of all modules that can be applied. Return only&lt;/span&gt;
&lt;span class="sd"&gt;    those that apply to the datastore if it is passed in.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_list_instances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get a list of all instances that have a given module applied."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Show the details of the module."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'all'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;all_tenants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;live_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Create a new module."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auto_apply&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;all_tenants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;live_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Update an existing module."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Delete a module."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h4&gt;Instance Interaction&lt;/h4&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Apply modules to an instance."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Query an instance about installed modules."""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Retrieve the module data file from an instance and save it in&lt;/span&gt;
&lt;span class="sd"&gt;    filename.  If module is not supplied, retrieve all the modules.&lt;/span&gt;
&lt;span class="sd"&gt;    If filename is not supplied, use the generated filename found&lt;/span&gt;
&lt;span class="sd"&gt;    on the instance.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;module_remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Remove a module from an instance."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h4&gt;Creation Enhancements&lt;/h4&gt;
&lt;p&gt;For instance.create, the modules field will be added to the call:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flavor_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;restorePoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;availability_zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;replica_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slave_of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replica_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Create (boot) a new instance."""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For cluster.create, the modules field will be added to the
[‘cluster’][‘instances’] data structure that is already being passed in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following Trove CLI commands (upon completion) will be fully functional&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;module-list          Displays all modules for the tenant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-show          Shows details for a particular module resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-create        Creates a new module resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;module-update        Updates module details for a particular module&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;resource.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-delete        Delete a module resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-apply         Apply the given modules to a Trove instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;module-query         Query the given Trove instance for any installed&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;modules.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-retrieve      Retrieves the current modules from a Trove instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;module-remove        Remove a module from a Trove instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;create –module [–module]&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Creates a new instance and applies the given modules.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;cluster-create –instance=module=&amp;lt;id&amp;gt;[,module=&amp;lt;id&amp;gt;]&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Creates a new cluster and applies the given modules to
each instance.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Changes also need to be made to the internal API to include any module IDs as
a part of the message body that is sent to the task manager.&lt;/p&gt;
&lt;p&gt;The API server will need to make calls to the Guest Agent for the instance
interaction type commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;In the Guest Agent, the modules will be managed with a plugin style
architecture based on the stevedore.driver.DriverManager paradym.  Each plugin
will need to implement ‘apply’, ‘query’ and ‘remove’ actions.  The ‘query’
action will need to report the status of the module ‘apply’ action.  This
would report (at a minimum) ‘OK’ or ‘FAILED’ plus any other state that seems
reasonable for users of the relevant software.  If possible, the
‘error_message’ field should be filled with useful information if an error
occurs.&lt;/p&gt;
&lt;p&gt;A simple plugin ‘base class’ that defines the contract will be provided.  It
will also provide functionality such as placing the file contents into a
specified location and retrieving the file will be added.  This can be used
as the basis for all other plugins.&lt;/p&gt;
&lt;p&gt;The Guest Agent code will use the module ‘type’ to determine if a plugin exists
for the given module.  If no plugin can be found, then an error will be written
to the log and processing stopped.&lt;/p&gt;
&lt;p&gt;To provide a concrete, real-world plugin implementation, a Vertica license
module plugin will be created to allow licenses to be applied to a Vertica
datastore.  A New Relic plugin will also be created to illustrate activation of
other third party software on a guest image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;A multi-dropdown will need to be added to the instance create dialog that
contains all modules for the selected datastore.  These modules, along with
any auto-apply ones, will need to be sent along on the create call.  The same
will be needed for the cluster create dialog.&lt;/p&gt;
&lt;p&gt;A module detail panel will need to be created.  This panel will have fields
representing the attributes of a module (see module-create command).&lt;/p&gt;
&lt;p&gt;A ‘modules’ list panel will need to be created.  This will have buttons for
‘delete’ and ‘update’ and will have a link to the detail page for each listed
module.  This will be a high-level panel, similar to ‘Instances.’&lt;/p&gt;
&lt;p&gt;The instance list panel will need to have a new action added: ‘apply module.’
This will cause a pop-up where the available modules are displayed.  The
selected module will then be passed in to the module-apply command.&lt;/p&gt;
&lt;p&gt;The instance detail panel will need to run ‘module-query’ and display the
results in a new section ‘modules.’ Alternately, a link could be placed here
that would open a module list panel with the results of the ‘module-query’
call.  Here, buttons for ‘module-remove’ and ‘module-retrieve’ would be
needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;[peterstac]&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be undertaken with the following tasks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Client (Python and CLI) changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server (API) changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guest Agent module plugin infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vertica/New Relic plugin implementation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;Since this change is net-new, no upgrade issues are expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Generic int-tests will be written, however these will not be run under MySQL
testing as it requires no module-based handling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This is a net-new feature, and as such will require documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;nrsysmond-config –set license_key=&amp;lt;new_relic_key&amp;gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 12 Jan 2016 00:00:00 </pubDate></item><item><title>Implement cassandra cluster provisioning</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/cassandra-cluster.html</link><description>
 
&lt;p&gt;Implement cassandra cluster provisioning.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-cluster&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Cassandra is by nature a distributed database consisting of ‘equal’ nodes.
The ‘equality’ of nodes means that any node in the cluster can receive and
service a request. There are no query routers or configuration servers
like in some other databases (MongoDB).
There are no restrictions on the hardware configuration of individual nodes
(i.e. the nodes may have different flavors).&lt;/p&gt;
&lt;p&gt;When a node receives a request (it becomes so called a coordinator for that
request) it uses the partition key (part of the primary key) to compute
which nodes (replicas) contain the requested data (data is distributed based
on the hash of the partition key). It then passes the request to the replicas
and collects the results. Its job is then compose the response to the client.
Each field (value) stored in the database is accompanied by timestamp
(or tombstone marker in case of deleted data). The coordinator uses
these timestamps to compile the most current view of the data into a
result set.
That is why it is absolutely critical for the nodes’ clock to be synchronized.&lt;/p&gt;
&lt;p&gt;The Cassandra has been designed such that it can survive failure of any given
node(s) and still be available. This was achieved by relaxing the consistency
requirements. Cassandra offers so called eventual consistency.
Both the fault tolerance and consistency can be tuned.
Fault tolerance can be configured on the keyspace level (Replication Factor).
Consistency can be controlled globally or on per-request level
(Consistency Level).&lt;/p&gt;
&lt;p&gt;The replication factor determines how many replicas will hold data from a
given keyspace.
Cassandra can group replicas into ‘racks’.
A ‘rack’ is a set of nodes (replicas) that share a common point of failure.
Cassandra always tries to distribute data across multiple racks, so that
failure of one does not render the data inaccessible.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Example:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Let’s have a three-node system (nodes #1, #2 and #3) and a keyspace
with replication factor (RC) 2. Now let’s suppose the user issues an insert
statement which lands on node #3 (coordinator). The coordinator uses
the partition key to determine which of the nodes the data belong to,
say it would be #1. It therefore proceeds to store the data on node #1
and because RC=2 also on the next node #2.
Now suppose both node #1 and #2 share a common failure point and are
placed into a single rack. The coordinator therefore stores the second
replica on the next available node not in the rack - that is #3 (itself).&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Cassandra also has a concept of data centers. Data centers are generally
geographically distant groups of nodes with their own set of racks.
They very much behave like separate clusters.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Example:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Let’s suppose that the example above took place on datacenter DC1, but
the keyspace in question is also configured to replicate to DC2
(the replication factor for DC1 does not have to be the same as for DC1).
The coordinator then fires an asynchronous request to one of the nodes
in DC2 which then proceeds handling the it in the same way.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Note that it is not uncommon for a keyspace to have replication factor RC=0
for a specific data center - one reason could be legal regulation which require
certain data be stored within a particular geographical region.&lt;/p&gt;
&lt;p&gt;Each node is configured with a cluster name. All nodes within a single cluster
must share the same cluster name.
Individual nodes in a cluster exchange so called gossip - basic information
on the cluster’s topology. Newly added nodes learn about all the other nodes
the same way. They just need to be provided a set of initial gossip seeds
(already active nodes from within the cluster). It is recommended that
the seed nodes come from multiple racks across all DCs (in case one is down).&lt;/p&gt;
&lt;p&gt;All these configurations are stored in the standard ‘cassandra.yaml’ file
which is already managed by the guest agent &lt;a class="footnote-reference brackets" href="#id6" id="id1"&gt;2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The node membership (rack/dc) is stored in ‘cassandra-rackdc.properties’ file
at the same location as the main configuration file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This specification proposes the following cluster-related actions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shrink&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only rack support will be implemented as a part of this patch. All nodes
will be placed into a single DC (‘dc1’). The racks will be mapped on the
Availability Zones (AZ) passed from the client. The nodes will be placed into
a single default rack (‘rack1’) if no AZ is specified.&lt;/p&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h3&gt;Create Cluster&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provision a requested number of instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the instances to become active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the seed nodes.
They should include at least one node from
each data center and rack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure each cluster node with the list of seeds.
Note that the seed nodes must have the automatic bootstrap &lt;em&gt;disabled&lt;/em&gt; during
&lt;em&gt;initial&lt;/em&gt; startup of a new &lt;em&gt;empty&lt;/em&gt; cluster.
Once all nodes are configured, start the seed nodes
one at a time (automatic bootstrap is disabled at this time)
followed by the rest of the nodes (automatic bootstrap may be enabled
as the seed nodes are already running).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the in-database (‘os_admin’) user via the first node.
The remaining nodes will replicate in-database
changes automatically.
Only update the local authentication file on the
other nodes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="grow-cluster"&gt;
&lt;h3&gt;Grow Cluster&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provision a requested number of instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the instances to become active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recompute the seed nodes based on the updated cluster geometry and
configure each cluster node with the updated list of seeds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the superuser credentials from one previously existing node
and save it on the newly added nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start any seeds from the added nodes first one at a time followed by the
rest of the nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run nodetool cleanup on each of the previously existing nodes
to remove the keys that no longer belong to those nodes (they now on belong
to some of the added nodes).&lt;/p&gt;
&lt;p&gt;Put the node into BLOCKED state first and then initiate the cleanup.
Restore the node’s state once the cleanup finishes. The taskmanager
can poll for the node state change and proceed to the next node when ready.&lt;/p&gt;
&lt;p&gt;The operation has to be run sequentially on all previously
existing nodes and can take an excessive amount of time.
Cleanup can generally be safely postponed for low-usage hours.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="shrink-cluster"&gt;
&lt;h3&gt;Shrink Cluster&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Recompute the seed nodes based on the updated cluster
geometry if any of the existing seed nodes was removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the list of seeds on remaining nodes if necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run nodetool decommission on the removed nodes.
Cassandra will stream data from decommissioned nodes to the
remaining ones. Shutdown the database once completed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for the removed nodes to go SHUTDOWN.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete decommissioned instances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The following configuration values will be implemented in the Cassandra
configuration group:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoolOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cluster_support'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Enable clusters to be created and managed.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental.'&lt;/span&gt;
           &lt;span class="s1"&gt;'cassandra.api.CassandraAPIStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific API logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'taskmanager_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental'&lt;/span&gt;
           &lt;span class="s1"&gt;'.cassandra.taskmanager.CassandraTaskManagerStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific task manager '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'guestagent_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental'&lt;/span&gt;
           &lt;span class="s1"&gt;'.cassandra.guestagent.CassandraGuestAgentStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific Guest Agent API '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The following methods will be implemented in the CassandraGuestAgentAPI:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_data_center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving the data center for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_data_center"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_rack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving the rack for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_rack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_seeds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Configuring the gossip seeds for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"set_seeds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_seeds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving the gossip seeds for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_seeds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_auto_bootstrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Setting the auto-bootstrap to '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;' for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
              &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"set_auto_bootstrap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Sending a setup completion notification for node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
              &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cluster_complete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;node_cleanup_begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Signaling the node to prepare for cleanup: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"node_cleanup_begin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;node_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Running cleanup on node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'node_cleanup'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;node_decommission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Decommission node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"node_decommission"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_secure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Securing the cluster via node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;"cluster_secure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_admin_credentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieving the admin credentials from node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_admin_credentials"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;store_admin_credentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin_credentials&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Storing the admin credentials on node: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"store_admin_credentials"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_LOW_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;admin_credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;admin_credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Functionality for writing the ‘cassandra-rackdc.properties’ file will be
implemented in addition to the above methods.&lt;/p&gt;
&lt;p&gt;The node membership (rack/dc) will be included in the cluster_info dictionary
passed into the prepare method.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;Will need to enable Cassandra as a clustering datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be delivered as a single commit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This implementation heavily depends on work done as a part of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;blueprint cassandra-database-user-functions &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;1&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;blueprint cassandra-configuration-groups &lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;blueprint cassandra-backup-restore &lt;a class="footnote-reference brackets" href="#id7" id="id4"&gt;3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Manager unittests will be added where appropriate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The scenario tests already cover implemented functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Datastore documentation for Cassandra will need to be updated to reflect
clustering support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Cassandra user/database implementation review: &lt;a class="reference external" href="https://review.openstack.org/#/c/206739/"&gt;https://review.openstack.org/#/c/206739/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;2&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id3"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Cassandra configuration review: &lt;a class="reference external" href="https://review.openstack.org/#/c/206740/"&gt;https://review.openstack.org/#/c/206740/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Cassandra backup/restore review: &lt;a class="reference external" href="https://review.openstack.org/#/c/206751/"&gt;https://review.openstack.org/#/c/206751/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 11 Jan 2016 00:00:00 </pubDate></item><item><title>Support for ‘root’ actions to Cassandra</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/cassandra-root-enable.html</link><description>
 
&lt;p&gt;Implement root enable (with password)/disable and show calls in the Cassandra
guest agent.
Also include datastore-agnostic scenario tests for the root actions.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-root-enable"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-root-enable&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Continuing the work on add user/database support for Cassandra
guests &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt; we should also enable the Trove users to create superuser accounts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The Cassandra’s superuser is called ‘cassandra’.
It comes with any new Cassandra installation, but it can be deleted.&lt;/p&gt;
&lt;p&gt;In Cassandra only SUPERUSERS can create other users and grant permissions to
database resources.
Trove uses the ‘os_admin’ superuser to perform its administrative tasks. &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;1&lt;/a&gt;
The users it creates are all ‘normal’ (NOSUPERUSER) accounts.&lt;/p&gt;
&lt;p&gt;The built-in ‘cassandra’ superuser is proactively removed on prepare as it is
not needed.&lt;/p&gt;
&lt;p&gt;During normal operation (no ‘root’ enabled), there should be only
one superuser in the system (os_admin). The ‘root’ is therefore &lt;strong&gt;not&lt;/strong&gt;
enabled.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The ‘enable’ action will be implemented by creating a new superuser
(‘cassandra’) and granting it full access to all
keyspaces. The username (‘cassandra’) and password (user-supplied or random
otherwise) will be returned back to the client.&lt;/p&gt;
&lt;p&gt;Now on, there will be more than one superuser accounts in the system and
the ‘root’ will hence be reported as ‘enabled’.&lt;/p&gt;
&lt;p&gt;The ‘disable’ action will merely reset the user’s password to a new random
string without exposing it to the end-user. The account itself &lt;strong&gt;will not&lt;/strong&gt; be
removed so the &lt;em&gt;root-show&lt;/em&gt; will keep reporting root as ‘enabled’ as it should.&lt;/p&gt;
&lt;p&gt;When a backup is restored the presence of superusers other than ‘os_admin’
will be checked and the root-status of the new instance will be reported as
‘enabled’ if there are any.&lt;/p&gt;
&lt;p&gt;Note that a superuser cannot remove its &lt;em&gt;super&lt;/em&gt; privileges or delete itself.
It should therefore not be possible to bypass the root check by creating a new
superuser, deleting the old one and restoring the state into a new instance.&lt;/p&gt;
&lt;p&gt;Once having the superuser access to the database the end-user could of course
alter/drop the ‘os_admin’, but doing that would render the instance
unmanageable from Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement root-related calls in the Cassandra manager.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add datastore-agnostic scenario tests to exercise the new functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;This implementation largely depends on work done as a part of
blueprint cassandra-database-user-functions &lt;a class="footnote-reference brackets" href="#id4" id="id3"&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Manager unittests will be added where appropriate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Datastore-agnostic scenario tests to exercise the related functionality will
be implemented.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Document the newly enabled functionality for the Cassandra datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;1&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id2"&gt;2&lt;/a&gt;,&lt;a href="#id3"&gt;3&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Cassandra user/database implementation review: &lt;a class="reference external" href="https://review.openstack.org/#/c/206739/"&gt;https://review.openstack.org/#/c/206739/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Fri, 08 Jan 2016 00:00:00 </pubDate></item><item><title>&lt;span class="sectnum"&gt;1&lt;/span&gt; Ceilometer Integration</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/ceilometer-integration.html</link><description>
 
&lt;p&gt;The current implementation of trove supports 4 different operation
notifications to Ceilometer: trove.instance.create,
trove.instance.delete, trove.instance.modify_volume, and
trove.instance.modify_flavor.  An additional notification,
trove.instance.exists is generated periodically to provide status of
active instances.&lt;/p&gt;
&lt;p&gt;This spec outlines how Trove can be extended to bring its notification
support to be more in line with the rest of Openstack by generating
start|end|fail notifications for all operation which result in a
change of state of the system.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/ceilometer-integration"&gt;https://blueprints.launchpad.net/trove/+spec/ceilometer-integration&lt;/a&gt;&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="auto-toc simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#ceilometer-integration" id="id3"&gt;&lt;span class="sectnum"&gt;1&lt;/span&gt; Ceilometer Integration&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#problem-description" id="id4"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#proposed-change" id="id5"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-status-notifications" id="id6"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; Trove Status Notifications&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-instance-create" id="id7"&gt;&lt;span class="sectnum"&gt;1.2.1.1&lt;/span&gt; trove.instance.create&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-instance-delete" id="id8"&gt;&lt;span class="sectnum"&gt;1.2.1.2&lt;/span&gt; trove.instance.delete&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-instance-modify-volume" id="id9"&gt;&lt;span class="sectnum"&gt;1.2.1.3&lt;/span&gt; trove.instance.modify_volume&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-instance-modify-flavor" id="id10"&gt;&lt;span class="sectnum"&gt;1.2.1.4&lt;/span&gt; trove.instance.modify_flavor&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-instance-exists" id="id11"&gt;&lt;span class="sectnum"&gt;1.2.1.5&lt;/span&gt; trove.instance.exists&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-quotas" id="id12"&gt;&lt;span class="sectnum"&gt;1.2.1.6&lt;/span&gt; dbaas.quotas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#trove-api-notifications" id="id13"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Trove API Notifications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#configuration" id="id14"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#database" id="id15"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Database&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api" id="id16"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Public API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#public-api-security" id="id17"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python-api" id="id18"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Python API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cli-python-troveclient" id="id19"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-api" id="id20"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Internal API&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#guest-agent" id="id21"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#alternatives" id="id22"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dashboard-impact-ux" id="id23"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#implementation" id="id24"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#assignee-s" id="id25"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#milestones" id="id26"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#work-items" id="id27"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#upgrade-implications" id="id28"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dependencies" id="id29"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#testing" id="id30"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#documentation-impact" id="id31"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#references" id="id32"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#appendix" id="id33"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/p&gt;
&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-api-notification-definitions" id="id34"&gt;&lt;span class="sectnum"&gt;1.10.1&lt;/span&gt; Dbaas API Notification Definitions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-create-start" id="id35"&gt;&lt;span class="sectnum"&gt;1.10.2&lt;/span&gt; dbaas.instance_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-create-end" id="id36"&gt;&lt;span class="sectnum"&gt;1.10.3&lt;/span&gt; dbaas.instance_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-create-error" id="id37"&gt;&lt;span class="sectnum"&gt;1.10.4&lt;/span&gt; dbaas.instance_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-restart-start" id="id38"&gt;&lt;span class="sectnum"&gt;1.10.5&lt;/span&gt; dbaas.instance_restart.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-restart-end" id="id39"&gt;&lt;span class="sectnum"&gt;1.10.6&lt;/span&gt; dbaas.instance_restart.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-restart-error" id="id40"&gt;&lt;span class="sectnum"&gt;1.10.7&lt;/span&gt; dbaas.instance_restart.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-volume-start" id="id41"&gt;&lt;span class="sectnum"&gt;1.10.8&lt;/span&gt; dbaas.instance_resize_volume.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-volume-end" id="id42"&gt;&lt;span class="sectnum"&gt;1.10.9&lt;/span&gt; dbaas.instance_resize_volume.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-volume-error" id="id43"&gt;&lt;span class="sectnum"&gt;1.10.10&lt;/span&gt; dbaas.instance_resize_volume.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-instance-start" id="id44"&gt;&lt;span class="sectnum"&gt;1.10.11&lt;/span&gt; dbaas.instance_resize_instance.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-instance-end" id="id45"&gt;&lt;span class="sectnum"&gt;1.10.12&lt;/span&gt; dbaas.instance_resize_instance.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-resize-instance-error" id="id46"&gt;&lt;span class="sectnum"&gt;1.10.13&lt;/span&gt; dbaas.instance_resize_instance.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-promote-start" id="id47"&gt;&lt;span class="sectnum"&gt;1.10.14&lt;/span&gt; dbaas.instance_promote.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-promote-end" id="id48"&gt;&lt;span class="sectnum"&gt;1.10.15&lt;/span&gt; dbaas.instance_promote.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-promote-error" id="id49"&gt;&lt;span class="sectnum"&gt;1.10.16&lt;/span&gt; dbaas.instance_promote.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-eject-start" id="id50"&gt;&lt;span class="sectnum"&gt;1.10.17&lt;/span&gt; dbaas.instance_eject.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-eject-end" id="id51"&gt;&lt;span class="sectnum"&gt;1.10.18&lt;/span&gt; dbaas.instance_eject.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-eject-error" id="id52"&gt;&lt;span class="sectnum"&gt;1.10.19&lt;/span&gt; dbaas.instance_eject.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-delete-start" id="id53"&gt;&lt;span class="sectnum"&gt;1.10.20&lt;/span&gt; dbaas.instance_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-delete-end" id="id54"&gt;&lt;span class="sectnum"&gt;1.10.21&lt;/span&gt; dbaas.instance_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-delete-error" id="id55"&gt;&lt;span class="sectnum"&gt;1.10.22&lt;/span&gt; dbaas.instance_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-start" id="id56"&gt;&lt;span class="sectnum"&gt;1.10.23&lt;/span&gt; dbaas.instance_detach.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-end" id="id57"&gt;&lt;span class="sectnum"&gt;1.10.24&lt;/span&gt; dbaas.instance_detach.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-error" id="id58"&gt;&lt;span class="sectnum"&gt;1.10.25&lt;/span&gt; dbaas.instance_detach.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-attach-configuration-start" id="id59"&gt;&lt;span class="sectnum"&gt;1.10.26&lt;/span&gt; dbaas.instance_attach_configuration.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-attach-configuration-end" id="id60"&gt;&lt;span class="sectnum"&gt;1.10.27&lt;/span&gt; dbaas.instance_attach_configuration.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-attach-configuration-error" id="id61"&gt;&lt;span class="sectnum"&gt;1.10.28&lt;/span&gt; dbaas.instance_attach_configuration.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-configuration-start" id="id62"&gt;&lt;span class="sectnum"&gt;1.10.29&lt;/span&gt; dbaas.instance_detach_configuration.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-configuration-end" id="id63"&gt;&lt;span class="sectnum"&gt;1.10.30&lt;/span&gt; dbaas.instance_detach_configuration.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-instance-detach-configuration-error" id="id64"&gt;&lt;span class="sectnum"&gt;1.10.31&lt;/span&gt; dbaas.instance_detach_configuration.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-create-start" id="id65"&gt;&lt;span class="sectnum"&gt;1.10.32&lt;/span&gt; dbaas.cluster_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-create-end" id="id66"&gt;&lt;span class="sectnum"&gt;1.10.33&lt;/span&gt; dbaas.cluster_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-create-error" id="id67"&gt;&lt;span class="sectnum"&gt;1.10.34&lt;/span&gt; dbaas.cluster_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-delete-start" id="id68"&gt;&lt;span class="sectnum"&gt;1.10.35&lt;/span&gt; dbaas.cluster_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-delete-end" id="id69"&gt;&lt;span class="sectnum"&gt;1.10.36&lt;/span&gt; dbaas.cluster_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-delete-error" id="id70"&gt;&lt;span class="sectnum"&gt;1.10.37&lt;/span&gt; dbaas.cluster_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-add-shard-start" id="id71"&gt;&lt;span class="sectnum"&gt;1.10.38&lt;/span&gt; dbaas.cluster_add_shard.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-add-shard-end" id="id72"&gt;&lt;span class="sectnum"&gt;1.10.39&lt;/span&gt; dbaas.cluster_add_shard.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-add-shard-error" id="id73"&gt;&lt;span class="sectnum"&gt;1.10.40&lt;/span&gt; dbaas.cluster_add_shard.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-grow-start" id="id74"&gt;&lt;span class="sectnum"&gt;1.10.41&lt;/span&gt; dbaas.cluster_grow.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-grow-end" id="id75"&gt;&lt;span class="sectnum"&gt;1.10.42&lt;/span&gt; dbaas.cluster_grow.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-grow-error" id="id76"&gt;&lt;span class="sectnum"&gt;1.10.43&lt;/span&gt; dbaas.cluster_grow.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-shrink-start" id="id77"&gt;&lt;span class="sectnum"&gt;1.10.44&lt;/span&gt; dbaas.cluster_shrink.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-shrink-end" id="id78"&gt;&lt;span class="sectnum"&gt;1.10.45&lt;/span&gt; dbaas.cluster_shrink.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-cluster-shrink-error" id="id79"&gt;&lt;span class="sectnum"&gt;1.10.46&lt;/span&gt; dbaas.cluster_shrink.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-create-start" id="id80"&gt;&lt;span class="sectnum"&gt;1.10.47&lt;/span&gt; dbaas.backup_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-create-end" id="id81"&gt;&lt;span class="sectnum"&gt;1.10.48&lt;/span&gt; dbaas.backup_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-create-error" id="id82"&gt;&lt;span class="sectnum"&gt;1.10.49&lt;/span&gt; dbaas.backup_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-delete-start" id="id83"&gt;&lt;span class="sectnum"&gt;1.10.50&lt;/span&gt; dbaas.backup_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-delete-end" id="id84"&gt;&lt;span class="sectnum"&gt;1.10.51&lt;/span&gt; dbaas.backup_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-backup-delete-error" id="id85"&gt;&lt;span class="sectnum"&gt;1.10.52&lt;/span&gt; dbaas.backup_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-create-start" id="id86"&gt;&lt;span class="sectnum"&gt;1.10.53&lt;/span&gt; dbaas.database_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-create-end" id="id87"&gt;&lt;span class="sectnum"&gt;1.10.54&lt;/span&gt; dbaas.database_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-create-error" id="id88"&gt;&lt;span class="sectnum"&gt;1.10.55&lt;/span&gt; dbaas.database_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-delete-start" id="id89"&gt;&lt;span class="sectnum"&gt;1.10.56&lt;/span&gt; dbaas.database_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-delete-end" id="id90"&gt;&lt;span class="sectnum"&gt;1.10.57&lt;/span&gt; dbaas.database_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-database-delete-error" id="id91"&gt;&lt;span class="sectnum"&gt;1.10.58&lt;/span&gt; dbaas.database_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-create-start" id="id92"&gt;&lt;span class="sectnum"&gt;1.10.59&lt;/span&gt; dbaas.user_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-create-end" id="id93"&gt;&lt;span class="sectnum"&gt;1.10.60&lt;/span&gt; dbaas.user_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-create-error" id="id94"&gt;&lt;span class="sectnum"&gt;1.10.61&lt;/span&gt; dbaas.user_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-delete-start" id="id95"&gt;&lt;span class="sectnum"&gt;1.10.62&lt;/span&gt; dbaas.user_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-delete-end" id="id96"&gt;&lt;span class="sectnum"&gt;1.10.63&lt;/span&gt; dbaas.user_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-delete-error" id="id97"&gt;&lt;span class="sectnum"&gt;1.10.64&lt;/span&gt; dbaas.user_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-update-attributes-start" id="id98"&gt;&lt;span class="sectnum"&gt;1.10.65&lt;/span&gt; dbaas.user_update_attributes.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-update-attributes-end" id="id99"&gt;&lt;span class="sectnum"&gt;1.10.66&lt;/span&gt; dbaas.user_update_attributes.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-update-attributes-error" id="id100"&gt;&lt;span class="sectnum"&gt;1.10.67&lt;/span&gt; dbaas.user_update_attributes.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-grant-start" id="id101"&gt;&lt;span class="sectnum"&gt;1.10.68&lt;/span&gt; dbaas.user_grant.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-grant-end" id="id102"&gt;&lt;span class="sectnum"&gt;1.10.69&lt;/span&gt; dbaas.user_grant.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-grant-error" id="id103"&gt;&lt;span class="sectnum"&gt;1.10.70&lt;/span&gt; dbaas.user_grant.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-revoke-start" id="id104"&gt;&lt;span class="sectnum"&gt;1.10.71&lt;/span&gt; dbaas.user_revoke.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-revoke-end" id="id105"&gt;&lt;span class="sectnum"&gt;1.10.72&lt;/span&gt; dbaas.user_revoke.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-revoke-error" id="id106"&gt;&lt;span class="sectnum"&gt;1.10.73&lt;/span&gt; dbaas.user_revoke.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-change-password-start" id="id107"&gt;&lt;span class="sectnum"&gt;1.10.74&lt;/span&gt; dbaas.user_change_password.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-change-password-end" id="id108"&gt;&lt;span class="sectnum"&gt;1.10.75&lt;/span&gt; dbaas.user_change_password.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-user-change-password-error" id="id109"&gt;&lt;span class="sectnum"&gt;1.10.76&lt;/span&gt; dbaas.user_change_password.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-create-start" id="id110"&gt;&lt;span class="sectnum"&gt;1.10.77&lt;/span&gt; dbaas.configuration_create.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-create-end" id="id111"&gt;&lt;span class="sectnum"&gt;1.10.78&lt;/span&gt; dbaas.configuration_create.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-create-error" id="id112"&gt;&lt;span class="sectnum"&gt;1.10.79&lt;/span&gt; dbaas.configuration_create.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-delete-start" id="id113"&gt;&lt;span class="sectnum"&gt;1.10.80&lt;/span&gt; dbaas.configuration_delete.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-delete-end" id="id114"&gt;&lt;span class="sectnum"&gt;1.10.81&lt;/span&gt; dbaas.configuration_delete.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-delete-error" id="id115"&gt;&lt;span class="sectnum"&gt;1.10.82&lt;/span&gt; dbaas.configuration_delete.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-update-start" id="id116"&gt;&lt;span class="sectnum"&gt;1.10.83&lt;/span&gt; dbaas.configuration_update.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-update-end" id="id117"&gt;&lt;span class="sectnum"&gt;1.10.84&lt;/span&gt; dbaas.configuration_update.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-update-error" id="id118"&gt;&lt;span class="sectnum"&gt;1.10.85&lt;/span&gt; dbaas.configuration_update.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-edit-start" id="id119"&gt;&lt;span class="sectnum"&gt;1.10.86&lt;/span&gt; dbaas.configuration_edit.start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-edit-end" id="id120"&gt;&lt;span class="sectnum"&gt;1.10.87&lt;/span&gt; dbaas.configuration_edit.end&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#dbaas-configuration-edit-error" id="id121"&gt;&lt;span class="sectnum"&gt;1.10.88&lt;/span&gt; dbaas.configuration_edit.error&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id4"&gt;&lt;span class="sectnum"&gt;1.1&lt;/span&gt; Problem Description&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Trove does not support sufficient notifications for billing or error
monitoring.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id5"&gt;&lt;span class="sectnum"&gt;1.2&lt;/span&gt; Proposed Change&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each Trove API call which results in a change of state will be
enhanced to generate notifications in line with other Openstack
projects.  Taskmanager tasks and asynchronous guest agent calls will
be supplemented with additional parameters to support the generation
of appropriate notifications.  A new RPC method will be added to the
Conductor to allow the guest to forward the results of asynchronous
calls as the guest agent may not have access to the control plane
where the Ceilometer collectors operate.&lt;/p&gt;
&lt;p&gt;Each API event handler will generate appropriate start, end, and (if
necessary) error notifications.  For asynchronous calls to the
taskmanager or guest agent, the event handler will emit the start
notification and pass along sufficient information in the Trove
Context to allow subsequent components to generate the end and error
notifications.  Notification events generated by the Trove guest will
be forwarded to the Conductor to be placed on the Trove control plane
RabbitMQ broker.&lt;/p&gt;
&lt;div class="section" id="trove-status-notifications"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id6"&gt;&lt;span class="sectnum"&gt;1.2.1&lt;/span&gt; Trove Status Notifications&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These notifications have an event type of “trove.&amp;lt;action&amp;gt;”.  They are
the notifications currently emitted by trove, enhanced to include the
cluster_id where appropriate.&lt;/p&gt;
&lt;p&gt;All Trove status notifications will have the following information:&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.*&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits: &amp;amp;trove_base_traits&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;instance_type:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_type&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;user_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.user_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;resource_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;instance_type_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_type_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;launched_at:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.launched_at&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;instance_name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;state:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.state&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;state_description:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.state_description&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;nova_instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.nova_instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;service_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.service_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;created_at:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.created_at&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;region:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.region&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of the flavor of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;user_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the id of the Openstack user who invoked the action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;resource_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;trove instance_id of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;instance_type_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;flavor id of the flavor of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;launched_at&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;same as created_at&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;instance_name&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of the trove instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;state&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;current state of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;state_description&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;description of the current state of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;nova_instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of the underlying nova instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;service_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification service id for datastore&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;created_at&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;creation time of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;region&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Openstack region&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Trove status notifications for trove.create, trove.delete,
trove.modify_volume and trove.modify_flavor will have the following
additional information:&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: [‘trove.instance.create’, ‘trove.instance.modify_volume’,&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;‘trove.instance.modify_flavor’, ‘trove.instance.delete’]&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;traits: &amp;amp;trove_common_traits&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;availability_zone:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.availability_zone&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;instance_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.instance_size&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;volume_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.volume_size&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;nova_volume_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.nova_volume_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of the Trove instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;availability_zone&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Openstack availability zone&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;instance_size&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;ram allocated to instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;volume_size&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;size of volume (if volume support enabled)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;nova_volume_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;nove volume id (if volume support enabled)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;id of cluster (if instance in cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="section" id="trove-instance-create"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id7"&gt;&lt;span class="sectnum"&gt;1.2.1.1&lt;/span&gt; trove.instance.create&lt;/a&gt;&lt;/h4&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.instance.create&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: [*trove_base_traits, *trove_common_traits]&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-instance-delete"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id8"&gt;&lt;span class="sectnum"&gt;1.2.1.2&lt;/span&gt; trove.instance.delete&lt;/a&gt;&lt;/h4&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.instance.delete&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: [*trove_base_traits, *trove_common_traits]&lt;/div&gt;
&lt;div class="line"&gt;deleted_at:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.deleted_at&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;deleted_at&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;time at which instance deletion is complete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-instance-modify-volume"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id9"&gt;&lt;span class="sectnum"&gt;1.2.1.3&lt;/span&gt; trove.instance.modify_volume&lt;/a&gt;&lt;/h4&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.instance.modify_volume&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: [*trove_base_traits, *trove_common_traits]&lt;/div&gt;
&lt;div class="line"&gt;old_volume_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.old_volume_size&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;modify_at:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.modify_at&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;old_volume_size&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;volume size prior to resize&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;modify_at&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;time at which volume resize completed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-instance-modify-flavor"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id10"&gt;&lt;span class="sectnum"&gt;1.2.1.4&lt;/span&gt; trove.instance.modify_flavor&lt;/a&gt;&lt;/h4&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.instance.modify_flavor&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: [*trove_base_traits, *trove_common_traits]&lt;/div&gt;
&lt;div class="line"&gt;old_instance_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.old_instance_size&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;modify_at:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.modify_at&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;old_instance_size&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;memory of instance prior to resize&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;modify_at&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;time at which resize completed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-instance-exists"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id11"&gt;&lt;span class="sectnum"&gt;1.2.1.5&lt;/span&gt; trove.instance.exists&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A periodic event to update statistics about each Trove instance.  This
notification is emitted only if configured via the
exists_notification_transformer config value.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.instance.exists&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *trove_base_traits&lt;/div&gt;
&lt;div class="line"&gt;display_name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.display_name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;audit_period_beginning:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.audit_period_beginning&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;audit_period_ending:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.audit_period_ending&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;display_name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;audit_period_beginning&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;audit period start time&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;audit_period_ending&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;audit period end time&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-quotas"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#id12"&gt;&lt;span class="sectnum"&gt;1.2.1.6&lt;/span&gt; dbaas.quotas&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The dbaas.quotas notification will be periodically emitted to reflect
the current state of utilization of the Trove quotas.  The frequency
of notification events will be defined by the
quota_notification_interval configuration value, but at each interval
multiple events may be emitted for each resource due to Taskmanager
deployment configuration - each Taskmanager will emit a notification
for each resource.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: trove.quota&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;resource:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.resource&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;in_use:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.in_use&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;reserved:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.reserved&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;limit:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.limit&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;updated:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: datetime&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.updated&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;resource&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of resource (currently “instances”, “volumes”, or “backups”)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;in_use&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the number of resource instances currently in use&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;reserved&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the number of resource instances currently reserved&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;limit&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;the maximum allocation of resource&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;updated&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;the time of last resource allocation event&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="trove-api-notifications"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id13"&gt;&lt;span class="sectnum"&gt;1.2.2&lt;/span&gt; Trove API Notifications&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;See the Appendix at the end of this document for the individual API
notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id14"&gt;&lt;span class="sectnum"&gt;1.2.3&lt;/span&gt; Configuration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new configuration value will be added to support implementation of
periodic notifcations for quotas.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;quota_notification_interval&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Seconds between periodic quota notifications (&amp;lt;0 to disable) &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id15"&gt;&lt;span class="sectnum"&gt;1.2.4&lt;/span&gt; Database&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes will be made to the Trove database.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id16"&gt;&lt;span class="sectnum"&gt;1.2.5&lt;/span&gt; Public API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes will be made to the Trove REST API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id17"&gt;&lt;span class="sectnum"&gt;1.2.6&lt;/span&gt; Public API Security&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id18"&gt;&lt;span class="sectnum"&gt;1.2.7&lt;/span&gt; Python API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes will be made to the Trove Python API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id19"&gt;&lt;span class="sectnum"&gt;1.2.8&lt;/span&gt; CLI (python-troveclient)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No changes will be made to the Trove CLI.
n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id20"&gt;&lt;span class="sectnum"&gt;1.2.9&lt;/span&gt; Internal API&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Notification object instances representing the REST API calls that are
responsible for generating API Notification events will be created in
the Trove API process.  These notification objects will be created for
each REST API call which expects to change the state of the Trove
system, or one of the guest agents.  At the time the notification
object is created, the appropriate “.start” event will be generated
and published to the notification.info queue.&lt;/p&gt;
&lt;p&gt;For operations which are processed completely within the trove-api
process, the appropriate “.end” or “.error” event will be published
upon completion of the operation.&lt;/p&gt;
&lt;p&gt;For operations which require support from the Taskmanager or a guest
agent, the notification object will be attached to the TroveContext
instance for the operation.  The trove-taskmanager or trove-guestagent
will be able to retrieve the notification instance from the
TroveContext instance and use it to generate the appropriate
notification events.  The trove-taskmanager will place the
notification events directly on the RabbitMQ notification.info queue,
whereas the guest agent will forward the notification object to the
trove-conductor to be placed on the queue.&lt;/p&gt;
&lt;p&gt;A new method will be added to the API for the Conductor.  The
following RPC method instructs the trove-conductor to send an end or
error notification with the appropriate values:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_exc_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;etype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;etype, value, trace&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;results from the sys.exc_info exception call.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id21"&gt;&lt;span class="sectnum"&gt;1.2.10&lt;/span&gt; Guest Agent&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There will be no changes to the synchronous guest-agent RPC methods.&lt;/p&gt;
&lt;p&gt;Asynchronous guest-agent methods will be modified to send “.end”
or”.error” notifications to the trove-conductor to reflect the
completion status of each asynchronous RPC method.&lt;/p&gt;
&lt;p&gt;It is expected that the current upgrade procedure where the guests are
upgraded before the trove controller components will be followed.  In
this scenario, no notifications will be added to the TroveContext, so
the guest agent will not send any notifications to the (yet to be
upgraded) trove-conductor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id22"&gt;&lt;span class="sectnum"&gt;1.2.11&lt;/span&gt; Alternatives&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An alternative implementation would be to have the guest agent place
notifications directly on the notifications queue, but this would
require the guest agent to have access to the same RabbitMQ broker as
the trove-api and trove-taskmanager.  The proposed design is a step in
the direction of allowing the guest to operate in an isolated
environment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id23"&gt;&lt;span class="sectnum"&gt;1.3&lt;/span&gt; Dashboard Impact (UX)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id24"&gt;&lt;span class="sectnum"&gt;1.4&lt;/span&gt; Implementation&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id25"&gt;&lt;span class="sectnum"&gt;1.4.1&lt;/span&gt; Assignee(s)&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;6-morgan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id26"&gt;&lt;span class="sectnum"&gt;1.4.2&lt;/span&gt; Milestones&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Mitaka&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id27"&gt;&lt;span class="sectnum"&gt;1.4.3&lt;/span&gt; Work Items&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Develop framework for new notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-implement existing notifications in new framework (for consistency)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement new notification messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement TroveContext changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate messages with synchronous API calls in trove-api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement conductor RPC methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate notifications with async Taskmanager RPC methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate notifications with asynch guest agent RPC methods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ceilometer message definitions for new notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit tests for new code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify existing tests to verify notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide documentation for new notifications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id28"&gt;&lt;span class="sectnum"&gt;1.5&lt;/span&gt; Upgrade Implications&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tenant-id will be added to ceilometer definition for existing Trove
notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;new notifications will be added for all state changing REST APIs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id29"&gt;&lt;span class="sectnum"&gt;1.6&lt;/span&gt; Dependencies&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id30"&gt;&lt;span class="sectnum"&gt;1.7&lt;/span&gt; Testing&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Existing unit tests will test changes to trove.* notifications.&lt;/p&gt;
&lt;p&gt;New unit tests will be developed to test the new notifications.&lt;/p&gt;
&lt;p&gt;The notification mechanism, when propely configured, adds
notifications to queues to be consumed by other Openstack, or
non-Openstack, components.  As these consumers are outside the scope
of Trove, integration tests do not test notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id31"&gt;&lt;span class="sectnum"&gt;1.8&lt;/span&gt; Documentation Impact&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Documentation will be generated for the new notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id32"&gt;&lt;span class="sectnum"&gt;1.9&lt;/span&gt; References&lt;/a&gt;&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/oslo-incubator/api/openstack.common.periodic_task.html"&gt;http://docs.openstack.org/developer/oslo-incubator/api/openstack.common.periodic_task.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id33"&gt;&lt;span class="sectnum"&gt;1.10&lt;/span&gt; Appendix&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="dbaas-api-notification-definitions"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id34"&gt;&lt;span class="sectnum"&gt;1.10.1&lt;/span&gt; Dbaas API Notification Definitions&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are new notifications emitted by trove to reflect in invocation
of the various Trove APIs.&lt;/p&gt;
&lt;p&gt;All DBAAS notifications will have an event type of
“dbaas.&amp;lt;action&amp;gt;.(start|end|error)” and include the following
information:&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.*&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits: &amp;amp;dbaas_base_traits&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;tenant_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.tenant_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;client_ip:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.client_ip&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;server_ip:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.server_ip&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;server_type:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.server_type&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;request_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.request_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;tenant_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of the configured tenant&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;client_ip&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;ip:port of trove client which generated API invocation&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;server_ip&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;ip:port of trove service which generated notification&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;server_type&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;service which generated notification (api|task|conductor)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;request_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Identifier used to correlate start|end|error&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id35"&gt;&lt;span class="sectnum"&gt;1.10.2&lt;/span&gt; dbaas.instance_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.create(name, flavor_id, volume=None,
databases=None, users=None,
restorePoint=None, availability_zone=None, datastore=None,
datastore_version=None, nics=None, configuration=None,
replica_of=None, slave_of=None, replica_count=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/create&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;flavor:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.flavor&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;datastore:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.datastore&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;databases:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.databases&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;users:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.users&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;volume_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.volume_size&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;restore_point:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.restore_point&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;availability_zone:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.availability_zone&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;replica_of:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.replica_of&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;replica_count:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.replica_count&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Name of new instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;flavor&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Flavor id of instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;datastore&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Datastore of instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Datastore_version of instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;databases&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Comma separated list of databases to create (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;users&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Comma separated list of users to create (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;volume_size&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Size of volume to create (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;restore_point&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Reference to backup to use to initialize instance (if
specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;availability_zone&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;AZ of instance (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;replica_of&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Master instance from which to create replica (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;replica_count&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Number of replicas to create (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id36"&gt;&lt;span class="sectnum"&gt;1.10.3&lt;/span&gt; dbaas.instance_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.create(name, flavor_id, volume=None,
databases=None, users=None,
restorePoint=None, availability_zone=None, datastore=None,
datastore_version=None, nics=None, configuration=None,
replica_of=None, slave_of=None, replica_count=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/create&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of created instance&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id37"&gt;&lt;span class="sectnum"&gt;1.10.4&lt;/span&gt; dbaas.instance_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.create(name, flavor_id, volume=None,
databases=None, users=None,
restorePoint=None, availability_zone=None, datastore=None,
datastore_version=None, nics=None, configuration=None,
replica_of=None, slave_of=None, replica_count=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/create&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;message&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;exception&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-restart-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id38"&gt;&lt;span class="sectnum"&gt;1.10.5&lt;/span&gt; dbaas.instance_restart.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.restart(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_restart.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_restart.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to restart&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-restart-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id39"&gt;&lt;span class="sectnum"&gt;1.10.6&lt;/span&gt; dbaas.instance_restart.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.restart(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_restart.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_restart.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-restart-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id40"&gt;&lt;span class="sectnum"&gt;1.10.7&lt;/span&gt; dbaas.instance_restart.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.restart(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_restart.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_restart.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-volume-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id41"&gt;&lt;span class="sectnum"&gt;1.10.8&lt;/span&gt; dbaas.instance_resize_volume.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_volume(instance, volume_size)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_volume.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_volume.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;new_size:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;type: int&lt;/div&gt;
&lt;div class="line"&gt;fields: payload.new_size&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to resize_volume&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;new_size&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;size to which volume will be resized&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-volume-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id42"&gt;&lt;span class="sectnum"&gt;1.10.9&lt;/span&gt; dbaas.instance_resize_volume.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_volume(instance, volume_size)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_volume.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_volume.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-volume-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id43"&gt;&lt;span class="sectnum"&gt;1.10.10&lt;/span&gt; dbaas.instance_resize_volume.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_volume(instance, volume_size)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_volume.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_volume.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-instance-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id44"&gt;&lt;span class="sectnum"&gt;1.10.11&lt;/span&gt; dbaas.instance_resize_instance.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_instance(instance, flavor_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_instance.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_instance.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;new_flavor_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.new_flavor_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to resize_instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;new_flavor_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;id of flavor to which instance will be resized&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-instance-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id45"&gt;&lt;span class="sectnum"&gt;1.10.12&lt;/span&gt; dbaas.instance_resize_instance.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_instance(instance, flavor_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_instance.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_instance.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-resize-instance-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id46"&gt;&lt;span class="sectnum"&gt;1.10.13&lt;/span&gt; dbaas.instance_resize_instance.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.resize_instance(instance, flavor_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_resize_instance.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_resize_instance.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-promote-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id47"&gt;&lt;span class="sectnum"&gt;1.10.14&lt;/span&gt; dbaas.instance_promote.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.promote_to_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_promote.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_promote.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to promote&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-promote-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id48"&gt;&lt;span class="sectnum"&gt;1.10.15&lt;/span&gt; dbaas.instance_promote.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.promote_to_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_promote.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_promote.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-promote-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id49"&gt;&lt;span class="sectnum"&gt;1.10.16&lt;/span&gt; dbaas.instance_promote.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.promote_to_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_promote.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_promote.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-eject-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id50"&gt;&lt;span class="sectnum"&gt;1.10.17&lt;/span&gt; dbaas.instance_eject.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.eject_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_eject.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_eject.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to eject&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-eject-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id51"&gt;&lt;span class="sectnum"&gt;1.10.18&lt;/span&gt; dbaas.instance_eject.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.eject_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_eject.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_eject.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-eject-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id52"&gt;&lt;span class="sectnum"&gt;1.10.19&lt;/span&gt; dbaas.instance_eject.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.eject_replica_source(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{id}/action&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_eject.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_eject.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id53"&gt;&lt;span class="sectnum"&gt;1.10.20&lt;/span&gt; dbaas.instance_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.delete(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id54"&gt;&lt;span class="sectnum"&gt;1.10.21&lt;/span&gt; dbaas.instance_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.delete(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id55"&gt;&lt;span class="sectnum"&gt;1.10.22&lt;/span&gt; dbaas.instance_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.delete(instance)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id56"&gt;&lt;span class="sectnum"&gt;1.10.23&lt;/span&gt; dbaas.instance_detach.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(detach_replica_source=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to detach&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id57"&gt;&lt;span class="sectnum"&gt;1.10.24&lt;/span&gt; dbaas.instance_detach.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(detach_replica_source=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id58"&gt;&lt;span class="sectnum"&gt;1.10.25&lt;/span&gt; dbaas.instance_detach.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(detach_replica_source=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-attach-configuration-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id59"&gt;&lt;span class="sectnum"&gt;1.10.26&lt;/span&gt; dbaas.instance_attach_configuration.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.modify(instance, configuration)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_attach_configuration.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_attach_configuration.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;configuration_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.configuration_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to attach_configuration&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;configuration_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;id of configuration to attach&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-attach-configuration-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id60"&gt;&lt;span class="sectnum"&gt;1.10.27&lt;/span&gt; dbaas.instance_attach_configuration.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.modify(instance, configuration)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_attach_configuration.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_attach_configuration.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-attach-configuration-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id61"&gt;&lt;span class="sectnum"&gt;1.10.28&lt;/span&gt; dbaas.instance_attach_configuration.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.modify(instance, configuration)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_attach_configuration.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_attach_configuration.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-configuration-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id62"&gt;&lt;span class="sectnum"&gt;1.10.29&lt;/span&gt; dbaas.instance_detach_configuration.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(instance, configuration, remove_configuration=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach_configuration.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach_configuration.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance to detach_configuration&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-configuration-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id63"&gt;&lt;span class="sectnum"&gt;1.10.30&lt;/span&gt; dbaas.instance_detach_configuration.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(instance, configuration, remove_configuration=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach_configuration.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach_configuration.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-instance-detach-configuration-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id64"&gt;&lt;span class="sectnum"&gt;1.10.31&lt;/span&gt; dbaas.instance_detach_configuration.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;instances.edit(instance, configuration, remove_configuration=True)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/instances/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.instance_detach_configuration.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.instance_detach_configuration.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id65"&gt;&lt;span class="sectnum"&gt;1.10.32&lt;/span&gt; dbaas.cluster_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.create(name, datastore, datastore_version,
instances=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;datastore:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.datastore&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;datastore_version:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.datastore_version&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of cluster&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;datastore of cluster&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;datastore_version of cluster&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id66"&gt;&lt;span class="sectnum"&gt;1.10.33&lt;/span&gt; dbaas.cluster_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.create(name, datastore, datastore_version,
instances=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of newly created cluster&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id67"&gt;&lt;span class="sectnum"&gt;1.10.34&lt;/span&gt; dbaas.cluster_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.create(name, datastore, datastore_version,
instances=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id68"&gt;&lt;span class="sectnum"&gt;1.10.35&lt;/span&gt; dbaas.cluster_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.delete(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of cluster to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id69"&gt;&lt;span class="sectnum"&gt;1.10.36&lt;/span&gt; dbaas.cluster_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.delete(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id70"&gt;&lt;span class="sectnum"&gt;1.10.37&lt;/span&gt; dbaas.cluster_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.delete(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-add-shard-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id71"&gt;&lt;span class="sectnum"&gt;1.10.38&lt;/span&gt; dbaas.cluster_add_shard.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.add_shard(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_add_shard.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_add_shard.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of cluster to which to add a shard&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-add-shard-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id72"&gt;&lt;span class="sectnum"&gt;1.10.39&lt;/span&gt; dbaas.cluster_add_shard.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.add_shard(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_add_shard.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_add_shard.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-add-shard-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id73"&gt;&lt;span class="sectnum"&gt;1.10.40&lt;/span&gt; dbaas.cluster_add_shard.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.add_shard(cluster)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_add_shard.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_add_shard.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-grow-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id74"&gt;&lt;span class="sectnum"&gt;1.10.41&lt;/span&gt; dbaas.cluster_grow.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.grow(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_grow.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_grow.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of cluster to which to add a shard&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-grow-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id75"&gt;&lt;span class="sectnum"&gt;1.10.42&lt;/span&gt; dbaas.cluster_grow.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.grow(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_grow.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_grow.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-grow-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id76"&gt;&lt;span class="sectnum"&gt;1.10.43&lt;/span&gt; dbaas.cluster_grow.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.grow(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_grow.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_grow.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-shrink-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id77"&gt;&lt;span class="sectnum"&gt;1.10.44&lt;/span&gt; dbaas.cluster_shrink.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.shrink(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_shrink.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_shrink.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;cluster_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.cluster_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;cluster_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of cluster to which to add a shard&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-shrink-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id78"&gt;&lt;span class="sectnum"&gt;1.10.45&lt;/span&gt; dbaas.cluster_shrink.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.shrink(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_shrink.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_shrink.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-cluster-shrink-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id79"&gt;&lt;span class="sectnum"&gt;1.10.46&lt;/span&gt; dbaas.cluster_shrink.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;clusters.shrink(cluster, instances)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/clusters/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.cluster_shrink.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.cluster_shrink.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id80"&gt;&lt;span class="sectnum"&gt;1.10.47&lt;/span&gt; dbaas.backup_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.create(name, instance=None, description=None,
parent_id=None, backup=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/backups&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;description:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.description&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;parent_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.parent_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of backup&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;id of instance of which to create backup&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;description&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;description of backup&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;parent_id&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;id of backup of which to take incremental backup&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id81"&gt;&lt;span class="sectnum"&gt;1.10.48&lt;/span&gt; dbaas.backup_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.create(name, instance=None, description=None,
parent_id=None, backup=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/backups&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;backup_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.backup_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;backup_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of newly created backup&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id82"&gt;&lt;span class="sectnum"&gt;1.10.49&lt;/span&gt; dbaas.backup_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.create(name, instance=None, description=None,
parent_id=None, backup=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/backups&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id83"&gt;&lt;span class="sectnum"&gt;1.10.50&lt;/span&gt; dbaas.backup_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.delete(backup_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/backups/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;backup_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.backup_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;backup_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of backup to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id84"&gt;&lt;span class="sectnum"&gt;1.10.51&lt;/span&gt; dbaas.backup_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.delete(backup_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/backups/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-backup-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id85"&gt;&lt;span class="sectnum"&gt;1.10.52&lt;/span&gt; dbaas.backup_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;backups.delete(backup_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/backups/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.backup_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.backup_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id86"&gt;&lt;span class="sectnum"&gt;1.10.53&lt;/span&gt; dbaas.database_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Note that a single call to databases.create would generate a separate
notification for each database to be created.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.create(instance, databases)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;dbname:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.dbname&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance of which to create database&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;dbname&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of database to be created&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id87"&gt;&lt;span class="sectnum"&gt;1.10.54&lt;/span&gt; dbaas.database_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.create(instance, databases)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id88"&gt;&lt;span class="sectnum"&gt;1.10.55&lt;/span&gt; dbaas.database_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.create(instance, databases)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id89"&gt;&lt;span class="sectnum"&gt;1.10.56&lt;/span&gt; dbaas.database_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.delete(database_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/databases/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;dbname:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.dbname&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance from which to delete database&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;dbname&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of database to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id90"&gt;&lt;span class="sectnum"&gt;1.10.57&lt;/span&gt; dbaas.database_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.delete(database_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/databases/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-database-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id91"&gt;&lt;span class="sectnum"&gt;1.10.58&lt;/span&gt; dbaas.database_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;databases.delete(database_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/databases/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.database_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.database_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id92"&gt;&lt;span class="sectnum"&gt;1.10.59&lt;/span&gt; dbaas.user_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Note that a single call to users.create would generate a separate
notification for each user to be created.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.create(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance for which to create user&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user to be created&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id93"&gt;&lt;span class="sectnum"&gt;1.10.60&lt;/span&gt; dbaas.user_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.create(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id94"&gt;&lt;span class="sectnum"&gt;1.10.61&lt;/span&gt; dbaas.user_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.create(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id95"&gt;&lt;span class="sectnum"&gt;1.10.62&lt;/span&gt; dbaas.user_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.delete(instance, username, hostname)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance from which to delete user&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id96"&gt;&lt;span class="sectnum"&gt;1.10.63&lt;/span&gt; dbaas.user_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.delete(instance, username, hostname)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id97"&gt;&lt;span class="sectnum"&gt;1.10.64&lt;/span&gt; dbaas.user_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.delete(instance, username, hostname)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-update-attributes-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id98"&gt;&lt;span class="sectnum"&gt;1.10.65&lt;/span&gt; dbaas.user_update_attributes.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.update_attributes(self, instance, username,
newuserattr=None, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_update_attributes.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_update_attributes.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance for which to update attributes&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user for whom to update attributes&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-update-attributes-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id99"&gt;&lt;span class="sectnum"&gt;1.10.66&lt;/span&gt; dbaas.user_update_attributes.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.update_attributes(self, instance, username,
newuserattr=None, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_update_attributes.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_update_attributes.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-update-attributes-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id100"&gt;&lt;span class="sectnum"&gt;1.10.67&lt;/span&gt; dbaas.user_update_attributes.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.update_attributes(self, instance, username,
newuserattr=None, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_update_attributes.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_update_attributes.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-grant-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id101"&gt;&lt;span class="sectnum"&gt;1.10.68&lt;/span&gt; dbaas.user_grant.start&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Note  that a  single  call  to users.grant  would  generate  a set  of
notifications for each database to which the user is granted access.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.grant(instance, username, databases, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_grant.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_grant.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;database:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.database&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance from which to grant user&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user to grant access to database&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;database&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of database to which access will be granted&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-grant-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id102"&gt;&lt;span class="sectnum"&gt;1.10.69&lt;/span&gt; dbaas.user_grant.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.grant(instance, username, databases, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_grant.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_grant.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-grant-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id103"&gt;&lt;span class="sectnum"&gt;1.10.70&lt;/span&gt; dbaas.user_grant.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.grant(instance, username, databases, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_grant.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_grant.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-revoke-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id104"&gt;&lt;span class="sectnum"&gt;1.10.71&lt;/span&gt; dbaas.user_revoke.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.revoke(instance, username, database, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases/{database}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_revoke.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_revoke.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;database:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.database&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance from which to revoke user&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user to revoke access to database&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;database&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of database to which access will be revoked&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-revoke-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id105"&gt;&lt;span class="sectnum"&gt;1.10.72&lt;/span&gt; dbaas.user_revoke.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.revoke(instance, username, databases, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases/{database}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_revoke.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_revoke.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-revoke-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id106"&gt;&lt;span class="sectnum"&gt;1.10.73&lt;/span&gt; dbaas.user_revoke.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.revoke(instance, username, databases, hostname=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users/{id}/databases/{database}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_revoke.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_revoke.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-change-password-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id107"&gt;&lt;span class="sectnum"&gt;1.10.74&lt;/span&gt; dbaas.user_change_password.start&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Note that a single call to users.change_password would result in a
separate notification event for each changed user.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.change_password(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_change_password.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_change_password.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;instance_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.instance_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;username:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.username&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;instance_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of instance from which to change_password user&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;username&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;name of user for which password changed&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-change-password-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id108"&gt;&lt;span class="sectnum"&gt;1.10.75&lt;/span&gt; dbaas.user_change_password.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.change_password(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_change_password.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_change_password.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-user-change-password-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id109"&gt;&lt;span class="sectnum"&gt;1.10.76&lt;/span&gt; dbaas.user_change_password.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;users.change_password(instance, users)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/instances/{instance}/users&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.user_change_password.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.user_change_password.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-create-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id110"&gt;&lt;span class="sectnum"&gt;1.10.77&lt;/span&gt; dbaas.configuration_create.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.create(name, values, description=None,
datastore=None, datastore_version=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/configurations&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_create.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_create.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;datastore:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.datastore&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;datastore_version:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.datastore_version&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;name of configuration to create&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;datastore&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;datastore of configuration&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;datastore_version&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;datastore_version of configuration&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-create-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id111"&gt;&lt;span class="sectnum"&gt;1.10.78&lt;/span&gt; dbaas.configuration_create.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.create(name, values, description=None,
datastore=None, datastore_version=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/configurations&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_create.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_create.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;configuration_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.configuration_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;configuration_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of newly created configuration&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-create-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id112"&gt;&lt;span class="sectnum"&gt;1.10.79&lt;/span&gt; dbaas.configuration_create.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.create(name, values, description=None,
datastore=None, datastore_version=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;POST v1/{tenant_id}/configurations&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_create.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_create.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-delete-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id113"&gt;&lt;span class="sectnum"&gt;1.10.80&lt;/span&gt; dbaas.configuration_delete.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.delete(configuration_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_delete.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_delete.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;configuration_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.configuration_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;configuration_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of configuration to delete&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-delete-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id114"&gt;&lt;span class="sectnum"&gt;1.10.81&lt;/span&gt; dbaas.configuration_delete.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.delete(configuration_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_delete.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_delete.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-delete-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id115"&gt;&lt;span class="sectnum"&gt;1.10.82&lt;/span&gt; dbaas.configuration_delete.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.delete(configuration_id)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;DELETE v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_delete.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_delete.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-update-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id116"&gt;&lt;span class="sectnum"&gt;1.10.83&lt;/span&gt; dbaas.configuration_update.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.update(configuration_id, values, name=None,
description=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_update.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_update.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;configuration_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.configuration_id&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;name:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.name&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;description:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.description&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;configuration_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of configuration to update&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;name&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;new group name (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;description&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;new group description (if specified)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-update-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id117"&gt;&lt;span class="sectnum"&gt;1.10.84&lt;/span&gt; dbaas.configuration_update.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.update(configuration_id, values, name=None,
description=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_update.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_update.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-update-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id118"&gt;&lt;span class="sectnum"&gt;1.10.85&lt;/span&gt; dbaas.configuration_update.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.update(configuration_id, values, name=None,
description=None)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PUT v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_update.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_update.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-edit-start"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id119"&gt;&lt;span class="sectnum"&gt;1.10.86&lt;/span&gt; dbaas.configuration_edit.start&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.edit(configuration_id, values)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_edit.start&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_edit.start&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;configuration_id:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.configuration_id&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;configuration_id&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;id of configuration to edit&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-edit-end"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id120"&gt;&lt;span class="sectnum"&gt;1.10.87&lt;/span&gt; dbaas.configuration_edit.end&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.edit(configuration_id, values)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_edit.end&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.info&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_edit.end&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dbaas-configuration-edit-error"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id121"&gt;&lt;span class="sectnum"&gt;1.10.88&lt;/span&gt; dbaas.configuration_edit.error&lt;/a&gt;&lt;/h3&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;Python API&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;configurations.edit(configuration_id, values)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;REST API&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;PATCH v1/{tenant_id}/configurations/{id}&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Event Type&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;dbaas.configuration_edit.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;Queue&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;notification.error&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;Message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p/&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;event_type: dbaas.configuration_edit.error&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;traits:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&amp;lt;&amp;lt;: *dbaas_base_traits&lt;/div&gt;
&lt;div class="line"&gt;message:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.message&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;exception:&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;fields: payload.exception&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;message&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;message of exception (duplicated from stack trace)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;exception&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;stack trace of exception&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>CouchDB Backup &amp;amp; Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/couchdb-backup-restore.html</link><description>
 
&lt;p&gt;Add support for CouchDB backup and restore functionality in Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/couchdb-backup-restore"&gt;https://blueprints.launchpad.net/trove/+spec/couchdb-backup-restore&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;CouchDB is one of the NoSQL databases that Trove supports.  While Trove
provides support for doing backups and restores, this functionality has not
been implemented for CouchDB.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The recommended method for doing full backups in CouchDB is to do a simple
filesystem copy of the data files &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;. Since CouchDB does not officially
support incremental backups, this feature will not be implemented in this
release.&lt;/p&gt;
&lt;p&gt;CouchDB is a document based database system where each database consist of
several documents and each document is a JSON structure. In CouchDB, each
document is associated with a revision number. Each database is stored as a
single .couch file which is an append-only file (Every time a change is made
to the document, it does not overwrite the existing document, instead it
creates a new document with an updated version number). This makes it easy
to do a full backup by simply copying this .couch file.&lt;/p&gt;
&lt;p&gt;The following steps give a high level overview of the full backup and restore
process for CouchDB.&lt;/p&gt;
&lt;p&gt;Backup process is explained as follows:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Locate the database files to be backed up. By default, the database files
are located under /var/lib/couchdb directory (this location will be
specified in the couchdb config file under /etc/couchdb directory). In
CouchDB, each database is wholly contained in a single append-only file.
This means that we can take a backup while its being written to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compress and/or encrypt the database files and stream it to Swift storage.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Restore process is explained as follows:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Stream and uncompress backup from storage to the database file directory
(this location is specified in the /etc/couchdb config file)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change ownership of the files to the CouchDB user and group&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The following configuration options will be updated with the corresponding
values for CouchDB:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following commands will be functional for CouchDB after these changes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create –backup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The CouchDB guestagent will be modified to add support for full backup and
restore functionality. In addition, new strategies will also be added to
support these new features.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;The following guestagent file will be modified:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/datastore/experimental/couchdb/manager.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;and the following new strategy files will be added for CouchDB:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/strategies/backup/experimental/couchdb_impl.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove/guestagent/strategies/restore/experimental/couchdb_impl.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Since CouchDB does not officially support incremental backups, an alternative
to doing this is to use the CouchDB replication interface. CouchDB’s
replication interface supports master-master replication model and replicates
at the database level. It uses the REST API to trigger replication between
databases on a source and target systems. If the databases are not on the same
system, the source/target should be specified in a URI format:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http:/"&gt;http:/&lt;/a&gt;/&amp;lt;address&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;database name&amp;gt;&lt;/p&gt;
&lt;p&gt;An example of a request for replicating database ‘db1’ from a local server to
a remote server on x.x.x.x server would be:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;curl -X POST -d ‘{“source”:”db1”,”target”:”&lt;a class="reference external" href="http://x.x.x.x:5984:db1"&gt;http://x.x.x.x:5984:db1&lt;/a&gt;”}’ &lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://localhost:5984/_replicate"&gt;http://localhost:5984/_replicate&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;When replication is enabled for a database from a source to target system, it
uses the document revision numbers to track differences and detect conflicts
and resolve it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Mariam John (&lt;a class="reference external" href="mailto:mariamj%40us.ibm.com"&gt;mariamj&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;There will only be one work item for this feature. This includes implementing
the strategies for CouchDB backup and restore and make the necessary
guestagent changes. This will also include test-cases necessary to test the
new functionalities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add new test cases to test backup and restore functionality for CouchDB:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new unit tests to test the newly implemented functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new CouchDB helper class to the existing integration-test framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Filesystem Backup: &lt;a class="reference external" href="http://wiki.apache.org/couchdb/FilesystemBackups?action=show"&gt;http://wiki.apache.org/couchdb/FilesystemBackups?action=show&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Trove Logging</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/datastore-log-operations.html</link><description>
 
&lt;p&gt;Provide end-user access to various type of logs on guest instances.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/datastore-log-operations"&gt;https://blueprints.launchpad.net/trove/+spec/datastore-log-operations&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In the current implementation, it is not possible for the user to
retrieve any logs from the guest agent without ssh access to the
instance.  The user should be able to retrieve logs as defined by the
datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This document outlines a proposal to provide access to guest logs by
storing them in a Swift container.&lt;/p&gt;
&lt;p&gt;Each datastore will define a number of log files which it can make
available to the user.  Logs can be either system logs such as the
Trove guest-agent log which are always enabled, or the log can be user
logs such as the MySQL Slow Query Log which can be enabled or disabled
by the user.&lt;/p&gt;
&lt;p&gt;The contents of the appropriate log files will be copied from the
guest instance to a Swift container via execution of a log-publish
command, and may then be streamed to the user.  Subsequent invocations
of the log-publish command will only copy log entries made since the
last log-publish command to efficiently utilize network resources and
minimize impact on database performance.&lt;/p&gt;
&lt;div class="section" id="swift-log-container"&gt;
&lt;h3&gt;Swift Log Container&lt;/h3&gt;
&lt;p&gt;Each log will be composed of multiple objects stored in a Swift container (with
a predefined prefix), with each object being a subset of the logging
information.  The entire log will be reconstructed by concatenating the objects
in the container that pertain to the specified log; order can be determined by
examining the object metadata for each object, or simply by alphabetically
sorting the objects by filename (assuming a suitable naming convention).  The
prefix will be generated by using a know pattern.  All the corresponding files
can then be retrieved from Swift using this prefix.  The suggested prefix will
be: ‘%(instance_id)s/%(datastore)s-%(log)s/’&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Each log will store a metadata file in the container, which will have the
following information associated with it:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 26%"/&gt;
&lt;col style="width: 74%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Key&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Value&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Log Name&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Name of log&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Log Type&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;SYS or USER&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Log File&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;File where data is published from&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Log Hash&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Hash of log file&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Log Size&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Log file size at last publish&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Log Lines&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Log file line count at last publish&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A list of all the instances with logs in the container could be viewed with the
following command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ swift list database_logs --delimiter='/'
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;fa8c452e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6568&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;438&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b2878290fb90&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A list of all the logs for an instance could be viewed with the following
command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ swift list database_logs --delimiter='/' --prefix fa8c452e-6568-438a-9f04-b2878290fb90/
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;fa8c452e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6568&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;438&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b2878290fb90&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;fa8c452e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6568&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;438&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b2878290fb90&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;guest_metafile&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A list of all the actual log files associated with a specific datastore log
could be viewed with the following command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ swift list database_logs --delimiter='/' --prefix fa8c452e-6568-438a-9f04-b2878290fb90/mysql-guest/
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;fa8c452e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6568&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;438&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b2878290fb90&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="n"&gt;T21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;09.975754&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Datastore CONF settings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;guest_log_exposed_logs - Used to configure which logs will be exposed by
the logging component&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest_log_container_name - pattern used to generate the name of the
contain which will hold the logs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest_log_long_query_time - the time to set to identify if a query is
taking a long time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest_log_limit - max size (in bytes) for any chunk pushed to Swift&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest_log_expiry - time in seconds after which the log component is
removed from the Swift container (0 for no expiry)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="guest-log-exposed-logs"&gt;
&lt;h4&gt;guest_log_exposed_logs&lt;/h4&gt;
&lt;p&gt;A guest_log_exposed_logs config value will enumerate the logs available for a
datastore.  By default, the guestagent log would be supported by all
datastores plus any other logs defined and supported by the datastore’s
guestagent manager.&lt;/p&gt;
&lt;p&gt;Excerpt from trove-guestagent.conf:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;guest_log_exposed_logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;slow_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;general&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Any USER log not mentioned in the guest_log_exposed_logs list will be disabled
by default.  A special value of “ALL” will enable all logs supported by
the guest agent manager.&lt;/p&gt;
&lt;p&gt;An admin user will always be able to see all the logs, and to publish and
view the contents, regardless of whether they are ‘exposed’ or not.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-log-container-name"&gt;
&lt;h4&gt;guest_log_container_name&lt;/h4&gt;
&lt;p&gt;The name of the container used to store log components can be
specified in the configuration file.&lt;/p&gt;
&lt;p&gt;Excerpt from trove-guestagent.conf:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;guest_log_container_name = database_logs&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The value shown above is the default value.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-log-long-query-time"&gt;
&lt;h4&gt;guest_log_long_query_time&lt;/h4&gt;
&lt;p&gt;The amount of time to set for ‘slow_query’ logging.  This value
is datastore specific, and may mean different things for different
datastores.  For example, MySQL has a slow query log that these queries
are written into, whereas PostgreSQL would use the field to decide what
queries to write into its general log.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-rotation"&gt;
&lt;h3&gt;Log Rotation&lt;/h3&gt;
&lt;p&gt;Many systems will use log rotation to ensure that logs do not exceed
the amount of available disk space on a system.  At any point in time,
the current log file could be renamed to “&amp;lt;logfile&amp;gt;.1” (or some other
name) and a new log file started for ongoing log messages.&lt;/p&gt;
&lt;p&gt;To account for this, the logging feature will keep track of a hash of
the first line of the current log file that exists during a
log-publish operation.  The current hash value will be stored in the
x-container-meta-log-header-digest value associated with the log file
container.  Subsequent log-publish operations will use the hash value
to determine whether the log has indeed been rotated.  If so, the
current container will be purged and the new log file published to it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;For log-list:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'logs'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'guest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'SYS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Ready'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'4234'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;
            &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-guest_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Disabled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;
            &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-general_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'slow_query'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Partial'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'1009'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'304'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'database_logs'&lt;/span&gt;
            &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-slow_query/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-slow_query_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For log-show:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'guest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'SYS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Partial'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;218913&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2636234&lt;/span&gt;
        &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'database_logs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-guest/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-guest_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For log-enable:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'enable'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Enabled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;
        &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-general_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For log-disable:&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'disable'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Disabled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'30103'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'log-mysql-general-&amp;lt;id&amp;gt;'&lt;/span&gt;
        &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-general/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-general_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For log-publish:
(Note that ‘publish’ will automatically ‘enable’ a log)&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'guest'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'SYS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Published'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'443'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'log-mysql-guest-&amp;lt;id&amp;gt;'&lt;/span&gt;
        &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-guest/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-guest_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For log-discard&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'discard'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'log'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'USER'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Ready'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'30103'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;
        &lt;span class="s1"&gt;'prefix'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'None'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'metafile'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;id&amp;gt;/mysql-general_metafile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Get a list of all guest logs.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: list of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Show details of a log.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to enable&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: List of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Enable the writing of a log.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to enable&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: List of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_disable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Disable the writing of a log.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to disable&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: List of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;discard&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Publish guest log to Swift container.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to publish&lt;/span&gt;
&lt;span class="sd"&gt;    :param disable: Turn off &amp;lt;log&amp;gt;&lt;/span&gt;
&lt;span class="sd"&gt;    :param discard: Delete the associated container&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: List of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_discard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Discard (delete) the published log container in Swift.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to discard&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: List of :class:`DataStoreLog`.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Return generator to yield the last &amp;lt;lines&amp;gt; lines of guest log.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to publish&lt;/span&gt;
&lt;span class="sd"&gt;    :param publish: Publish updates before displaying log&lt;/span&gt;
&lt;span class="sd"&gt;    :param lines: Display last &amp;lt;lines&amp;gt; lines of log (0 for all lines)&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: generator function to yield log as chunks.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;log_save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""Saves a guest log to a file.&lt;/span&gt;

&lt;span class="sd"&gt;    :param instance: The :class:`Instance` (or its ID) of the database&lt;/span&gt;
&lt;span class="sd"&gt;    instance to get the log from.&lt;/span&gt;
&lt;span class="sd"&gt;    :param log: The type of &amp;lt;log&amp;gt; to publish&lt;/span&gt;
&lt;span class="sd"&gt;    :param publish: Publish updates before displaying log&lt;/span&gt;
&lt;span class="sd"&gt;    :rtype: Filename to which log was saved&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;div class="section" id="log-list"&gt;
&lt;h4&gt;Log List&lt;/h4&gt;
&lt;p&gt;The log-list command provides information about each log available on
a given Trove instance.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-list &amp;lt;instance&amp;gt;
+------------+------+-------------+-----------+---------+---------------+---------------------+
| Name       | Type | Status      | Published | Pending | Container     | Prefix              |
+------------+------+-------------+-----------+---------+---------------+---------------------+
| error      | SYS  | Unavailable |         0 |       0 | None          |                     |
| general    | USER | Published   |      1009 |       0 | database_logs | &amp;lt;id&amp;gt;/mysql-general/ |
| guest      | SYS  | Ready       |         0 |  499850 | None          |                     |
| slow_query | USER | Disabled    |         0 |       0 | None          |                     |
+------------+------+-------------+-----------+---------+---------------+---------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 17%"/&gt;
&lt;col style="width: 83%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Column&lt;/p&gt;&lt;/th&gt;
&lt;th class="head" rowspan="2"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Name&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Name of the log component&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="4"&gt;&lt;p&gt;Type&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;SYS: System log, always on&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;USER: Managed by user&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="22"&gt;&lt;p&gt;Status&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Disabled: Inital state of USER log&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="3"&gt;&lt;p&gt;Enabled: Initial state of a SYS log or a USER log with no
data in it&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Unavailable: SYS log that has no data in it&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Ready: Log has data available for publishing&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Published: Log file has been fully published&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Partial: Log file has been partially published&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="3"&gt;&lt;p&gt;Rotated: Log file has rotated, so next publish will delete
the container first&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="3"&gt;&lt;p&gt;Restart Required: Datastore requires a restart in order to
begin writing to the log file&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"&gt;&lt;td rowspan="3"&gt;&lt;p&gt;Restart Completed: Internal state so the guest log knows to
begin reporting the actual state again&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"/&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Published&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Amount of data published to container&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Pending&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Amount of data available to be published by log-publish&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Container&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Swift container that holds the components of the log&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;tr class="row-odd"&gt;&lt;td rowspan="2"&gt;&lt;p&gt;Prefix&lt;/p&gt;&lt;/td&gt;
&lt;td rowspan="2"&gt;&lt;p&gt;Prefix to send to Swift to get just the relevant log parts&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"/&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Note: Where the values for ‘Container’ and ‘Prefix’ for the logs in the
example above are ‘None,’ this signifies that that log has not had a
log-publish operation executed against it&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="log-show"&gt;
&lt;h4&gt;Log Show&lt;/h4&gt;
&lt;p&gt;The log-show command provides full information about a specific log available
on a given Trove instance.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-show &amp;lt;instance&amp;gt; general
 +--------------+-----------------------------+
 | Property     | Value                       |
 +--------------+-----------------------------+
 | name         | slow_query                  |
 | type         | USER                        |
 | status       | Enabled                     |
 | published    | 135                         |
 | pending      | 2156                        |
 | container    | database_logs               |
 | prefix       | &amp;lt;id&amp;gt;/mysql-slow_query/      |
 | metafile     | &amp;lt;id&amp;gt;/mysql-general_metafile |
 +--------------+-----------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-enable"&gt;
&lt;h4&gt;Log Enable&lt;/h4&gt;
&lt;p&gt;The log-enable command will instruct the guest agent to begin writing
information to the specified log file.  Only ‘USER’ logs can be enabled
as ‘SYS’ logs are enabled by default (and cannot be disabled).  Depending
on the datastore, this may cause the log to go into a ‘Restart Required’
state where it will remain until the datastore is restarted.  This can
be configured on a per-datastore basis, and should only be done if there
is no way to dynamically start the logging (i.e. PostgreSQL must be
restarted in order to change logging, so it would require this configuration).&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-enable &amp;lt;instance&amp;gt; general
 +--------------+-----------------------------+
 | Property     | Value                       |
 +--------------+-----------------------------+
 | name         | general                     |
 | type         | USER                        |
 | status       | Enabled                     |
 | published    | 0                           |
 | pending      | 0                           |
 | container    | None                        |
 | prefix       | None                        |
 | metafile     | &amp;lt;id&amp;gt;/mysql-general_metafile |
 +--------------+-----------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-disable"&gt;
&lt;h4&gt;Log Disable&lt;/h4&gt;
&lt;p&gt;The log-disable command will instruct the guest agent to stop writing
information to the specified log file.  Only ‘USER’ logs can be disabled.
As with log-enable, this may cause the log to go into a ‘Restart Required’
state.  See log-enable for more details.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-disable &amp;lt;instance&amp;gt; general
 +--------------+-----------------------------+
 | Property     | Value                       |
 +--------------+-----------------------------+
 | name         | general                     |
 | type         | USER                        |
 | status       | Disabled                    |
 | published    | 34658                       |
 | pending      | 2532                        |
 | container    | database_logs               |
 | prefix       | &amp;lt;id&amp;gt;/mysql-general/         |
 | metafile     | &amp;lt;id&amp;gt;/mysql-general_metafile |
 +--------------+-----------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-publish"&gt;
&lt;h4&gt;Log Publish&lt;/h4&gt;
&lt;p&gt;The log-publish command will instruct the guest agent to push any
updates to the specified log to the Swift container, which will be
created if required.  One log-publish command could result in multiple
objects being pushed to the Swift container in order to keep each
object below the maximum object size as configured by the
guest_log_limit CONF value.&lt;/p&gt;
&lt;p&gt;The log-publish command will execute asynchronously.  When the
log-publish command is executed, the Trove instance will be put in the
LOGGING state, returning to ACTIVE when objects have been pushed to
the logging container so as to successfully finish execution of the
command.&lt;/p&gt;
&lt;p&gt;When an object is pushed to the Swift container, an X-Delete-After
header is used to specify a time-to-live for the container
object. This will result in objects automatically being removed from
the container after a period of time as specified by the
log_expiry CONF value.&lt;/p&gt;
&lt;p&gt;An optional –disable parameter will be supported to disable logging
for a particular USER log.  An optional –discard parameter will be
supported to first discard (delete) the associated container.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-publish &amp;lt;instance&amp;gt; slow_query
 +--------------+--------------------------------+
 | Property     | Value                          |
 +--------------+--------------------------------+
 | name         | slow_query                     |
 | type         | USER                           |
 | status       | Published                      |
 | published    | 43242                          |
 | pending      | 0                              |
 | container    | database_logs                  |
 | prefix       | &amp;lt;id&amp;gt;/mysql-slow_query/         |
 | metafile     | &amp;lt;id&amp;gt;/mysql-slow_query_metafile |
 +--------------+--------------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-discard"&gt;
&lt;h4&gt;Log Discard&lt;/h4&gt;
&lt;p&gt;The log-discard command will discard (delete) the container where the current
log information resides.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-discard &amp;lt;instance&amp;gt; general
 +--------------+-----------------------------+
 | Property     | Value                       |
 +--------------+-----------------------------+
 | name         | general                     |
 | type         | USER                        |
 | status       | Enabled                     |
 | published    | 0                           |
 | pending      | 37190                       |
 | container    | None                        |
 | prefix       | None                        |
 | metafile     | &amp;lt;id&amp;gt;/mysql-general_metafile |
 +--------------+-----------------------------+
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-tail"&gt;
&lt;h4&gt;Log Tail&lt;/h4&gt;
&lt;p&gt;By default, log-tail outputs the 50 lines at the end of the
log.  With the –lines=n option, log-tail will output the last n
lines of the log.  If n is negative, output will start past line n and
continue to the end; –lines=0 will output the entire log.&lt;/p&gt;
&lt;p&gt;With the –publish option, log-tail will first execute a log-publish
command and wait for the log to be published before beginning output.&lt;/p&gt;
&lt;p&gt;It should be noted that the actual display of the log will take place
in the Python API only.  There will be no REST APIs to facilitate
display of the log; such APIs would put undue stress on the system due
to the requirements of buffering and streaming from Swift.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-tail &amp;lt;instance&amp;gt; slow_query --publish
/usr/local/mysql/libexec/mysqld, Version: 3.23.54-log, started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 030207 15:03:33
# User@Host: wsuser[wsuser] @ localhost.localdomain [127.0.0.1]
# Query_time: 13  Lock_time: 0  Rows_sent: 117  Rows_examined: 234
use wsdb;
SELECT l FROM un WHERE ip='209.xx.xxx.xx';
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="log-save"&gt;
&lt;h4&gt;Log Save&lt;/h4&gt;
&lt;p&gt;Like the log-tail command, the log-save command will execute in the
python-troveclient, but where log-tail will output the log to the
console, the log-save command will save the log into a file in the
filesystem.  This will allow the user to download extremely large log
files without overwhelming the client or browser.&lt;/p&gt;
&lt;p&gt;With the –file option, the log will be saved to the named file.
Without the –file option, the log will be output to &amp;lt;logname&amp;gt;.log in
the current directory.&lt;/p&gt;
&lt;p&gt;With the –publish option, log-tail will first execute a log-publish
command and wait for the log to be published before beginning output.&lt;/p&gt;
&lt;p&gt;It should be noted that the actual saving of the log will take place
in the Python API only.  There will be no REST APIs to facilitate
display of the log; such APIs would put undue stress on the system due
to the requirements of buffering and streaming from Swift.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove log-save &amp;lt;instance&amp;gt; slow_query --file=/tmp/my.log --publish
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;The Swift containers will be created with the same security
credentials as used for backup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Appropriate API methods will be added to both the task manager and the guest.&lt;/p&gt;
&lt;p&gt;No changes to existing APIs are foreseen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No compatibility issues are foreseen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;div class="section" id="alternate-api"&gt;
&lt;h4&gt;Alternate API&lt;/h4&gt;
&lt;p&gt;An alternative API could be implemented that does away with some
of the simpler commands.&lt;/p&gt;
&lt;p&gt;Note:  This alternate section was modified after describing the process to
documentation personnel, where it was determined that having the ‘simple’
commands made it significantly easier to understand the logging process.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Openstack functionality:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 54%"/&gt;
&lt;col style="width: 46%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;API&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;log-list&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;As above&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;log-show&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Removed&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;log-enable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Removed&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;log-disable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Removed&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;log-publish&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;As above&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;log-discard&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Removed&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;log-tail&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;As above&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;log-save&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;As above&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="publish-by-default"&gt;
&lt;h4&gt;–publish by default&lt;/h4&gt;
&lt;p&gt;There has also been a suggestion to make the –publish option the
default on the log-tail and log-save commands.  If this were done, it
seems unlikely that anyone would ever execute –no-publish and the
log-publish command would really only ever execute “log-publish
–disable”, so it would be better to just eliminate the
–publish/–no-publish options, have log-tail and log-save always
publish first, and replace the log-publish command with log-disable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="admin-override-for-guest-log"&gt;
&lt;h4&gt;Admin override for guest log&lt;/h4&gt;
&lt;p&gt;It is possible for the operator to exclude the guest agent log from the list of
logs returned to the user.  Doing so, however, will not prevent the operator
from seeing the guest log, as they would access it through the admin account.
Currently the admin user will still stream the logs to the same tenant as the
Trove user.  This could be enhanced (in the future) to have the admin user
provide a tenant that could be used to host the log containers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vgnbkr (&lt;a class="reference external" href="mailto:morgan%40tesora.com"&gt;morgan&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignees:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;peterstac (&lt;a class="reference external" href="mailto:peter%40tesora.com"&gt;peter&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)
atomic77 (&lt;a class="reference external" href="mailto:atomic%40tesora.com"&gt;atomic&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Documentation:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;laurelm (&lt;a class="reference external" href="mailto:lmichaels%40tesora.com"&gt;lmichaels&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Mitaka-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;This component has been largely implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;As this is entirely new functionality, no upgrade implications are foreseen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;An integration scenario test will be added to retrieve the guest log, execute a
command, retrieve the guest log again and confirm that additional logging
details were captured.  The log will then be deleted via the log-discard
command and the removal of the files from the container from Swift will be
verified.  The TestHelper class will be enhanced to include the ‘default’ log
list (which is simply ‘guest’), and the MySQL one the additional defined USER
logs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;New documentation describing the added functionality will need to be
written.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/trove-2015-vancouver-logging"&gt;https://etherpad.openstack.org/p/trove-2015-vancouver-logging&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Refactor the Datastore Manager</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/datastore-manager-refactor.html</link><description>
 
&lt;p&gt;There is a large amount of boiler-plate and/or copy-and-paste code in each
datastore manager.  As more managers are added, the time involved in
maintaining all this code will continue to grow. To alleviate this and the bugs
it promotes, a base manager class needs to be created where all common code can
reside.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/datastore-manager-refactor"&gt;https://blueprints.launchpad.net/trove/+spec/datastore-manager-refactor&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;When bugs are discovered and fixed in the manager code of one datastore, these
changes are seldom transferred to all the other datastores.  This causes a
‘drift’ in the stability of each experimental datastore as currently there are
no third-party CI’s.  In addition, when ‘new improved’ ways to solve a problem
are implemented they are done differently across each manager, if at all.  It
is also difficult to transfer features (and coding knowledge) from one
datastore to another, and the problem is exacerbated as code is
copied-and-pasted when a new datastore manager is implemented.&lt;/p&gt;
&lt;p&gt;A current example of this problem is the issue where instances flip from BUILD
to ACTIVE and back again &lt;a class="footnote-reference brackets" href="#id3" id="id1"&gt;1&lt;/a&gt;, or from BUILD-&amp;gt;SHUTDOWN-&amp;gt;ACTIVE. &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;2&lt;/a&gt;  Fixing
this means changing how prepare works, and currently this change would be
required to be made in each datastore manager.  Implementing this in a uniform
way would be almost impossible with the current architecture of the manager
code base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;A new ‘Manager’ class will be created that will be the base class for all
datastore managers.  In order to keep the scope reasonable, only the barest
minimum of functionality will be pulled back into the base class in the initial
implementation - this will include methods that are currently ‘boiler-plate’
code (such as the response to the rpc_ping and get_fileststem_stats calls, and
the periodic task, update_status).&lt;/p&gt;
&lt;p&gt;A mechanism for encapsulating functionality will also be needed in order for
the base manager to be able to execute datastore-specific instructions.  This
will be accomplished through the use of properties that can be overridden by
each descendant.  Some required ones (such as the ‘status’ object) will be
declared abstract and must be present; others (such as the new configuration
manager, and potentially a future dictionary of strategies) will be optional.&lt;/p&gt;
&lt;p&gt;The new Manager class will reside in the datastore module:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove/guestagent/datastore/manager.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is alongside the existing service.py file (which contains the existing
BaseDbStatus class).  The directory structure of the MySQL derived classes will
also be tidied a bit and will end up looking like the following:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove
+-- guestagent
    +-- datastore
        +-- __init__.py
        +-- manager.py          &amp;lt;-- new &lt;span class="s1"&gt;'base'&lt;/span&gt; manager
        +-- service.py
        +-- experimental
         +-- __init__.py
         +-- cassandra
          +-- __init__.py
          +-- manager.py
          +-- service.py
          +-- system.py

        &amp;lt;other experimental datastore modules&amp;gt;

         +-- redis
          +-- __init__.py
          +-- manager.py
          +-- service.py
          +-- system.py
         +-- vertica
             +-- __init__.py
             +-- manager.py
             +-- service.py
             +-- system.py
        +-- mysql_common        &amp;lt;-- new module
         +-- __init__.py
         +-- manager.py      &amp;lt;-- renamed from mysql/manager_base.py
         +-- service.py      &amp;lt;-- renamed from mysql/service_base.py
        +-- mysql
         +-- __init__.py
         +-- manager.py
         +-- service.py
        +-- technical-preview
            +-- __init__.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Within the context of this refactor (as a proof-of-concept), the issue with
having instances flip in-and-out of BUILD state will be addressed properly.
The prepare method will be moved into the base class, which will
seamlessly implement the code required to ensure that no notifications are
sent until it is guaranteed that prepare has finished successfully.  The
existing prepare methods will be renamed ‘do_prepare’ and will be called from
within the base prepare method.&lt;/p&gt;
&lt;p&gt;This manner of determining whether prepare has finished will be accomplished by
having the manager write a file at the start and at the successful conclusion
of the prepare operation.  Any errors (exceptions) will be trapped and logged
and the instance set into the FAILED state.&lt;/p&gt;
&lt;p&gt;A sample of what this will look like in the base manager is as follows,
although additional properties may be defined as they are deemed necessary (and
others can be added in future cleanup work):&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;periodic_task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PeriodicTasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;"""This is the base class for all datastore managers.  Over time, common&lt;/span&gt;
&lt;span class="sd"&gt;    functionality should be pulled back here from the existing managers.&lt;/span&gt;
&lt;span class="sd"&gt;    """&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;manager_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Manager properties&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manager_name&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__prepare_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;manager_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This returns the passed-in name of the manager."""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager_name&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This returns the name of the manager."""&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CONF&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore_manager&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager_name&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__manager&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__prepare_error&lt;/span&gt;

    &lt;span class="nd"&gt;@prepare_error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setter&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prepare_error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__prepare_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prepare_error&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;configuration_manager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""If the datastore supports the new-style configuration manager,&lt;/span&gt;
&lt;span class="sd"&gt;        it should override this to return it.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="nd"&gt;@abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abstractproperty&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This should return an instance of a status class that has been&lt;/span&gt;
&lt;span class="sd"&gt;        inherited from datastore.service.BaseDbStatus.  Each datastore&lt;/span&gt;
&lt;span class="sd"&gt;        must implement this property.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="c1"&gt;################&lt;/span&gt;
    &lt;span class="c1"&gt;# Status related&lt;/span&gt;
    &lt;span class="c1"&gt;################&lt;/span&gt;
    &lt;span class="nd"&gt;@periodic_task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;periodic_task&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Update the status of the trove instance. It is decorated with&lt;/span&gt;
&lt;span class="sd"&gt;        perodic_task so it is called automatically.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Update status called."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rpc_ping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Responding to RPC ping."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

    &lt;span class="c1"&gt;#################&lt;/span&gt;
    &lt;span class="c1"&gt;# Prepare related&lt;/span&gt;
    &lt;span class="c1"&gt;#################&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;device_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;config_contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Set up datastore on a Guest Instance."""&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Starting datastore prepare for '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin_install&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;post_processing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cluster_config&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;do_prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;config_contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"An error occurred preparing datastore: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;
                          &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt;
        &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Ending datastore prepare for '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_occurred&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;post_processing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;post_processing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# At this point critical 'prepare' work is done and the instance&lt;/span&gt;
        &lt;span class="c1"&gt;# is now in the correct 'ACTIVE' 'INSTANCE_READY' or 'ERROR' state.&lt;/span&gt;
        &lt;span class="c1"&gt;# Of cource if an error has occurred, none of the code that follows&lt;/span&gt;
        &lt;span class="c1"&gt;# will run.&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Completed setup of datastore successfully.'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;# We only create databases and users automatically for non-cluster&lt;/span&gt;
        &lt;span class="c1"&gt;# instances.&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Calling add databases.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Calling add users.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"An error occurred creating databases/users: "&lt;/span&gt;
                                &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Calling post_prepare.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;config_contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"An error occurred in post prepare: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;
                          &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt;

    &lt;span class="nd"&gt;@abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;device_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This is called from prepare when the Trove instance first comes&lt;/span&gt;
&lt;span class="sd"&gt;        online.  'Prepare' is the first rpc message passed from the&lt;/span&gt;
&lt;span class="sd"&gt;        task manager.  do_prepare handles all the base configuration of&lt;/span&gt;
&lt;span class="sd"&gt;        the instance and is where the actual work is done.  Once this method&lt;/span&gt;
&lt;span class="sd"&gt;        completes, the datastore is considered either 'ready' for use (or&lt;/span&gt;
&lt;span class="sd"&gt;        for final connections to other datastores) or in an 'error' state,&lt;/span&gt;
&lt;span class="sd"&gt;        and the status is changed accordingly.  Each datastore must&lt;/span&gt;
&lt;span class="sd"&gt;        implement this method.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;post_prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;device_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backup_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config_contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="n"&gt;root_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This is called after prepare has completed successfully.&lt;/span&gt;
&lt;span class="sd"&gt;        Processing done here should be limited to things that will not&lt;/span&gt;
&lt;span class="sd"&gt;        affect the actual 'running' status of the datastore (for example,&lt;/span&gt;
&lt;span class="sd"&gt;        creating databases and users, although these are now handled&lt;/span&gt;
&lt;span class="sd"&gt;        automatically).  Any exceptions are caught, logged and rethrown,&lt;/span&gt;
&lt;span class="sd"&gt;        however no status changes are made and the end-user will not be&lt;/span&gt;
&lt;span class="sd"&gt;        informed of the error.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'No post_prepare work has been defined.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="c1"&gt;#####################&lt;/span&gt;
    &lt;span class="c1"&gt;# File System related&lt;/span&gt;
    &lt;span class="c1"&gt;#####################&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_filesystem_stats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fs_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Gets the filesystem stats for the path given."""&lt;/span&gt;
        &lt;span class="c1"&gt;# TODO(peterstac) - note that fs_path is not used in this method.&lt;/span&gt;
        &lt;span class="n"&gt;mount_point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CONF&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mount_point&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Getting file system stats for '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dbaas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_filesystem_volume_stats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mount_point&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;#################&lt;/span&gt;
    &lt;span class="c1"&gt;# Cluster related&lt;/span&gt;
    &lt;span class="c1"&gt;#################&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Cluster creation complete, starting status checks."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_install&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The base service class will be enhanced to contain the necessary methods to
set a flag denoting whether prepare has finished of not.  This will look
something like the following (only new code is shown):&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseDbStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;GUESTAGENT_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'~'&lt;/span&gt;
    &lt;span class="n"&gt;PREPARE_START_FILENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'.guestagent.prepare.start'&lt;/span&gt;
    &lt;span class="n"&gt;PREPARE_END_FILENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'.guestagent.prepare.end'&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_completed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_completed&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Force the file check&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_completed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_completed&lt;/span&gt;

    &lt;span class="nd"&gt;@prepare_completed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setter&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prepare_completed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Set the value based on the existence of the file; 'value' is&lt;/span&gt;
        &lt;span class="c1"&gt;# ignored&lt;/span&gt;
        &lt;span class="c1"&gt;# This is required as the value of prepare_completed is cached,&lt;/span&gt;
        &lt;span class="c1"&gt;# so this must be referenced any time the existence of the&lt;/span&gt;
        &lt;span class="c1"&gt;# file changes&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_completed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;guestagent_utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build_file_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GUESTAGENT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PREPARE_END_FILENAME&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;begin_install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Called right before DB is prepared."""&lt;/span&gt;
        &lt;span class="n"&gt;prepare_start_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guestagent_utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build_file_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GUESTAGENT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PREPARE_START_FILENAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;operating_system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prepare_start_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_completed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceStatuses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BUILDING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;end_install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error_occurred&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_processing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Called after prepare completes."""&lt;/span&gt;

        &lt;span class="c1"&gt;# Set the "we're done" flag if there's no error and&lt;/span&gt;
        &lt;span class="c1"&gt;# no post_processing is necessary&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_occurred&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;post_processing&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;prepare_end_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guestagent_utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build_file_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GUESTAGENT_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PREPARE_END_FILENAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;operating_system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prepare_end_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_completed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

        &lt;span class="n"&gt;final_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;error_occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;final_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceStatuses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;post_processing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;final_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServiceStatuses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTANCE_READY&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;final_status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Set final status to &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;final_status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;final_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_end_install_or_restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;end_restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;restart_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Ending restart."&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_end_install_or_restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_end_install_or_restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Called after DB is installed or restarted.&lt;/span&gt;
&lt;span class="sd"&gt;        Updates the database with the actual DB server status.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="n"&gt;real_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_actual_db_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Current database status is '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;real_status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;real_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_installed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""This is for compatibility - it may be removed during further&lt;/span&gt;
&lt;span class="sd"&gt;        cleanup.&lt;/span&gt;
&lt;span class="sd"&gt;        """&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_completed&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;"""Use conductor to update the DB app status."""&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;force&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_installed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Casting set_status message to conductor "&lt;/span&gt;
                      &lt;span class="s2"&gt;"(status is '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;')."&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trove_context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TroveContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="n"&gt;heartbeat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'service_status'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;conductor_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heartbeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;CONF&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guest_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;heartbeat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timeutils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float_utcnow&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Successfully cast set_status."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Prepare has not completed yet, skipping heartbeat."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No configuration changes are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;The ServiceStatuses.BUILD_PENDING state has been renamed to
ServiceStatuses.INSTANCE_READY to better reflect the instance’s actual state.
The value displayed will remain ‘BUILD’ so that there should be no outward
differences and thus backwards compatibility will be maintained.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;This change should not affect any behavior on the Guest Agent.  The current
tests should be adequate to ensure that the change is fully compatible with the
rest of the code base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;One suggestion as to how to fix the prepare issue was to use Nova metadata,
which is available on the guest instance.  If it is decided that this would be
useful, it could be added in addition to the proposed method as a means of
notification only.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;peterstac&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Mitaka-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;All changes will be done in the context of a single task.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The unittests will be modified as necessary, however minimal changes will be
made in this regard as well.  In order to keep the changes as small as
possible, refactoring the tests will also be done in stages with only the bare
minimum done to start and the remainder being left to a future date.  The
future work would include testing the base class thoroughly and then removing
all the corresponding tests from the derived classes.&lt;/p&gt;
&lt;p&gt;The int-tests should continue to run as always, and will be used to determine
that no fundamental changes have been made to the implementation, with the
exception of the bug fixes (and they should just lead to greater stability in
the test infrastructure).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Since all the changes are implementation related, no documentation changes are
foreseen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id3"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/trove/+bug/1482795"&gt;https://bugs.launchpad.net/trove/+bug/1482795&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/trove/+bug/1487233"&gt;https://bugs.launchpad.net/trove/+bug/1487233&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>DB2 Backup And Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/db2-backup-restore.html</link><description>
 
&lt;p&gt;The DB2 Express C datastore in Trove lacks backup and restore functionality
at the moment. This blueprint aims at adding the feature of backup and
restore to DB2 in Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/db2-backup-restore"&gt;https://blueprints.launchpad.net/trove/+spec/db2-backup-restore&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, there is no way to create backups of DB2 databases using Trove nor
is it possible to perform a restore from a backup. Since this functionality
is core to a data model and typical use case, it is imperative for Trove to
add it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The simplest form of database backup and restore will be implemented for DB2
creating a backup image in a default location. Since by default, DB2
databases are in a circular logging mode, it isn’t possible to take an online
backup. Therefore a full offline backup functionality will be implemented by
this feature &lt;a class="footnote-reference brackets" href="#id6" id="id1"&gt;1&lt;/a&gt; . At this time, incremental backups for db2 will not be
supported. The LIST UTILITIES command will be used to monitor the
process. &lt;a class="footnote-reference brackets" href="#id7" id="id2"&gt;2&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="backup"&gt;
&lt;h3&gt;Backup&lt;/h3&gt;
&lt;p&gt;The backup procedure for DB2 will follow a process as below. &lt;a class="footnote-reference brackets" href="#id8" id="id3"&gt;3&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine the directory where the backups are written. For DB2 databases
the default directory location can be found in the config file (/etc/db2/db2
.conf)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if sufficient disk space is available for the backup on the instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initiate a DB2 backup through the cli. The BACKUP DATABASE command will be
used for this purpose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the backup is complete, compress/encrypt the backup inside the volume
storage. The name of the backup file will have the following format -
DB_alias.Type.Inst_name.NODEnnnn.CATNnnnn.timestamp.Seq_num&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The db2ckbkp command will be used to display information about existing
backup images. This will verify the newly created database backup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The compressed/encrypted file can then be stored in Swift under the
database_backups container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The old backup files can then be deleted on the VM once stored in Swift.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since db2 only supports streaming to named pipes, the backup cannot be
performed in a single step and will first need to store the backup file on
the VM. &lt;a class="footnote-reference brackets" href="#id9" id="id4"&gt;4&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="restore"&gt;
&lt;h3&gt;Restore&lt;/h3&gt;
&lt;p&gt;In order to restore a DB2 database from backup, the following procedure will
be followed. &lt;a class="footnote-reference brackets" href="#id10" id="id5"&gt;5&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine the directory where the backup files are stored&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that no other applications are running against the database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the backup from storage to the proper location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the RESTORE DATABASE command to recover the database&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The default configuration values of the following will need to change to
correspond to the respective DB2 locations.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore_namespace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The implmentation of the DB2 backup and restore functionality will allow
users to use several CLI commands for the DB2 datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following commands will be functional for DB2&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list-instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create –backup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The DB2 guest agent will be modified to support backup and restore. In
particular the following files will have added components-&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/strategies/backup/experimental/db2_impl.py
guestagent/strategies/restore/experimental/db2_impl.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/db2/manager.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It will be backwards compatible with API and Task Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The other type of backup that can be implmented is online backup so the
database won’t need to shut down before taking backups. However, for online
backups to be implemented, the database must have archive logging options. At
this time it is not possible to specify logging options for DB2 databases in
Trove. Once users can configure other logging options like archive logging,
online backup can be implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;imandhan&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Target Milestone for completion:&lt;/p&gt;
&lt;p&gt;Mitaka-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement backup and restore API calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write associated test cases.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added as necessary for the backup and restore
functionality. Also, a db2 helper will be added to the existing
int-test framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The DB2 Trove documentation should be updated to indicate that backup and
restore is supported.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Offline Backup: &lt;a class="reference external" href="http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0051343.html"&gt;http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0051343.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Monitoring Backup: &lt;a class="reference external" href="http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/t0060260.html"&gt;http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/t0060260.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;DB2 Backup procedure: &lt;a class="reference external" href="http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006150.html"&gt;http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006150.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id9"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;DB2 backing up to named pipe: &lt;a class="reference external" href="https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.admin.ha.doc/doc/t0006202.html"&gt;https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.admin.ha.doc/doc/t0006202.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;5&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;DB2 Restore procedure: &lt;a class="reference external" href="http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006237.html"&gt;http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006237.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Move to oslo_db</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/move-to-oslo-db.html</link><description>
 
&lt;p&gt;Replace the trove.db.sqlalchemy package with the oslo_db library.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/move-to-oslo-db"&gt;https://blueprints.launchpad.net/trove/+spec/move-to-oslo-db&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The current code uses the outdated incubator package for database
connectivity. The old package has some bugs such as not handling concurrent
threads correctly. This is a good opportunity to migrate to the oslo_db
library, replacing the trove.db.sqlalchemy package.&lt;/p&gt;
&lt;p&gt;A similar move has been done by other OS projects such as nova &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;oslo_db is a library that handles the common database connection and controls.
Change the trove.db.sqlalchemy engine and session handling to use the oslo_db
library. This transparently handles connections and sessions, and protects
against mismanaged connections in Trove’s threaded environment.&lt;/p&gt;
&lt;p&gt;The only external effect will be the exposure of oslo_db configuration
options.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Add the configuration options for oslo_db to the [database] section &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;The database connection is the only change. Data models and queries are not
affected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Determine the root cause of the database connection mismanagement &lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;3&lt;/a&gt;.
Previous efforts were unsuccessful.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Remove the engine and session management code and replace it with a facade
from oslo_db.&lt;/p&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Matthew Van Dijk&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A single task for code changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update docs with the new configuration settings&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;oslo_db&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Do not break existing tests - especially the fake mode tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Describe the config variables that are in the database section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/101901/"&gt;Nova’s migration commit&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/developer/oslo.db/opts.html#database?"&gt;oslo_db configuration options&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/trove/+bug/1481493"&gt;Associated bug on Launchpad&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>PostgreSQL Incremental Backup and Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/pgsql-incremental-backup.html</link><description>
 
&lt;p&gt;Trove currently only supports full backup and restore with the PostgreSQL guest
agent.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/postgresql-incremental-backup"&gt;https://blueprints.launchpad.net/trove/+spec/postgresql-incremental-backup&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, backups in PostgreSQL are done with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_dump&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_restore&lt;/span&gt;&lt;/code&gt; tools, which produce efficient, logical backups. Unfortunately,
they cannot be used as the basis for incremental backups or point-in-time
recovery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;div class="section" id="postgresql-logging"&gt;
&lt;h3&gt;PostgreSQL Logging&lt;/h3&gt;
&lt;p&gt;In contrast to MySQL, PostgreSQL uses the same foundation for recovery,
replication and incremental backups. Central to this is the write-ahead log
(WAL) &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt;. With each update to the database, a WAL entry is created. The WAL
contents are periodically checkpointed to the main data files in the database
directory and are eventually purged depending on the system configuration.&lt;/p&gt;
&lt;p&gt;In the event of a system crash, recovery proceeds by replaying the contents of
the WAL since the last checkpoint. This same mechanism is used, in a
“continuous” sense, for replication, and up until a specific WAL entry, for
point-in-time recovery &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So in order to support incremental backup, two parts are required:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A base backup, a snapshot of the filesystem contents of the pgsql data
directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The WAL files written since the previous backup up to the desired point in
time&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="base-backups"&gt;
&lt;h4&gt;Base Backups&lt;/h4&gt;
&lt;p&gt;Base backups are taken with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_basebackup&lt;/span&gt;&lt;/code&gt; filesystem-level backup tool
&lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;3&lt;/a&gt;. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_basebackup&lt;/span&gt;&lt;/code&gt; creates a copy of the binary files in the PostgreSQL
cluster data directory and enough WAL segments to allow the database to be
brought back to a consistent state. Associated with each backup is a log
location, normally indicated by the WAL file name and the position inside the
file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="point-in-time-recovery-and-wal-archiving"&gt;
&lt;h4&gt;Point-in-time Recovery and WAL Archiving&lt;/h4&gt;
&lt;p&gt;PostgreSQL can be made to support Trove’s notion of incremental backup and
restore by bootstrapping the recovery system. To restore an incremental backup
from a previous backup, in PostgreSQL, is to replay the WAL entries to a
designated point in time – all that is required is the most recent base
backup, and all WAL files that were written since.&lt;/p&gt;
&lt;p&gt;During normal operation of the database, as WAL data is written and then
checkpointed to the data files, unneeded files are purged. PostgreSQL can also
be configured to automatically archive WAL files, which can then be used for
the purposes of point-in-time recovery.&lt;/p&gt;
&lt;p&gt;PostgreSQL has two important configuration parameters that manage WAL archiving
and WAL retrieval for recovery: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;archive_command&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;recovery_command&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The parameters allow a great deal of flexibility in how WAL files are handled
– all that is required is that the command returns 0 only in the event that
the file was successfully transferred. A simple example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;archive_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'test ! -f /mnt/arch/&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s1"&gt; &amp;amp;&amp;amp; cp %p /mnt/arch/&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above command checks for the existence of the file in the archive directory
/mnt/arch (to avoid overwritting an existing file) and then copies it in.&lt;/p&gt;
&lt;p&gt;Similarly, for recovery:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;restore_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'cp /mnt/arch/&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s1"&gt; "%p"'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above commands assume that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/mnt/arch&lt;/span&gt;&lt;/code&gt; is accessible and, for recovery,
contains the appropriate WAL files.&lt;/p&gt;
&lt;p&gt;In principle &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;archive_command&lt;/span&gt;&lt;/code&gt; can be anything, with a few important caveats:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The speed of the archive_command must be fast enough to keep up with the
on-going generation of WAL files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The restore command must be able to reverse whatever operation is applied
to the WAL file on archive&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assuming that an appropriate mechanism to archive and retrieve the WAL files is
in place,  incremental backup and restore become simple operations: an
incremental “backup” is done by creating a restore point, using
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pg_start_backup('my_restore_pt')&lt;/span&gt;&lt;/code&gt;, and the equivalent restore is done by
restarting the server with a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;recovery_target_name&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;'my_restore_pt'&lt;/span&gt;&lt;/code&gt; in the
recovery.conf file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="incremental-collection-of-wal-files"&gt;
&lt;h4&gt;Incremental Collection of WAL Files&lt;/h4&gt;
&lt;p&gt;Consider the following series of WAL files that may be found in the PostgreSQL
WAL archive directory:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ ls -lh /mnt/wal_arch
-rw------- 1 postgres postgres  16M Oct 27 19:11 000000010000000000000016
-rw------- 1 postgres postgres  16M Oct 27 19:11 000000010000000000000017
-rw------- 1 postgres postgres  16M Oct 27 19:12 000000010000000000000018
-rw------- 1 postgres postgres  16M Oct 27 19:12 000000010000000000000019
-rw------- 1 postgres postgres  16M Oct 27 19:12 00000001000000000000001A
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The WAL entry stream can be visualized as:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;--------------------------------------------------------&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;16&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;17&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;18&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;19&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;--------------------------------------------------------&lt;/span&gt;
     &lt;span class="o"&gt;^&lt;/span&gt;                  &lt;span class="o"&gt;^&lt;/span&gt;                    &lt;span class="o"&gt;^&lt;/span&gt;
    &lt;span class="n"&gt;B1&lt;/span&gt;                  &lt;span class="n"&gt;I1&lt;/span&gt;                   &lt;span class="n"&gt;I2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Suppose that base backup B1 was taken at file 16 position 48, incremental
backup I1 at file 18 position 30, and incremental backup I2 at file 1A
position 20.&lt;/p&gt;
&lt;p&gt;I1 would consist of WAL files 16 through 18: the entries after position 48 in
file 16, where B1 was taken, would be needed, along with the contents of file
18 up until position 30.&lt;/p&gt;
&lt;p&gt;I2 would consist of WAL files 18 through 1A.&lt;/p&gt;
&lt;p&gt;This approach has the benefit of being consistent with the current paradigm
used by Trove for incremental backup and restore. The main downside is that
WAL data must be archived in two stages: once by PostgreSQL, local to the
instances, and a second time by Trove, to object storage. This introduces more
complexity and increases storage requirements on the instance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The new incremental backup and restore strategies will need to be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;After implementation, the following CLI commands will work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inc_backup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;backup_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;backup&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;inc_backup_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;A new backup and restore strategy based on pg_basebackup will be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;div class="section" id="tighter-postgresql-swift-integration"&gt;
&lt;h4&gt;Tighter Postgresql - Swift Integration&lt;/h4&gt;
&lt;p&gt;A simpler approach would be to bypass the two-stage archive process, and have
PostgreSQL automatically manage the WAL archiving process to and from object
storage. For example, the archive command could run the WAL file through a
fast compressor such as Snappy or LZOP, encrypt and then ship the file to
Swift directly, with an equivalent reverse procedure for recovery.&lt;/p&gt;
&lt;p&gt;This has the benefit of being simpler to implement, as most log handling is
pushed down to PostgreSQL, but has the significant side-effect of introducing
a relatively continuous stream of WAL data from the PostgreSQL guest to Swift,
something potentially unexpected and not consistent with the approach to
incremental backups on other datastores.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;atomic77&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;mitaka-1&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;pg_basebackup full backup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;incremental backup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;Backups taken with the old PgDump strategy will not be compatible with this new
strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Ability to create pgsql instances in the generic int-test framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Int-tests for incremental backup currently do not exist in the new generic
int-test framework and will be added. Unit tests will be added as necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation will need to be updated to reflect the new backup and restore
strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/9.4/static/wal-configuration.html"&gt;http://www.postgresql.org/docs/9.4/static/wal-configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/9.4/static/continuous-archiving.html"&gt;http://www.postgresql.org/docs/9.4/static/continuous-archiving.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.postgresql.org/docs/current/static/app-pgbasebackup.html"&gt;http://www.postgresql.org/docs/current/static/app-pgbasebackup.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Postgres Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/postgres-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/postgres-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/postgres-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Postgres guestagent currently does not support configuration groups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement configuration groups for Postgres 9.3 or above.&lt;/p&gt;
&lt;p&gt;Postgres stores its configuration &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt; in ‘postgresql.conf’ file.
Configuration directives have key-value format:
“keyword = value”&lt;/p&gt;
&lt;p&gt;In addition to the ‘postgresql.conf’ file already mentioned,
PostgreSQL uses two other configuration files
(‘pg_hba.conf’ and ‘pg_ident.conf’), which control client authentication.&lt;/p&gt;
&lt;p&gt;These will be written directly by the guest-agent and will not
be exposed via the configuration groups mechanism.&lt;/p&gt;
&lt;p&gt;Configuration changes can be loaded on the fly without interrupting
any open connections by the special ‘pg_reload_conf’ call &lt;a class="footnote-reference brackets" href="#id5" id="id2"&gt;2&lt;/a&gt;.
Note that Postgres also has a ‘SET’ command, but it only affects the current
session values.&lt;/p&gt;
&lt;p&gt;Most configuration properties will be available via configuration groups.
Some, however, do not make sense in the Trove context.&lt;/p&gt;
&lt;p&gt;These include (will be documented in the configuration template):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;guestagent specific (e.g. file paths, passwords, file access rules)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;items that Trove needs to control (replication/clustering/log properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; for the full list of supported
options.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;This work will enable the following client commands:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-patch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-update&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement &lt;em&gt;update_overrides&lt;/em&gt; and &lt;em&gt;apply_overrides&lt;/em&gt; in
the &lt;em&gt;manager&lt;/em&gt; and &lt;em&gt;service&lt;/em&gt; modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A configuration template and validation rules will with changes noted in
&lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; will be provided.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The existing ‘PropertiesCodec’ implementation will be reused to handle
text-file operations.
Configuration overrides will be implemented using the ‘OneFileOverrideStrategy’
of the guestagent configuration manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;TBD (section added after approval)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;All changes will be done in the context of a single task.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Implement configuration-related manager API calls:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The change is largely covered by the existing configuration tests.
Unit tests will be added to validate any Postgres-specific codepaths.
A ‘postgres_helper’ will be contributed to the scenario tests to
enable configuration coverage on this datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on Postgres configuration: &lt;a class="reference external" href="http://www.postgresql.org/docs/9.3/static/runtime-config.html"&gt;http://www.postgresql.org/docs/9.3/static/runtime-config.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Notes on Postgres system administration functions: &lt;a class="reference external" href="http://www.postgresql.org/docs/9.3/static/functions-admin.html"&gt;http://www.postgresql.org/docs/9.3/static/functions-admin.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;div class="section" id="available-configuration-properties"&gt;
&lt;h3&gt;Available Configuration Properties&lt;/h3&gt;
&lt;p&gt;The properties configurable by the user via the Trove API:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;max_connections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;superuser_reserved_connections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bonjour&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bonjour_name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;authentication_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;password_encryption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;db_user_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tcp_keepalives_idle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tcp_keepalives_interval&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tcp_keepalives_count&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared_buffers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;huge_pages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;temp_buffers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_prepared_transactions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;work_mem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maintenance_work_mem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_work_mem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_stack_depth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dynamic_shared_memory_type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;temp_file_limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_files_per_process&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_cost_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_cost_page_hit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_cost_page_miss&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_cost_page_dirty&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_cost_limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bgwriter_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bgwriter_lru_maxpages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bgwriter_lru_multiplier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;effective_io_concurrency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_worker_processes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fsync&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;synchronous_commit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_sync_method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;full_page_writes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_log_hints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_buffers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_writer_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commit_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;commit_siblings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checkpoint_segments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checkpoint_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checkpoint_completion_target&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checkpoint_warning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_keep_segments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_sender_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;synchronous_standby_names&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_defer_cleanup_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hot_standby&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_standby_archive_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_standby_streaming_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_receiver_status_interval&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hot_standby_feedback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_receiver_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_bitmapscan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_hashagg&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_hashjoin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_indexscan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_indexonlyscan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_material&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_mergejoin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_nestloop&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_seqscan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_sort&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable_tidscan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;seq_page_cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;random_page_cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cpu_tuple_cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cpu_index_tuple_cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cpu_operator_cost&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;effective_cache_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_effort&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_pool_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_generations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_selection_bias&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geqo_seed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_statistics_target&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constraint_exclusion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cursor_tuple_fraction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;from_collapse_limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;join_collapse_limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_truncate_on_rotation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_rotation_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_rotation_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client_min_messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_min_messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_min_error_statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_min_duration_statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debug_print_parse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debug_print_rewritten&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debug_print_plan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debug_pretty_print&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_checkpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_connections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_disconnections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_duration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_error_verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_hostname&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_line_prefix&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_lock_waits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_statement&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_temp_files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_timezone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;track_activities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;track_counts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;track_io_timing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;track_functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;track_activity_query_size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_parser_stats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_planner_stats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_executor_stats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_statement_stats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_autovacuum_min_duration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_max_workers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_naptime&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_vacuum_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_analyze_threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_vacuum_scale_factor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_analyze_scale_factor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_freeze_max_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_multixact_freeze_max_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_vacuum_cost_delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autovacuum_vacuum_cost_limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;search_path&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_tablespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;temp_tablespaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check_function_bodies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_transaction_isolation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_transaction_read_only&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_transaction_deferrable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;session_replication_role&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;statement_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lock_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_freeze_min_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_freeze_table_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_multixact_freeze_min_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vacuum_multixact_freeze_table_age&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bytea_output&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;xmlbinary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;xmloption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;datestyle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;intervalstyle&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timezone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timezone_abbreviations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;extra_float_digits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client_encoding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lc_messages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lc_monetary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lc_numeric&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lc_time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_text_search_config&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deadlock_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_locks_per_transaction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;max_pred_locks_per_transaction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;array_nulls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backslash_quote&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;default_with_oids&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;escape_string_warning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lo_compat_privileges&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;quote_all_identifiers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sql_inheritance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;standard_conforming_strings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;synchronize_seqscans&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;transform_null_equals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;exit_on_error&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restart_after_crash&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Guestagent-controlled properties:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;data_directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hba_file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ident_file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;external_pid_file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;listen_addresses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;port&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unix_socket_directories&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unix_socket_group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unix_socket_permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;wal_level&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;archive_mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;archive_command&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;archive_timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_destination&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;logging_collector&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_filename&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log_file_mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update_process_title&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Template for New Trove Specs</title><link>https://specs.openstack.org/openstack/trove-specs/specs/template.html</link><description>
 
&lt;p&gt;Introduction paragraph – what is the motivation for the spec/blueprint?
(Don’t forget to change the title above to something more relevant.)&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/name-of-blueprint"&gt;https://blueprints.launchpad.net/trove/+spec/name-of-blueprint&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;A detailed description of the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Here is where you cover the change you propose to make in detail. How do you
propose to solve this problem?&lt;/p&gt;
&lt;p&gt;If this is one part of a larger effort make it clear where this piece ends. In
other words, what’s the scope of this effort?&lt;/p&gt;
&lt;p&gt;If your specification proposes any changes to the Trove REST API such
as changing parameters which can be returned or accepted, or even
the semantics of what happens when a client calls into the API, then
you should add the APIImpact flag to the commit message. Specifications with
the APIImpact flag can be found with the following query:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z"&gt;https://review.openstack.org/#/q/status:open+project:openstack/trove-specs+message:apiimpact,n,z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Code snippets, etc. should be placed in appropriately marked blocks:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# This is a bash command&lt;/span&gt;
ls -lf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="c1"&gt;# sample code&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Does this impact any configuration files? If so, which ones?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;Does this impact any existing tables? If so, which ones?
Are the changes forward and backward compatible?
Be sure to include the expected migration process&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;Does this change any API that an end-user has access to?
Are there any exceptions in terms of consistency with other APIs?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;If this change proposes a new API, or if this change relates to
security on an existing API, provide details here.&lt;/p&gt;
&lt;p&gt;What are the expectations of, and implications to security on the
Public API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Does this change the Python API? If anything was removed, has it
been properly marked as deprecated?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Will the Trove CLI need to be modified?  If the CLI will just implement
the changes mentioned in the Python API section, it may be enough to
just mention it here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Does this change any internal messages between API and Task Manager or Task
Manager to Guest?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Does this change behavior on the Guest Agent? If so, is it backwards compatible
with API and Task Manager?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;This is an optional section, where it does apply we’d just like a demonstration
that some thought has been put into why the proposed approach is the best one.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;This section should detail how the dashboard (Horizon) should display the new
changes, if relevant.  For example, if adding cluster support for Redis, this
section could say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Enabling&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;clustering&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;simply&lt;/span&gt; &lt;span class="n"&gt;reuse&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt; &lt;span class="n"&gt;pulldown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;selects&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="n"&gt;dialog&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;dynamically&lt;/span&gt;
&lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="n"&gt;overview&lt;/span&gt; &lt;span class="n"&gt;panel&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="n"&gt;specific&lt;/span&gt;
&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt;
&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Who is leading the writing of the code? Or is this a spec where you’re throwing
it out there to see who picks it up?&lt;/p&gt;
&lt;p&gt;If more than one person is working on the implementation, please designate the
primary author and contact.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Dashboard assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&amp;lt;launchpad-id or None&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Can list additional ids if they intend on doing substantial implementation work
on this spec.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;eg. Liberty-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Work items or tasks – break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we’re mostly trying to understand the timeline for implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;In this section, describe the upgrade implications (if any) of the
proposed change. This could include such details as:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;changes to location of files, or layout of the source tree if this
impacts configuration files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;invalidates old backups,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;changes the CLI in a manner that could impact existing scripting,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;eliminates or adds new notifications (events),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any changes that an operator or user must perform as part of the
upgrade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the change has upgrade implications, also remember to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add the DocImpact keyword to the commit, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provide sufficient information in the commit message or in the
documentation bug that gets created.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about the DocImpact keyword, refer to
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Documentation/DocImpact"&gt;https://wiki.openstack.org/wiki/Documentation/DocImpact&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: Documentation for the CLI commands are automatically generated
from the help strings when a new version of the CLI is released, so
a DocImpact keyword is not typically required for python-troveclient
changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Include specific references to specs and/or blueprints in Trove, or in other
projects, that this one either depends on or is related to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this feature require any new library dependencies or code otherwise not
included in OpenStack? Or does it depend on a specific version of library?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Please discuss how the change will be tested. We especially want to know what
int tests and tempest tests will be added. It is assumed that unit
test coverage will be added so that doesn’t need to be mentioned
explicitly, but discussion of why you think unit tests are sufficient
and we don’t need to add more tempest tests would need to be included.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;What is the impact on the docs team of this change? Some changes might require
donating resources to the docs team to have the documentation updated. Don’t
repeat details discussed above, but please reference them here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Please add any useful references here. You are not required to have any
references. Moreover, this specification should still make sense when your
references are unavailable. Examples of what you could include are &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;1&lt;/a&gt;,
&lt;a class="footnote-reference brackets" href="#id6" id="id2"&gt;2&lt;/a&gt;, &lt;a class="footnote-reference brackets" href="#id7" id="id3"&gt;3&lt;/a&gt; and &lt;a class="footnote-reference brackets" href="#id8" id="id4"&gt;4&lt;/a&gt;.&lt;/p&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to mailing list or IRC discussions&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to notes from a summit session&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Links to relevant research, if appropriate&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Anything else you feel it is worthwhile to refer to&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Any additional technical information and data.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 06 Jan 2016 00:00:00 </pubDate></item><item><title>Vertica Cluster Grow and Shrink Support</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/vertica-grow-shrink-cluster.html</link><description>
 
&lt;p&gt;The Vertica database has elastic grow/shrink capabilities which are not
currently supported by the Vertica guest agent for Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/vertica-grow-shrink-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/vertica-grow-shrink-cluster&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Vertica guest agent currently does not leverage the underlying elastic
capabilities of Vertica. This will enable a user to grow a cluster in the
event that they wish to accommodate more data or enable faster query
performance, while scaling down helps avoid costs associated with
overprovisioning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;As Vertica was architected from the ground up to be a clustered system, adding
and removing nodes is relatively simple in comparison to other datastores.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A minimum k-safety configuration option will be added for vertica to allow
the operator to decide their desired level of fault tolerance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The following public API calls will be made available to the Vertica datastore.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Cluster Grow - The existing call payload will not be changed. Implementing
the grow cluster feature will add the new instances to the existing cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cluster Shrink - The existing call payload will not be changed.
Implementing the shrink cluster feature will allow a user to remove
instances from their existing cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Support for the following existing CLI calls.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cluster-grow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-shrink&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No changes should be nessesary to accomplish these actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;To enable more efficient grow and shrink, local data segmentation will be
enabled on Vertica &lt;a class="footnote-reference brackets" href="#id7" id="id1"&gt;1&lt;/a&gt;. This creates additional local, logical segments of
data on a node to enable easier shipping of data between nodes. The number of
local segments is configurable with the scaling factor variable. Local
segmentation has the drawback of making tables with many hundreds of
projections less efficient &lt;a class="footnote-reference brackets" href="#id8" id="id2"&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="grow"&gt;
&lt;h4&gt;Grow&lt;/h4&gt;
&lt;p&gt;Growing a cluster involves two main steps &lt;a class="footnote-reference brackets" href="#id9" id="id3"&gt;3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, a new “host” must be added to the cluster, which in the case of trove
would mean a new instance. The update_vertica script is then called, similar
to the install_vertica script, which handles installation of the vertica
binaries.&lt;/p&gt;
&lt;p&gt;Second, the host must be added as a node to the database. The adminTools
utility is called with the db_add_node command to register the host with the
database.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="shrink"&gt;
&lt;h4&gt;Shrink&lt;/h4&gt;
&lt;p&gt;Removing a node from a Vertica cluster proceeds inversely to addition, with
an extra check to ensure that the minimum k-safety level of the system is
maintained.&lt;/p&gt;
&lt;p&gt;If a user attempts to remove a node that would lower the k-safety
level below the configured level, an error will be thrown.&lt;/p&gt;
&lt;p&gt;After the k-safety check, the host is removed from the database &lt;a class="footnote-reference brackets" href="#id10" id="id4"&gt;4&lt;/a&gt;.
Similarly as with grow, the adminTools utility will be called using the
db_remove_node command.&lt;/p&gt;
&lt;p&gt;Then, the host to be removed is removed from the cluster, using the same
update_vertica script but with the –remove-hosts option.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="k-safety"&gt;
&lt;h4&gt;K-safety&lt;/h4&gt;
&lt;p&gt;Vertica defines three K-safety levels for the number of nodes K that could
fail while allowing the cluster to continue to operate: K=0 for clusters
with 1 or 2 nodes, K=1 for clusters with 3 or 4 nodes, and K=2 for 5 or
more &lt;a class="footnote-reference brackets" href="#id11" id="id5"&gt;5&lt;/a&gt; &lt;a class="footnote-reference brackets" href="#id12" id="id6"&gt;6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Rather than prevent a user from removing nodes that would result in a lower
k-safety value, it is up to the operator to define a minimum level of safety
she is willing to accept. For example, in some cases it may be that the costs
associated with overprovisioning the cluster outweigh the risk of data being
unavailable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Trove could enforce a minimum k-safety level to ensure the integrity of the
cluster, but this could be too restrictive.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;atomic77&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Grow cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shrink cluster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Integration tests will be added or modified as needed in order to test
grow/shrink with the new int-test framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation should be updated to reflect the fact that grow and shrink is
supported for Vertica clusters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;There will be some minor changes to the UI to support grow and shrink buttons
for the cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ClusterManagement/ElasticCluster/LocalDataSegmentation.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ClusterManagement/ElasticCluster/LocalDataSegmentation.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The Vertica documentation recommends local data segmentation be done
with numbers of nodes that are a power of two. Some experimentation
will be required to see what is whether violating this recommendation
is still worthwhile compared to not using local data segmentation at
all&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id9"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/AddingNodes.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/AddingNodes.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/RemovingNodes.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/RemovingNodes.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id11"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;5&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/LoweringTheK-SafetyLevelToAllowForNodeRemoval.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AdministratorsGuide/ManageNodes/LoweringTheK-SafetyLevelToAllowForNodeRemoval.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id12"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id6"&gt;6&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/ConceptsGuide/Components/HighAvailabilityAndRecovery.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/ConceptsGuide/Components/HighAvailabilityAndRecovery.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 04 Jan 2016 00:00:00 </pubDate></item><item><title>Vertica Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/vertica-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/vertica-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/vertica-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Vertica guestagent currently does not support configuration groups for the
single instance case.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;While Vertica has minimal required configuration as one of its design goals, it
is nonetheless possible to configure a large number of parameters &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="databases-in-trove-and-vertica"&gt;
&lt;h3&gt;Databases in Trove and Vertica&lt;/h3&gt;
&lt;p&gt;While Trove thinks of instances as being the parent of one or more databases,
following the model of single-server MySQL, Vertica supports one or more nodes
natively, and databases can span multiple nodes. Configuration options can
also be applied at both the node and database level.&lt;/p&gt;
&lt;p&gt;The Vertica guest agent currently does not support multiple Vertica databases
for both the single instance and clustered cases, so only configuration
options valid at the database level will be exposed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration-changes"&gt;
&lt;h3&gt;Configuration Changes&lt;/h3&gt;
&lt;p&gt;Vertica recommends against writing configuration changes to a configuration
file for version 7.1. It is unclear if this applies to 7.2, or has been
remedied, but for the purposes of providing support for both 7.1 and 7.2,
writing to this file will be avoided &lt;a class="footnote-reference brackets" href="#id7" id="id2"&gt;3&lt;/a&gt;. Configurations can be applied with
the use of the ALTER DATABASE command, and current configuration settings can
be retrieved via the CONFIGURATION_PARAMETERS system view &lt;a class="footnote-reference brackets" href="#id6" id="id3"&gt;2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vertica supports 360 different options as of Vertica 7.2.1. Options related to
authentication and big data support have been excluded. For a complete list of
the options that will be supported, see the Appendix section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;This work will enable the following client commands:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-patch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-update&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that the configuration groups API is not currently supported for clusters,
so only support for single-instance Vertica will be provided.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement &lt;em&gt;update_overrides&lt;/em&gt; and &lt;em&gt;apply_overrides&lt;/em&gt; in the &lt;em&gt;manager&lt;/em&gt; and
&lt;em&gt;service&lt;/em&gt; modules.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/vertica/manager.py
guestagent/datastore/experimental/vertica/service.py
guestagent/datastore/experimental/vertica/system.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Alex Tomic &amp;lt;&lt;a class="reference external" href="mailto:atomic%40tesora.com"&gt;atomic&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;mitaka-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;provide support for viewing and modifying the vertica database-level
configuration options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement configuration-related manager API calls:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to validate implemented functions, and integration
tests added or modified from the new scenario testing framework as needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;The following is the list of parameters that will be supported:&lt;/p&gt;
&lt;p&gt;ActivePartitionCount
AddressCollectorInterval
AdvanceAHMInterval
AHMBackupManagement
AllowNonAsciiNames
AnalyzeRowCountInterval
AnalyzeStatsPlanMaxColumns
AnalyzeStatsSampleBands
ARCCommitPercentage
AuditConfidenceLevel
AuditErrorTolerance
BasicVerticaOptions
BlockCacheSize
BufferQueryOutputForPossibleRetry
CachePositionIndex
CascadeResourcePoolAlwaysReplan
CatalogCheckpointChunkSizeKB
CatalogCheckpointMinLogSizeKB
CatalogCheckpointPercent
CatalogDeindexRename
CheckCRCs
CheckDataTargetSortOrder
ClusterRecoveryWait
CollationExpansion
CompressCatalogOnDisk
CompressDistCalls
CompressNetworkData
ComputeApproxNDVsDuringAnalyzeStats
ContainersPerProjectionLimit
CopyFromVerticaWithIdentity
DatabaseHeartbeatInterval
DBDCorrelationSampleRowCount
DBDCorrelationSampleRowPct
DBDCountDistinctSampleRowCount
DBDCountDistinctSampleRowPct
DBDDeploymentParallelism
DBDDynamicSampling
DBDEncodingSampleRowCount
DBDEncodingSampleRowPct
DBDLargestTableRowCountBoundary
DBDLogInternalDesignProcess
DBDMaxConcurrencyForEncodingExperiment
DBDRepLargeRowCountPct
DBDRepSmallRowCountPct
DBDSampleStorageBandCount
DBDSkewDetectionSampleRowCount
DBDSkewDetectionSampleRowPct
DBDUseOnlyDesignerResourcePool
DefaultIntervalStyle
DefaultSessionLocale
DisableInheritedPrivileges
DisableLocalResegmentation
DisableNodeDownOptimization
DisablePrejoinProjections
DisallowMars
DiskSpacePollingInterval
DMLCancelTM
EEVerticaOptions
EnableAccessPolicy
EnableAllRolesOnLogin
EnableApportionLoad
EnableAutoDMLStats
EnableBlockMemoryManager
EnableCooperativeParse
EnableDataCollector
EnabledCipherSuites
EnableEEThreadPool
EnableEMMJMultiblockSIPS
EnableExprsInProjections
EnableForceOuter
EnableGroupByProjections
EnableJIT
EnableNewPrimaryKeysByDefault
EnableNewUniqueKeysByDefault
EnableParallelHashBuild
EnableParallelSort
EnablePatternMatchingAnyRow
EnablePlanStability
EnablePlanStabilityLookup
EnableResourcePoolCPUAffinity
EnableRuntimePriorityScheduler
EnableSSL
EnableStorageBundling
EnableStrictTimeCasts
EnableTopKProjections
EnableUDTProjections
EnableUniquenessOptimization
EnableVirtualCoreCount
EpochMapInterval
EscapeStringWarning
EvaluateDeletePerformanceSampleStorageBandCount
EvaluateDeletePerformanceSampleStorageCount
ExcludeEphemeralNodesInQueries
ExternalTablesExceptionsLimit
FailoverToStandbyAfter
FencedUDxMemoryLimitMB
FilesPerProjectionLimit
FlexTableDataTypeGuessMultiplier
FlexTableRawSize
ForceUDxFencedMode
FsyncCatalogForLuck
FsyncDataForLuck
GBHashMemCapMB
GlobalEEProfiling
GlobalHeirUsername
GlobalQueryProfiling
GlobalSessionProfiling
GroupGeneratorHashingEnabled
HadoopConfDir
HCatConnectionTimeout
HCatParserName
HCatSlowTransferLimit
HCatSlowTransferTime
HCatSourceName
HCatWebserviceName
HCatWebserviceVersion
HistoryRetentionEpochs
HistoryRetentionTime
JavaBinaryForUDx
JavaSideProcessMinHeapSizeMB
KeepMinMaxOnAllColumns
LGELagThreshold
LoadMaxFinalROSCount
LockTimeout
LogHeartbeatInterval
LowDiskSpaceWarningPct
MaxAutoSegColumns
MaxBundleableROSSizeKB
MaxClientSessions
MaxConstraintChecksPerQuery
MaxDataCollectorFileSize
MaxDesiredEEBlockSize
MaxDVROSPerContainer
MaxLogLineLength
MaxMrgOutROSSizeMB
MaxOptMemMB
MaxOptMemMBInDBD
MaxParsedQuerySizeMB
MaxPartitionCount
MaxQueryRetries
MaxRecoverErrors
MaxRecoverHistoricPasses
MaxRefreshErrors
MaxRefreshHistoricPasses
MaxROSPerStratum
MergeJoinInnerInitialMB
MergeOutCache
MergeOutInterval
MinimumCatalogDiskMegabytes
MinimumDataDiskMegabytes
MinimumDataDiskTempMegabytes
MinSortMergeJoinMB
MoveOutInterval
MoveOutMaxAgeEpochs
MoveOutMaxAgeTime
MoveOutSizePct
NewEEGroupBySmallMemMB
NewEEROSSubdivisionRows
NewEEThreads
NoRecoverShutdownWait
OptVerticaOptions
ParallelizeLocalSegmentLoad
PatternMatchAllocator
PatternMatchingMatchLimitRecursion
PatternMatchingMaxPartition
PatternMatchingMaxPartitionMatches
PatternMatchingPerMatchWorkspaceSize
PatternMatchingUseJit
PatternMatchStackAllocator
PinProcessors
PinProcessorsOffset
PreExcavatorReplicatedProjection
PruneDataCollectorByTime
PruneSystemTableColumns
PurgeMergeoutPercent
RangeWindowMaxMem
ReapBeforeRecover
RecoverByContainer
RecoveryDirtyTxnWait
ReflexiveMoveout
RefreshByContainer
RemoteInitiatorBufSize
RemoveSnapshotInterval
ReplayDeleteAlgorithmSwitchThreshold
ResLowLimPctOfHighLim
RestrictSystemTables
ROSCacheBlocks
ROSCacheLargeBlocks
ROSPerStratum
SaveDCEEProfileThresholdUS
SecurityAlgorithm
SegmentAutoProjection
SegmentDataCollector
SessionProfilingAgeOut
SlowDeleteConsoleWarningLimit
SlowDeleteSystemWarningLimit
SmallROSSize
SnapshotRetentionTime
SnmpTrapDestinationsList
SnmpTrapEvents
SnmpTrapsEnabled
SortCheckOption
SortOrderReportLevel
SortWorkerThreads
SSLCA
SSLCertificate
SSLPrivateKey
StandardConformingStrings
StrictUDxParameterChecking
SyslogEnabled
SyslogEvents
SyslogFacility
SystemMonitorInterval
SystemMonitorThreshold
TerraceRoutingFactor
TextIndexComputeDeletedTokens
TextIndexMaxTokenLength
TopKHeapMaxMem
TransactionIsolationLevel
TransactionMode
TrustConstraintsAsUnique
UDxFencedBlockTimeout
UDxFencedCancelTimeout
UDxFencedExternalProcedureTimeout
UseModularHashForReseg
UseOnlyResilientRedistribution
UseRecoveringNodesInVirtualTableQueries
UseSafeDecompression
UseV50IntegerDivision
UseZygoteForExternalProcedures
WarnOnIncompleteStartupPacket
WithClauseMaterialization&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/AdministratorsGuide/ConfiguringTheDB/ConfiguringTheDatabase.htm"&gt;https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/AdministratorsGuide/ConfiguringTheDB/ConfiguringTheDatabase.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/CONFIGURATION_PARAMETERS.htm"&gt;https://my.vertica.com/docs/7.2.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/MONITOR/CONFIGURATION_PARAMETERS.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/AdministratorsGuide/ConfiguringTheDB/SettingandClearingConfigParameters.htm"&gt;https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/AdministratorsGuide/ConfiguringTheDB/SettingandClearingConfigParameters.htm&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Thu, 24 Dec 2015 00:00:00 </pubDate></item><item><title>Implement Galera cluster provisioning</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/mariadb-clustering.html</link><description>
 
&lt;p&gt;High availability of database instances is required in order to build users
confidence when running production workloads in Trove.
Apart from replication, clustering ensures the deployment is highly available
by allowing data to be accessed from any node in the cluster.
It enhances system uptime, prevents from data loss and makes the architecture
more scalable for future growth.
Currently Trove has support for MongoDB clusters and Percona clusters.
Trove clustering for the MariaDB datastore will be based on Galera Cluster,
a synchronous multi-master database cluster.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mariadb-clustering"&gt;https://blueprints.launchpad.net/trove/+spec/mariadb-clustering&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;MariaDB datastore does not have support for clustering. Adding a cluster
implementation will allow users to create, read and write scalable and highly
available deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Galera Cluster will leverage the base cluster implementation that currently
exists in Trove by creating pluggable and configurable strategies.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;An instance of Galera Cluster consists of a series of nodes,
preferably three or more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initial cluster creation will start with 3 or more nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cluster inspection will return IPs of all its nodes in order to
allow read and write to any node at any time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The name of each instance will be automatically generated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clusters shall allow the cluster nodes to be resizable for volume
and flavors.
No validation will occur if a user resizes volumes or flavors
of an instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following will be changed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Base classes for Percona Cluster and Galera Cluster will be added to
common/strategies/cluster/experimental/galera_common/{api,taskmanager,guestagent}.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Percona Cluster specialization will live under
common/strategies/cluster/experimental/pxc/{api,taskmanger,guestagent}.py
This contains the API, the taskmanager strategy to handle the
cluster provisioning for Percona and the guestagent strategy
to handle the cluster provisioning, configuration and execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Galera Cluster specialization will be added to
common/strategies/cluster/experimental/mariadb/{api,taskmanager,guestagent}.py
This contains the API, the taskmanager strategy to handle the
cluster provisioning for Galera and the guestagent strategy
to handle the cluster provisioning, configuration and execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new datastore configuration section will be added.
This initial implementation will add no Galera Cluster
specific configuration options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;This implementation will leverage the existing database schema for cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The API request for creating/deleting cluster will remain unchanged.
However, there will be subtle differences in the response.
Galera clustering, as Percona implementation, will return all IPs of its nodes.
This will be used for the user who wants to scale read/write.&lt;/p&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mariadb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c33385b2-6c2a-491e-b44e-bcbb4af24136"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-14T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-14T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mariadb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;c33385b2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;c2a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;491&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b44e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bcbb4af24136&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c33385b2-6c2a-491e-b44e-bcbb4af24136"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-14T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-12-14T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mariadb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-instance"&gt;
&lt;h4&gt;Show Instance&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;c33385b2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;c2a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;491&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b44e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bcbb4af24136&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;416&lt;/span&gt;&lt;span class="n"&gt;b0b16&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ba55&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4302&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bbd3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ff566032e1c1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dfbbd9ca-b5e1-4028-adb7-f78643e17998"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mariadb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.17&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-clusters"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"clusters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"c33385b2-6c2a-491e-b44e-bcbb4af24136"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-04-25T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mariadb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-cluster"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;c33385b2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;c2a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;491&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b44e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bcbb4af24136&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt; &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The same CLI implemented for Percona Cluster will be used to interact
with Galera Cluster. The main features are accessed as follows:&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-create

usage: trove cluster-create &amp;lt;name&amp;gt; &amp;lt;datastore&amp;gt; &amp;lt;datastore_version&amp;gt;
                            [--instance &amp;lt;instance&amp;gt;]

Creates a new cluster.

Positional arguments:
  &amp;lt;name&amp;gt;                Name of the cluster.
  &amp;lt;datastore&amp;gt;           A datastore name or UUID.
  &amp;lt;datastore_version&amp;gt;   A datastore version name or UUID.

Optional arguments:

  --instance &amp;lt;flavor_id=flavor_id,volume=volume&amp;gt;
                        Create an instance for the cluster. Specify
                        multiple times to create multiple instances.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-create products mariadb "10" \
  --instance flavor_id=7,volume=2 \
  --instance flavor_id=7,volume=2 \
  --instance flavor_id=7,volume=2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Property&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mariadb&lt;/span&gt;                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;                                   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;aa6ef0f5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dbef&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8952&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;573&lt;/span&gt;&lt;span class="n"&gt;ad881e717&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_description&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_name&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BUILDING&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The cluster-create command will create a cluster with identical instances.
Trove will choose a instance to start with the –wsrep-new-cluster option,
then the remaining instances will be started sequentially.
The cluster will be marked ACTIVE when all instances have started and
the database is available for use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-show

usage: trove cluster-show &amp;lt;cluster&amp;gt;

Shows details of a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID or name of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-show aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Property&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mariadb&lt;/span&gt;                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;                                   &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;aa6ef0f5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dbef&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8952&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;573&lt;/span&gt;&lt;span class="n"&gt;ad881e717&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;                &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;                             &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_description&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;            &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;task_name&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NONE&lt;/span&gt;                                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="n"&gt;T01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------+--------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster-instance"&gt;
&lt;h4&gt;Show Cluster Instance&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-instances

usage: trove cluster-instances &amp;lt;cluster&amp;gt;

Lists all instances of a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID or name of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-instances aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;                                  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;45532&lt;/span&gt;&lt;span class="n"&gt;fc4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;661&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4030&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;ca4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="n"&gt;f02a2b337&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7458&lt;/span&gt;&lt;span class="n"&gt;a98d&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;f89&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;dfd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bb61&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;cf1d65c121&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1557208&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;c23&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4537&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a9f2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="n"&gt;a9db38d3a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+-------------------------------------+----------------+-----------+------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-list

usage: trove cluster-list [--limit &amp;lt;limit&amp;gt;] [--marker &amp;lt;ID&amp;gt;]

Lists all the clusters.

Optional arguments:
  --limit &amp;lt;limit&amp;gt;  Limit the number of results displayed.
  --marker &amp;lt;ID&amp;gt;    Begin displaying the results for IDs greater than the
                   specified marker. When used with --limit, set this to
                   the last ID displayed in the previous run.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-list
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;DsVersion&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;IP&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mariadb&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip1&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NONE&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;percona&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ip2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;BUILDING&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+--------+----------+-----------+-----------+----------+-----------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove help cluster-delete

usage: trove cluster-delete &amp;lt;cluster&amp;gt;

Deletes a cluster.

Positional arguments:
  &amp;lt;cluster&amp;gt;  ID of the cluster.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-delete aa6ef0f5-dbef-48cd-8952-573ad881e717
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None defined yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The datastore must be enabled as a clustering datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;vkmc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tellesnobrega&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Mitaka-3&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Trove Integration change to add support for mariadb-galera-server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Task Manager strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guest Agent strategy implementation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;To enable MariaDB cluster support, a different package needs to be installed
on the guest instance rather than the default. This can be solved by updating
the packages installed on the datastore version, although it is recommended
that a new image with the desired package is built and loaded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit tests will be added to cover non-trivial code paths.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration tests will be added to test end-to-end cluster features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The response API will look different due to the nature of Galera clusters.
Precisely, the view will contain all the IPs of the instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Besides the existing API, there will be new API to grow/shrink cluster handled
in a follow up spec.&lt;/p&gt;
&lt;p&gt;Trove does not monitor the status of the cluster instances. If an instance in
the cluster becames detached from the PRIMARY instance, it will responsability
of the user to detect the situation and take a corrective action.
If the instance does not re-attach to the cluster when a
Incremental State Transfer (IST) or State Snapshot Transfer (SST) is possible,
the user would need to delete the instance and add a new node to the cluster.
This will be later substituted by the grow/shrink cluster feature.&lt;/p&gt;
&lt;p&gt;In the event of a Nova compute reboot, the nodes will automatically restart,
and the cluster will automatically recover provided that the nodes can
determine that the PRIMARY component can be properly recovered.
In the case that the PRIMARY component cannot be recovered,
operator intervention would be required to manually restart the cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 14 Dec 2015 00:00:00 </pubDate></item><item><title>CouchDB Database &amp;amp; User Functions</title><link>https://specs.openstack.org/openstack/trove-specs/specs/mitaka/couchdb-database-user-functions.html</link><description>
 
&lt;p&gt;Even though CouchDB has been added as an experimental datastore in Trove, the
functionality yet has some gaps to be filled. The motivation behind this spec
is to implement some of those missing user and database functions for the
CouchDB datastore in Trove.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/couchdb-database-user-functions"&gt;https://blueprints.launchpad.net/trove/+spec/couchdb-database-user-functions&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, a CouchDB instance can be created using Trove but the
functionality is very limited. No user or database actions can be performed
via the Trove CLI. While, it is possible to perform such operations by
accessing the CouchDB administration interface called Futon &lt;a class="footnote-reference brackets" href="#id5" id="id1"&gt;1&lt;/a&gt;, it is not
within the scope of Trove. Therefore for ease of use and consistency, it is
best that these database and user functionalities for CouchDB be implemented
as part of Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Implementation of the basic user and database functions will be performed for
the CouchDB datastore in Trove using an HTTP-based REST API which CouchDB uses
to communicate with the server. Curl commands will be sent over HTTP requests
to the CouchDB server which will then execute actions.&lt;/p&gt;
&lt;p&gt;The new operations that will be supported are as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create/delete/show user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grant/revoke/show access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;root enable/show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create/delete database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list databases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CouchDBAdmin&lt;/span&gt;&lt;/code&gt; class will be created in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;service.py&lt;/span&gt;&lt;/code&gt; which will have
these methods in it and the functions in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;manager.py&lt;/span&gt;&lt;/code&gt; will be updated to
call these new methods. Each method will use the core CouchDB API to make
appropriate HTTP requests for that functionality on the server.&lt;/p&gt;
&lt;p&gt;As of now an API extension for CouchDB does not exist so a new API extension
will be created to implement datastore specifics while moderating user/
database operations. The validation in effect in the CouchDB specific models
will correspond to CouchDB datastore requirements.&lt;/p&gt;
&lt;div class="section" id="couchdb-security"&gt;
&lt;h3&gt;CouchDB Security&lt;/h3&gt;
&lt;p&gt;On a fresh CouchDB instance, the server allows any request to be made by
anyone - it’s an Admin Party &lt;a class="footnote-reference brackets" href="#id6" id="id2"&gt;2&lt;/a&gt; . To enable the user functionalities, the
guest agent’s CouchDB server will be made secure by creating a Trove user
‘os_admin’ by default. When a guest is first started, the os_admin user will
be created and will be connected to the server using a password generated by
the guest. This will be done using the following command-
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;PUT&lt;/span&gt; &lt;span class="pre"&gt;http://localhost:5984/_config/admins/os_admin&lt;/span&gt; &lt;span class="pre"&gt;-d&lt;/span&gt; &lt;span class="pre"&gt;'"password"'&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The username and generated password will be stored in a file in the home ~
directory on the instance (stream_codecs.JsonCodec will be used to handle
it). All other users that are created are non-admin users so this
preventing anybody from accidentally creating an admin user &lt;a class="footnote-reference brackets" href="#id7" id="id3"&gt;3&lt;/a&gt; . The only
admin user that can be created is ‘root’ using the trove root-enable command
by creating a user on the couchDB server with admin privileges.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The user will be able to run the implemented functions for CouchDB datastore
via CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following Trove command line commands will be functional for CouchDB:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;trove user-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-grant-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-revoke-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove user-show-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove root-enable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove root-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove database-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove database-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove database-list&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The CouchDB guest agent will be modified to support additional database and
user functionality. In particular the following files will have added
components:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;trove/guestagent/datastore/experimental/couchdb/manager.py
trove/guestagent/datastore/experimental/couchdb/service.py
trove/guestagent/datastore/experimental/couchdb/system.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Several new guest agent functions will be implemented using the CouchDB API.
Below are sample API calls and associated details for each guest agent method.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;create_user&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create non-admin user with name &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;username&lt;/span&gt;&lt;/code&gt; and password &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;password&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;curl -X PUT http://os_admin:password@localhost:5984/_users/org.couchdb
.user:username &lt;span class="se"&gt;\&lt;/span&gt;
-H &lt;span class="s2"&gt;"Accept: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
-H &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
-d &lt;span class="s1"&gt;'{"name": "username", "password": "password", "roles": [], "type":&lt;/span&gt;
&lt;span class="s1"&gt;"user"}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;list_users&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;List all the users from the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_users&lt;/span&gt;&lt;/code&gt; and all the databases
from the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_all_dbs&lt;/span&gt;&lt;/code&gt;. Then cross reference to list users and
the databases that they have access to.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_users/_all_docs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_all_dbs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/databasename/_security&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;delete_user&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deletes user &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;username&lt;/span&gt;&lt;/code&gt; from the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_users&lt;/span&gt;&lt;/code&gt; corresponding
to rev number 1-3cd11775d7e3ba15a9f8c553cb3d47bd. The rev number for the
document to be obtained using the second command listed below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;DELETE&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_users/org.&lt;/span&gt;
&lt;span class="pre"&gt;couchdb.user:username?rev=1-3cd11775d7e3ba15a9f8c553cb3d47bd&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_users/_all_docs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;get_user&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shows the complete information associated with a specific user - username,
databases user has access to and permissions(admin/member).&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_all_dbs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/databasename/_security&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;enable_root&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create user “root” and grant the role “admin”&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;curl -X PUT http://os_admin:password@localhost:5984/_config/admins/
root -d &lt;span class="s1"&gt;'"password"'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;is_root_enabled&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Checks if user root exists in the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_config&lt;/span&gt;&lt;/code&gt; and has admin
privileges&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_config/_admins&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;delete_root&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deletes the root user from the CouchDB instance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;curl -X DELETE http://
os_admin:password@localhost:5984/_config/admins/root
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;grant_access&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modify the role of user &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;username&lt;/span&gt;&lt;/code&gt; for database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;databasename&lt;/span&gt;&lt;/code&gt; to include
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;username&lt;/span&gt;&lt;/code&gt; as a listed admin&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;curl -X PUT http://os_admin:password@localhost:5984
/databasename/_security &lt;span class="se"&gt;\&lt;/span&gt;
&amp;gt; -d &lt;span class="s1"&gt;'{"admins":{"names":[], "roles":[]}, "members":{"names”:[&lt;/span&gt;
&lt;span class="s1"&gt;“username”],”roles":[]}}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;revoke_access&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Similar to the implementation of grant access, modify the role of user `
username`` for database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;databasename&lt;/span&gt;&lt;/code&gt; to remove &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;username&lt;/span&gt;&lt;/code&gt; as a listed
member&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;curl -X PUT http://os_admin:password@localhost:5984
/databasename/_security &lt;span class="se"&gt;\&lt;/span&gt;
&amp;gt; -d &lt;span class="s1"&gt;'{"admins":{"names":[], "roles":[]}, "members":{"names”:[],&lt;/span&gt;
&lt;span class="s1"&gt;”roles":[]}}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;list_access&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lists all the databases from the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_all_dbs&lt;/span&gt;&lt;/code&gt;. Then cross
reference to list all the databases that the specified user has has access to.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_all_dbs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/databasename/_security&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;create_database&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Creates a database with name &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;database_name&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;PUT&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/database_name&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The database name must consist of one or more of the following characters and
the name must begin with a lowercase letter &lt;a class="footnote-reference brackets" href="#id8" id="id4"&gt;4&lt;/a&gt; .&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Lowercase characters (a-z)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Digits (0-9)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any of the characters _, $, (, ), +, -, and /.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;delete_database&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deletes the database with name &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;database_name&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;DELETE&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/database_name&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;list_databases&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lists all the databases from the system database &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_all_dbs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt; &lt;span class="pre"&gt;-X&lt;/span&gt; &lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;http://os_admin:password@localhost:5984/_all_dbs&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dashboard-impact-ux"&gt;
&lt;h2&gt;Dashboard Impact (UX)&lt;/h2&gt;
&lt;p&gt;The dashboard will need to be updated for the users and databases tabs to be
enabled for the CouchDB datastore. No new features will need to be added to
the dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;imandhan (launchpad id)
Ishita Mandhan &amp;lt;&lt;a class="reference external" href="mailto:imandha%40us.ibm.com"&gt;imandha&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Mitaka&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Implementation of the functionality of user and database functions for
CouchDB. Involves working on the manager, service and system files
primarily. Tests will be written as required - both unit tests and int tests.
The work will be split into 5 parts-&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Enable authentication on server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create/delete/get/list user&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable/check root&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grant/revoke/list access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create/delete/list database&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests and integration tests will be added as necessary to test new code
added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The CouchDB Trove documentation will need to be updated to indicate that user
and database functions have been implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id5"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;CouchDB Futon: &lt;a class="reference external" href="http://docs.couchdb.org/en/1.6.1/intro/futon.html"&gt;http://docs.couchdb.org/en/1.6.1/intro/futon.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;CouchDB Security: &lt;a class="reference external" href="http://docs.couchdb.org/en/1.6.1/intro/security.html"&gt;http://docs.couchdb.org/en/1.6.1/intro/security.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;CouchDB Authentication: &lt;a class="reference external" href="http://docs.couchdb.org/en/1.6.1/config/auth.html"&gt;http://docs.couchdb.org/en/1.6.1/config/auth.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;CouchDB Database Name Restrictions: &lt;a class="reference external" href="http://couchdb-13.readthedocs.org/en/latest/api/database/"&gt;http://couchdb-13.readthedocs.org/en/latest/api/database/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="appendix"&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 25 Nov 2015 00:00:00 </pubDate></item><item><title>Example Snippet Generator</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/example-generator.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/example-snippet-generator"&gt;https://blueprints.launchpad.net/trove/+spec/example-snippet-generator&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove has ssome really nice documentation featuring snippets showing the
what the JSON looks like for the standard REST calls and response. The only
issue is these docs are not validated, meaning if the API changes in ways big
or small its possible they will not match what a present day user of Trove
will see.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This blueprint proposes we fix this by automatically generating these examples
and validating them in Trove.&lt;/p&gt;
&lt;p&gt;The fix will involve actually making calls against the real Trove code and
capturing the bodies of the requests and responses then writing them to the
text files used by the docs. We can do this quickly by utilizing the same “fake
mode” test doubles that are used by the tests already run in Tox. The beauty
is all of the API code that determines what the request and responses look like
will get run just the same as if the tests had executed against a fully stood
up Trove environment, with the advantage that certain UUIDs can be altered to
avoid them changing with every test run.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="data-model-impact"&gt;
&lt;h3&gt;Data Model Impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rest-api-impact"&gt;
&lt;h3&gt;REST API Impact&lt;/h3&gt;
&lt;p&gt;None, except that it will be tested even better than before.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="security-impact"&gt;
&lt;h3&gt;Security Impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="notifications-impact"&gt;
&lt;h3&gt;Notifications Impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="other-end-user-impact"&gt;
&lt;h3&gt;Other End User Impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="performance-impact"&gt;
&lt;h3&gt;Performance Impact&lt;/h3&gt;
&lt;p&gt;The snippet generation will run in mere seconds as part of Tox. There will be
no noticeable impact on the developers of Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="other-deployer-impact"&gt;
&lt;h3&gt;Other Deployer Impact&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="developer-impact"&gt;
&lt;h3&gt;Developer Impact&lt;/h3&gt;
&lt;p&gt;The generation will run fast enough to be invisible to most developers. However
developers will be aware if they inadvertently change anything in the request
or response payload and will have to argue for the changes to the API, even
if they’re merely additions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="community-impact"&gt;
&lt;h3&gt;Community Impact&lt;/h3&gt;
&lt;p&gt;The generation of snippets will usher in a new golden era of devs and doc
writers working together. Maybe sometimes devs will be doc writers, or doc
writers will be devs. It isn’t a stretch to suggest it will be a utopia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;We could continue the implied agreement that devs are always constantly reading
the docs and treating that as a contract, and that with each change they
rabidly run integration tests but also manually run tests and inspect the
output, making sure the snippets shown in the docs are accurate. Unfortunately
since many of the current snippets &lt;em&gt;are&lt;/em&gt; inaccurate I don’t think this will
work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Tim Simpson&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement the snippets generator.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;div class="section" id="tempest-tests"&gt;
&lt;h3&gt;Tempest Tests&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="functional-tests"&gt;
&lt;h3&gt;Functional Tests&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="api-tests"&gt;
&lt;h3&gt;API Tests&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;We will need to change the snippets at least initially as they have changed
so much since when they were originally authored.&lt;/p&gt;
&lt;div class="section" id="user-documentation"&gt;
&lt;h3&gt;User Documentation&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="developer-documentation"&gt;
&lt;h3&gt;Developer Documentation&lt;/h3&gt;
&lt;p&gt;We will need to document how this works in the Tox file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;/div&gt;
</description><pubDate>Thu, 24 Sep 2015 00:00:00 </pubDate></item><item><title>Datastore maturity, experimental datastores</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/experimental-datastores.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/experimental-datastores"&gt;https://blueprints.launchpad.net/trove/+spec/experimental-datastores&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hitherto, Trove has not made a clear distinction of which datastores are considered to be “experimental” and which are considered to be “suitable for general use”. At the mid-cycle in Seattle (Kilo release) we discussed the possibility of introducing a clear definition of what an “experimental” datastore would be and how one could migrate a datastore from “experimental” to “suitable for general use”.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;When code for a datastore is submitted to Trove, there is no clear indication whether that datastore is in a state that would be sufficient for general use. For example, while a single instance datastore of MySQL is perfectly usable for some development and test use cases but a single instance datastore of (say) Cassandra is much less useful. A datastore that supports backup and restore is more useful than one that does not.&lt;/p&gt;
&lt;p&gt;As a community we wish to be welcoming of changes but no all change sets are made equal. Some include extensive capabilities and test coverage while others are more basic. In an effort to make it clear what we, as a community, believe is the “readiness” of a datastore, we believe that a classification of datastores is a good improvement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;div class="section" id="introduce-a-classification-of-datastores"&gt;
&lt;h3&gt;Introduce a classification of datastores&lt;/h3&gt;
&lt;p&gt;It is proposed that we create three groups of datastores as described in detail below. This classification will mean that any datastore could be considered to be either (a) “experimental”, (b) “technical preview”, or (c) “stable”.&lt;/p&gt;
&lt;p&gt;In each release, beginning with the Kilo release, each datastore will be given a classification that will be one of the values listed above based strictly on its adherence to the requirements for each of those classifications.&lt;/p&gt;
&lt;p&gt;The classifications will be inclusive; i.e. a datastore that meets the “technical preview” requirements must also meet all the requirements for “experimental”, and a datastore that meets the “stable” requirements must also meet all the requirements for “technical preview”.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="introduce-a-classification-of-strategies"&gt;
&lt;h3&gt;Introduce a classification of strategies&lt;/h3&gt;
&lt;p&gt;In a similar vein, we will also assign a classification to each strategy. Some strategies may be more throughly vetted and tested (for example) than others. While (purely for purposes of illustration) mysql_binlog may be considered “stable”, one could have a different replication strategy that was considered “experimental”.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;At the very least, this change will impact the trove-guestagent.conf file as it lists the datastore registry by providing the path to the implementation (manager.py)&lt;/p&gt;
&lt;p&gt;Any similar location either in a configuraiton file (or for that matter, in the code) that calls out a location of an implementation will have to change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;This should have no database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;This change has no impact on the Public API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;Not applicable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No changes to the internal API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;It does not change the behavior of the guest agent, merely the location of the code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="initial-classifications"&gt;
&lt;h3&gt;Initial Classifications&lt;/h3&gt;
&lt;p&gt;As part of this change, it is proposed that the following assignments be made.&lt;/p&gt;
&lt;p&gt;Stable: MySQL
Technical Preview: Cassandra and MongoDB
Experimental: All others&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="requirements"&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Experimental&lt;/p&gt;
&lt;p&gt;A datastore will be considered for merging in the experimental stage if it includes the following items.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implementation of a basic subset of the trove API including create and delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guest agent “elements” that will allow a user to create a guest agent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a definition of supported operating systems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;basic unit tests that will verify the operation of the guest agent and test suite that is non-voting&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A strategy will be considered experimental if an implementation is provided and includes basic unit tests to verify operation of the strategy. A passing, and non-voting test suite should also be provided.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Technical Preview&lt;/p&gt;
&lt;p&gt;A datastore will be considered for “Technical Preview” if it meets the requirements of “Experimental” and further&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implements API’s required to implement the capabilities of the datastore as defined in the datastore compatibility matrix that is at [&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Trove/DatastoreCompatibilityMatrix"&gt;https://wiki.openstack.org/wiki/Trove/DatastoreCompatibilityMatrix&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that it is not required that the datastore implement all features (resize, backup, replication, clustering, …) to meet this classification.&lt;/p&gt;
&lt;p&gt;It is also required that non-voting gate tests for all capabilities and a mechanism to build a guest image that will allow a user to exercise these capabilities is provided.&lt;/p&gt;
&lt;p&gt;A strategy will not (normally) be considered for Technical Preview classification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stable&lt;/p&gt;
&lt;p&gt;A datastore will be considered “Stable” if it meets the requirements of “Technical Preview” and a stable voting test suite is part of the gate.&lt;/p&gt;
&lt;p&gt;A strategy will be considered “Stable” if it meets the requirements of “Experimental” and also has stable voting tests as part of the gate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="details-of-change"&gt;
&lt;h3&gt;Details of Change&lt;/h3&gt;
&lt;p&gt;The plan is to edit all files required to reflect the change in location of some datastores and strategies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The only other alternative is to have a webpage that lists this information without actually reorganizing the code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;amrith
slicknik&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;kilo-3&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine which datastores are in each of the proposed classifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine which strategies are in each of the proposed classifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the change to relocate code into the appropriate directory structure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement changes in trove-integration to match this (redstack) if appropriate&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;None&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Each datastore will have to be launched and verified for proper operation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;This will have a documentation impact and a bug will be opened for this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This was discussed at the mid-cycle. The etherpad is [&lt;a class="reference external" href="https://etherpad.openstack.org/p/trove-kilo-sprint-state-of-ci"&gt;https://etherpad.openstack.org/p/trove-kilo-sprint-state-of-ci&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><pubDate>Thu, 24 Sep 2015 00:00:00 </pubDate></item><item><title>MongoDB Backup and Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mongodb-backup-restore.html</link><description>
 
&lt;p&gt;Despite the previous efforts, Trove still does not provide backup or restore
functionality for MongoDB. This blueprint aims to support backup and restore
for single instances.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/backups-single-instance-mongodb"&gt;https://blueprints.launchpad.net/trove/+spec/backups-single-instance-mongodb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is also a previous blueprint that incorporated single-instance backup
&lt;a class="footnote-reference brackets" href="#id15" id="id1"&gt;7&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Backup and restore capability is important for eventually moving the MongoDB
datastore out of the “experimental” stage. MongoDB provides two utilities,
mongodump and mongorestore, which work with BSON-based files: efficient, binary
equivalents of the JSON data that MongoDB manages. These utilities will be used
to provide a standard backup and restore strategy for the MongoDB datastore,
equivalent to the MySQLDump strategy for MySQL-based datastores.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;An initial simple backup and restore strategy for MongoDB will be implemented
using the default parameters to the mongodump and mongorestore utilities. For
compatibility, it will avoid the new features provided in 3.0 (backups with
oplogs) and avoid the options no longer supported in 3.0 (backups taken with
direct filesystem access to the database).&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The default values for backup_strategy, backup_namespace and restore_namespace
for MongoDB will change to point to the appropriate locations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;There are no changes to the existing API, but this blueprint enables the use of
the backup-create, backup-delete and backup-list CLI commands for MongoDB
datastores.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The MongoDB guest agent will be modified to support the new backup and restore
strategies.&lt;/p&gt;
&lt;p&gt;It is currently unclear whether the MongoDB backup and restore tools directly
support streaming. There is an open JIRA ticket &lt;a class="footnote-reference brackets" href="#id13" id="id2"&gt;5&lt;/a&gt;, and some unofficial
third-party tools exist to support streaming &lt;a class="footnote-reference brackets" href="#id14" id="id3"&gt;6&lt;/a&gt;. This seems to contradict the
documentation &lt;a class="footnote-reference brackets" href="#id16" id="id4"&gt;8&lt;/a&gt; which suggests streaming is supported. If streaming can be
implemented and supported it will be used, otherwise backup and restore will
fall back to a two-stage process.&lt;/p&gt;
&lt;p&gt;The backup procedure will use the mongodump command to connect directly to the
running MongoDB server and dump the contents of the database onto local
storage, or compressed and streamed on the fly, if supported. The backup will
be streamed to the container configured in the backup_swift_container
configuration option.&lt;/p&gt;
&lt;p&gt;The restore procedure works in reverse, streaming and uncompressing the backup
from object storage back onto the guest, then using the mongorestore command to
restore the database, or streamed and uncompressed in-place, if the tools
support it.&lt;/p&gt;
&lt;p&gt;The _perform_restore and create_backup methods are implemented in:
trove/guestagent/datastore/experimental/mongodb/manager.py&lt;/p&gt;
&lt;p&gt;The backup and restore implementation will go in their respective strategy
folders: trove/guestagent/strategies/backup/experimental/mongo_impl.py
trove/guestagent/strategies/restore/experimental/mongo_impl.py&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;As of version 3.0, MongoDB supports consistent, point-in-time snapshots with
the use of –oplog to the mongodump command for single-server deployments.
Operations committed after the start of the mongodump command are logged to a
separate file, and this file can be replayed with the –oplogReplay parameter
to mongorestore. As previous versions of MongoDB, and sharded installations do
not support this, it has been left as future work: a subclassed backup/restore
strategy could be easily implemented for MongoDB 3.0 guests.&lt;/p&gt;
&lt;p&gt;In addition, the MongoDB documentation recommends filesystem snapshots as the
preferred way to do backups &lt;a class="footnote-reference brackets" href="#id9" id="id5"&gt;1&lt;/a&gt;. This pushes the problem down to the storage
layer, and so is currently not implemented as a backup/restore strategy for any
datastores in Trove. A spec was previously proposed &lt;a class="footnote-reference brackets" href="#id10" id="id6"&gt;2&lt;/a&gt; &lt;a class="footnote-reference brackets" href="#id11" id="id7"&gt;3&lt;/a&gt;, and discussed on
the mailing list &lt;a class="footnote-reference brackets" href="#id12" id="id8"&gt;4&lt;/a&gt; but has yet to be implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee: atomic77&lt;/p&gt;
&lt;p&gt;Building on previous efforts of:&lt;/p&gt;
&lt;p&gt;Ramashri Umale &amp;lt;&lt;a class="reference external" href="mailto:rumale%40ebaysf.com"&gt;rumale&lt;span&gt;@&lt;/span&gt;ebaysf&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;, Viswa Vutharkar &amp;lt;&lt;a class="reference external" href="mailto:vpvutharkar%40ebaysf.com"&gt;vpvutharkar&lt;span&gt;@&lt;/span&gt;ebaysf&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Target Milestone for completion:&lt;/p&gt;
&lt;p&gt;liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rebase of last patchset uploaded on Oct 14, 2014 to current upstream trove&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;change backup/restore to operate on a running MongoDB, as MongoDB 3.0
deprecates –journal and –dbpath for mongodump&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;review existing test cases for gaps, implement as necessary&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Test cases used for testing backup/restore for MySQL will be adapted to run
against MongoDB.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation should reflect that MongoDB backup/restore is supported for
single instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id9"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.mongodb.org/manual/tutorial/backup-with-filesystem-snapshots/"&gt;http://docs.mongodb.org/manual/tutorial/backup-with-filesystem-snapshots/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id6"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/volume-snapshot"&gt;https://blueprints.launchpad.net/trove/+spec/volume-snapshot&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id11"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id7"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Trove/volume-data-snapshot-design"&gt;https://wiki.openstack.org/wiki/Trove/volume-data-snapshot-design&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id12"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id8"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://lists.openstack.org/pipermail/openstack-dev/2014-April/032673.html"&gt;http://lists.openstack.org/pipermail/openstack-dev/2014-April/032673.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id13"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;5&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://jira.mongodb.org/browse/TOOLS-23"&gt;https://jira.mongodb.org/browse/TOOLS-23&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id14"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;6&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/timisbusy/dumpstr"&gt;https://github.com/timisbusy/dumpstr&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id15"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;7&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/single-instance-mongodb-ga"&gt;https://blueprints.launchpad.net/trove/+spec/single-instance-mongodb-ga&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id16"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;8&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.mongodb.org/manual/reference/program/mongodump/#bin.mongodump"&gt;http://docs.mongodb.org/manual/reference/program/mongodump/#bin.mongodump&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Thu, 24 Sep 2015 00:00:00 </pubDate></item><item><title>MariaDB Datastore Support</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mariadb-datastore-support.html</link><description>
 
&lt;p&gt;MariaDB &lt;a class="footnote-reference brackets" href="#id6" id="id1"&gt;1&lt;/a&gt; is a community-developed fork of MySQL licensed under GNU GPL.&lt;/p&gt;
&lt;p&gt;It aims to maintain high compatibility with MySQL, ensuring a “drop-in”
replacement capability with library binary equivalency and exact matching
with MySQL APIs and commands.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mariadb-datastore-support"&gt;https://blueprints.launchpad.net/trove/+spec/mariadb-datastore-support&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;MariaDB versioning follow the MySQL’s versioning scheme up to version 5.5.
Thus, MariaDB 5.5 offers all of the MySQL 5.5 features. After the 5.5 version,
MariaDB developers decided to start a branch numbered 10, as an attempt
to make it clear that specific new features have been developed in MariaDB 10
that are not included in MySQL 5.6.&lt;/p&gt;
&lt;p&gt;Currently, Trove has support for MySQL but not for MariaDB in particular.
This could be easily fixed for MariaDB 5.5 by just adapting the main
configuration file (my.cnf).
But in the case of MariaDB 10, this will no-longer be so straightforward.&lt;/p&gt;
&lt;p&gt;With this in mind, and the fact that several GNU/Linux distributions
are adopting MariaDB as the default MySQL implementation, it seems important
to add support for this datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To add support for this datastore, we will need the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement instance management for the datastore:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Launch new instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Terminate instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reboot instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resize instance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement user and database management for the datastore:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;CRUD users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRUD databases&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add new elements in trove-integration project to enable the creation
of Ubuntu/Fedora images with MariaDB&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;In this first approach, it makes sense to take profit of the MySQL Refactor
spec &lt;a class="footnote-reference brackets" href="#id7" id="id2"&gt;2&lt;/a&gt; and inherit as much as possible from the MySQL implementation,
providing a cleaner way to launch MariaDB 5.5 instances.&lt;/p&gt;
&lt;p&gt;In a follow up spec, differences in implementation will be tackled
(e.g. a GTID based replication strategy &lt;a class="footnote-reference brackets" href="#id8" id="id3"&gt;3&lt;/a&gt; for MariaDB 10 will be proposed)
and we would be able to provide support for MariaDB newer versions.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new configuration group for MariaDB and the different configuration options
specific to MariaDB have to be added to trove/common/cfg.py&lt;/p&gt;
&lt;p&gt;Some of the examples for the configuration options are:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tcp_ports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;udp_ports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_incremental_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mount_point&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;device_path&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore_namespace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This requires implementing the various datastore features for MariaDB
like Launch, Reboot, Terminate and Resize.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This requires implementing the various CRUD features for users and databases
for MariaDB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This will include adding the following files specific to MariaDB under the
guestagent/datastore module:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;manager.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;service.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;These changes will not affect the behavior of the guestagent or its interaction
with other components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Do not support MariaDB.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;vkmc&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update trove-integration to support MariaDB image creation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create MariaDB elements for Ubuntu/Fedora&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update trove/common/cfg.py with the configuration options for MariaDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add MariaDB configuration templates under templates/mariadb&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for instance management features in
guestagent/experimental/mariadb/service.py [*]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add support for user and databases management features in
guestagent/experimental/mariadb/service.py [*]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit and integration tests specific to MariaDB&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[*] This items rely on the MySQL Manager Refactor spec &lt;a class="footnote-reference brackets" href="#id7" id="id4"&gt;2&lt;/a&gt; and in the first
iteration it will only require inheriting from the MySQL existing
implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;MySQL Manager Refactor &lt;a class="footnote-reference brackets" href="#id7" id="id5"&gt;2&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit tests will be added for MariaDB guestagent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration tests will be added for end-to-end feature testing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create/Delete MariaDB instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resize MariaDB instances&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Docs will be updated to indicate that:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Which MariaDB version is supported&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trove capabilities for MariaDB datastore&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instructions to build guest MariaDB images using trove-integration elements&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://mariadb.org/"&gt;https://mariadb.org/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;2&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id2"&gt;1&lt;/a&gt;,&lt;a href="#id4"&gt;2&lt;/a&gt;,&lt;a href="#id5"&gt;3&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://specs.openstack.org/openstack/trove-specs/specs/liberty/mysql-manager-refactor.html"&gt;http://specs.openstack.org/openstack/trove-specs/specs/liberty/mysql-manager-refactor.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="https://mariadb.com/kb/en/mariadb/global-transaction-id/"&gt;https://mariadb.com/kb/en/mariadb/global-transaction-id/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Mon, 10 Aug 2015 00:00:00 </pubDate></item><item><title>MySQL Manager Refactor</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mysql-manager-refactor.html</link><description>
 
&lt;p&gt;There are a number of forks of MySQL that differ to varying degrees. This
blueprint proposes the creation of a class structure for MySQL-derived
datastores to avoid duplication of code for features and capabilities shared
in common.&lt;/p&gt;
&lt;p&gt;It is expected that the lessons learned from this effort will be applicable to
future efforts to provide differentiation for systems such as MongoDB and
PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mysql-manager-refactor"&gt;https://blueprints.launchpad.net/trove/+spec/mysql-manager-refactor&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In recent years, there have been a number forks of MySQL with varying levels of
divergence from MySQL Community Edition (CE). Commonly used variants of MySQL
include Percona and MariaDB. Specialized versions specific to a variant also
exist, such as Galera for MariaDB or MySQL Cluster (NDB). Despite the
differences, there is a great deal shared among these variants. As such,
wholly separate datastore implementations of each would result in duplicated
code, leading to maintainability difficulties and potential confusion for
operators expecting common functionality to be treated the same across systems.&lt;/p&gt;
&lt;p&gt;Openstack Trove would benefit from the refactoring of the MySQL manager with
more consistent support for MySQL-like systems, simplified code maintenance as
the variants evolve and the ability to provide differentiating features. New
variants could also be introduced with relative ease.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The existing MySQL datastore code is found in
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove/guestagent/datastore/mysql&lt;/span&gt;&lt;/code&gt;. This datastore already effectively
serves as a sort of superclass, with both the Percona and MySQL datastores
pointing to the same management code. MariaDB is supported if the underlying
MariaDB instance is treated as if it were MySQL.&lt;/p&gt;
&lt;p&gt;The crux of this blueprint is to move the majority of the existing MySQL
manager code into a new set of abstract classes, with stub subclasses for
MySQL, Percona and MariaDB datastores inheriting from them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maturity-Aware Reorganization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The base mysql code will reside in the current mysql datastore directory.
This would result in&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The creation of new base implementations for the manager and service
modules in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove/guestagent/datastore/mysql&lt;/span&gt;&lt;/code&gt; directory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The creation of explicit datastores for Percona and MariaDB with
implementation classes that inherit from base MySQL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The resulting file and directory structure would change from:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager_base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service_base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;percona&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;percona&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This approach has the benefit of less potential confusion about the maturity
level of the base code. However, it is not as not as clean an organization:
MySQL CE is treated as both a base system and an implementing datastore.&lt;/p&gt;
&lt;p&gt;A pass through the MySQL manager code will be done to identify methods that
should be made abstract. These methods would then be brought “down” into the
subclasses.&lt;/p&gt;
&lt;p&gt;This blueprint does &lt;em&gt;not&lt;/em&gt; attempt to create optimized MariaDB or Percona
datastores, but rather to lay the groundwork for their creation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Service class dependency injection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The service.py module contains a number of classes, such as MySqlAppStatus,
that are used in the manager.py module. These are currently tightly coupled:
the mysql manager has an explicit import for each.&lt;/p&gt;
&lt;p&gt;The make it possible to extend these classes arbitrarily for different
datastores, and eliminate the tight-coupling, the old references will be
refactored into class properties, which are to be injected by the concrete
manager class.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strategy consolidation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently not included in the scope of this refactor, but an important future
consideration, are the associated strategies that can also have differences
across variants. For example, it may make sense to bring some or all of the
logic from the replication strategy into the datastore subtree to provide
differentiation.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Guest agent configuration options that point to fully qualified classnames,
e.g:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;datastore_registry_ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;percona&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will need to point to the new class names, e.g:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;datastore_registry_ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;percona&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percona&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;Nothing expected, but confirm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Behaviour should remain the same, but location of the code would change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Two alternatives are discussed in the main Proposed Change section.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:&lt;/p&gt;
&lt;p&gt;Launchpad/IRC: atomic77&lt;/p&gt;
&lt;p&gt;Email: &lt;a class="reference external" href="mailto:atomic%40tesora.com"&gt;atomic&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Target Milestone for completion:&lt;/p&gt;
&lt;p&gt;liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Reorganize code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create stub implementations of Percona and MariaDB datastores that inherit
from base MySQL classes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review MySQL datastore implementation for initial candidates for abstract
methods. Bring down and reimplement in each of the three datastore
implementations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write additional integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;As with any change to the layout of the source tree, care must be taken by the
operator to ensure that the updating of the code on the guest agent coincides
with the updating of configuration files. This would only be an issue for
operators that eventually want to leverage the new optimized managers for
Percona, MariaDB, etc. as the location of the MySQL CE manager would remain
backwards-compatible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Additional tests should be added to ensure that subclassing is working
correctly e.g. ensure that some Percona-specific code is not running against
MySQL datastores, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The documentation should be updated to inform operators of the new locations of
datastore implementations that could be added to the guestagent configuration
file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;A related blueprint is experimental-datastores [1] as this impacts the
organization of datastore implementations into directories based on maturity
level.&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/experimental-datastores"&gt;https://blueprints.launchpad.net/trove/+spec/experimental-datastores&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 29 Jul 2015 00:00:00 </pubDate></item><item><title>Cluster Scaling</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/cluster-scaling.html</link><description>
 
&lt;p&gt;Cluster support in trove currently has no direct support for growing
or shrinking clusters.  The current MongoDB cluster implementation
does currently support adding a “shard” via the “add-shard” action,
but it has been decided that this should be changed to use the new
cluster-grow functionality outlined in this spec.&lt;/p&gt;
&lt;p&gt;The cluster-grow and cluster-shrink functionality has been discussed
at the previous mid-cycle and summit, and it was accepted as a
preferable alternative to the add-shard functionality currently
implemented by the MongoDB datastore.  This specification is intended
to develop a foundation for the shrink/grow functionality in Percona
and Redis clustering, and to be backward compatible with the MongoDB
clustering implementation.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cluster-scaling"&gt;https://blueprints.launchpad.net/trove/+spec/cluster-scaling&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove cluster support needs to be extended with support for increasing
or decreasing the size of a cluster.  This support will be provided by
adding new ReST APIs for cluster-grow and cluster-shrink with
corresponding CLI and python-troveclient support.&lt;/p&gt;
&lt;p&gt;The MongoDB cluster implementation will be enhanced to support
cluster-grow in addition to the currently supported “add-shard”
action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;div class="section" id="new-rest-apis"&gt;
&lt;h3&gt;New ReST APIs&lt;/h3&gt;
&lt;p&gt;Two new ReST APIs will be added for this feature.&lt;/p&gt;
&lt;div class="section" id="cluster-grow"&gt;
&lt;h4&gt;cluster-grow&lt;/h4&gt;
&lt;p&gt;Adds nodes to a cluster.&lt;/p&gt;
&lt;p&gt;This new API adds 3 new attributes to the usual instance payload:&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;name&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Name to assign to the instance&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-even"&gt;instance_type&lt;/dt&gt;
&lt;dd class="field-even"&gt;&lt;p&gt;Datastore specific type of the instance (eg.,
query/replica for Mongo, master/slave for Redis).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="field-odd"&gt;related_to&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;Defines a relationship from one member to another.  The
value is datastore specific, but will likely refer to the
name of a previously defined instance in the same ReST
payload.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"slave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"slave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;understand&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cluster-shrink"&gt;
&lt;h4&gt;cluster-shrink&lt;/h4&gt;
&lt;p&gt;Deletes the specified instances from the cluster.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
    &lt;span class="s2"&gt;"shrink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;This change adds new CLI commands cluster-grow and cluster-shrink,
detailed below.  These CLI commands and their corresponding APIs
should be consistent with existing CLI and API usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No security impacts are expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;The following methods will be added to the Clusters class in
the python-troveclient:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Clusters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;grow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="sd"&gt;"""Grow the specified cluster.&lt;/span&gt;

&lt;span class="sd"&gt;      :param cluster: The cluster to grow&lt;/span&gt;
&lt;span class="sd"&gt;      :param instances: JSON describing instances to add&lt;/span&gt;
&lt;span class="sd"&gt;      """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shrink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="sd"&gt;"""Shrink the specified cluster.&lt;/span&gt;

&lt;span class="sd"&gt;      :param cluster: The cluster to shrink&lt;/span&gt;
&lt;span class="sd"&gt;      :param instances: JSON describing instances to remove&lt;/span&gt;
&lt;span class="sd"&gt;      """&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;div class="section" id="id1"&gt;
&lt;h4&gt;cluster-grow&lt;/h4&gt;
&lt;div class="section" id="basic-grow"&gt;
&lt;h5&gt;Basic Grow&lt;/h5&gt;
&lt;p&gt;Basic Grow would be suitable to databases such as Galera or Cassandra
where all nodes are effectively peers - no special options are
required.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-grow mycluster --instance flavor=7
&amp;lt;example output to follow&amp;gt;

--instance parameter may be specified multiple times.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Generated Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="add-master-and-slave"&gt;
&lt;h5&gt;Add Master and Slave&lt;/h5&gt;
&lt;p&gt;Master and Slave grow would be suitable for databases such as Redis
which support master/slave replication within a cluster.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-grow mycluster \
  --instance name=newnode1,type=master,flavor=7 \
  --instance name=newnode2,type=slave,related_to=newnode1,flavor=7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Generated Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"newnode1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"newnode2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"slave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"newnode1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To add a standby node to a node named “node1” in a database such as
Vertica or Redis, a simpler form of the above could be used.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-grow mycluster \
  --instance type=standby,related_to=node1,flavor=7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Generated Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"standby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"node1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="add-replica-set"&gt;
&lt;h5&gt;Add Replica Set&lt;/h5&gt;
&lt;p&gt;This form of Grow Cluster would be used for databases such as MongoDB
which implement growth by shards, in this case called “replica sets”.
The example below creates a new query server plus two replica sets of
3 nodes each.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-grow mycluster \
  --instance name=rs2q,type=query,flavor=7 \
  --instance name=rs2a,type=replica,flavor=7 \
  --instance name=rs2b,type=replica,related_to=rs2a,flavor=7 \
  --instance name=rs2c,type=replica,related_to=rs2b
  --instance name=rs3a,type=replica,flavor=7 \
  --instance name=rs3b,type=replica,related_to=rs3a,flavor=7 \
  --instance name=rs3c,type=replica,related_to=rs3b
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Generated Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs3a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs3b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs3a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs3c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"instance_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"replica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"related_to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"rs3b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7 "&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h4&gt;cluster-shrink&lt;/h4&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;$ trove cluster-shrink mycluster nodename-1 nodename-2
&amp;lt;example output to follow&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Appropriate methods will be added to the base Cluster Strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Appropriate methods will be added to the base Cluster Strategy.&lt;/p&gt;
&lt;p&gt;The MongoDB Implementation will be adapted to support both the existing
add-shard functionality, plus the new cluster-grow functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Matthew Van Dijk
Morgan Jones&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-3&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement base cluster-shrink/cluster-grow functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update MongoDB Clustering implementation to use new APIs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;The MongoDB clustering implementation will continue to support the
existing “add-shard” functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;int-tests for clustering functionality is still under consideration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The new cluster-grow and cluster-shrink functionality will need to be
documented.&lt;/p&gt;
&lt;p&gt;The MongoDB Datastore documentation will need to be updated to reflect
Mongo’s implementation of both the old and new functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 15 Jun 2015 00:00:00 </pubDate></item><item><title>Redis Clustering</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/redis-cluster.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/redis-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/redis-cluster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Redis is a NoSQL database designed for high performance caching and
persistence of key/value data.  This document outlines a proposal for
implementing clustering for Redis.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Implement clustering for Redis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The Redis clustering feature will strive to implement the minimum
functionality required for a user to implement a Redis cluster in a
Trove environment.  While Trove will provide functionality to support
operations not possible directly through the Redis API, functionality
will be left to the user to perform via the Redis API wherever
possible.  This decision is based on the belief that it would be
extremely difficult to provide all the required functionality through
a web interface, and that Redis users will be familiar with the Redis
command set.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The following configuration values will be implemented in the Redis
configuration group:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoolOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cluster_support'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Enable clusters to be created and managed.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'api_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental.'&lt;/span&gt;
           &lt;span class="s1"&gt;'redis.api.RedisAPIStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific API logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'taskmanager_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental.redis.'&lt;/span&gt;
           &lt;span class="s1"&gt;'taskmanager.RedisTaskManagerStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific task manager '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StrOpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'guestagent_strategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'trove.common.strategies.cluster.experimental.'&lt;/span&gt;
           &lt;span class="s1"&gt;'redis.guestagent.RedisGuestAgentStrategy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Class that implements datastore-specific Guest Agent API '&lt;/span&gt;
                &lt;span class="s1"&gt;'logic.'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rest-api"&gt;
&lt;h3&gt;REST API&lt;/h3&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;p&gt;The cluster-create command will allow the user to create a cluster
with the specified number of master nodes.  The data slots will be
evenly divided between the created nodes.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;understand&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="grow-cluster"&gt;
&lt;h4&gt;Grow Cluster&lt;/h4&gt;
&lt;p&gt;Adds nodes to a cluster.  The added nodes will be master nodes empty
of data and will have no slots assigned to them.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;edaac9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa7653e11224&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;understand&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="shrink-cluster"&gt;
&lt;h4&gt;Shrink Cluster&lt;/h4&gt;
&lt;p&gt;Removes the specified nodes from the cluster.  It is expected that all
data slots have been removed from the node - the shrink operation will
fail otherwise.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
    &lt;span class="s2"&gt;"shrink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Forbidden&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;One&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;slots&lt;/span&gt; &lt;span class="n"&gt;assigned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;edaac9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa7653e11224&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.4"&lt;/span&gt;&lt;span class="p"&gt;,],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.4"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-instance"&gt;
&lt;h4&gt;Show Instance&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;edaac9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa7653e11224&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;416&lt;/span&gt;&lt;span class="n"&gt;b0b16&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ba55&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4302&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bbd3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ff566032e1c1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.17&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-clusters"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"clusters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3.0"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"redis-clstr-member-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-cluster"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No public API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;No Python API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;No CLI changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No changes are envisioned to the guestagent api, beyond implementing
the existing API methods.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The following methods will be implemented in the RedisGuestAgentAPI:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_node_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Retrieve ip info from node."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_node_ip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_node_id_for_removal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Validating cluster node removal."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"get_node_id_for_removal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Removing nodes from cluster."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"remove_nodes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;node_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_meet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Joining node to cluster."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cluster_meet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_addslots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first_slot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_slot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Adding slots &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; to cluster."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first_slot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_slot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cluster_addslots"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;first_slot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;first_slot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_slot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;last_slot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cluster_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Notifying cluster install completion."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cluster_complete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guest_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AGENT_HIGH_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vgnbkr&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-3&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;implement clustering for Redis&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;implement new Taskmanager cluster strategy for Redis
implement python API and shell for shrink/grow (this may be already done
through cluster-scaling bp implementation)
add grow/shrink to cluster strategy (in absence of scaling implementation)
implement guest agent support for joining/leaving a cluster
implement unit tests as appropriate
implement int-test if the mechanism for doing so has been worked out by
that time&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;As this is a new implementation, no upgrade implications are
envisioned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;This functionality depends on the cluster scaling functionality
outlined in
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cluster-scaling"&gt;https://blueprints.launchpad.net/trove/+spec/cluster-scaling&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implementation of int-tests for clustering is still being worked out
for MongoDB and Cassandra.  It is expected that Redis will
implement/run similar int-tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Datastore documentation for Redis will need to be updated to reflect
clustering support.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://redis.io/topics/cluster-tutorial"&gt;http://redis.io/topics/cluster-tutorial&lt;/a&gt;
&lt;a class="reference external" href="http://redis.io/topics/cluster-spec"&gt;http://redis.io/topics/cluster-spec&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 15 Jun 2015 00:00:00 </pubDate></item><item><title>Root Disable</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/root-disable.html</link><description>
 
&lt;p&gt;Include the URL of your launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/root-disable"&gt;https://blueprints.launchpad.net/trove/+spec/root-disable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since there is the ability to enable a root user on an instance the
ability to disable the root user should be provided as well.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, the root user can be enabled on an instance.  It is expected
that the root user can also be disabled.&lt;/p&gt;
&lt;p&gt;Disabling the root user should not change the ability of the command
root-show to determine if the root user has ever been enabled.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This change will add a new root-disable command.&lt;/p&gt;
&lt;p&gt;The command will remove the root user from the specified instance.  No changes
will be made in the root_enable_history table from the execution of the
command.  This ensures the root-show command will continue to operate as
expected.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;REST API:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;DELETE /instances/{id}/root&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Python API in class Root:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl&gt;
&lt;dt&gt;def delete(self, instance):&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;“””Implements root-disable API.&lt;/p&gt;
&lt;p&gt;Removes the root user for the specified db instance.&lt;/p&gt;
&lt;dl class="field-list simple"&gt;
&lt;dt class="field-odd"&gt;param instance&lt;/dt&gt;
&lt;dd class="field-odd"&gt;&lt;p&gt;The instance from which the root user is removed from&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;“””&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;CLI:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;trove root-disable &amp;lt;instance&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The appropriate root disable method will added only for MySQL.  All other
datastores will also need to have the appropriate not implemented error.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Another option is root-disable will simply call root-enable and not return
the password back to the user.  This alternative also has no impact on the
root-show.&lt;/p&gt;
&lt;p&gt;However, an operator may believe the root user to be completely removed from
the database after the root-disable call is made.  Leaving the root user
may not be what the operator is expecting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="discussion-summary"&gt;
&lt;h3&gt;Discussion Summary&lt;/h3&gt;
&lt;p&gt;Some concerns were raised during the discussion of this blueprint.  The full
details can be found here &lt;a class="reference external" href="https://review.openstack.org/#/c/189837/"&gt;https://review.openstack.org/#/c/189837/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In summary the concerns revolved around the fact that after the user performs
a root enable the following issues can occur.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;A security hole exists where a user can create an alternate root user,
drop the existing root user and do a backup then restore leaving no trace
that the root user has been enabled for the restored database and an
“unknown” alternate root user is left in the restored database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The enabled root user can change the management user access leaving the
instance in a state that cannot be managed via Trove.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It was determined that adding the root-disable command does not cause or make
the concerns raised above to be any worse than already exists.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;dloi&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement CLI, Python API and REST API calls&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the guest add disable_root method for MySQL database and not implemented
stubs for all other datastores&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Add to existing root enable tests to test disabling the root user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;New root-disable command needs to be added to the API documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 09 Jun 2015 00:00:00 </pubDate></item><item><title>Redis Replication</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/redis-replication.html</link><description>
 
&lt;p&gt;Replication functionality needs to be added to the Redis datastore.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/redis-replication"&gt;https://blueprints.launchpad.net/trove/+spec/redis-replication&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;At present, only single instances of Redis can be created.  While useful,
having multiple slaves that replicate off of a designated master is also
desirable.  This functionality will be addressed in this spec.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Redis replication is a very simple to use (and configure) master-slave
replication.  It allows Redis slaves to be exact copies of master servers. &lt;a class="footnote-reference brackets" href="#id2" id="id1"&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="replication"&gt;
&lt;h3&gt;Replication&lt;/h3&gt;
&lt;p&gt;Redis replication has the following features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Asynchronous&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple slaves&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slave-of-slave&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Non-blocking initialization of slaves&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To improve performance, persistence can be turned off on the master node.  This
however can lead to a loss of data if the system reboots and Redis starts
automatically.  For this reason, the master node will be required to have
persistence enabled.&lt;/p&gt;
&lt;p&gt;Creating a Redis replication network is handled by the Redis SLAVEOF command.
A new instance (or set of instances) will be created and the SLAVEOF command
executed on each one.  Having Trove create a backup and restore it is not
necessary, as Redis has this capability built into the SLAVEOF command.  This
means that the Redis replication strategy will need to bypass the creation of a
backup to add to the snapshot info, and the taskmanager will need to be
modified to handle this case.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;replication&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;enabled&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;restore&lt;/span&gt;
&lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;however&lt;/span&gt; &lt;span class="n"&gt;once&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;slave&lt;/span&gt; &lt;span class="n"&gt;restarts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;starts&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;automatically&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;resync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thus&lt;/span&gt; &lt;span class="n"&gt;rendering&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;backup&lt;/span&gt;
&lt;span class="n"&gt;obsolete&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Enough disk space must be available on the master node to allow Redis to
persist its data to storage.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;2.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ability&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;backup&lt;/span&gt; &lt;span class="n"&gt;directly&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Since&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;behaviour&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;still&lt;/span&gt;
&lt;span class="n"&gt;considered&lt;/span&gt; &lt;span class="n"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;specific&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt;
&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;beyond&lt;/span&gt; &lt;span class="n"&gt;being&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.8&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;however&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;Redis&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;increase&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;systems&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;slow&lt;/span&gt; &lt;span class="n"&gt;disks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;
&lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="n"&gt;operators&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;turn&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Redis configuration file on each slave will have the corresponding values
set so that subsequent starting of the database will maintain the slave status.
As part of the slave configuration, all slaves will also be set to read-only.
As with the MySQL implementation, slave-of-slave will not be allowed.  The
feature could be augmented to include this in the future.&lt;/p&gt;
&lt;p&gt;The steps to create a replication network is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create the necessary configuration file.  This will have the following
settings:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;slaveof &amp;lt;master_ip&amp;gt; &amp;lt;master_port&amp;gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slave-read-only&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-diskless-sync-delay (if more than one slave is specified)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create ‘n’ new slave instances with the correct configuration file&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="detach-replica"&gt;
&lt;h3&gt;Detach Replica&lt;/h3&gt;
&lt;p&gt;The current API for detach-replica will need to be implemented.  No additions
to the API are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="failover"&gt;
&lt;h3&gt;Failover&lt;/h3&gt;
&lt;p&gt;The current APIs for failover (both eject-replica-source and
promote-to-replica-source) will need to be implemented.  When ejecting the
current replica source, a slave needs to be chosen as the new one.  This will
be done by overriding the _most_current_replica() method and having it query
each slave and choose the one with the smallest value for
‘master_last_io_seconds_ago.’  This, presumably, will be the one with the most
current data.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The default values for the following config options will need to be updated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;replication_strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Existing Python bindings are sufficient, and no changes are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Once these changes are implemented, the following Trove CLI
commands will now be fully functional with Redis:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create –replica_of &amp;lt;id&amp;gt; –replica_count &amp;lt;n&amp;gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;eject-replica-source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;promote-to-replica-source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;detach-replica&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The following files will need to be added to the guest agent, where the
corresponding implementation will reside:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/strategies/replication/experimental/redis_sync.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/redis/manager.py
guestagent/datastore/experimental/redis/service.py
guestagent/datastore/experimental/redis/system.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No backwards compatibility issues are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No alternative solutions are proposed at this time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;peterstac&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create replication strategy for Redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement API calls for detach_replica, promote_to_replica_source and
eject_replica_source.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;No new tests are deemed to be required (beyond the requisite unit tests).  The
int-tests group for Redis will be modified to run replication-related commands
during integration test runs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Datastore specific documentation should be modified to indicate that
replication is now supported by Redis, along with the corresponding
detach/failover commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id2"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Redis Replication: &lt;a class="reference external" href="http://redis.io/topics/replication"&gt;http://redis.io/topics/replication&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Mon, 08 Jun 2015 00:00:00 </pubDate></item><item><title>Guestagent Configuration Manager</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/guestagent-configuration-manager.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/guestagent-configuration-manager"&gt;https://blueprints.launchpad.net/trove/+spec/guestagent-configuration-manager&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Each datastore currently has to implement a strategy for maintaining its
configuration files including functionality for parsing, updating
properties, saving and managing overrides.
With increasing number of supported datastores this approach leads to a
significant duplication in the production and testing codebase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Facilitate code reuse by implementing a manager class that could be used by all
guestagents to manage their configuration files and overrides.&lt;/p&gt;
&lt;p&gt;The patch set will consist of four main features.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Codecs for serialization and deserialization of configuration files.&lt;/p&gt;
&lt;p&gt;These would be responsible for parsing a Python structure (dict)
into an appropriate serialized form (see the simple example below).&lt;/p&gt;
&lt;p&gt;An INI-style file (serialized form):&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;[&lt;/span&gt;section_1&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; value1
&lt;span class="nv"&gt;key2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; value2
...

&lt;span class="o"&gt;[&lt;/span&gt;section_2&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;key1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; value1
&lt;span class="nv"&gt;key2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; value2
...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dict representation of the above contents (deserialized form):&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'section_1'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;: &lt;span class="s1"&gt;'value1'&lt;/span&gt;, &lt;span class="s1"&gt;'key2'&lt;/span&gt;: &lt;span class="s1"&gt;'value2'&lt;/span&gt;, ...&lt;span class="o"&gt;}&lt;/span&gt;,
 &lt;span class="s1"&gt;'section_2'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;: &lt;span class="s1"&gt;'value1'&lt;/span&gt;, &lt;span class="s1"&gt;'key2'&lt;/span&gt;: &lt;span class="s1"&gt;'value2'&lt;/span&gt;, ...&lt;span class="o"&gt;}&lt;/span&gt;
 ...
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Codecs for common configuration formats currently present in Trove
will be implemented.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;These include:&lt;/dt&gt;&lt;dd&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;INI-style format: see the example above&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;YAML format: see &lt;a class="reference external" href="http://pyyaml.org/wiki/PyYAMLDocumentation"&gt;http://pyyaml.org/wiki/PyYAMLDocumentation&lt;/a&gt;
for examples of Python representation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Properties format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Serialized form:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;key1 k1arg1 k1arg2 ... k1argN
key2 k2arg1 k2arg2 ... k2argN
key3 k3arg1 k3arg2 ...
key3 k3arg3 k3arg4 ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dict representation of the above contents (deserialized form):&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'key1'&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;k1arg1, k1arg2 ... k1argN&lt;span class="o"&gt;]&lt;/span&gt;,
 &lt;span class="s1"&gt;'key2'&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;k2arg1, k2arg2 ... k2argN&lt;span class="o"&gt;]&lt;/span&gt;,
 &lt;span class="s1"&gt;'key3'&lt;/span&gt;: &lt;span class="o"&gt;[[&lt;/span&gt;k3arg1, k3arg2, ...&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;k3arg3, k3arg4, ...&lt;span class="o"&gt;]]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Functions for reading and writing using a given codec.&lt;/p&gt;
&lt;p&gt;A ‘write’ function saves a serialized form of a given dict into a file.
A ‘read’ function applied on the file produces the same dict
structure that was written in the previous step.
The write function will write a file with superuser privileges when
provided an optional ‘as_root’ keyword. This will be implemented by
writing a temporary file first moving it to place using the existing
operating system calls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The configuration manager.&lt;/p&gt;
&lt;p&gt;ConfigurationManager will be responsible for management of datastore
configuration files.
Its base functionality will include reading and writing configuration
files and updating or retrieving current values.
It will be also responsible for validating user inputs and requests.
When supplied an override strategy (below) it allows the user to manage
configuration overrides as well.&lt;/p&gt;
&lt;p&gt;The configuration manager will be responsible for enforcing the limit on
the number of applied overrides (there can currently be only one
override applied to an instance at any given time).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common override strategies.&lt;/p&gt;
&lt;p&gt;An override strategy object responsible for management of overrides
in the configuration manager (when provided).&lt;/p&gt;
&lt;p&gt;It will implement functions to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;apply&lt;/em&gt; updated values on the current revision of the configuration
file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;remove&lt;/em&gt; the last applied overrides and effectively restoring the
previous version of the configuration file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The strategies provided with this patch set will be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rolling Override Strategy:&lt;/p&gt;
&lt;p&gt;A strategy suitable for applications that do not support includes
in their configuration files. It applies updates to the
configuration file while maintaining a backup of the previous
version that can be restored when the overrides get removed.&lt;/p&gt;
&lt;p&gt;Apply procedure:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Save a backup copy of the current configuration file to a known
configurable location.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load and parse the current configuration file into a
dict (using an appropriate codec).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the dict with the overridden values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overwrite the configuration file with the serialized form
of the dict (using the same codec).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Remove procedure:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Move the appropriate backup revision over the current
configuration file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import Override Strategy:&lt;/p&gt;
&lt;p&gt;A strategy useful for datastores that support imports in their
configuration files (like MySQL).
The overrides are stored in a known configurable directory which
is then imported by the base configuration file which itself remains
intact.&lt;/p&gt;
&lt;p&gt;Apply procedure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Store a serialized form (using an appropriate codec) of the
overrides dict in an imported location.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remove procedure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Remove the appropriate file from the imported location.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The affected files would include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;guestagent/common/operating_system.py: I/O functions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;common/stream_codecs.py: Implementations of codecs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;common/configurations.py: Reuse the codecs in configuration parsers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guestagent/common/configuration.py: Implementations of the configuration
manager and override strategies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement codecs for serialization and deserialization of common
configuration files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement functions for reading and writing files using a given codec.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the configuration manager.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement common override strategies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add unit tests for the above functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The current implementation works around limitations of the ConfigParser
in Python 2.6. OpenStack no longer supports this version of Python
and Trove gate tests run against Python 2.7
We can therefore remove the compatibility requirement and make full use of
the ConfigParser in Python 2.7 in the existing code base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to cover non-trivial code paths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Thu, 04 Jun 2015 00:00:00 </pubDate></item><item><title>Datastore Registration API</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/datastore-registration-api.html</link><description>
 
&lt;p&gt;Blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/datastore-registration-api"&gt;https://blueprints.launchpad.net/trove/+spec/datastore-registration-api&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The proposal is to introduce a new Management API that facilitates a
the datastore registration on an existing Trove Deployment&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Today, the only means of adding/registering a datastore/datastore-version on
an existing deployment is to use some sequence of trove-manage
(datastore_update, datastore_version_update) to add a datastore followed by
adding the datastore-version with its image.&lt;/p&gt;
&lt;p&gt;Another problem with this process is one needs to have access to the
trove-api server from where one can execute trove-manage, alteratively
one needs direct access to database if the want to by-pass trove-manage
and add the entries by using an insert/update command to tables, both of
these methods requires to relax the security of trove-api/database server
for direct access to operator/deployer.&lt;/p&gt;
&lt;p&gt;One more problem that lies with registering datastores is we need to
use multiple commands to register a new datastore with an image-id.&lt;/p&gt;
&lt;div class="section" id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a deployer, I want to be able to add new datastores through the
Trove management API, without having to log in to the Trove control plane
and manually running a trove-manage command.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Following functionalities would be added as part of the change::&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add/register a new datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get a list of datastore-versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get information about an existing datastore-version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update image/manager/packages/active/default for an existing datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete an existing datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;While registering a datastore version, we would create a datastore with
the requested datastore_name, if it does not exists.&lt;/p&gt;
&lt;p&gt;These functionalities would only be available to an admin user
who would access the APIs via an admin tenant.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No Configuration changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No Database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No public API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="management-api"&gt;
&lt;h3&gt;Management API&lt;/h3&gt;
&lt;p&gt;The request/response for new APIs are as follows.
These APIs would be invokable only through an admin tenant.&lt;/p&gt;
&lt;div class="section" id="add-register-datastore-version"&gt;
&lt;h4&gt;Add/Register Datastore Version&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"154b350d-4d86-4214-9067-9c54b230c0da"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mysql-server-5.6"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="n"&gt;Already&lt;/span&gt; &lt;span class="n"&gt;Exists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="get-datastore-versions"&gt;
&lt;h4&gt;Get Datastore Versions&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"versions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"b80c2b43-cd87-4d5d-9f32-a4996bd57cb1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"b8a23fa1-1faf-441a-a6b7-83a19c30f347"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"154b350d-4d86-4214-9067-9c54b230c0da"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mysql-server-5.6"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"127bc577-8054-4b32-9ed3-2d6b01773810"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"21c8805a-a800-4bca-a192-3a5a2519044d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"6230baf1-dffe-40fa-a1fb-47d9ff346503"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vertica-7.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="get-information-about-a-datastore-version"&gt;
&lt;h4&gt;Get information about a Datastore Version&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b8a23fa1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;faf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;441&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a6b7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="n"&gt;a19c30f347&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"b80c2b43-cd87-4d5d-9f32-a4996bd57cb1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"b8a23fa1-1faf-441a-a6b7-83a19c30f347"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"154b350d-4d86-4214-9067-9c54b230c0da"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mysql-server-5.6"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="update-image-manager-packages-active-default-for-a-datastore-version"&gt;
&lt;h4&gt;Update Image/Manager/Packages/Active/Default for a Datastore Version&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;Payload&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;those&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;wants&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;PATCH&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b8a23fa1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;faf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;441&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a6b7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="n"&gt;a19c30f347&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"e33f8e2f-1148-461c-a7ea-f8228e7c5f4a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-an-existing-datastore-version"&gt;
&lt;h4&gt;Delete an existing Datastore Version&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;datastore_versionid&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b8a23fa1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;faf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;441&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a6b7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="n"&gt;a19c30f347&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Datastore&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;409&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Conflict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;exists&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No Guest Agent changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The current alternative is use trove-manage or use database directly,
but both these methods need relaxation on access-policies of api/db servers
which has its own security implications.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Sushil Kumar (&lt;a class="reference external" href="mailto:skm.net%40gmail.com"&gt;skm&lt;span&gt;.&lt;/span&gt;net&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-2&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement API routes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement management API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement unit-tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;There is an ongoing work to associate flavors with
datastore versions(&lt;a class="reference external" href="https://review.openstack.org/#/c/109824"&gt;https://review.openstack.org/#/c/109824&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It has to be noted once we have these flavor-mappings in place,
there would be two available options while deleting a datastore-version:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Don’t delete datastore-version if it has any flavor-mappings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete the flavor-mappings along with the datastore-versions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to cover non-trivial code paths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Management API’s documentation would be updated with new API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 03 Jun 2015 00:00:00 </pubDate></item><item><title>Cluster root enable</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/cluster-root-enable.html</link><description>
 
&lt;p&gt;This spec is intended to add root enable support for clusters.&lt;/p&gt;
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/vertica-cluster-user-features"&gt;https://blueprints.launchpad.net/trove/+spec/vertica-cluster-user-features&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove’s cluster API currently does not support root enable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add support for root-enable for clusters, with optional user-provided
passwords. User supplied passwords are necessary to create a good user
experience in Horizon where enabling a root user should allow user input
rather than requiring the user to wait for a password to popup on a response
dialog.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;This change will add a new /clusters/&amp;lt;cluster_id&amp;gt;/root resource which is
similar to the /root resource on instances with the addition of an optional
password.&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"secretsecret"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;POST /v1.0/​[account-id]/clusters/&amp;lt;cluster_id&amp;gt;/root&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"secretsecret"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;GET /v1.0/​&amp;lt;tenant_id&amp;gt;/clusters/&amp;lt;cluster_id&amp;gt;/root&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DELETE /v1.0/​​&amp;lt;tenant_id&amp;gt;/clusters/&amp;lt;cluster_id&amp;gt;/root&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;The security of this API will be handled in the same manner as existing
implementations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;New cluster-root-enable and cluster-root-show commands will be added&lt;/p&gt;
&lt;p&gt;Changes will effect:&lt;/p&gt;
&lt;p&gt;troveclient/v1/root.py
troveclient/v1/shell.py
troveclient/v1/clusters.py&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;Root enablement support should be added for clusters. Changes include:&lt;/p&gt;
&lt;p&gt;trove/extensions/routes/mysql.py
trove/extensions/mysql/service.py
trove/extensions/mysql/models.py
trove/guestagent/api.py&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The guestagent API will get a new enable_root(self, password) function
which allows optionally provided passwords to be supplied to a guest
agent. This function will be in addition to the existing function, allowing
for backwards compatibility with existing images.&lt;/p&gt;
&lt;p&gt;Additionally, each guest agent datastore impl will need to implement
the enable_root(password) function.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:jonathan.halterman%40hp.com"&gt;jonathan&lt;span&gt;.&lt;/span&gt;halterman&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:sharika.pongubala%40hp.com"&gt;sharika&lt;span&gt;.&lt;/span&gt;pongubala&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;API changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guest agent changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLI changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internal API changes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;New unit and scenario tests will be added to assert that root enablement
works as expected at the cluster level&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The API changes to the clusters resource and the addition of the new
cluster root resource need to be documented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Thu, 09 Apr 2015 00:00:00 </pubDate></item><item><title>Add instance name as parameter to various CLI commands</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/add-instance-name-to-cli.html</link><description>
 
&lt;p&gt;Blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/add-instance-name-to-cli"&gt;https://blueprints.launchpad.net/trove/+spec/add-instance-name-to-cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The proposal is to allow instance-name to be specified wherever instance-ID
is currently used throughout the CLI.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Currently, only the “trove show” command will take instance-ID or
instance-name as its parameter. There are many more commands in the
CLI that require an instance reference as a parameter but require that
the instance-ID be used. It would be helpful to customers to be able
to use instance-ID or instance-name interchangeably throughtout the CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Allow instance-id or instance-name to be passed in for the following commands:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list-instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;detach-replica&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-edit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resize-flavor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resize-instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;resize-volume&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;root-enable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;root-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-grant-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-revoke-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-show-access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user-update-attributes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove&lt;/span&gt; &lt;span class="pre"&gt;delete&lt;/span&gt;&lt;/code&gt; currently looks like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;Deletes&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Positional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The proposal is to make it look like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;Deletes&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Positional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This will be a CLI change only.&lt;/p&gt;
&lt;p&gt;Currently the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove&lt;/span&gt; &lt;span class="pre"&gt;show&lt;/span&gt;&lt;/code&gt; command will display an error if there is
more than one instance with the name provided. The error indicates that,
in this case, the instance ID must be used. This behavior will be preserved
and used across all the commands mentioned above.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignees:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;0-doug (dougshelley66)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;peterstac&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Go through python-troveclient/troveclient/v1/shell.py and call
_find_instance(cs, args.instance) ahead of the “real” work in each “do_&amp;lt;&amp;gt;”
method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alter the help text in shell.py to indicate the use of name or ID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alter the existing unit tests as appropriate.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;If we had Tempest coverage for the CLI it would be adjusted to exercise
passing instance name to all the altered commands. Also, there is an
existing LP bug [1] that indicates we should write tests for the CLI.&lt;/p&gt;
&lt;p&gt;Both of these are considered out of scope for this BP.&lt;/p&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://bugs.launchpad.net/python-troveclient/+bug/1314793"&gt;https://bugs.launchpad.net/python-troveclient/+bug/1314793&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The help text for the aforementioned commands will be altered to now
include instance name as a valid parameter. I believe that the CLI
documentation is generated from the code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Associate instance flavors with datastores</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/associate-flavors-datastores.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/associate-flavors-datastores"&gt;https://blueprints.launchpad.net/trove/+spec/associate-flavors-datastores&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Motivation:
Each datastore type has its own hardware requirements (minimum and
maximum). Currently, trove lacks the ability to enforce this
requirement. This change enables trove with the ability to associate
the virtual hardware templates (flavors) with datastore types.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove supports multiple datastore types. However, each datastore type
has its own hardware requirements, which presently, cannot be enforced
in trove.&lt;/p&gt;
&lt;p&gt;For example:
MySQL - Minimum System Requirements:
- 2 or more CPU cores
- 2 or more GB of RAM
- Disk I/O subsystem applicable for a write-intensive database&lt;/p&gt;
&lt;p&gt;Find more information about other datastore specific hardware
requirements in the References section.&lt;/p&gt;
&lt;p&gt;Trove uses virtual hardware templates called ‘flavors’ in
OpenStack. In order for trove to be able to enforce the datastore
specific hardware requirements, there needs to be a way in which
datastore types can be associated with their minimum flavor (hardware)
requirements. This way, the user/administrator can at least be
notified while provisioning the datastore with the inappropriate
flavor, that does not meet the minimum hardware requirements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The trove-manage utility will provide the ability to add and delete
the datastore version-flavor associations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There will be an additional API call in order to get a list of
flavors for the specified datastore version id.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No impact on existing tables.&lt;/p&gt;
&lt;p&gt;One new entity will be created in the trove database:
datastore_version_metadata. This will store any additional metadata
related to a datastore version including its relation with flavors:
key=flavor and the value=flavor_id.&lt;/p&gt;
&lt;p&gt;The blueprint specifies the table attributes in detail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;Does not impact any other API which the user has access to.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Launchpad: riddhi89&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IRC: Riddhi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email: &lt;a class="reference external" href="mailto:ridhi.j.shah%40gmail.com"&gt;ridhi&lt;span&gt;.&lt;/span&gt;j&lt;span&gt;.&lt;/span&gt;shah&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add the new database schema for datastore version metadata.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove-manage util extension to associate a flavor list with a
datastore version id&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove-manage util extension to delete a flavor associated with a
datastore version id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REST API call to list flavors for a datastore version id
(/{tenant_id}/flavors/{datastore_version_id})&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unit tests for individual components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration tests for end-to-end testing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New API call to list flavors given a datastore version id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trove-manage util extensions to add/delete datastore version -
flavor associations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Further hardware requirements for different datastore types:
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/TroveFlavorsPerDatastore"&gt;https://wiki.openstack.org/wiki/TroveFlavorsPerDatastore&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Datastore Visibility</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/datastore-visibility.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/datastore-visibility"&gt;https://blueprints.launchpad.net/trove/+spec/datastore-visibility&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Motivation: Since Trove supports multiple datastore types, there is a
need for Trove to have a greater control over the customer visibility
of these datastore types. This change enables Trove to control the
visibility of the various datastore types.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;There might be some datastore types, which the deployers require to be
active but not visible to customers in the production environment.
Example use case: Say we want to have an active datastore A in production
and not expose it to customers yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;This change suggests adding a visibility attribute to the datastore
versions. This enables the datastore to still be active, but not visible
to the users.
The visibility flag will ensure it is visible on the datastore list
call only to admins.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Visibility attribute to the datastore version. It can be:
public/private/unlisted/deprecated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding a datastore version members table to add tenants for
private datastores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If visibility is public:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;All users can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All users can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If visibility is private:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Members only can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Members only can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can add and remove tenants as members of a datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If visibility is unlisted:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;All users can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If visibility is deprecated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;All admin can view it in the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All admin can make a GET call on the datastore version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Only admins can create a ‘deprecated’ instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Database migration of adding a column ‘visibility’ to the
datastore_versions table.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Table datastore_versions:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Field&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Extra&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;---------------------------------------------------------------|&lt;/span&gt;
&lt;span class="nb"&gt;id&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;PRIMARY&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;datastore_id&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;MUL&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;image_id&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;packages&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;511&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;active&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;tinyint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;manager&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;visibility&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;&lt;p&gt;New table datastore_version_members which consists of columns - id,
datastore_version_id,tenant_id.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Table datastore_version_members:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;Field&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;        &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Null&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;         &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Default&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Extra&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------------------|&lt;/span&gt;
&lt;span class="nb"&gt;id&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;PRIMARY&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;datastore_version_id&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Foreign&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="n"&gt;tenant_id&lt;/span&gt;           &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NO&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt;             &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;|&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;datastore_version_id&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Foreign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;datastore_version&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;div class="section" id="admin-calls-related-to-datastore-versions"&gt;
&lt;h4&gt;Admin calls related to datastore versions&lt;/h4&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Set visibility&lt;/p&gt;
&lt;p&gt;POST /{tenant_id}/mgmt/datastores/{datastore}/versions/{id}&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore_version"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="s2"&gt;"visibility"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;visibility value&amp;gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get datastore version - A visibility field added only for admin users.&lt;/p&gt;
&lt;p&gt;GET /{tenant_id}/datastores/{datastore_id}/versions/{id}&lt;/p&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"9dd70f56-72e9-444b-9881-f564ac955056"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"65747630-1ce7-4be0-92d4-8695825a475b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"32070be9-3cab-4cee-be05-524b4f379447"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://172.16.117.178:8779/v1.0/9a4e7142f34b4ce990a276c82b7beb15/datastores/versions/65747630-1ce7-4be0-92d4-8695825a475b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"self"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://172.16.117.178:8779/datastores/versions/65747630-1ce7-4be0-92d4-8695825a475b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"mysql-server-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"visibility"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"public"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="admin-calls-related-to-datastore-version-members"&gt;
&lt;h4&gt;Admin calls related to datastore version members&lt;/h4&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Add a member:&lt;/p&gt;
&lt;p&gt;POST /{tenant_id}/mgmt/datastores/{datastore}/versions/{id}/members&lt;/p&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Delete a member:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;DELETE
/{tenant_id}/mgmt/datastores/{datastore}/versions/{id}/members/{member_id}&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic" start="3"&gt;
&lt;li&gt;&lt;p&gt;Get a member:&lt;/p&gt;
&lt;p&gt;GET
/{tenant_id}/mgmt/datastores/{datastore}/versions/{id}/members/{member_id}&lt;/p&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s2"&gt;"datastore_version_member"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;MEMBER_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"datastore_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;DATASTORE_VERSION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List members for a datastore version&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;GET  /{tenant_id}/mgmt/datastores/{datastore}/versions/{id}/members&lt;/p&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s2"&gt;"datastore_version_members"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;MEMBER_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"datastore_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;DATASTORE_VERSION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;MEMBER_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"datastore_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;DATASTORE_VERSION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;ol class="arabic" start="5"&gt;
&lt;li&gt;&lt;p&gt;Get members by tenant id:&lt;/p&gt;
&lt;p&gt;GET /{tenant_id}/mgmt/datastores/{datastore}/versions/members/{tenant_id}&lt;/p&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s2"&gt;"datastore_version_members"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;MEMBER_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="s2"&gt;"datastore_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;DATASTORE_VERSION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;MEMBER_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="s2"&gt;"datastore_version_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;DATASTORE_VERSION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;TENANT_ID&amp;gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Launchpad: riddhi89&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IRC: Riddhi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email: &lt;a class="reference external" href="mailto:ridhi.j.shah%40gmail.com"&gt;ridhi&lt;span&gt;.&lt;/span&gt;j&lt;span&gt;.&lt;/span&gt;shah&lt;span&gt;@&lt;/span&gt;gmail&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;Co-Authored by:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Theron Voran&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email: &lt;a class="reference external" href="mailto:theron.voran%40rackspace.com"&gt;theron&lt;span&gt;.&lt;/span&gt;voran&lt;span&gt;@&lt;/span&gt;rackspace&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1
Kilo-2&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;Already in review process - References [1].&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;It is in the process of review - References [1].&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests, fake tests and real mode tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Since API calls have been added/modified, their respective samples
would need to be incorporated in the API docs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/110197/"&gt;https://review.openstack.org/#/c/110197/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Guest RPC Ping Pong</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/guest-rpc-ping-pong.html</link><description>
 
&lt;p&gt;Blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/guest-rpc-ping-pong"&gt;https://blueprints.launchpad.net/trove/+spec/guest-rpc-ping-pong&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The proposal is to introduce a new Management API route that facilitates a
lightweight ping/pong mechanism for determining whether RPC communication is
working as expected.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Today, the only means of ascertaining whether direct or indirect RPC
connectivity between the control-plane and the guest is functioning, via an
API, is by using the ‘show’ operation in the Management API.&lt;/p&gt;
&lt;p&gt;Although mgmt-show indirectly answers the question of “is the guest
reachable?”, it is a relatively heavyweight call.  Beyond consulting the
filesystem for rudimentary information, mgmt-show sends ‘show’ requests to
Nova and Cinder.&lt;/p&gt;
&lt;div class="section" id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a deployer, I want to be able to determine whether RPC connectivity
between the control-plane and a specific guest is broken.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Introduce&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;rpc_ping&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Behavior&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;rpc_ping&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;will result in the following if it’s successful:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;
&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Thu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="n"&gt;Oct&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="n"&gt;GMT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;on the other hand, if trove-guest is shutdown, or the guest is generally
not responding, the following will be returned:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;237&lt;/span&gt;
&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Thu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="n"&gt;Oct&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;GMT&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"badRequest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"An error occurred communicating&lt;/span&gt;
 &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Timeout&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;waiting&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;RPC&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
 &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; \&lt;span class="s2"&gt;"guestagent.1e4099f1-7f8d-4564-bd83-0b9f66aa35b9&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;RPC&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; \&lt;span class="s2"&gt;"rpc_ping&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; info: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;unknown&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No Configuration changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No Database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No public API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No public API Security related changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="management-api"&gt;
&lt;h3&gt;Management API&lt;/h3&gt;
&lt;p&gt;Introduces:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;mgmt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;rpc_ping&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No Guest Agent changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;The current alternative is mgmt-show, but it’s too heavyweight of a call,
and can fail to return meaningful information if the underlying compute
and/or volume are unhealthy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Auston McReynolds (amcrn)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://review.openstack.org/#/c/125819/"&gt;https://review.openstack.org/#/c/125819/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No dependencies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Standard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;If the Management API is documented (which I don’t believe it is), then
the addition of the ‘rpc_ping’ route is relevant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Enhance Mgmt-Show To Support Deleted Instances</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/mgmt-show-deleted.html</link><description>
 
&lt;p&gt;Blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mgmt-show-deleted"&gt;https://blueprints.launchpad.net/trove/+spec/mgmt-show-deleted&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;/v1.0/&amp;lt;tenant_id&amp;gt;/mgmt/instances/&amp;lt;instance_id&amp;gt;&lt;/span&gt;&lt;/code&gt; does not work
for Trove instances that are marked as deleted.&lt;/p&gt;
&lt;p&gt;The proposal is to introduce an optional query parameter that indicates that
the Trove instance information should be returned irrespective of whether the
Trove instance is marked as deleted or not.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Without an API to retrieve information about a deleted instance, the deployer
is forced to consult the Trove infrastructure database directly.&lt;/p&gt;
&lt;p&gt;The mgmt-list operation supports returning deleted instances if
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;?deleted=true&lt;/span&gt;&lt;/code&gt; is provided, so it only makes sense that additional
information about a deleted instance be accessible via mgmt-show.&lt;/p&gt;
&lt;div class="section" id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a deployer, I want to be able to retrieve information about a deleted
Trove instance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Support the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;?deleted=true/false&lt;/span&gt;&lt;/code&gt; query parameter in
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;/v1.0/&amp;lt;tenant_id&amp;gt;/mgmt/instances/&amp;lt;instance_id&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Changes In Behavior:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;If &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deleted=true&lt;/span&gt;&lt;/code&gt;, if the Trove instance UUID is present in the
infrastructure database, the instance information is returned and the
request is successful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deleted=false&lt;/span&gt;&lt;/code&gt;, or the deleted query parameter is omitted, the request
will only succeed if the trove instance is not marked as deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the compute_instance_id exists in the trove.instances row, return it in
the mgmt-show response at instance.server.id, even if the Nova API
consultation fails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the volume_id exists in the trove.instances row, return it in the
mgmt-show response at instance.volume.id, even if the Cinder API
consultation fails.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No Configuration changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No Database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No public API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No public API Security related changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="management-api"&gt;
&lt;h3&gt;Management API&lt;/h3&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;GET&lt;/span&gt; &lt;span class="pre"&gt;/v1.0/&amp;lt;tenant_id&amp;gt;/mgmt/instances/&amp;lt;instance_id&amp;gt;&lt;/span&gt;&lt;/code&gt; will be enhanced to
support the ‘deleted’ query parameter.&lt;/p&gt;
&lt;p&gt;For reference, the response of a mgmt-show: &lt;a class="reference external" href="http://git.io/2RwWWA"&gt;http://git.io/2RwWWA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today, if the compute_instance_id is not recognized by the Nova API, the
mgmt-show response will not include instance.server{}. Along the same lines,
if the volume_id is not recognized by the Cinder API, the mgmt-show response
will not include instance.volume{}.&lt;/p&gt;
&lt;p&gt;This blueprint changes that behavior by always returning instance.server.id
and instance.volume.id if they exist in the trove.instances table.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No Guest Agent changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No relevant alternatives given the prior art on using ‘deleted=true/false’
in other Trove routes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Auston McReynolds (amcrn)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://review.openstack.org/#/c/128446/"&gt;https://review.openstack.org/#/c/128446/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No dependencies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Standard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;If the Management API is documented (which I don’t believe it is), then
the addition of the ‘deleted’ query parameter is relevant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Use native OS::* Heat resources for internal orchestration</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/native-os-heat-resources.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/native-os-heat-resources"&gt;https://blueprints.launchpad.net/trove/+spec/native-os-heat-resources&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;A far-fetching goal in Trove is to use OpenStack Orchestration service (Heat)
for all the internal orchestration tasks.
Current Trove usage of Heat involves exclusively AWS-compatible template
syntax and Heat resources.&lt;/p&gt;
&lt;p&gt;As of Icehouse OpenStack release Heat community declared new, native
HOT template format to be stable and ready for wide usage.
Moreover, most of the innovation will happen in native OS::* resources
and HOT template format to fully leverage available OpenStack functionality,
as they do not have to keep compatibility with AWS CloudFormation service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Align default Heat template with latest changes in Heat. That involves:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;usage of HOT template format and internal functions;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;usage of native OS::* resources wherever possible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;All the changes are in the &lt;cite&gt;default.heat.template&lt;/cite&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No public API Security related changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Do not change anything and continue to use AWS-compatible resources,
missing many of the new features Heat can offer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;pshchelo&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-2&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rewrite &lt;cite&gt;default.heat.template&lt;/cite&gt; to use as much of native Heat capabilities
and OS resources as possible
(implementation is on review &lt;a class="reference external" href="https://review.openstack.org/#/c/112035/"&gt;https://review.openstack.org/#/c/112035/&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unfortunately testing Heat-based orchestration is not yet enabled
on Trove gates.
Enabling it might be a topic for another blueprint.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Trove Replication V2</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/replication-v2.html</link><description>
 
&lt;p&gt;Include the URL of your launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/bp/replication-v2"&gt;https://blueprints.launchpad.net/trove/bp/replication-v2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Juno release of Trove laid the foundation of Trove Replication
support.  The V1 version of replication focused on providing read-only
slave replication in MySQL 5.5.  For the V2 replication release for
Kilo, replication will be extended to provide support for manual
failover in MySQL replication leveraging the latest replication
features of MySQL 5.6.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;For the Kilo release of OpenStack, trove replication support will be
extended to support manual failover when a replication master fails.
Specifically, this means that a user can instruct Trove to demote a
replication master and promote a slave to be the new master.  For V2,
manual promotion means that the user will be required to execute an
action to cause failover - a component to detect failure and cause the
failover to occur will not be within the scope of V2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Supported Features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;manual failover&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;master/slaves in different availability zones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;automatic slave generation to replace slaves promoted to master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;automatically generated slave will be created in the same az as the
slave that was promoted to master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;public ips assigned to deleted/demoted master will be transferred to
new master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;public ips of promoted slave will be transferred to new slave&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GTIDs will be used to facilitate master promotion (Note: this limits
feature set to MySQL 5.6 and later)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if a master site is reachable, a chosen slave may be promoted to
master and the old master will be demoted to a slave.  This
operation will be done in such a way as to prevent the loss of data.
This operation would be useful for resizing a master without
downtime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a master site may be deleted, in which case Trove will pick a slave
to be promoted to master (see MASTER_PROMOTION_STRATEGY below) and a
new slave will be generated to replace the promoted slave.  If the
master site in not reachable, it will be forcefully removed from
Trove/Nova; this is how an unreachable master would be “failed
over”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;new master selection process on delete has following
MASTER_PROMOTION_STRATEGY (CONF) switch: MOST_RECENT: the slave with
the most recent updates is chosen as new master, PROXIMATE_AZ: slave
IN MASTER’s AZ with most recent updates is chosen as new master,
PROXIMATE_REGION: slave IN MASTER’s REGION with most recent update
is chosen as new master.  PROXIMATE_REGION will be the default
(though for now equivalent to MOST_RECENT) and may be the only
implemented option for V2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication from existing backup and incremental snapshot will be
implemented&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replica_count option will be added to create-instance to allow N
slaves to be spun up from a given snapshot.  All replicas from the
given snapshot will have the same “create-instance” options.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Features Not Supported:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;automatic failover&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;region support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;writable slaves&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;features related to the promotion of slaves to masters will not be
supported by MySQL versions prior to 5.6&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication_strategy per datastore - this could be implemented in
Kilo via an independent blueprint&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GTID based replication for MariaDB (binlog replication will not be
tested for MariaDB, but should be compatible with MySQL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;host affinity/anti-affinity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dealing with “error transactions” created when updates are executed
directly on slaves in conflict with changes on the master.
Performing updates directly on slaves is not supported by Trove and
slave sites will be put into “read only” mode.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="replication-v2-components"&gt;
&lt;h3&gt;Replication V2 Components&lt;/h3&gt;
&lt;p&gt;The V2 Replication feature will consist of several components:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement a new replication strategy to support GTID Based
Replication in addition to Bin Log replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manual failover from replication master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replication configuration using incremental snapshots based on
existing backups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creation of multiple slaves from master in single call&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="upgrade-from-binlog-replication-to-gtid-based-replication"&gt;
&lt;h4&gt;Upgrade from Binlog Replication to GTID Based Replication&lt;/h4&gt;
&lt;p&gt;MySQL 5.6 introduced a new type of replication which is based on
Global Transaction IDs (GTID).  By assigning a GTID to each
transaction, MySQL is able to simplify transaction coordination
between masters and slaves, allowing for simpler and more reliable
failover to a new master.&lt;/p&gt;
&lt;p&gt;This feature requires that the trove-integration project upgrade to
use Ubuntu 14.04 and MySQL 5.6.&lt;/p&gt;
&lt;p&gt;A new Replication Strategy named “MysqlGTIDReplicationStrategy” will
be created to support the new GTID based replication with MySQL 5.6
and later, and the existing Replication Strategy named
“MysqlBinlogReplication” will continue to be supported for MySQL 5.5
but without support for the new features listed in this document.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="manual-failover-from-replication-master"&gt;
&lt;h4&gt;Manual Failover from Replication Master&lt;/h4&gt;
&lt;p&gt;It will be possible for a user to cause a slave to become the new
master for replication by executing a trove command.  For the V2
release of replication, no facility for detecting a master failure
condition will be provided.&lt;/p&gt;
&lt;p&gt;To assist the user in minimizing data loss, there will be two
different ways for the user to cause a slave to be promoted to master.
If the user wishes to promote a slave to replace a master which is
healthy and reachable, they will execute a new
“promote_to_replica_source” function against a slave to promote it in
place of the existing master; this function will coordinate with the
master site to ensure that no data is lost.  If a master site is
unreachable, the user will use the “eject_replica_source” function to
remove that instance from the replication set and the replication
strategy will choose the slave with the most recent updates to promote
to master; this operation may result in the loss of any transactions
that were committed at the master site but not replicated to any of
the slaves.  Trove will not allow a reachable master site to be
deleted as that would unnecessarily result in lost data.&lt;/p&gt;
&lt;p&gt;There will be no accomodation made to allow users or operators to
“fix” slaves which have gotten out of sync with the master site.
Instead, every effort will be made to configure replication so that
the slave will not fall out of sync with the master.  The following
MySQL options will be set to ensure safe replication:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Master Options&lt;/em&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Binary logs will be configured for MIXED mode logging.  This will
allow statement based replication where it is safe to do so, and row
based replication will be used where necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The enforce_gtid_consistency option will be used to prevent
statements which will conflict with the use of GTID replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the Percona database is being used, the Percona
enforce_storage_engine option will be used to restrict replication
to the InnoDB storage engine.  This is to prevent the use of MyISAM
tables which could be corrupted during a crash recovery.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Slave Options&lt;/em&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Slave will execute in READ_ONLY mode to avoid transaction conflicts
between master and slave.  By default, users are not given root
access to the database; if they choose to enable root access, they
are assumed to be sufficiently advanced as to not execute operations
on a slave which will disturb replication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The slaves’ relay log will be stored in a table in the database to
provide transactional consistency between the statements executed
against the database and the recording of the slave’s position in
executing the relay log.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relay log recovery will be turned on to cause relay log recovery
during mysql startup.  relay_log_purge will be enabled in support
for relay_log_recovery.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="promotion-of-slave-to-master"&gt;
&lt;h5&gt;Promotion of Slave to Master&lt;/h5&gt;
&lt;p&gt;The user may select a slave to be promoted to be the new master of a
replication set.  This operation would consist of the following steps:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Contact each slave, abort operation if any not reachable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make the old master read-only&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detach old master’s public IP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detach master candidate’s public IP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record latest GTID of master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each slave (including master candidate)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Wait for slave to receive/apply master’s latest GTID&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set master candidate as replication master site&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each remaining slave&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Make instance slave of new master&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make old master be slave of new master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign master candidate’s IP to old master (which is now slave)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make new master writable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign old master’s public IP to new master&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Promote to Master API&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To replace a healthy master site, the promote_to_replica_source API
call will be added to the client and taskmanager APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ejection-of-master-site"&gt;
&lt;h5&gt;Ejection of Master Site&lt;/h5&gt;
&lt;p&gt;If a replication master site is out of service, the user may choose to
“eject” the instance from the replication set.  Ejecting an
unreachable instance which is a master for replication would result in
one of its slaves being chosen to be promoted to be the new master
site, and a new slave generated to fill out the replication set.  The
ejected master will be available for examination, but will no longer
participate in replication.  This operation would consist of the
following steps:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Abort operation if the master site can be contacted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contact each slave, abort operation if any not reachable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detach master’s public IP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record master’s Region/Zone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select master candidate (see Master Candidate Selection)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch the master candidate from slave to master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For each remaining slave&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Connect slave to new master instance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mark new master as writable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attach master’s public IP to new master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create new slave in same Region/Zone as old master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign master candidate’s public IP to new slave&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Master Candidate Selection&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When selecting a slave to be promoted to master to replace an
unreachable master site, the algorithm for choosing the master
candidate will be determined by the value of the
MASTER_PROMOTION_STRATEGY configuration option of the Taskmanager
Config (not datastore specific).  The possible values for this option
are outlined below:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 25%"/&gt;
&lt;col style="width: 75%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Strategy&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;MOST_RECENT&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The slave with the highest GTID is chosen as the
master candidate&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;PROXIMATE_AZ&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The slave with the highest GTID in the same
Availability Zone as the old master is chosen&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;PROXIMATE_REGION&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;The slave with the highest GTID in the same
Region as the old master is chosen&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The PROXIMATE_REGION setting will be the default as this will ensure
that the new master site will be in the same region as the old master;
for the Kilo release, this will be equivalent to the MOST_RECENT
option (and may be implemented as such) as Region support is not
implemented in Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="incremental-snapshots"&gt;
&lt;h4&gt;Incremental Snapshots&lt;/h4&gt;
&lt;p&gt;To improve the performance of slave creation, the default action will
be to take the most recent backup (full or incremental) and create an
incremental backup to be used for the replication snapshot.  If no
previous backup can be found, a full backup will be created to include
in the replication snapshot.  Should the “backup” option be specified
in addition to the “replica_of” option, an incremental backup will be
performed from the indicated backup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="multiple-slave-creation"&gt;
&lt;h4&gt;Multiple Slave Creation&lt;/h4&gt;
&lt;p&gt;A replica_count option will be added to support the creation of multiple
slaves from a single replication snapshot.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;a replica_count option will be added to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trove&lt;/span&gt; &lt;span class="pre"&gt;create&lt;/span&gt;&lt;/code&gt; command&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a replica_count parameter will be added to the create_instance
taskmanager ReST API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the taskmanager FreshInstanceTasks.create_instance method will
iteratively create the specified number of slaves from a single
replication snapshot (the implementor is free to implement slave
creation in parallel if time permits, and should investigate doing
so, but it is not a requirement for V2)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;MysqlGTIDReplicationStrategy value added to ReplicationStategy option
for MySQL configuration.&lt;/p&gt;
&lt;p&gt;New configuration option master_promotion_strategy added to MySQL
configuration with values as above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No database impacts are envisioned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Promote to Replica Source&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A new action will be added to the Trove REST API to allow a replica to
be promoted to be the master of its replication set:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"promote_to_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;RESP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s1"&gt;'date'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;date&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'content-length'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;RESP BODY len&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'content-type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'application/json'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;RESP&lt;/span&gt; &lt;span class="n"&gt;BODY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"PROMOTE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
          &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-11-25T21:25:11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
              &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-11-25T21:25:06"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"replicas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"8e5710df-ef39-4201-a059-764d9091f079"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                      &lt;span class="p"&gt;{&lt;/span&gt;
                          &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                      &lt;span class="p"&gt;},&lt;/span&gt;
                      &lt;span class="p"&gt;{&lt;/span&gt;
                          &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                      &lt;span class="p"&gt;}&lt;/span&gt;
                  &lt;span class="p"&gt;]&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"fff6d8c5-9d05-4a00-ab58-d8954ec945a3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/flavors\/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                  &lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/flavors\/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                  &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A new CLI command will be added to invoke the
promote_to_replica_source API:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;promote&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Eject Replica Source&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A new action will be added to the Trove REST API to allow a replica
source to be ejected from a replication set:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"eject_replica_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;RESP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s1"&gt;'date'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;date&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'content-length'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;RESP BODY len&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'content-type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'application/json'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;RESP&lt;/span&gt; &lt;span class="n"&gt;BODY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"EJECT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
          &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-11-25T21:25:11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
              &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2014-11-25T21:25:06"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"replicas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"8e5710df-ef39-4201-a059-764d9091f079"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                      &lt;span class="p"&gt;{&lt;/span&gt;
                          &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                      &lt;span class="p"&gt;},&lt;/span&gt;
                      &lt;span class="p"&gt;{&lt;/span&gt;
                          &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/instances\/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                      &lt;span class="p"&gt;}&lt;/span&gt;
                  &lt;span class="p"&gt;]&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"fff6d8c5-9d05-4a00-ab58-d8954ec945a3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/v1.0\/...\/flavors\/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"self"&lt;/span&gt;
                  &lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https:\/\/10.40.10.178:8779\/flavors\/7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="s2"&gt;"rel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"bookmark"&lt;/span&gt;
                  &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;]&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A new CLI command will be added to invoke the eject_replica_source
API:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;eject&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;replica&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Trove Create Replica Count&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Trove REST API for the create instance operation will be augmented
with a new field &lt;em&gt;replica_count&lt;/em&gt; to specify the number of replicas to
be created from the indicated instance:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8779&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"replica_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;master id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"replica_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;n&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;RESP&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;unchanged&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;An option will be added to the “trove create” CLI command to specify
the new replica count option:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;replica_count&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;promote_to_replica_source method added to taskmanager API.
eject_replica_source method added to taskmanager API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The implementation of this feature set will result in many additions
to the MySQL guest agent.  There should be minimal impact to
pre-existing code, and there is not expected to be any impact on
backward compatibility of the APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;vgnbkr&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Secondary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;peterstac&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo-2&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;table class="docutils align-default"&gt;
&lt;colgroup&gt;
&lt;col style="width: 46%"/&gt;
&lt;col style="width: 19%"/&gt;
&lt;col style="width: 35%"/&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Work Item&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Assignee&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Scheduled Release&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;GTID Support&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Morgan&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Kilo-3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Failover&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Morgan&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Kilo-3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Slave Count&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Peter&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Kilo-3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Incremental Snapshots&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Peter&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Kilo-3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;n/a&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The existing int-tests are believed to be sufficient for testing the
GTID replication changes, as there are no functionality changes, just
implementation changes.&lt;/p&gt;
&lt;p&gt;New Int-Tests:&lt;/p&gt;
&lt;p&gt;Promote to Master Positive&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Create a new replication set of two sites.  Attach floating ip
addresses to each instance.  Execute the promote_to_replica_source
API call and verify that the master/slave relationships are
correctly changed, and that the floating ip addresses maintain
their affinity to master and slave.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Promote to Master Negative&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Create a new replication set of two sites. Execute “service mysql
stop” on the master site.  Verify that promote_to_replica_source
cannot be executed against the slave site.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Delete Master Positive&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Create a new replication set of two sites.  Attach floating ip
addresses to each instance.  Execute “service mysql stop” on the
master to simulate the master site crashing.  Execute the delete
API call against the master site.  Ensure that the slave has been
promoted to master, a new slave has been added, and that the
floating ip addresses have been moved appropriately.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Replica Count&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;No int-test will be done for this feature due to the resource
requirements&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Incremental Snapshots&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;No int-test will be done for this feature as there is no way to
verify that the restore was actually done from an incremental
backup rather than a full backup&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;div class="section" id="user-guide"&gt;
&lt;h3&gt;User Guide&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add section explaining manual failover, both via
promote-to-replica-source and via deletion of a failed master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;section on replication should be updated to document replica_count
option to “trove create”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-reference"&gt;
&lt;h3&gt;CLI Reference&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add promote-to-replica-source command&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add eject-replica-source command&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;update create command with replica_count&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://etherpad.openstack.org/p/kilo-summit-trove-replication-v2"&gt;https://etherpad.openstack.org/p/kilo-summit-trove-replication-v2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Make Rsync for Guest Optional</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/rsync-optional.html</link><description>
 
&lt;p&gt;Blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove-integration/+spec/rsync-optional"&gt;https://blueprints.launchpad.net/trove-integration/+spec/rsync-optional&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today, the instance rsyncs the guestagent code and trove-guestagent.conf
via &lt;a class="reference external" href="http://git.io/qI9ivw"&gt;http://git.io/qI9ivw&lt;/a&gt; (or &lt;a class="reference external" href="http://git.io/p88Njw"&gt;http://git.io/p88Njw&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The proposal is to introduce an alternative that does not require
guest-to-controller SSH connectivity: bake the guestagent code and
trove-guestagent.conf into the image.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;In production, permitting SSH connectivity between guests and the
control-plane is a security no-no. Although trove-integration is considered
to be only a sample reference implementation, we owe it to deployers to
provide insight into how to properly secure Trove.&lt;/p&gt;
&lt;div class="section" id="use-cases"&gt;
&lt;h3&gt;Use Cases&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;As a deployer, I want to avoid ssh connectivity between guests and the
control-plane.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Add additional elements in trove-integration to stage the guestagent code
and trove-guestagent.conf during the extra-data.d hook, and subsequently
install them in the install.d hook, vs. relying on upstart/systemd to rsync.&lt;/p&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://review.openstack.org/#/c/119488/"&gt;https://review.openstack.org/#/c/119488/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is not turned on by default, and therefore is backwards compatible.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;To make use of this functionality, it requires setting GUEST_LOCAL_TROVE_DIR
and GUEST_LOCAL_TROVE_CONF. The aforementioned values are used in the newly
introduced diskimage-builder elements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No database changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No public API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No public API Security related changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;No Guest Agent changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;No alternatives.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Auston McReynolds (amcrn)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://review.openstack.org/#/c/119488/"&gt;https://review.openstack.org/#/c/119488/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;No dependencies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;diskimage-builder element additions/changes are not tested via traditional
means at the moment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;No documentation impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Switch to OSLO Messaging</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/switch-to-oslo-messaging.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Trove-rpc-versioning"&gt;https://wiki.openstack.org/wiki/Trove-rpc-versioning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blueprint is to document the project to switch trove to use OSLO
Messaging.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Get Trove on the same page w/ other projects + oslo. This will require
refactoring the rpc layer&lt;/p&gt;
&lt;p&gt;Prevent backward incompatibility between Trove components&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The rpc client can send an older version of a message/call to a
newer message handler without issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The rpc client can send a newer version of a message/call to an
older message handler without killing it (need to confirm this).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The rpc client can check to see if it can send a newer version of a
message/call.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce the need for downtime during deployments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;** Effectively allows for a mix of versions between the control plane&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;and guest agents (in most cases). There may still be updates that
will require down time.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Remove rpc common components from oslo incubator?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use oslo messaging library&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;** The minimum version will be picked from global-requirements. At the&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;time of this writing, it’s &amp;gt;= 1.4.0&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Keep track of a “version history” in comments in the code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update trove calls to the openstack.common.rpc client to include a
version cap param. (This is already supported in the client)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;** Trove API    –&amp;gt; Task Manager
** Trove API    –&amp;gt; Guest Agent
** Guest Agent  –&amp;gt; Conductor
** Task Manager –&amp;gt; Conductor
** Document the use cases and examples of how to add/modify API calls&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;oslo.messaging has been designed to be backwards compatible
config-wise. All the config compatibilities will be kept until all the
projects have been migrated to oslo.messaging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;NA&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;sgotliv&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;see above.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Additional tests will be proposed if required, existing tests amended.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;See &lt;a class="reference external" href="https://review.openstack.org/#/c/94484/"&gt;https://review.openstack.org/#/c/94484/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Cassandra Backup &amp;amp; Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/cassandra-backup-restore.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-backup-restore"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-backup-restore&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Cassandra datastore currently does not support any backup/restore strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement full backup/restore of a single instance
using the Nodetool &lt;a class="footnote-reference brackets" href="#id6" id="id1"&gt;1&lt;/a&gt; utility for Cassandra 2.1 &lt;a class="footnote-reference brackets" href="#id8" id="id2"&gt;3&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;The following Cassandra configuration options will be updated:&lt;/dt&gt;&lt;dd&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup/restore namespaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;The following Trove CLI commands (upon completion)
will be fully functional with Cassandra:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create –backup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;We are implementing full backup using node snapshots following the procedure
outlined in the Nodetool manual &lt;a class="footnote-reference brackets" href="#id7" id="id3"&gt;2&lt;/a&gt;.
Nodetool can take a snapshot of one or more keyspace(s).
A snapshot can be restored by moving all &lt;em&gt;*.db&lt;/em&gt; files from a snapshot
directory to the respective keyspace overwriting any existing files.&lt;/p&gt;
&lt;p&gt;When a snapshot is taken Cassandra starts saving all changes into new
data files keeping the old ones at the same state as when the snapshot was
taken.
The data storage must have enough capacity to accommodate the backlog of all
changes throughout the duration of the backup operation until the snapshots get
cleaned up.&lt;/p&gt;
&lt;p&gt;Backups are streamed to and from a remote storage as (TAR) archives.
We now outline the general procedure for creating and restoring
such an archive.&lt;/p&gt;
&lt;p&gt;Unique backup IDs will be used for snapshot names, to avoid collisions between
concurrent backups.&lt;/p&gt;
&lt;p&gt;The Backup Procedure:&lt;/p&gt;
&lt;ol class="arabic" start="0"&gt;
&lt;li&gt;&lt;p&gt;Make sure the database is up an running.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear any existing snapshots (nodetool clearsnapshot) with the same name
as the created one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take a snapshot of all keyspaces (nodetool snapshot).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collect all &lt;em&gt;*.db&lt;/em&gt; files from the snapshot directories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Package the snapshot files into a single TAR archive
(compressing and/or encrypting as required) while streaming
the output to Swift storage under the database_backups container.&lt;/p&gt;
&lt;p&gt;Transform the paths such that the backup can be restored simply by
extracting the archive right to an existing data directory.
This is to ensure we can always restore an old backup
even if the standard guest agent data directory changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear the created snapshots as in (1).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Restore Procedure:&lt;/p&gt;
&lt;ol class="arabic simple" start="0"&gt;
&lt;li&gt;&lt;p&gt;Stop the database if running and clear any files generated in the system
keyspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new data directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read backup from storage unpacking it to the data directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update ownership of the restored files to the Cassandra user.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Additional Considerations:&lt;/p&gt;
&lt;p&gt;Instances are created as single-node clusters. A restored instance
should therefore belong to its own cluster as well.
The original cluster name property has to be reset to match the new unique ID
of the restored instance. This is to ensure that the restored instance is a
part of a new single-node cluster rather than forming a one with the
original node or other instances restored from the same backup.
Cluster name is stored in the database and is required to match the
configuration value. Cassandra fails to start otherwise.&lt;/p&gt;
&lt;p&gt;A general ‘cluster_name’ reset procedure is:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Update the name in the system keyspace table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the name in the configuration file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restart the service.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The ‘superuser’ &lt;em&gt;(“root”)&lt;/em&gt; password stored in the system keyspace
needs to be reset before we can start up with restored data.&lt;/p&gt;
&lt;p&gt;A general password reset procedure is:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Disable user authentication and remote access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restart the service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the password in the ‘system_auth.credentials’ table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-enable authentication and make the host reachable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restart the service.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Implement functionality needed for resetting cluster name and superuser
password.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement backup/restore API calls.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;The patch set will be building on functionality implemented in blueprints:
cassandra-database-user-functions &lt;a class="footnote-reference brackets" href="#id9" id="id4"&gt;4&lt;/a&gt; and cassandra-configuration-groups &lt;a class="footnote-reference brackets" href="#id10" id="id5"&gt;5&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unittests will be added to validate implemented functions and non-trivial
codepaths. We do not implement functional tests as a part of this patch set.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.
Also note the new configuration options - backup/restore namespaces and
backup_strategy for Cassandra datastore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id6"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;1&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on Nodetool utility for Cassandra 2.1: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsNodetool_r.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsNodetool_r.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id3"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Manual on Backup and Restore for Cassandra 2.1: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/operations/ops_backup_restore_c.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/operations/ops_backup_restore_c.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on Cassandra 2.1: &lt;a class="reference external" href="http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html"&gt;http://docs.datastax.com/en/cassandra/2.1/cassandra/gettingStartedCassandraIntro.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id9"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id4"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Database and User Functions for Cassandra: &lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-database-user-functions"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-database-user-functions&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id5"&gt;5&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Configuration Groups for Cassandra: &lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/cassandra-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/cassandra-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>MongoDB Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mongodb-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mongodb-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/mongodb-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The MongoDB guestagent currently does not support configuration groups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement configuration groups for MongoDB 2.6 and above.&lt;/p&gt;
&lt;p&gt;MongoDB 2.6 and above stores its configuration &lt;a class="footnote-reference brackets" href="#id4" id="id1"&gt;1&lt;/a&gt; in a YAML ‘mongod.conf’
file.
The database service has to be restarted for any changes to the
configuration file to take effect. All configuration changes will therefore be
requiring database restart and ‘apply_overrides’ will be implemented as no-op.&lt;/p&gt;
&lt;p&gt;Overrides will be implemented by replacing the current file with an
updated one.
The old file will be backed up in the same directory (as &lt;em&gt;*.old&lt;/em&gt;) and
restored on configuration reset.&lt;/p&gt;
&lt;p&gt;The platform-default configuration file will be used as a base for our
configuration template.
Guest agent interfaces exposing the configuration properties will be made
available to other modules such as backup and replication.&lt;/p&gt;
&lt;p&gt;Most configuration properties will be available via configuration groups.
Some, however, do not make sense in the Trove context.&lt;/p&gt;
&lt;p&gt;These would include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;irrelevant options (like automatic snapshots, since the Trove user cannot
retrieve them)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guestagent specific (e.g. file paths, passwords)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;items that Trove needs to control (replication/clustering properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; for the full list of supported
options.&lt;/p&gt;
&lt;p&gt;The user should be able to specify configurations properties as standard Python
YAML objects - key-value pairs and dicts.&lt;/p&gt;
&lt;div class="section" id="available-configuration-properties"&gt;
&lt;h3&gt;Available Configuration Properties&lt;/h3&gt;
&lt;p&gt;Keys not included in the lists are kept at their default values and are not
configurable via Trove. See &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;1&lt;/a&gt; for more details and default values.&lt;/p&gt;
&lt;p&gt;The properties configurable by the user via the Trove API:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;systemLog.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.accessControl.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.command.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.control.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.geo.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.index.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.network.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.query.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.replication.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.sharding.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.storage.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.storage.journal.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.component.write.verbosity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.quiet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.traceAllExceptions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.logAppend&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.logRotate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;systemLog.timeStampFormat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.maxIncomingConnections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.wireObjectCheck&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.unixDomainSocket.enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.ipv6&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.http.enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.http.JSONPEnabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;net.http.RESTInterfaceEnabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security.sasl.hostName&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security.sasl.serviceName&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security.sasl.saslauthdSocketPath&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;security.javascriptEnabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;operationProfiling.slowOpThresholdMs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;operationProfiling.mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.indexBuildRetry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.journal.enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.directoryPerDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.syncPeriodSecs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.nsSize&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.quota.enforced&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.quota.maxFilesPerDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.smallFiles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.journal.debugFlags&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.mmapv1.journal.commitIntervalMs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.engineConfig.cacheSizeGB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.engineConfig.statisticsLogDelaySecs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.engineConfig.journalCompressor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.engineConfig.directoryForIndexes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.collectionConfig.blockCompressor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storage.wiredTiger.indexConfig.prefixCompression&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication.oplogSizeMB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication.secondaryIndexPrefetch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sharding.clusterRole&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auditLog.format&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auditLog.filter&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;snmp.subagent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;snmp.master&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication.localPingThresholdMs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sharding.autoSplit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sharding.configDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sharding.chunkSize&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;setParameter&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Non-configurable properties with updated default values:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;systemLog.path&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;systemLog.destination&lt;/em&gt; &lt;strong&gt;file&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;processManagement.pidFilePath&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;processManagement.fork&lt;/em&gt; &lt;strong&gt;True&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;security.keyFile&lt;/em&gt; &lt;strong&gt;(controlled-by replication)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;security.clusterAuthMode&lt;/em&gt; &lt;strong&gt;(keyFile)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;security.authorization&lt;/em&gt; &lt;strong&gt;True&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;storage.dbPath&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;replication.replSetName&lt;/em&gt; &lt;strong&gt;(controlled-by replication)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;sharding.archiveMovedChunks&lt;/em&gt; &lt;strong&gt;False&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;auditLog.destination&lt;/em&gt; &lt;strong&gt;file&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;auditLog.path&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;This work will enable the following client commands:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-patch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-update&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update facilities for handling of YAML config files
in the &lt;em&gt;operating_system&lt;/em&gt; module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement API to &lt;em&gt;update_overrides&lt;/em&gt; in
the &lt;em&gt;manager&lt;/em&gt; and &lt;em&gt;service&lt;/em&gt; modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The current configuration template will be updated to the default version
for the target platform with changes noted in
&lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/mongodb/manager.py
guestagent/datastore/experimental/mongodb/service.py
templates/mongodb/config.template
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Implement functionality to handle (read/write/update) MongoDB YAML
configuration files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement configuration-related manager API calls.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to validate implemented functions and non-trivial
codepaths. Relevant integration tests will be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;1&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id2"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on MongoDB configuration: &lt;a class="reference external" href="http://docs.mongodb.org/manual/reference/configuration-options/"&gt;http://docs.mongodb.org/manual/reference/configuration-options/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>MongoDB database management</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mongodb-database.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mongodb-database"&gt;https://blueprints.launchpad.net/trove/+spec/mongodb-database&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enable MongoDB database management functionality.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The MongoDB datastore does not support database management features. Allowing
the user to create, list, and delete databases through the API is essential.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Three standard Trove commands will be enabled for MongoDB:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;database-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database-delete&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The changes will be confined to the guestagent code. The taskmanager, API, and
conductor do not require any code changes. The code changes will be to
implement a new class service.MongoDBAdmin and the corresponding methods as
members of the class. The methods of manager.Manager will be updated to call
the admin functions.&lt;/p&gt;
&lt;p&gt;Calls to MongoDB will be done in Python via the PyMongo library, which is
required to be pre-installed on the guest.&lt;/p&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;No changes will be made to any configuration files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No new items will be added here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No API Security changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No Internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Modified files:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;MongoDBSchema&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Guest Agent will be changed to support the following manager functions:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;create_database - MongoDB does not have a method to explicitly create a
database. The database to use is specified via ‘use &amp;lt;dbname&amp;gt;’, but this does
not create the database. Databases are created when a ‘document’ is first
inserted into them. To ensure a database is created, a dummy document will
be inserted but then deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list_databases - Run ‘pymongo.MongoClient.database_names()’ and return the
resulting list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete_database - Drop the database with
‘pymongo.MongoClient.drop_database(“&amp;lt;dbname&amp;gt;”)’. Users associated with the
database will have to be removed manually.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;create_database could not create a dummy object in the database.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Matthew Van Dijk&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The changes will be implemented in a single commit. The scope is small and the
functionality is linked.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;There will be no upgrade implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;There are no dependencies on other work in progress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to validate non-trivial code paths.
Integration tests may be added as needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The MongoDB datastore documentation can be updated to reflect the enabled
features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;There are no external references in this document.&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>MongoDB users management</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/mongodb-users.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/mongodb-users"&gt;https://blueprints.launchpad.net/trove/+spec/mongodb-users&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enable MongoDB users management functionality.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The MongoDB guest agent does not support users management features. Allowing
the user to create, list, and delete users, enable/check root access, and
grant/revoke user access through the API is essential.&lt;/p&gt;
&lt;p&gt;MongoDB users are unique to each database. A user is identified by both its
name and database. Therefore the Trove actions requiring user names need
the value to be in the following string format: “&amp;lt;database&amp;gt;.&amp;lt;username&amp;gt;”.
MongoDB does not allow the following characters in the database name: /. “$&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Calls to MongoDB will be done in Python via the PyMongo library, which is
required to be pre-installed on the guest.&lt;/p&gt;
&lt;div class="section" id="features"&gt;
&lt;h3&gt;Features&lt;/h3&gt;
&lt;p&gt;A number of Trove commands will be enabled for the MongoDB datastore.
Also, MongoDB’s authentication protocol will be enabled by default, making
the database secure.&lt;/p&gt;
&lt;div class="section" id="functions"&gt;
&lt;h4&gt;Functions&lt;/h4&gt;
&lt;p&gt;Several standard Trove commands will be enabled for MongoDB. Below are the
corresponding CLI commands with all allowed arguments:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;grant&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;access_databases&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;revoke&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;access_database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The code changes will be to implement a new class service.MongoAdmin and the
corresponding methods as members of the class. The methods of manager.Manager
will be updated to call the admin functions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="security"&gt;
&lt;h4&gt;Security&lt;/h4&gt;
&lt;p&gt;Currently the MongoDB datastore creates an insecure database. To make the
above functionality useful the guest agent’s MongoDB server will be made
secure. This will be done by enabling authentication and creating a Trove
user ‘os_admin’ on the server by default. The Trove user will have user and
database administrator privileges, but not read/write. When the guest is first
started the guest agent will generate a password and
connect (because of the localhost exception) to the server. It will then run
the following (below is Mongo shell code, but it will be implemented using
PyMongo):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"os_admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;generated_password&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"userAdminAnyDatabase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"dbAdminAnyDatabase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"cluserAdmin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Authentication will be enabled by default. To disable it a configuration group
can be used with the option {‘auth’: ‘false’}.&lt;/p&gt;
&lt;p&gt;Note: enabling authentication on MongoDB effects clustering as shards are
required to use a shared key file to connect to each other. Therefore a new
cryptographically secure key will be generated during cluster-create to be used
by the shards. This key value will be pushed to each shard, where it will be
stored for connection use. The key will not be stored on the controller. The
controller will ask an existing cluster guest for the key when adding new
shards.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The mongodb configuration file will have ‘auth’ set to ‘on’ to enable
authentication on the server.&lt;/p&gt;
&lt;p&gt;A new MongoDB RC script will be created at ~/.mongorc.js. This file will store
the username and generated password, allowing the local MongoDB client to
automatically connect using those credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;No new items will be added here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;No API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;No API Security changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;No Internal API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;Modified files:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;MongoDBUser&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guestagent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;experimental&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The Guest Agent will be changed to support the following manager functions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create user - using ‘createUser()’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list users - query the admin database’s system.users collection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delete user - using ‘dropUser()’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;show user - using ‘getUser()’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable root - create user “root” and grant the role “root”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;check if root is enabled - check if user “root” exists&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grant user access to a database - using ‘updateUser()’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;revoke user access to a database - using ‘updateUser()’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;show user access to a database - using ‘getUser()’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Grant os_admin “root” role for full access.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Matthew Van Dijk&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;liberty-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The work will be split into four deliverables:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Enable authentication on server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create/list/show/delete users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enable/check root&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;grant/show/revoke access&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;There will be no upgrade implications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;There are no dependencies on other work in progress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to validate non-trivial codepaths.
Integration tests may be added if necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Documentation will be required to explain that authentication is enabled on
MongoDB guests. The MongoDB datastore documentation can be updated to reflect
the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://docs.mongodb.org/manual/"&gt;MongoDB manual&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Redis Backup And Restore</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/redis-backup-restore.html</link><description>
 
&lt;p&gt;Backup and Restore functionality needs to be added to the Redis datastore.&lt;/p&gt;
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/redis-backup-restore"&gt;https://blueprints.launchpad.net/trove/+spec/redis-backup-restore&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Trove instances created with the Redis datastore do not currently have a way to
create a backup or to restore from one.  This functionality needs to be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;Redis currently has two persistence strategies: RDB &lt;a class="footnote-reference brackets" href="#id3" id="id1"&gt;*&lt;/a&gt; and AOF &lt;a class="footnote-reference brackets" href="#id4" id="id2"&gt;†&lt;/a&gt; (both can
be used concurrently).  The backup strategy is the same for both, however
restoring is a little different if AOF is enabled (whether or not RDB is also
enabled).&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Note: All necessary changes are anticipated to be made in the Trove guestagent&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;code.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id3"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id1"&gt;*&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Redis DataBase&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id4"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id2"&gt;†&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Append-Only File&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="section" id="backup"&gt;
&lt;h3&gt;Backup&lt;/h3&gt;
&lt;p&gt;The redis-cli utility will be used to create the backup.  This process is the
same regardless of the persistence strategy configured within Redis.  The
process will be as follows &lt;a class="footnote-reference brackets" href="#id10" id="id5"&gt;1&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine the directory where the backup files are written.  This directory
is stored in the redis configuration file (typically /etc/redis/redis.conf)
under the dir keyword.  At present this location is hard-coded in the redis
config.template file, however it could be exposed in the future through
configuration groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find the time of the last Redis persistence run, and retain the information
temporarily.  This is accomplished by executing the LASTSAVE command through
the redis-cli, and is necessary to determine when the next run completes (as
explained below).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start a backup using the redis-cli utility.  This is done by executing the
BGSAVE command. &lt;a class="footnote-reference brackets" href="#id11" id="id6"&gt;2&lt;/a&gt;  Note: If Redis persistence is turned off
(it is on by default in the config.template) then enough disk space
must be available to write the backup file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait until the backup completes.  This is determined by polling using the
LASTSAVE command as above, and waiting until the timestamp changes. &lt;a class="footnote-reference brackets" href="#id12" id="id7"&gt;3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compress/encrypt the backup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stream the compressed/encrypted output to storage in Swift under the
database_backups container.  If persistence is turned off, the backup
file can then be deleted.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="restore"&gt;
&lt;h3&gt;Restore&lt;/h3&gt;
&lt;p&gt;Restoring a Redis server from backup depends on the persistence method that is
running on the server. &lt;a class="footnote-reference brackets" href="#id13" id="id8"&gt;4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To restore a Redis server from a backup &lt;a class="footnote-reference brackets" href="#id10" id="id9"&gt;1&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine if AOF mode is enabled&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If AOF is disabled:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine the location where backup files are located&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure the redis server is not running (stop if necessary)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the existing dump.rdb file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the backup from storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put the backup into the proper location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the ownership to redis:redis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the redis server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If AOF is enabled:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Determine the location where backup files are located&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure the redis server is not running (stop if necessary)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove existing dump.rdb and appendonly.aof&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retrieve the backup from storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put the backup into the proper location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the ownership to redis:redis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disable AOF in the Redis configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the redis server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new AOF file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop the Redis server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn on AOF in the Redis configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the Redis server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;The default values for the following config options will need to be updated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;Existing Python bindings are sufficient, and no changes are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;Once these changes are implemented, the following Trove CLI
commands will now be fully functional with Redis:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;backup-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-list-instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create –backup&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;The following files will need to be added to the guest agent, where the
corresponding implementation will reside:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/strategies/backup/experimental/redis_impl.py
guestagent/strategies/restore/experimental/redis_impl.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/redis/manager.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No backwards compatibility issues are anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Primary assignee:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;peterstac&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Liberty-1&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;p&gt;The API calls for backup and restore need to be implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;No new tests are deemed to be required (beyond the requisite unit tests).  The
int-tests group for Redis will be modified to run backup-related commands
during integration test runs.  It would be good if a 3rd party Redis CI could
be set up to test Redis integration functionality, but at present this is not
available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Datastore specific documentation should be modified to indicate that backup and
restore of a Redis Trove instance is now supported.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id10"&gt;&lt;span class="brackets"&gt;1&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id5"&gt;1&lt;/a&gt;,&lt;a href="#id9"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Backup and Restore procedure: &lt;a class="reference external" href="http://zdk.blinkenshell.org/redis-backup-and-restore"&gt;http://zdk.blinkenshell.org/redis-backup-and-restore&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id11"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id6"&gt;2&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Create Redis Backup: &lt;a class="reference external" href="http://redis.io/commands/bgsave"&gt;http://redis.io/commands/bgsave&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id12"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id7"&gt;3&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;How to tell when a Backup is finished: &lt;a class="reference external" href="http://redis.io/commands/lastsave"&gt;http://redis.io/commands/lastsave&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id13"&gt;&lt;span class="brackets"&gt;&lt;a class="fn-backref" href="#id8"&gt;4&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Redis Persistence: &lt;a class="reference external" href="http://redis.io/topics/persistence"&gt;http://redis.io/topics/persistence&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Redis Configuration Groups</title><link>https://specs.openstack.org/openstack/trove-specs/specs/liberty/redis-configuration-groups.html</link><description>
 
&lt;p&gt;Launchpad Blueprint:
&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/redis-configuration-groups"&gt;https://blueprints.launchpad.net/trove/+spec/redis-configuration-groups&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The Redis guestagent currently does not support configuration groups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;The patch set will implement configuration groups for Redis 3.0 or above.&lt;/p&gt;
&lt;p&gt;Redis stores its configuration &lt;a class="footnote-reference brackets" href="#id7" id="id1"&gt;1&lt;/a&gt; in ‘redis.conf’ file which can optionally
import other files. If there are multiple configuration directives for a single
property the last one is used.
Configuration directives have key-value format:
“keyword argument1 argument2 … argumentN”&lt;/p&gt;
&lt;p&gt;Redis configuration will be reconfigured on the fly without stopping and
restarting the service using the special CONFIG command &lt;a class="footnote-reference brackets" href="#id7" id="id2"&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note: Not all directives are supported by the CONFIG commands and
that modifying the configuration on the fly has no effects on the ‘redis.conf’
file.&lt;/p&gt;
&lt;p&gt;The base configuration file for Redis 3.0 &lt;a class="footnote-reference brackets" href="#id8" id="id3"&gt;2&lt;/a&gt; will be used as the default
configuration template.
Guest agent interfaces exposing the configuration properties will be made
available to other modules such as backup and replication.&lt;/p&gt;
&lt;p&gt;Most configuration properties will be available via configuration groups.
Some, however, do not make sense in the Trove context.&lt;/p&gt;
&lt;p&gt;These include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;irrelevant options (like automatic snapshots, since the Trove user cannot
retrieve them)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;guestagent specific (e.g. file paths, passwords)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;items that Trove needs to control (replication/clustering properties)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;See &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt; for the full list of supported
options.&lt;/p&gt;
&lt;p&gt;The CONFIG directives will be renamed to a name known only to the
guestagent for its internal use. This is to prevent a user from
bypassing Trove configuration groups by changing properties in the client.
Guestagent managed properties such as locations of database files and logs
could be potentially used to hijack the NOVA instance.&lt;/p&gt;
&lt;p&gt;Configuration overrides will be implemented using the in-file imports
supported by the Redis configuration file format.
User defined overrides if any, will be saved in ‘redis.conf.override’
and will be imported at the end of the default ‘redis.conf’ file.&lt;/p&gt;
&lt;div class="section" id="available-configuration-properties"&gt;
&lt;h3&gt;Available Configuration Properties&lt;/h3&gt;
&lt;p&gt;Keys not included in the lists are kept at their default values and are not
configurable via Trove. See &lt;a class="footnote-reference brackets" href="#id8" id="id4"&gt;2&lt;/a&gt; for more details and default values.&lt;/p&gt;
&lt;p&gt;The properties configurable by the user via the Trove API:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tcp-backlog&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tcp-keepalive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;loglevel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;databases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;save&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;stop-writes-on-bgsave-error&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rdbcompression&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rdbchecksum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slave-serve-stale-data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slave-read-only&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-diskless-sync&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-diskless-sync-delay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-ping-slave-period&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-disable-tcp-nodelay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-backlog-size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repl-backlog-ttl&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slave-priority&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;min-slaves-to-write&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;min-slaves-max-lag&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;requirepass&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maxclients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maxmemory&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maxmemory-policy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maxmemory-samples&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;appendonly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;appendfsync&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;no-appendfsync-on-rewrite&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auto-aof-rewrite-percentage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auto-aof-rewrite-min-size&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aof-load-truncated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lua-time-limit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-node-timeout&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-slave-validity-factor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-migration-barrier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster-require-full-coverage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slowlog-log-slower-than&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slowlog-max-len&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;latency-monitor-threshold&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notify-keyspace-events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hash-max-ziplist-entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hash-max-ziplist-value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list-max-ziplist-entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;list-max-ziplist-value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;set-max-intset-entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;zset-max-ziplist-entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;zset-max-ziplist-value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hll-sparse-max-bytes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;activerehashing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client-output-buffer-limit normal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client-output-buffer-limit slave&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client-output-buffer-limit pubsub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aof-rewrite-incremental-fsync&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Non-configurable properties with updated default values:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;daemonize&lt;/em&gt; &lt;strong&gt;yes&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;pidfile&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;logfile&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;dir&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;slaveof&lt;/em&gt; &lt;strong&gt;(controlled-by replication)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;masterauth&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;cluster-enabled&lt;/em&gt; &lt;strong&gt;(controlled-by clustering)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;cluster-config-file&lt;/em&gt; &lt;strong&gt;(controlled-by guestagent)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api-security"&gt;
&lt;h3&gt;Public API Security&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="python-api"&gt;
&lt;h3&gt;Python API&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="cli-python-troveclient"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;None (empty section added after merging)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;CLI (python-troveclient)&lt;/h3&gt;
&lt;p&gt;This work will enable the following client commands:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;configuration-attach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-delete&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-detach&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-parameter-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-patch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-show&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configuration-update&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update facilities for handling of Redis config files
in the &lt;em&gt;operating_system&lt;/em&gt; module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement &lt;em&gt;update_overrides&lt;/em&gt; and &lt;em&gt;apply_overrides&lt;/em&gt; in
the &lt;em&gt;manager&lt;/em&gt; and &lt;em&gt;service&lt;/em&gt; modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The current configuration template will be updated to &lt;a class="footnote-reference brackets" href="#id8" id="id6"&gt;2&lt;/a&gt;
with changes noted in &lt;a class="reference internal" href="#available-configuration-properties"&gt;Available Configuration Properties&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following existing files will be updated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;guestagent/datastore/experimental/redis/manager.py
guestagent/datastore/experimental/redis/service.py
templates/redis/config.template
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Petr Malik &amp;lt;&lt;a class="reference external" href="mailto:pmalik%40tesora.com"&gt;pmalik&lt;span&gt;@&lt;/span&gt;tesora&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Liberty&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Implement functionality to handle (read/write/update) Redis configuration
files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement configuration-related manager API calls:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_overrides&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="upgrade-implications"&gt;
&lt;h2&gt;Upgrade Implications&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;Unit tests will be added to validate implemented functions and non-trivial
codepaths. Relevant integration tests will be added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The datastore documentation should be updated to reflect the enabled features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;dl class="footnote brackets"&gt;
&lt;dt class="label" id="id7"&gt;&lt;span class="brackets"&gt;1&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id1"&gt;1&lt;/a&gt;,&lt;a href="#id2"&gt;2&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Documentation on Redis configuration: &lt;a class="reference external" href="http://redis.io/topics/config"&gt;http://redis.io/topics/config&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class="label" id="id8"&gt;&lt;span class="brackets"&gt;2&lt;/span&gt;&lt;span class="fn-backref"&gt;(&lt;a href="#id3"&gt;1&lt;/a&gt;,&lt;a href="#id4"&gt;2&lt;/a&gt;,&lt;a href="#id6"&gt;3&lt;/a&gt;)&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Self-documented configuration file for Redis 3.0: &lt;a class="reference external" href="https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf"&gt;https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</description><pubDate>Tue, 24 Feb 2015 00:00:00 </pubDate></item><item><title>Implement Vertica cluster provisioning</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/vertica-cluster.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/implement-vertica-cluster"&gt;https://blueprints.launchpad.net/trove/+spec/implement-vertica-cluster&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;Provide HP Vertica CE clusters through the Trove Clustering API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;p&gt;Trove provides a well-designed framework for implementing clustering
for different datastores.
The Vertica datastore requires additional effort to accomplish clustering.&lt;/p&gt;
&lt;p&gt;HP Vertica CE requires a minimum of 3 nodes to achieve fault tolerance.&lt;/p&gt;
&lt;p&gt;Development plan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;API strategy, needed for handling clustering requests for Vertica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Taskmanager strategy, needed to handle cluster provisioning for Vertica.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Guestagent strategy, needed to handle RPC API calls from
Taskmanager to guest instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cluster will return IPs of its nodes. This is done so that the
cluster can be used for multi write and read.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The name of each instance will be automatically generated;
it will be the &amp;lt;cluster_name&amp;gt;-member-&amp;lt;instance_num&amp;gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There will be no grow/shrink functions to the cluster,
since the CE edition provides for a maximum of 3-nodes and
a 2-node HP Vertica Cluster is not fault-tolerable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;div class="section" id="how-to-deploy-hp-vertica-cluster"&gt;
&lt;h3&gt;How to deploy HP Vertica Cluster&lt;/h3&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;To bind multiple instances into a Vertica cluster, run the command “install_vertica” with each node IP.
Next, run admintools to create a database on all included nodes in the cluster.&lt;/p&gt;
&lt;p&gt;Step-by-Step guide for cluster provisioning:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Spin up N instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once N instances are up and running, collect their IPs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable password-less ssh between member instances for root and dbadmin users, by copying public key to authorized_keys.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classify one of the nodes as first node(first-node is only logical to trove, Vertica has no preference as such.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From first node, run install_vertica with all IPs from this node to stich all nodes into vertica cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From first node, run admintools to create a database including all nodes in the cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Vertica datastore needs new configuration options to enable clustering:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;cluster_support - describes the availability of clustering feature.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type: Boolean&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;api_strategy - fully qualified class name of API strategy implementation.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type: String&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;taskmanager_strategy - fully qualified class name of a Taskmanager implementation.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type: String&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;guestagent_strategy - fully qualified class name of a Guestagent implementation.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Type: String&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;This implementation will leverage the existing database schema for cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;The API request for creating/deleting cluster will remain unchanged.
However, there will be subtle differences in the response.
Vertica clustering will return IPs of all of its nodes.
This will be used for user who want to scale read/write.&lt;/p&gt;
&lt;div class="section" id="create-cluster"&gt;
&lt;h4&gt;Create Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"flavorRef"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Building the initial cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Local&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;specified&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;flavor&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Flavor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-cluster"&gt;
&lt;h4&gt;Show Cluster&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;edaac9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa7653e11224&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"cluster"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;,],&lt;/span&gt;
    &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"BUILD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="show-instance"&gt;
&lt;h4&gt;Show Instance&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;edaac9ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5e1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4028&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;adb7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fa7653e11224&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;416&lt;/span&gt;&lt;span class="n"&gt;b0b16&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ba55&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4302&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bbd3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ff566032e1c1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"instance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"ACTIVE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cluster_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"flavor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"volume"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.17&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Instance&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="list-clusters"&gt;
&lt;h4&gt;List Clusters&lt;/h4&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"clusters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"edaac9ca-b5e1-4028-adb7-fa7653e11224"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"NONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"No tasks for the cluster."&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"updated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2015-01-29T20:19:23"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="s2"&gt;"datastore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"7.1"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"instances"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"416b0b16-ba55-4302-bbd3-ff566032e1c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"965ef811-7c1d-47fc-89f2-a89dfdd23ef2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"3642f41c-e8ad-4164-a089-3891bf7f2d2b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"vertica-clstr-member-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;"links"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP Codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="delete-cluster"&gt;
&lt;h4&gt;Delete Cluster&lt;/h4&gt;
&lt;p&gt;HTTP Method:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;DELETE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Route:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;clusters&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cluster_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;HTTP codes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="mi"&gt;202&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Accepted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="cluster-actions"&gt;
&lt;h4&gt;Cluster Actions&lt;/h4&gt;
&lt;p&gt;No cluster actions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;From API service to Taskmanager service:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;create_cluster:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;checks if all instances are in BUILDING state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;designates one of the instances as first instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calls guest “get_keys” to receive public key from all member instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calls guest “authorize_keys” to register set of public keys to all member instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calls guest “install_cluster” to bind all nodes into a cluster with a database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calls guest “cluster_complete” to all nodes to complete the activity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checks if all instances are in ACTIVE state.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;To accomplish clustering for Vertica datastore more RPC APIs would be needed
as per new guestagent-strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:sushil.kumar3%40hp.com"&gt;sushil&lt;span&gt;.&lt;/span&gt;kumar3&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt; (Primary Assignee)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:saurabh.surana%40hp.com"&gt;saurabh&lt;span&gt;.&lt;/span&gt;surana&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:jonathan.halterman%40hp.com"&gt;jonathan&lt;span&gt;.&lt;/span&gt;halterman&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;“Kilo-3”&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Implement API strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement Taskmanager strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement Guestagent strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unit and integration tests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;Single instance Vertica datastore to be merged first into Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;There will be unit tests that test every components in the strategies.
There will be integration tests which will test cluster features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The docs would need updates for:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Trove Capabilities for Vertica Clusters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vertica cluster creation methodolgy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modified responses of existing due to nature of HP Vertica clustering.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://my.vertica.com/docs/7.1.x/HTML/index.htm"&gt;http://my.vertica.com/docs/7.1.x/HTML/index.htm&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Wed, 18 Feb 2015 00:00:00 </pubDate></item><item><title>Add Vertica datastore for Trove</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/vertica-datastore.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/vertica-db-support"&gt;https://blueprints.launchpad.net/trove/+spec/vertica-db-support&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The aim of this blueprint is to enable Trove to support a new datastore type -
HP Vertica 7.1 CE on Ubuntu.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To add support for this new datastore, we need to implement the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add a new diskimage-builder element for Vertica&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the various datastore features like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Reboot&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Terminate&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Resize&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new configuration group for Vertica and the different configuration options specific
to Vertica in trove/common/cfg.py.&lt;/p&gt;
&lt;p&gt;Some of the examples for the configuration options are:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tcp_ports&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;udp_ports&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;backup_strategy&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;backup_incremental_strategy&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;replication_strategy&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;backup_namespace&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;restore_namespace&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;root_on_create&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;volume_support&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;device_path&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This requires implementing the various datastore feature for Vertica like Launch, Reboot, Terminate, Resize.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This will include adding the following files specific to Vertica under the guestagent/datastore module:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes will not affect the behavior of the guestagent or its interaction with other components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="disk-image-builder-elements"&gt;
&lt;h3&gt;Disk-Image-Builder Elements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Disk-Image-Building would be a 2-step process, basically:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Download&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Vertica&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CE is the free edition of HP Vertica database available at www.vertica.com&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One needs to go through a free registration process, which enables a user to download the Vertica package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Image-building elements would expect user to copy $VERTICA_PACKAGE_FILE at $VERTICA_SOURCE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It would be then the job of DIB elements to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;- Copy $VERTICA_PACKAGE_FILE from $VERTICA_SOURCE and host in the guest-image.
- Install the essential requisite packages.
- Install the Vertica package to guest-image.
- Create the Vertica dba user named as "dbadmin", with desired group and path &amp;amp; time-zone settings setup to profile.
- Create a base location to host database files.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:sushil.kumar3%40hp.com"&gt;sushil&lt;span&gt;.&lt;/span&gt;kumar3&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt; (Primary Assignee)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:saurabh.surana%40hp.com"&gt;saurabh&lt;span&gt;.&lt;/span&gt;surana&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:jonathan.halterman%40hp.com"&gt;jonathan&lt;span&gt;.&lt;/span&gt;halterman&lt;span&gt;@&lt;/span&gt;hp&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;“Kilo-3”&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vertica datastore would be tested using a 3rd party CI hosted by HP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New unit tests would be added for the Vertica guestagent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration tests needs to be added for end-to-end feature testing:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resize&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Documentation would need the update on:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;HP&lt;/span&gt; &lt;span class="n"&gt;Vertica&lt;/span&gt; &lt;span class="n"&gt;being&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Capabilities&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Trove&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;HP&lt;/span&gt; &lt;span class="n"&gt;Vertica&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;How&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;hosting&lt;/span&gt; &lt;span class="n"&gt;HP&lt;/span&gt; &lt;span class="n"&gt;Vertica&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="https://my.vertica.com/docs/7.1.x/HTML/index.htm"&gt;https://my.vertica.com/docs/7.1.x/HTML/index.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a class="reference external" href="https://my.vertica.com/download-community-edition/#EE"&gt;https://my.vertica.com/download-community-edition/#EE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] &lt;a class="reference external" href="https://my.vertica.com/hp-vertica-community-edition-software-license-agreement/"&gt;https://my.vertica.com/hp-vertica-community-edition-software-license-agreement/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Thu, 29 Jan 2015 00:00:00 </pubDate></item><item><title>Contributing to: trove-specs</title><link>https://specs.openstack.org/openstack/trove-specs/contributing.html</link><description>
 
&lt;p&gt;If you would like to contribute to the development of OpenStack,
you must follow the steps in this page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/infra/manual/developers.html"&gt;http://docs.openstack.org/infra/manual/developers.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Once those steps have been completed, changes to OpenStack
should be submitted for review via the Gerrit tool, following
the workflow documented at:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="http://docs.openstack.org/infra/manual/developers.html#development-workflow"&gt;http://docs.openstack.org/infra/manual/developers.html#development-workflow&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Pull requests submitted through GitHub will be ignored.&lt;/p&gt;
&lt;p&gt;Bugs should be filed on Launchpad, not GitHub:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/trove"&gt;https://bugs.launchpad.net/trove&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
</description><pubDate>Fri, 05 Dec 2014 00:00:00 </pubDate></item><item><title>Move the Trove Guest Agent to its own module</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/moving-trove-guestagent.html</link><description>
 
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/moving-trove-guestagent"&gt;https://blueprints.launchpad.net/trove/+spec/moving-trove-guestagent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently the guestagent code is part of the trove package. This
blueprint’s goal is to refactor the guestagent and common functions into
new top level packages, so that the guestagent can be deployed onto
instances independently.&lt;/p&gt;
&lt;p&gt;Note: Splitting the guestagent into its own repo was a requirement in
the original specification. However, it was determined at the Kilo Mid
Cycle that doing so would introduce dependencies between trove
components that is difficult to maintain.&lt;/p&gt;
&lt;p&gt;For example, commits for AMQP / API message changes between trove core
and guestagent would need to be manually coordinated if trove and the
guestagent were in separate repos.&lt;/p&gt;
&lt;p&gt;Since the overhead of such coordination outweighs the benefit of
splitting the guestagent into its own repo, we’ll proceed with the
splitting at the directory level, but defer the repo splitting until
further discussions.&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem description&lt;/h2&gt;
&lt;p&gt;This blueprint will bring upon the following improvements:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Simplify installation of the guestagent on instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce the amount of code that is deployed on instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lower the memory footprint of the guestagent by not importing
unnecessary code from Trove core.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed change&lt;/h2&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A new top level oslo.cfg for the troveguest will be added. (This
should be a small subset of the values in trove.common.cfg)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The values in trove.common.cfg that are specifically for the guest
will be removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is possible that some configuration values will need to be added.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;1) The guestagent code will be moved to a top level module in the
existing trove repository called ‘troveguest’.&lt;/p&gt;
&lt;p&gt;2) The import statements will be changed from ‘trove.guestagent’ to
‘troveguest’&lt;/p&gt;
&lt;p&gt;3) Imports for common functions will be updated. See the “Common Code”
section below for details.&lt;/p&gt;
&lt;p&gt;4) The code that currently rsyncs the code over to instances in
development will be changed to just include the ‘troveguest’ and common
function modules. (It is possible that another delivery method will be
used, however that should probably be done in its own blueprint)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="common-code"&gt;
&lt;h3&gt;Common Code&lt;/h3&gt;
&lt;p&gt;The guestagent currently uses a large amount of common code in
trove.common (/opt/stack/trove/trove/common) and trove.openstack.common
(/opt/stack/trove/trove/openstack/common).&lt;/p&gt;
&lt;p&gt;Code under the “trove.common” module will be moved up to a “common”
module:&lt;/p&gt;
&lt;p&gt;/opt/stack/trove/trove/common
-&amp;gt; /opt/stack/trove/common&lt;/p&gt;
&lt;p&gt;All import statements will be changed from ‘trove.common’to ‘common’&lt;/p&gt;
&lt;p&gt;Code under the “trove.openstack.common” module will be moved up to a
“common.openstack” module:&lt;/p&gt;
&lt;p&gt;/opt/stack/trove/trove/openstack/common
-&amp;gt; /opt/stack/trove/common/openstack&lt;/p&gt;
&lt;p&gt;All import statements will be changed from ‘trove.openstack.common’to
‘common.openstack’&lt;/p&gt;
&lt;p&gt;Splitting the common modules out of trove allows the guestagent and the
common module to be deployed onto an instance independently. We’ll no
longer need to deploy the whole trove code tree onto the guest instance
just because the guestagent needs to use some common functions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alternatives"&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;p&gt;Primary assignee:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Robert Myers (robertmyers)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simon Chang (schang)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Target Milestone for completion:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Kilo&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="work-items"&gt;
&lt;h3&gt;Work Items&lt;/h3&gt;
&lt;div class="section" id="stage-1"&gt;
&lt;h4&gt;Stage 1&lt;/h4&gt;
&lt;p&gt;&lt;a class="reference external" href="https://review.openstack.org/#/c/119425/"&gt;https://review.openstack.org/#/c/119425/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Add a new package to the [files] section of setup.cfg:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;trove&lt;/span&gt;
    &lt;span class="n"&gt;troveguest&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Move the trove/guestagent module up one level, and name it “troveguest”.
All references of “trove.guestagent” will be changed to “troveguest”.&lt;/p&gt;
&lt;p&gt;The new module layout will look like the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;troveguest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="stage-2"&gt;
&lt;h4&gt;Stage 2&lt;/h4&gt;
&lt;p&gt;Move the “trove.common” module up one level to “common”, and the
“trove.openstack.common” into “common.openstack”. See the “Common Code”
section for detail. Rename imports.&lt;/p&gt;
&lt;p&gt;The new module layout will look like the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;
    &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openstack&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;trove&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;troveguest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;The guestagent tests need to be split out from the trove.tests modules,
then we need to make sure the tests are discovered properly.&lt;/p&gt;
&lt;p&gt;Possibly modify tox.ini:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;testenv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;basepython&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="n"&gt;commands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;envpython&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;run_tests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;does_not_exist&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="n"&gt;erase&lt;/span&gt;
    &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;testr&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;coverage&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;run_tests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;troveguest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run_tests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;
    &lt;span class="n"&gt;coverage&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;Any docs or config file content that reference the old trove.guestagent
and common module paths will need to be updated. For example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The trove-guestagent section of this wiki:
&lt;a class="reference external" href="https://wiki.openstack.org/wiki/Trove"&gt;https://wiki.openstack.org/wiki/Trove&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This sample config file:
&amp;lt;trove_dir&amp;gt;/etc/trove/trove-guestagent.conf.sample&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Kilo mid cycle discussion notes:
&lt;a class="reference external" href="https://etherpad.openstack.org/p/trove-kilo-sprint-blueprints-bugs"&gt;https://etherpad.openstack.org/p/trove-kilo-sprint-blueprints-bugs&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Mon, 24 Nov 2014 00:00:00 </pubDate></item><item><title>Apache CouchDB plugin for Trove</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/couchdb_plugin.html</link><description>
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/couchdb-plugin-trove"&gt;https://blueprints.launchpad.net/trove/+spec/couchdb-plugin-trove&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The aim of this blueprint is to enable Trove to support a new datastore type -
Apache CouchDB v1.6.1 on Ubuntu and Fedora, in addition to the other NoSQL databases
supported by Trove.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To add support for this new datastore, we need to implement the following:
- Add a new diskimage-builder element for Apache CouchDB on Ubuntu and Fedora
- Implement the various datastore features like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Launch&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Reboot&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Terminate&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Backup&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Restore&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Resize&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Replication&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new configuration group for CouchDB and the different configuration options specific
to CouchDB in /trove/common/cfg.py.&lt;/p&gt;
&lt;p&gt;Some of the examples for the configuration options are:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tcp_ports&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;udp_ports&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;backup_strategy&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mount_point&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;usage_timeout&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;volume_support&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;device_path&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;This requires implementing the various datastore feature for Apache CouchDB like Launch, Reboot,
Terminate,Backup, Restore, Resize and Replication. This will include adding the following files
specific to Apache CouchDB under the guestagent/datastore module:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In addition to this, there will also be a class under guestagent/strategies/backup to implement
the backup and restore features and another class under guestagent/strategies/replication to
implement the replication feature. CouchDB uses the replication interface to do backups hence we
will only be implementing full backups for this release.&lt;/p&gt;
&lt;p&gt;These changes wont affect the behavior of the guestagent or its interaction with other components.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:mariamj%40us.ibm.com"&gt;mariamj&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt; (Primary Assignee)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Susan Malaika (CouchDB Contact)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add new unit tests for the CouchDB guestAgent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add integration tests for end-to-end feature testing:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span/&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;restore&lt;/span&gt; &lt;span class="n"&gt;backups&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;replication&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] &lt;a class="reference external" href="http://guide.couchdb.org/draft"&gt;http://guide.couchdb.org/draft&lt;/a&gt;
[2] &lt;a class="reference external" href="http://guide.couchdb.org/draft/api.html"&gt;http://guide.couchdb.org/draft/api.html&lt;/a&gt;
[3] &lt;a class="reference external" href="http://guide.couchdb.org/draft/replication.html"&gt;http://guide.couchdb.org/draft/replication.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</description><pubDate>Tue, 11 Nov 2014 00:00:00 </pubDate></item><item><title>DB2 Express-C guest agent for Trove</title><link>https://specs.openstack.org/openstack/trove-specs/specs/kilo/db2_plugin.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://creativecommons.org/licenses/by/3.0/legalcode"&gt;http://creativecommons.org/licenses/by/3.0/legalcode&lt;/a&gt;
..&lt;/p&gt;
&lt;div class="section" id="db2-express-c-guest-agent-for-trove"&gt;
 
&lt;p&gt;Launchpad blueprint:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blueprints.launchpad.net/trove/+spec/db2-plugin-for-trove"&gt;https://blueprints.launchpad.net/trove/+spec/db2-plugin-for-trove&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="problem-description"&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;The aim of this blueprint is to enable Trove to support a new datastore type - DB2,
in addition to the other SQL databases supported by Trove. For the first release, we
will be using DB2 Express-C v10.5.4(on Ubuntu) which is the free version of DB2 available
for enterprises.&lt;/p&gt;
&lt;p&gt;The following features will be implemented: Launch, Reboot, Terminate, Resize and Users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="proposed-change"&gt;
&lt;h2&gt;Proposed Change&lt;/h2&gt;
&lt;p&gt;To add support for this new datastore, we need to implement the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add a new diskimage-builder element for DB2 Express-C on Ubuntu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement the various datastore features like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Launch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reboot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Terminate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resize&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="configuration"&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;A new configuration group for DB2 and the different configuration options specific to it
will be defined in /trove/common/cfg.py.&lt;/p&gt;
&lt;p&gt;Some of the examples for the configuration options are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;tcp_ports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;udp_ports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_incremental_strategy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mount_point&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;volume_support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;device_path&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backup_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restore_namespace&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cluster_support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replication_strategy&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h3&gt;Database&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="public-api"&gt;
&lt;h3&gt;Public API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="internal-api"&gt;
&lt;h3&gt;Internal API&lt;/h3&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="guest-agent"&gt;
&lt;h3&gt;Guest Agent&lt;/h3&gt;
&lt;p&gt;This requires implementing the various datastore features(API) for DB2 like Launch,
Reboot, Terminate, Backup, Restore, Resize and Users. This will include adding
the following new files specific to DB2 under the guestagent module:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;manager.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;service.py&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;system.py&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes wont affect the behavior of the guestagent or its interaction with
other components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="disk-image-builder-elements"&gt;
&lt;h3&gt;Disk-Image-Builder Elements&lt;/h3&gt;
&lt;p&gt;DB2 Express-C is the free version of IBM DB2 database available for download. Inorder
to download the packages for DB2 Express-C, user needs to go through a free registration
process.&lt;/p&gt;
&lt;p&gt;Unlike other datastores supported by Trove, DB2 Express-C cannot be downloaded from a
public repository. Hence the recommendation for creating DIB elements for DB2 Express-C is
to have users go through the registration process and download the DB2 Express-C packages
from the link provided in Reference Section [1]. The downloaded packages can be made
available to Trove by storing it in a private repository or on the local filesystem.
Create an extra-data.d element to then copy the package to the image. Use the environment
variable, DATASTORE_PKG_LOCATION to specify the location of the package.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;div class="section" id="assignee-s"&gt;
&lt;h3&gt;Assignee(s)&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="mailto:mariamj%40us.ibm.com"&gt;mariamj&lt;span&gt;@&lt;/span&gt;us&lt;span&gt;.&lt;/span&gt;ibm&lt;span&gt;.&lt;/span&gt;com&lt;/a&gt; (Primary Assignee)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Susan Malaika (DB2 Contact)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="milestones"&gt;
&lt;h3&gt;Milestones&lt;/h3&gt;
&lt;p&gt;Kilo&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="dependencies"&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="testing"&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Add new unit tests for the DB2 Express-C guestAgent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add integration tests for end-to-end feature testing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create/delete instance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create/delete/list databases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create/delete/list users&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documentation-impact"&gt;
&lt;h2&gt;Documentation Impact&lt;/h2&gt;
&lt;p&gt;The DB2 Express-C packages can be downloaded from the link provided in Reference Section
[1]. Click on the link “DB2 Express-C for Linux 64-bit”. New users can either get an
IBM ID or click on the “Proceed without an IBM ID”. Users will have to register first
inorder to download the packages. After downloading the packages, users can make it
accessible to Trove for building guest images by:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;storing it in a private repository and defining the variable ‘DATASTORE_PKG_LOCATION’
to be the base url of the private repository&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storing it on the local filesystem in a directory accessible to the DB2 DIB element
and setting the ‘DATASTORE_PKG_LOCATION’ to point to this directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;For example, DATASTORE_PKG_LOCATION can be set as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;export DATASTORE_PKG_LOCATION=’/home/stack/db2’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;export DATASTORE_PKG_LOCATION=’&lt;a class="reference external" href="http://www.foo.com/pkgs/db2"&gt;http://www.foo.com/pkgs/db2&lt;/a&gt;’&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="references"&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;[1] DB2 Download Link: &lt;a class="reference external" href="http://www-01.ibm.com/software/data/db2/express-c/download.html"&gt;http://www-01.ibm.com/software/data/db2/express-c/download.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><pubDate>Tue, 11 Nov 2014 00:00:00 </pubDate></item><item><title>trove-specs</title><link>https://specs.openstack.org/openstack/trove-specs/readme.html</link><description>
 
&lt;p&gt;OpenStack Database Service (Trove) Specifications&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Free software: Apache license&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation: &lt;a class="reference external" href="http://docs.openstack.org/developer/trove-specs"&gt;http://docs.openstack.org/developer/trove-specs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="features"&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;TODO&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><pubDate>Wed, 18 Jun 2014 00:00:00 </pubDate></item></channel></rss>