)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"787cb4253ba693a84d55058260d859aa9152b308","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Includes unit tests and int-tests (dbaas.api.redis)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Id701a75b5a8cf1fa2c69f0111ee820021bd16c09"},{"line_number":16,"context_line":"Depends-On: Icc9b4eea8ed7db1455692823d29586088cfc9434"},{"line_number":17,"context_line":"Implements: blueprint redis-cluster"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da20952f_b47c59b6","line":16,"updated":"2015-09-02 20:44:56.000000000","message":"add this one as well.\n\nDepends-On: I633273d438c22f98bef2fd1535730bcdb5e5cff0","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"f3ee6337c226fb41de69dd68619f231530b1ac3e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Redis Cluster Initial Implementation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements support for clustering for the Redis database,"},{"line_number":10,"context_line":"including a clustering stategy and guest agent APIs."},{"line_number":11,"context_line":"Includes support for the new cluster scaling methods."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Includes unit tests and int-tests (run cluster specific"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da20952f_a917ed43","line":10,"updated":"2015-09-03 18:18:05.000000000","message":"strategy\n\n(-1)","commit_id":"40e093e763abd7f9b6ab9e80f0ab7e798add0fe4"}],"trove/cluster/models.py":[{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"1cba2829da5dbeac4dc65699184dfcceb1b41991","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from trove.common import cfg"},{"line_number":19,"context_line":"from trove.common import exception"},{"line_number":20,"context_line":"from trove.common.i18n import _"},{"line_number":21,"context_line":"import trove.common.remote as remote"},{"line_number":22,"context_line":"from trove.common.strategies.cluster import strategy"},{"line_number":23,"context_line":"from trove.datastore import models as datastore_models"},{"line_number":24,"context_line":"from trove.db import models as dbmodels"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_99cf1eb0","line":21,"updated":"2015-07-22 14:01:32.000000000","message":"from trove.common import remote","commit_id":"ffa76ead24d899dfb5d6543b6babb2e807906361"}],"trove/common/apischema.py":[{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"1cba2829da5dbeac4dc65699184dfcceb1b41991","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                        \"flavorRef\": flavorref,"},{"line_number":274,"context_line":"                        \"volume\": volume,"},{"line_number":275,"context_line":"                        \"nics\": nics,"},{"line_number":276,"context_line":"                        \"data\": non_empty_string"},{"line_number":277,"context_line":"                    }"},{"line_number":278,"context_line":"                }"},{"line_number":279,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_f70b5bd4","line":276,"updated":"2015-07-22 14:01:32.000000000","message":"Make this an object so that we don\u0027t have to manually parse it.","commit_id":"ffa76ead24d899dfb5d6543b6babb2e807906361"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"abb1407c03f643896ed52143c81d15c0097a004e","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                        \"name\": non_empty_string,"},{"line_number":273,"context_line":"                        \"flavorRef\": flavorref,"},{"line_number":274,"context_line":"                        \"volume\": volume,"},{"line_number":275,"context_line":"                        \"nics\": nics"},{"line_number":276,"context_line":"                    }"},{"line_number":277,"context_line":"                }"},{"line_number":278,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_1c0066aa","line":275,"updated":"2015-07-28 15:44:44.000000000","message":"Need to add availability_zone\n\nalso I am not sure about the requirement of having a name","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"d1aa16fdc68186a14b7894557ed7ace8794ef760","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                        \"name\": non_empty_string,"},{"line_number":273,"context_line":"                        \"flavorRef\": flavorref,"},{"line_number":274,"context_line":"                        \"volume\": volume,"},{"line_number":275,"context_line":"                        \"nics\": nics"},{"line_number":276,"context_line":"                    }"},{"line_number":277,"context_line":"                }"},{"line_number":278,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_8b44fd46","line":275,"in_reply_to":"3a50d1a3_1c0066aa","updated":"2015-07-29 12:54:37.000000000","message":"name is not in the required list. It is up to the datastores to determine if it is required or not.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"}],"trove/common/cfg.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"ada3bca02b6135fce6725851bef1d2de0b937531","unresolved":false,"context_lines":[{"line_number":568,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/redis\u0027,"},{"line_number":569,"context_line":"               help\u003d\"Filesystem path for mounting \""},{"line_number":570,"context_line":"               \"volumes if volume support is enabled.\"),"},{"line_number":571,"context_line":"    cfg.BoolOpt(\u0027volume_support\u0027, default\u003dTrue,"},{"line_number":572,"context_line":"                help\u003d\u0027Whether to provision a Cinder volume for datadir.\u0027),"},{"line_number":573,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003dNone,"},{"line_number":574,"context_line":"               help\u003d\u0027Device path for volume if volume support is enabled.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_5d75ab95","line":571,"updated":"2015-09-03 20:12:00.000000000","message":"Hmm, I\u0027m not sure about this ...","commit_id":"40e093e763abd7f9b6ab9e80f0ab7e798add0fe4"}],"trove/common/strategies/cluster/experimental/mongodb/api.py":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"a594b261dec1faa53863d9c167645f7c8a999271","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _action_add_shard(self, cluster, body):"},{"line_number":51,"context_line":"        cluster.add_shard()"},{"line_number":52,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @property"},{"line_number":55,"context_line":"    def cluster_view_class(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_1b5f1210","side":"PARENT","line":52,"updated":"2015-08-12 07:34:10.000000000","message":"Why are we changing this (mongodb\u0027s add_shard action) in a patch that deals with redis clusters?","commit_id":"67b68a9bccb7b3ede30275f545152e4e5d780a88"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"e1df8b041fbbb626e57a3a01ce7b0797755f9406","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _action_add_shard(self, cluster, body):"},{"line_number":51,"context_line":"        cluster.add_shard()"},{"line_number":52,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @property"},{"line_number":55,"context_line":"    def cluster_view_class(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_023b87ec","side":"PARENT","line":52,"in_reply_to":"1a4dcd0f_1b5f1210","updated":"2015-09-02 18:47:17.000000000","message":"This is changed because I changed the code that calls this.  The caller now returns the appropriate result.","commit_id":"67b68a9bccb7b3ede30275f545152e4e5d780a88"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"787cb4253ba693a84d55058260d859aa9152b308","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _action_add_shard(self, cluster, body):"},{"line_number":51,"context_line":"        cluster.add_shard()"},{"line_number":52,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @property"},{"line_number":55,"context_line":"    def cluster_view_class(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_949355fa","side":"PARENT","line":52,"in_reply_to":"fa1b9901_023b87ec","updated":"2015-09-02 20:44:56.000000000","message":"ahh i get it.","commit_id":"67b68a9bccb7b3ede30275f545152e4e5d780a88"}],"trove/common/strategies/cluster/experimental/redis/api.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"abb1407c03f643896ed52143c81d15c0097a004e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # Checking volumes"},{"line_number":99,"context_line":"        name_index \u003d 1"},{"line_number":100,"context_line":"        for instance in instances:"},{"line_number":101,"context_line":"            if not instance.get(\u0027name\u0027):"},{"line_number":102,"context_line":"                instance[\u0027name\u0027] \u003d \"%s-member-%s\" % (db_info.name, name_index)"},{"line_number":103,"context_line":"                name_index +\u003d 1"},{"line_number":104,"context_line":"            volume_size \u003d instance.get(\u0027volume_size\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_bc45b26f","line":101,"updated":"2015-07-28 15:44:44.000000000","message":"Do you mean to say that user is expected to provide member-instance names","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"d1aa16fdc68186a14b7894557ed7ace8794ef760","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # Checking volumes"},{"line_number":99,"context_line":"        name_index \u003d 1"},{"line_number":100,"context_line":"        for instance in instances:"},{"line_number":101,"context_line":"            if not instance.get(\u0027name\u0027):"},{"line_number":102,"context_line":"                instance[\u0027name\u0027] \u003d \"%s-member-%s\" % (db_info.name, name_index)"},{"line_number":103,"context_line":"                name_index +\u003d 1"},{"line_number":104,"context_line":"            volume_size \u003d instance.get(\u0027volume_size\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_48c11be3","line":101,"in_reply_to":"3a50d1a3_bc45b26f","updated":"2015-07-29 12:54:37.000000000","message":"If not provided then a name is generated, so it is saying it is optional.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"abb1407c03f643896ed52143c81d15c0097a004e","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            node_ids \u003d [Cluster.get_guest(instance).get_node_id_for_removal()"},{"line_number":193,"context_line":"                        for instance in removal_insts]"},{"line_number":194,"context_line":"            if None in node_ids:"},{"line_number":195,"context_line":"                raise TroveError(_(\"Some nodes cannot be removed (check slots)\""},{"line_number":196,"context_line":"                                   ))"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"            all_instances \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_422cc801","line":195,"updated":"2015-07-28 15:44:44.000000000","message":"This block would not reset the status of instance.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"d1aa16fdc68186a14b7894557ed7ace8794ef760","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            node_ids \u003d [Cluster.get_guest(instance).get_node_id_for_removal()"},{"line_number":193,"context_line":"                        for instance in removal_insts]"},{"line_number":194,"context_line":"            if None in node_ids:"},{"line_number":195,"context_line":"                raise TroveError(_(\"Some nodes cannot be removed (check slots)\""},{"line_number":196,"context_line":"                                   ))"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"            all_instances \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_a8277fc8","line":195,"in_reply_to":"3a50d1a3_422cc801","updated":"2015-07-29 12:54:37.000000000","message":"It gets set in the finally block","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"abb1407c03f643896ed52143c81d15c0097a004e","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            return RedisCluster(self.context, cluster_info,"},{"line_number":210,"context_line":"                                self.ds, self.ds_version)"},{"line_number":211,"context_line":"        finally:"},{"line_number":212,"context_line":"            cluster_info.update(task_status\u003dClusterTasks.NONE)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"class RedisClusterView(ClusterView):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_82ef30b0","line":212,"updated":"2015-07-28 15:44:44.000000000","message":"The finally block looks really wierd to me, it would only work in case everything went through OK.\n\nThere is no purpose of try block, no exceptions are handled.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"d1aa16fdc68186a14b7894557ed7ace8794ef760","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            return RedisCluster(self.context, cluster_info,"},{"line_number":210,"context_line":"                                self.ds, self.ds_version)"},{"line_number":211,"context_line":"        finally:"},{"line_number":212,"context_line":"            cluster_info.update(task_status\u003dClusterTasks.NONE)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"class RedisClusterView(ClusterView):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_ab3c59c8","line":212,"in_reply_to":"3a50d1a3_82ef30b0","updated":"2015-07-29 12:54:37.000000000","message":"finally runs whether an exception is thrown or not. Hitting the TroveError will still set the status, before raising the exception on.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from novaclient import exceptions as nova_exceptions"},{"line_number":15,"context_line":"from trove.cluster import models"},{"line_number":16,"context_line":"from trove.cluster.models import Cluster"},{"line_number":17,"context_line":"from trove.cluster.tasks import ClusterTasks"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_7179122f","line":14,"updated":"2015-08-10 08:45:31.000000000","message":"(+0) Can we get novaclient import into a separate group","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from trove.common import utils"},{"line_number":25,"context_line":"from trove.extensions.mgmt.clusters.views import MgmtClusterView"},{"line_number":26,"context_line":"from trove.instance import models as inst_models"},{"line_number":27,"context_line":"from trove.openstack.common import log as logging"},{"line_number":28,"context_line":"from trove.quota.quota import check_quotas"},{"line_number":29,"context_line":"from trove.taskmanager import api as task_api"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_31738a4f","line":27,"updated":"2015-08-10 08:45:31.000000000","message":"Need to oslo_log","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c17af603be4f995b24436e292db4d2dd64073b10","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from trove.common import utils"},{"line_number":25,"context_line":"from trove.extensions.mgmt.clusters.views import MgmtClusterView"},{"line_number":26,"context_line":"from trove.instance import models as inst_models"},{"line_number":27,"context_line":"from trove.openstack.common import log as logging"},{"line_number":28,"context_line":"from trove.quota.quota import check_quotas"},{"line_number":29,"context_line":"from trove.taskmanager import api as task_api"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_6a193522","line":27,"in_reply_to":"1a4dcd0f_31738a4f","updated":"2015-09-01 19:53:24.000000000","message":"this raises an exception on create.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":14576,"name":"Petr Malik","email":"pmalik@tesora.com","username":"pmalik"},"change_message_id":"e462dea01dc10c96ae89f71ce80cb84e41659c2a","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                            for inst in all_instances"},{"line_number":201,"context_line":"                            if inst.id not in removal_ids]"},{"line_number":202,"context_line":"            map(lambda x: Cluster.get_guest(x).remove_nodes(node_ids),"},{"line_number":203,"context_line":"                remain_insts)"},{"line_number":204,"context_line":"            map(lambda x: x.update_db(cluster_id\u003dNone), removal_insts)"},{"line_number":205,"context_line":"            map(inst_models.Instance.delete, removal_insts)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_b3aca336","line":203,"range":{"start_line":203,"start_character":16,"end_line":203,"end_character":28},"updated":"2015-08-08 00:06:03.000000000","message":"Just checking - \u0027remain_insts\u0027 here is correct?","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"e1df8b041fbbb626e57a3a01ce7b0797755f9406","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                            for inst in all_instances"},{"line_number":201,"context_line":"                            if inst.id not in removal_ids]"},{"line_number":202,"context_line":"            map(lambda x: Cluster.get_guest(x).remove_nodes(node_ids),"},{"line_number":203,"context_line":"                remain_insts)"},{"line_number":204,"context_line":"            map(lambda x: x.update_db(cluster_id\u003dNone), removal_insts)"},{"line_number":205,"context_line":"            map(inst_models.Instance.delete, removal_insts)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_cdccf563","line":203,"range":{"start_line":203,"start_character":16,"end_line":203,"end_character":28},"in_reply_to":"1a4dcd0f_b3aca336","updated":"2015-09-02 18:47:17.000000000","message":"Yup.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/common/strategies/cluster/experimental/redis/guestagent.py":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c17af603be4f995b24436e292db4d2dd64073b10","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from trove.common import cfg"},{"line_number":15,"context_line":"from trove.common.strategies.cluster import base"},{"line_number":16,"context_line":"from trove.guestagent import api as guest_api"},{"line_number":17,"context_line":"from trove.openstack.common import log as logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_2a781df8","line":17,"updated":"2015-09-01 19:53:24.000000000","message":"from oslo_log import log as logging","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/common/strategies/cluster/experimental/redis/taskmanager.py":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c17af603be4f995b24436e292db4d2dd64073b10","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from trove.common.strategies.cluster import base"},{"line_number":20,"context_line":"from trove.instance.models import DBInstance"},{"line_number":21,"context_line":"from trove.instance.models import Instance"},{"line_number":22,"context_line":"from trove.openstack.common import log as logging"},{"line_number":23,"context_line":"from trove.taskmanager import api as task_api"},{"line_number":24,"context_line":"import trove.taskmanager.models as task_models"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_ea81c5c4","line":22,"updated":"2015-09-01 19:53:24.000000000","message":"from oslo_log import log as logging","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":13355,"name":"Edmond Kotowski","email":"ekotowski@gmail.com","username":"ekotowski"},"change_message_id":"0e65414b0929691e1ebab86b2e2835be5799d545","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                for guest in guests[1:]:"},{"line_number":69,"context_line":"                    guest.cluster_meet(cluster_head_ip, cluster_head_port)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"                num_nodes \u003d len(instances)"},{"line_number":72,"context_line":"                total_slots \u003d 16384"},{"line_number":73,"context_line":"                slots_per_node \u003d total_slots / num_nodes"},{"line_number":74,"context_line":"                leftover_slots \u003d total_slots % num_nodes"},{"line_number":75,"context_line":"                first_slot \u003d 0"},{"line_number":76,"context_line":"                for guest in guests:"},{"line_number":77,"context_line":"                    last_slot \u003d first_slot + slots_per_node"},{"line_number":78,"context_line":"                    if leftover_slots \u003e 0:"},{"line_number":79,"context_line":"                        leftover_slots -\u003d 1"},{"line_number":80,"context_line":"                    else:"},{"line_number":81,"context_line":"                        last_slot -\u003d 1"},{"line_number":82,"context_line":"                    guest.cluster_addslots(first_slot, last_slot)"},{"line_number":83,"context_line":"                    first_slot \u003d last_slot + 1"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"                for guest in guests:"},{"line_number":86,"context_line":"                    guest.cluster_complete()"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_8da02ca1","line":83,"range":{"start_line":71,"start_character":15,"end_line":83,"end_character":46},"updated":"2015-08-27 18:50:58.000000000","message":"Extract this as method and put unit tests around it since it has important calculations we want tests around.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/common/strategies/cluster/experimental/vertica/api.py":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"a594b261dec1faa53863d9c167645f7c8a999271","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @classmethod"},{"line_number":56,"context_line":"    def create(cls, context, name, datastore, datastore_version, instances):"},{"line_number":57,"context_line":"        LOG.debug(\"Initiating cluster creation.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        vertica_conf \u003d CONF.get(datastore_version.manager)"},{"line_number":60,"context_line":"        num_instances \u003d len(instances)"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_1be2b2a0","line":58,"updated":"2015-08-12 07:34:10.000000000","message":"Seems like an unnecessary change to the Vertica Cluster strategy here.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"e1df8b041fbbb626e57a3a01ce7b0797755f9406","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @classmethod"},{"line_number":56,"context_line":"    def create(cls, context, name, datastore, datastore_version, instances):"},{"line_number":57,"context_line":"        LOG.debug(\"Initiating cluster creation.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        vertica_conf \u003d CONF.get(datastore_version.manager)"},{"line_number":60,"context_line":"        num_instances \u003d len(instances)"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_3dea70ad","line":58,"in_reply_to":"1a4dcd0f_1be2b2a0","updated":"2015-09-02 18:47:17.000000000","message":"Done","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/db/models.py":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"a594b261dec1faa53863d9c167645f7c8a999271","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        if hasattr(cls, \u0027deleted\u0027):"},{"line_number":38,"context_line":"            init_vals[\u0027deleted\u0027] \u003d False"},{"line_number":39,"context_line":"        init_vals.update(values)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        instance \u003d cls(**init_vals)"},{"line_number":42,"context_line":"        if not instance.is_valid():"},{"line_number":43,"context_line":"            raise exception.InvalidModelError(errors\u003dinstance.errors)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_7b009634","line":40,"updated":"2015-08-12 07:34:10.000000000","message":"Extraneous change.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"e1df8b041fbbb626e57a3a01ce7b0797755f9406","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        if hasattr(cls, \u0027deleted\u0027):"},{"line_number":38,"context_line":"            init_vals[\u0027deleted\u0027] \u003d False"},{"line_number":39,"context_line":"        init_vals.update(values)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        instance \u003d cls(**init_vals)"},{"line_number":42,"context_line":"        if not instance.is_valid():"},{"line_number":43,"context_line":"            raise exception.InvalidModelError(errors\u003dinstance.errors)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_7d078881","line":40,"in_reply_to":"1a4dcd0f_7b009634","updated":"2015-09-02 18:47:17.000000000","message":"Done","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/guestagent/datastore/experimental/redis/manager.py":[{"author":{"_account_id":15321,"name":"Matthew Van Dijk","email":"mvandijk@tesora.com","username":"mvandijk"},"change_message_id":"00055ea80e7d2f136f60930acc47d646703c2d80","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                   + \"cluster-config-file cluster.conf\\n\")"},{"line_number":110,"context_line":"            self._app.configuration_manager.save_configuration(config_contents)"},{"line_number":111,"context_line":"            self._app.apply_initial_guestagent_configuration()"},{"line_number":112,"context_line":"            self._app.restart()"},{"line_number":113,"context_line":"            LOG.info(_(\u0027Redis instance has been setup and configured.\u0027))"},{"line_number":114,"context_line":"        except Exception:"},{"line_number":115,"context_line":"            LOG.exception(_(\"Error setting up Redis instance.\"))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_195af150","line":112,"updated":"2015-07-27 15:25:21.000000000","message":"Indicate that the instance is now cluster-ready by setting the status to BUILD_PENDING if cluster-config.","commit_id":"92989a8fc588c9597635c4760617f51b18ca5e12"},{"author":{"_account_id":14576,"name":"Petr Malik","email":"pmalik@tesora.com","username":"pmalik"},"change_message_id":"e462dea01dc10c96ae89f71ce80cb84e41659c2a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            self._app.install_if_needed(packages)"},{"line_number":105,"context_line":"            LOG.info(_(\u0027Writing redis configuration.\u0027))"},{"line_number":106,"context_line":"            if cluster_config:"},{"line_number":107,"context_line":"                config_contents \u003d (config_contents + \"\\n\""},{"line_number":108,"context_line":"                                   + \"cluster-enabled yes\\n\""},{"line_number":109,"context_line":"                                   + \"cluster-config-file cluster.conf\\n\")"},{"line_number":110,"context_line":"            self._app.configuration_manager.save_configuration(config_contents)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_935de74a","line":107,"updated":"2015-08-08 00:06:03.000000000","message":"I would prefer doing this in a format independent way.\nJust move this two lines below - below apply_initial_guestagent_configuration and instead of appending to the raw template contents use the existing self._app.enable_cluster() and self._app.set_cluster_config_filename() calls - you may wish to combine them into one method...","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c17af603be4f995b24436e292db4d2dd64073b10","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                   + \"cluster-config-file cluster.conf\\n\")"},{"line_number":110,"context_line":"            self._app.configuration_manager.save_configuration(config_contents)"},{"line_number":111,"context_line":"            self._app.apply_initial_guestagent_configuration()"},{"line_number":112,"context_line":"            self._app.restart()"},{"line_number":113,"context_line":"            LOG.info(_(\u0027Redis instance has been setup and configured.\u0027))"},{"line_number":114,"context_line":"        except Exception:"},{"line_number":115,"context_line":"            LOG.exception(_(\"Error setting up Redis instance.\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_fbcd19b8","line":112,"updated":"2015-09-01 19:53:24.000000000","message":"if this is a cluster you should set the status to BUILD_PENDING otherwise the taskmanager will never know when to setup the cluster.\n\n    if cluster_config:\n        self._app.status.set_status(rd_instance.ServiceStatuses.BUILD_PENDING)","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/guestagent/datastore/experimental/redis/service.py":[{"author":{"_account_id":14576,"name":"Petr Malik","email":"pmalik@tesora.com","username":"pmalik"},"change_message_id":"d7784ee2a94f0520f2821a2eb240766df7e07c2e","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            while slots:"},{"line_number":398,"context_line":"                cmd \u003d ([system.REDIS_CLI, \u0027cluster\u0027, \u0027addslots\u0027]"},{"line_number":399,"context_line":"                       + slots[0:group_size])"},{"line_number":400,"context_line":"                out, err \u003d utils.execute_with_timeout(*cmd, run_as_root\u003dTrue,"},{"line_number":401,"context_line":"                                                      root_helper\u003d\u0027sudo\u0027)"},{"line_number":402,"context_line":"                if \u0027OK\u0027 not in out:"},{"line_number":403,"context_line":"                    raise RuntimeError(_(\u0027Error executing addslots: %s\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_ebd674c2","line":400,"updated":"2015-08-10 16:42:55.000000000","message":"Just a side-note. We may eventually want to do these with RedisAdmin(...).execute(...) too.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/tests/int_tests.py":[{"author":{"_account_id":10215,"name":"Peter Stachowski","email":"peter@tesora.com","username":"peterstac"},"change_message_id":"ada3bca02b6135fce6725851bef1d2de0b937531","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from trove.tests.api.mgmt import hosts"},{"line_number":27,"context_line":"from trove.tests.api.mgmt import instances as mgmt_instances"},{"line_number":28,"context_line":"from trove.tests.api.mgmt import storage"},{"line_number":29,"context_line":"from trove.tests.api import redis"},{"line_number":30,"context_line":"from trove.tests.api import replication"},{"line_number":31,"context_line":"from trove.tests.api import root"},{"line_number":32,"context_line":"from trove.tests.api import user_access"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_585ff9e4","line":29,"updated":"2015-09-03 20:12:00.000000000","message":"We should flip this out to use the new cluster int-tests (like vertica does now)","commit_id":"40e093e763abd7f9b6ab9e80f0ab7e798add0fe4"}],"trove/tests/unittests/cluster/test_cluster_redis_controller.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        validator \u003d jsonschema.Draft4Validator(schema)"},{"line_number":91,"context_line":"        self.assertFalse(validator.is_valid(body))"},{"line_number":92,"context_line":"        errors \u003d sorted(validator.iter_errors(body), key\u003dlambda e: e.path)"},{"line_number":93,"context_line":"        self.assertThat(len(errors), Is(1))"},{"line_number":94,"context_line":"        self.assertThat(errors[0].message,"},{"line_number":95,"context_line":"                        Equals(\"\u0027     \u0027 does not match \u0027^.*[0-9a-zA-Z]+.*$\u0027\"))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_74f6e0d8","line":93,"updated":"2015-08-10 08:45:31.000000000","message":"shall we use assertEqual, also check for other assertThat(s)","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        datastore_version.manager \u003d \u0027redis\u0027"},{"line_number":298,"context_line":"        mock_get_datastore_version.return_value \u003d (Mock(), datastore_version)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        self.assertRaises(exception.TroveError, self.controller.create, req,"},{"line_number":301,"context_line":"                          body, tenant_id)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    @patch.object(views.ClusterView, \u0027data\u0027, return_value\u003d{})"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_f4d75021","line":300,"updated":"2015-08-10 08:45:31.000000000","message":"We shall use assertRaisesRegexp instead of assertRaises to verify exception message.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        tenant_id \u003d Mock()"},{"line_number":315,"context_line":"        context \u003d Mock()"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        req \u003d Mock()"},{"line_number":318,"context_line":"        req.environ \u003d MagicMock()"},{"line_number":319,"context_line":"        req.environ.get \u003d Mock(return_value\u003dcontext)"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_746fc092","line":317,"updated":"2015-08-10 08:45:31.000000000","message":"i can see req, tenant_id like objects created in many methods, we should move this to setup method.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}],"trove/tests/unittests/cluster/test_redis_cluster.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ca7677304fc76de7ae2c6b8d6fe5a181d2a6ae74","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            side_effect\u003dnova_exceptions.NotFound("},{"line_number":87,"context_line":"                404, \"Flavor id not found %s\" % id))"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.assertRaises(exception.FlavorNotFound,"},{"line_number":90,"context_line":"                          Cluster.create,"},{"line_number":91,"context_line":"                          Mock(),"},{"line_number":92,"context_line":"                          self.cluster_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_74cb4073","line":89,"updated":"2015-08-10 08:45:31.000000000","message":"we shall use assertRaisesRegexp to verify messages.","commit_id":"92f7d9469e4c6984379489ddbf13a58a159b21cb"}]}
