)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"15d6658f8ef8e163f6239750000e672386c4f3cb","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Reasons:"},{"line_number":10,"context_line":"- instance provisioning required two parameters:"},{"line_number":11,"context_line":"  datastore_type, datastore_version;"},{"line_number":12,"context_line":"- accroding to python-troveclient releas notes,"},{"line_number":13,"context_line":"  v1.0.0 already support datastore type/versions;"},{"line_number":14,"context_line":"  Prof.link:"},{"line_number":15,"context_line":"  https://github.com/openstack/python-troveclient/compare/1.0.0...master"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAATn%2F8w%2BE%3D","line":12,"updated":"2013-12-20 15:09:08.000000000","message":"There are a few typos in this line.  It should be:\n\n- according to the python-troveclient release notes","commit_id":"a2b719221008a19f6feaed253fb86edfa5dce7d7"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"15d6658f8ef8e163f6239750000e672386c4f3cb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- accroding to python-troveclient releas notes,"},{"line_number":13,"context_line":"  v1.0.0 already support datastore type/versions;"},{"line_number":14,"context_line":"  Prof.link:"},{"line_number":15,"context_line":"  https://github.com/openstack/python-troveclient/compare/1.0.0...master"},{"line_number":16,"context_line":"  commit Oct 30, 2013"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Changes:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAATn%2F8w88%3D","line":15,"updated":"2013-12-20 15:09:08.000000000","message":"Shouldn\u0027t this link be:\n\nhttps://github.com/openstack/python-troveclient/compare/1.0.0...1.0.3\n\n?","commit_id":"a2b719221008a19f6feaed253fb86edfa5dce7d7"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"15d6658f8ef8e163f6239750000e672386c4f3cb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  v1.0.0 already support datastore type/versions;"},{"line_number":14,"context_line":"  Prof.link:"},{"line_number":15,"context_line":"  https://github.com/openstack/python-troveclient/compare/1.0.0...master"},{"line_number":16,"context_line":"  commit Oct 30, 2013"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Changes:"},{"line_number":19,"context_line":"- updating implementation, allowing datastore types and versions;"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"AAAATn%2F8w7U%3D","line":16,"updated":"2013-12-20 15:09:08.000000000","message":"That commit isn\u0027t in version 1.0.3.","commit_id":"a2b719221008a19f6feaed253fb86edfa5dce7d7"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Pavlo Shchelokovskyy \u003cpshchelokovskyy@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-07 11:49:42 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Trove Resource Update"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Reasons:"},{"line_number":10,"context_line":"- instance provisioning required two parameters:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAWn%2F%2F7jg%3D","line":7,"updated":"2014-04-08 12:54:16.000000000","message":"I don\u0027t mind if you use such commit message line, but IMO, First idea which come in the head is that you add Update ability for this resource.\nIt will be good, if you rephrase it.","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Pavlo Shchelokovskyy \u003cpshchelokovskyy@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-07 11:49:42 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Trove Resource Update"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Reasons:"},{"line_number":10,"context_line":"- instance provisioning required two parameters:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAW3%2F%2FzWo%3D","line":7,"in_reply_to":"AAAAWn%2F%2F7jg%3D","updated":"2014-04-10 10:09:28.000000000","message":"Done","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6743d656db06b39b0d64e3248358c5e1fb39bea4","unresolved":false,"context_lines":[{"line_number":10,"context_line":"when creating Trove instances. This patch enables their usage in Heat."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1d037a9fbf66f13c3195a55c7325d19b5e9a058c"},{"line_number":13,"context_line":"Closes-bug: 1257690"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"3ae8d1ca_014f33be","line":13,"updated":"2014-05-29 06:37:54.000000000","message":"Technically the spec for these requires the # before the numbers. The implementation happens to ignore the # so you can get away with it. :-P","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe3e2a075befd352b4ef60d5bf4f26ceab098777","unresolved":false,"context_lines":[{"line_number":10,"context_line":"when creating Trove instances. This patch enables their usage in Heat."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1d037a9fbf66f13c3195a55c7325d19b5e9a058c"},{"line_number":13,"context_line":"Closes-bug: 1257690"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"1ae5cdf2_291704ef","line":13,"in_reply_to":"3ae8d1ca_014f33be","updated":"2014-05-30 08:51:24.000000000","message":"Will do","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"}],"heat/engine/resources/os_database.py":[{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5993d079f224d58d1d45cf3c977b8f1cc3025ee2","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":181,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":182,"context_line":"                                               self.properties.get(\u0027flavor\u0027))"},{"line_number":183,"context_line":"        self.volume \u003d {\u0027size\u0027: self.properties.get(\u0027size\u0027)}"},{"line_number":184,"context_line":"        self.databases \u003d self.properties.get(\u0027databases\u0027, [])"},{"line_number":185,"context_line":"        self.users \u003d self.properties.get(\u0027users\u0027, [])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vL0%3D","line":182,"updated":"2013-12-06 15:19:45.000000000","message":"pep8 indent failed","commit_id":"3d670056bd8c3a8b3e53461006ba796ac4d49aae"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4d0086d00101844602b3a4f2b7208baa15c2184e","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":181,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":182,"context_line":"                                               self.properties.get(\u0027flavor\u0027))"},{"line_number":183,"context_line":"        self.volume \u003d {\u0027size\u0027: self.properties.get(\u0027size\u0027)}"},{"line_number":184,"context_line":"        self.databases \u003d self.properties.get(\u0027databases\u0027, [])"},{"line_number":185,"context_line":"        self.users \u003d self.properties.get(\u0027users\u0027, [])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vEM%3D","line":182,"in_reply_to":"AAAATn%2F9vL0%3D","updated":"2013-12-06 15:26:22.000000000","message":"Done","commit_id":"3d670056bd8c3a8b3e53461006ba796ac4d49aae"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"5993d079f224d58d1d45cf3c977b8f1cc3025ee2","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                \" datastore_version:%(datastore_version)s)\")"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        logger.info(msg % ({\u0027database\u0027: self.dbinstancename,"},{"line_number":228,"context_line":"                            \u0027flavor\u0027: self.flavor,"},{"line_number":229,"context_line":"                            \u0027volume\u0027: self.volume,"},{"line_number":230,"context_line":"                            \u0027datastore_type\u0027: self.datastore_type,"},{"line_number":231,"context_line":"                            \u0027datastore_version\u0027: self.datastore_version}))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vJo%3D","line":228,"updated":"2013-12-06 15:19:45.000000000","message":"pep8 indent","commit_id":"3d670056bd8c3a8b3e53461006ba796ac4d49aae"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4d0086d00101844602b3a4f2b7208baa15c2184e","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                \" datastore_version:%(datastore_version)s)\")"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        logger.info(msg % ({\u0027database\u0027: self.dbinstancename,"},{"line_number":228,"context_line":"                            \u0027flavor\u0027: self.flavor,"},{"line_number":229,"context_line":"                            \u0027volume\u0027: self.volume,"},{"line_number":230,"context_line":"                            \u0027datastore_type\u0027: self.datastore_type,"},{"line_number":231,"context_line":"                            \u0027datastore_version\u0027: self.datastore_version}))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9vEI%3D","line":228,"in_reply_to":"AAAATn%2F9vJo%3D","updated":"2013-12-06 15:26:22.000000000","message":"Done","commit_id":"3d670056bd8c3a8b3e53461006ba796ac4d49aae"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            properties.Schema.STRING,"},{"line_number":102,"context_line":"            _(\"Datastore version id\"),"},{"line_number":103,"context_line":"            required\u003dTrue),"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        \"name\": properties.Schema("},{"line_number":106,"context_line":"            properties.Schema.STRING,"},{"line_number":107,"context_line":"            _(\"Name of the DB instance to create.\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u3Q%3D","line":104,"updated":"2013-12-06 16:08:13.000000000","message":"Looking at trove\u0027s code, it seems those parameters aren\u0027t required. You can configure trove so that it uses a default datastore.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1059aaaebb1975e7bd7d924e786ca15d1352c28e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            properties.Schema.STRING,"},{"line_number":102,"context_line":"            _(\"Datastore version id\"),"},{"line_number":103,"context_line":"            required\u003dTrue),"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        \"name\": properties.Schema("},{"line_number":106,"context_line":"            properties.Schema.STRING,"},{"line_number":107,"context_line":"            _(\"Name of the DB instance to create.\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uxw%3D","line":104,"in_reply_to":"AAAATn%2F9u3Q%3D","updated":"2013-12-06 16:19:41.000000000","message":"by the default trove has no datastore types and datastore versions at all, only after manual registration they would be available, but still not default.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":181,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id("},{"line_number":182,"context_line":"            self.trove(), self.properties.get(\u0027flavor\u0027))"},{"line_number":183,"context_line":"        self.volume \u003d {\u0027size\u0027: self.properties.get(\u0027size\u0027)}"},{"line_number":184,"context_line":"        self.databases \u003d self.properties.get(\u0027databases\u0027, [])"},{"line_number":185,"context_line":"        self.users \u003d self.properties.get(\u0027users\u0027, [])"},{"line_number":186,"context_line":"        restore_point \u003d self.properties.get(\u0027restore_point\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u0E%3D","line":183,"updated":"2013-12-06 16:28:38.000000000","message":"\u0027flavor\u0027 and \u0027size\u0027 are required property.  So, I think that get() method should not use here.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":181,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id("},{"line_number":182,"context_line":"            self.trove(), self.properties.get(\u0027flavor\u0027))"},{"line_number":183,"context_line":"        self.volume \u003d {\u0027size\u0027: self.properties.get(\u0027size\u0027)}"},{"line_number":184,"context_line":"        self.databases \u003d self.properties.get(\u0027databases\u0027, [])"},{"line_number":185,"context_line":"        self.users \u003d self.properties.get(\u0027users\u0027, [])"},{"line_number":186,"context_line":"        restore_point \u003d self.properties.get(\u0027restore_point\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u28%3D","line":183,"updated":"2013-12-06 16:08:13.000000000","message":"Those changes look unnecessary, you shouldn\u0027t switch to get.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        restore_point \u003d self.properties.get(\u0027restore_point\u0027, None)"},{"line_number":187,"context_line":"        zone \u003d self.properties.get(\u0027availability_zone\u0027, None)"},{"line_number":188,"context_line":"        self.datastore_type \u003d self.properties.get(\"datastore_type\")"},{"line_number":189,"context_line":"        self.datastore_version \u003d self.properties.get(\"datastore_version\")"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        # convert user databases to format required for troveclient."},{"line_number":192,"context_line":"        # that is, list of database dictionaries"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uz4%3D","line":189,"updated":"2013-12-06 16:28:38.000000000","message":"\u0027 is more preferred than \"","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        Check if cloud DB instance creation is complete."},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        instance.get()  # get updated attributes"},{"line_number":217,"context_line":"        if instance.status in (\u0027ERROR\u0027, \u0027FAILED\u0027):"},{"line_number":218,"context_line":"            raise exception.Error(_(\"Database instance creation failed.\"))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        if instance.status !\u003d \u0027ACTIVE\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uw0%3D","line":217,"updated":"2013-12-06 16:28:38.000000000","message":"I think that using of hard-coded  strings for status is a not good idea. Strings constants are much better for this.\n\nFor example :\ninstance.status in (instance.ERROR, instance.FAILED)","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        Check if cloud DB instance creation is complete."},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        instance.get()  # get updated attributes"},{"line_number":217,"context_line":"        if instance.status in (\u0027ERROR\u0027, \u0027FAILED\u0027):"},{"line_number":218,"context_line":"            raise exception.Error(_(\"Database instance creation failed.\"))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        if instance.status !\u003d \u0027ACTIVE\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u2s%3D","line":217,"updated":"2013-12-06 16:08:13.000000000","message":"It seems ERROR is actually not a valid status? The change is untested anyway.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1059aaaebb1975e7bd7d924e786ca15d1352c28e","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        Check if cloud DB instance creation is complete."},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        instance.get()  # get updated attributes"},{"line_number":217,"context_line":"        if instance.status in (\u0027ERROR\u0027, \u0027FAILED\u0027):"},{"line_number":218,"context_line":"            raise exception.Error(_(\"Database instance creation failed.\"))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        if instance.status !\u003d \u0027ACTIVE\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uxU%3D","line":217,"in_reply_to":"AAAATn%2F9u2s%3D","updated":"2013-12-06 16:19:41.000000000","message":"ERROR and FAILED - valid statuses. One could come from VM guestagent, one from taskmanager.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                \" datastore_version:%(datastore_version)s)\")"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        logger.info(msg % ("},{"line_number":228,"context_line":"            {"},{"line_number":229,"context_line":"                \u0027database\u0027: self.dbinstancename,"},{"line_number":230,"context_line":"                \u0027flavor\u0027: self.flavor,"},{"line_number":231,"context_line":"                \u0027volume\u0027: self.volume,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uzA%3D","line":228,"updated":"2013-12-06 16:28:38.000000000","message":"Does empty line here is correct?","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        try:"},{"line_number":264,"context_line":"            # Some period of time trove instance stays in SHUTDOWN"},{"line_number":265,"context_line":"            if instance.status \u003d\u003d \u0027SHUTDOWN\u0027:"},{"line_number":266,"context_line":"                return False"},{"line_number":267,"context_line":"            instance.get()"},{"line_number":268,"context_line":"        except NotFound:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uxE%3D","line":265,"updated":"2013-12-06 16:28:38.000000000","message":"Hard-code is not good :)","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        try:"},{"line_number":264,"context_line":"            # Some period of time trove instance stays in SHUTDOWN"},{"line_number":265,"context_line":"            if instance.status \u003d\u003d \u0027SHUTDOWN\u0027:"},{"line_number":266,"context_line":"                return False"},{"line_number":267,"context_line":"            instance.get()"},{"line_number":268,"context_line":"        except NotFound:"},{"line_number":269,"context_line":"            self.resource_id_set(None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u2U%3D","line":266,"updated":"2013-12-06 16:08:13.000000000","message":"This is untested.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if not self.properties.get(\u0027datastore_version\u0027):"},{"line_number":288,"context_line":"            msg \u003d _(\u0027Datastore version property is required \u0027"},{"line_number":289,"context_line":"                    \u0027if datastore type is provided\u0027)"},{"line_number":290,"context_line":"            raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        # check validity of user and databases"},{"line_number":293,"context_line":"        users \u003d self.properties.get(\u0027users\u0027, [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u2g%3D","line":290,"updated":"2013-12-06 16:08:13.000000000","message":"You don\u0027t need that AFAIU.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"61c95e68684ccfe5df3e8260e2937501d2cb3846","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            missing_db \u003d [db_name for db_name in user[\u0027databases\u0027]"},{"line_number":310,"context_line":"                          if db_name"},{"line_number":311,"context_line":"                          not in [db[\u0027name\u0027] for db in databases]]"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"            if missing_db:"},{"line_number":314,"context_line":"                msg \u003d _(\u0027Database %s specified for user does not exist in \u0027"},{"line_number":315,"context_line":"                        \u0027databases.\u0027) % missing_db"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uuw%3D","line":312,"updated":"2013-12-06 16:28:38.000000000","message":"I\u0027m not sure but, maybe you can use set subtraction in this code to increase the readability?","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9c19dfe04525579c384ff66afb164e5345a3205f","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        \"datastore_version\": properties.Schema("},{"line_number":110,"context_line":"            properties.Schema.STRING,"},{"line_number":111,"context_line":"            _(\"Datastore version id\"),"},{"line_number":112,"context_line":"            required\u003dFalse),"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        \"name\": properties.Schema("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9uEE%3D","line":111,"updated":"2013-12-06 19:05:06.000000000","message":"See comment below, but should document that this property is required if datastore_type is also specified.","commit_id":"5087b638cc886bff3b42f63c786ff33c9e069d6e"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9c19dfe04525579c384ff66afb164e5345a3205f","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        if res:"},{"line_number":284,"context_line":"            return res"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if self.properties.get(\u0027datastore_version\u0027):"},{"line_number":287,"context_line":"            if not self.properties.get(\u0027datastore_type\u0027):"},{"line_number":288,"context_line":"                msg \u003d _(\u0027Datastore_type property is required \u0027"},{"line_number":289,"context_line":"                        \u0027if datastore_version property is provided\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9uEU%3D","line":286,"updated":"2013-12-06 19:05:06.000000000","message":"This constraint should be documented in the property IMO. Also, is the reverse true (version is required if type is defined)?","commit_id":"5087b638cc886bff3b42f63c786ff33c9e069d6e"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"cb6d176cbb2a4995a7cf97ec57ab3c74f541afc7","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # If datastore_version_schema presented in parameters,"},{"line_number":227,"context_line":"        # its items, such as datastore_type and datastore_version,"},{"line_number":228,"context_line":"        # parameter datastore_type will be overriden."},{"line_number":229,"context_line":"        self.datastore_version \u003d None"},{"line_number":230,"context_line":"        if self.datastore_version_schema:"},{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mNg%3D","line":228,"updated":"2013-12-09 20:51:21.000000000","message":"I guess, this behavior is not clear enough. May be it is better to validate template and to raise exception when datastore_version_schema and datastore_type are both set.","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9e7dc2c02ad924c8eccf3bd11ee468ec39a19c8a","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # If datastore_version_schema presented in parameters,"},{"line_number":227,"context_line":"        # its items, such as datastore_type and datastore_version,"},{"line_number":228,"context_line":"        # parameter datastore_type will be overriden."},{"line_number":229,"context_line":"        self.datastore_version \u003d None"},{"line_number":230,"context_line":"        if self.datastore_version_schema:"},{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9l2g%3D","line":228,"in_reply_to":"AAAATn%2F9mNg%3D","updated":"2013-12-09 21:36:44.000000000","message":"if user would mention standalone datastore_type and datastore_type in version schema, schemas datastore will override standalone parameter.\nSuch behavior diesigned to give user ability to create instance only with datastore_type. Giving ability to specify datastore_version (pinned do datastore_type) protects user from template misconfiguration.\nThat is why exception should be risen when mentioned only datastore_version, because Trove cannot create instance only with version mentioned.\nThat is why i chose such form of validation.","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"cb6d176cbb2a4995a7cf97ec57ab3c74f541afc7","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.datastore_version \u003d None"},{"line_number":230,"context_line":"        if self.datastore_version_schema:"},{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"},{"line_number":232,"context_line":"                self.datastore_type, self.datastore_version \u003d ("},{"line_number":233,"context_line":"                    item.values()"},{"line_number":234,"context_line":"                )"},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mME%3D","line":232,"updated":"2013-12-09 20:51:21.000000000","message":"If self.datastore_version_schema is a list with multiple values this code means multiple overwrite of variables self.datastore_type, self.datastore_version. Is it right?","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9e7dc2c02ad924c8eccf3bd11ee468ec39a19c8a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.datastore_version \u003d None"},{"line_number":230,"context_line":"        if self.datastore_version_schema:"},{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"},{"line_number":232,"context_line":"                self.datastore_type, self.datastore_version \u003d ("},{"line_number":233,"context_line":"                    item.values()"},{"line_number":234,"context_line":"                )"},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9l6Y%3D","line":232,"in_reply_to":"AAAATn%2F9mME%3D","updated":"2013-12-09 21:36:44.000000000","message":"To be precise, it\u0027s gonna be user problem if he will form incorrect template with more than one version and datastore.\nTrove instance could be provisioned with only datastore_type parameter mentioned, but all versions are pinned to some kind of  datastore type.\nThe only way to avoid look-up through list is to pop element, and then retrieve item values.","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"cb6d176cbb2a4995a7cf97ec57ab3c74f541afc7","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"},{"line_number":232,"context_line":"                self.datastore_type, self.datastore_version \u003d ("},{"line_number":233,"context_line":"                    item.values()"},{"line_number":234,"context_line":"                )"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        # create db instance"},{"line_number":237,"context_line":"        instance \u003d self.trove().instances.create("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mJY%3D","line":234,"updated":"2013-12-09 20:51:21.000000000","message":"I think that such unpacking is a not good idea, because dictionary does not keep order in python. May be explicit unpacking would be better here.  \nself.datastore_type \u003d item[\u0027datastore_type\u0027]\n...","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9e7dc2c02ad924c8eccf3bd11ee468ec39a19c8a","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            for item in self.datastore_version_schema:"},{"line_number":232,"context_line":"                self.datastore_type, self.datastore_version \u003d ("},{"line_number":233,"context_line":"                    item.values()"},{"line_number":234,"context_line":"                )"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        # create db instance"},{"line_number":237,"context_line":"        instance \u003d self.trove().instances.create("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9l58%3D","line":234,"in_reply_to":"AAAATn%2F9mJY%3D","updated":"2013-12-09 21:36:44.000000000","message":"yes, agreed, i\u0027ll fix that.","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":9377,"name":"Sergey Slipushenko","email":"slipushenko@gmail.com","username":"sslypushenko"},"change_message_id":"cb6d176cbb2a4995a7cf97ec57ab3c74f541afc7","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            return res"},{"line_number":315,"context_line":"        schema \u003d self.properties.get(\u0027datastore_version_schema\u0027)"},{"line_number":316,"context_line":"        if schema:"},{"line_number":317,"context_line":"            dtype, vtype \u003d schema[0].values()"},{"line_number":318,"context_line":"            if not dtype:"},{"line_number":319,"context_line":"                msg \u003d _(\u0027Datastore_type property is required \u0027"},{"line_number":320,"context_line":"                        \u0027if datastore_version property is provided\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9mIQ%3D","line":317,"updated":"2013-12-09 20:51:21.000000000","message":"Implicit unpacking....","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9e7dc2c02ad924c8eccf3bd11ee468ec39a19c8a","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            return res"},{"line_number":315,"context_line":"        schema \u003d self.properties.get(\u0027datastore_version_schema\u0027)"},{"line_number":316,"context_line":"        if schema:"},{"line_number":317,"context_line":"            dtype, vtype \u003d schema[0].values()"},{"line_number":318,"context_line":"            if not dtype:"},{"line_number":319,"context_line":"                msg \u003d _(\u0027Datastore_type property is required \u0027"},{"line_number":320,"context_line":"                        \u0027if datastore_version property is provided\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9l14%3D","line":317,"in_reply_to":"AAAATn%2F9mIQ%3D","updated":"2013-12-09 21:36:44.000000000","message":"agreed, missed that \u003d/\ni\u0027ll fix that","commit_id":"701f5c50800443ddd53d0ba0641ce855e33c5d37"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"2d6a6f767981efc7f4f44d125d7b9e6c45de4523","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        # All kinds of datastore_versions are pinned to datastore_type."},{"line_number":229,"context_line":"        # According to this, datastore_type which mentioned"},{"line_number":230,"context_line":"        # in datastore_version_schema has bigger priority"},{"line_number":231,"context_line":"        # then standalone datastore_type, because Trove image could be"},{"line_number":232,"context_line":"        # provisioned with only datastore_type, but if datastore_version"},{"line_number":233,"context_line":"        # mentioned datastore_type is required."},{"line_number":234,"context_line":"        # That is why datastore_type in schema has bigger priority and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hlE%3D","line":231,"updated":"2013-12-10 15:59:20.000000000","message":"typo s/then/than, and it would be better to have this priority precedence explanation in the property description as well.","commit_id":"818a68d02a4f3b167f600035f5c8f873eac728fc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1dc39b9bb64b135a9f6b468a3565284242b1ce8a","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        # All kinds of datastore_versions are pinned to datastore_type."},{"line_number":229,"context_line":"        # According to this, datastore_type which mentioned"},{"line_number":230,"context_line":"        # in datastore_version_schema has bigger priority"},{"line_number":231,"context_line":"        # then standalone datastore_type, because Trove image could be"},{"line_number":232,"context_line":"        # provisioned with only datastore_type, but if datastore_version"},{"line_number":233,"context_line":"        # mentioned datastore_type is required."},{"line_number":234,"context_line":"        # That is why datastore_type in schema has bigger priority and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9hhU%3D","line":231,"in_reply_to":"AAAATn%2F9hlE%3D","updated":"2013-12-10 16:05:46.000000000","message":"Thanks for review. I will do it asap.","commit_id":"818a68d02a4f3b167f600035f5c8f873eac728fc"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":31,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TroveInstanceStatus(object):"},{"line_number":35,"context_line":"    # Trove instance statuses"},{"line_number":36,"context_line":"    ERROR \u003d \u0027ERROR\u0027"},{"line_number":37,"context_line":"    FAILED \u003d \u0027FAILED\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bz88%3D","line":34,"updated":"2014-01-21 21:53:58.000000000","message":"For consistency this should be represented inside OSDBInstance in the same style as PROPERTIES","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"eb0497920e2541ef776f33b99ee0d256b0d03bdb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TroveInstanceStatus(object):"},{"line_number":35,"context_line":"    # Trove instance statuses"},{"line_number":36,"context_line":"    ERROR \u003d \u0027ERROR\u0027"},{"line_number":37,"context_line":"    FAILED \u003d \u0027FAILED\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2F9T4%3D","line":34,"in_reply_to":"AAAAUH%2F%2Bz88%3D","updated":"2014-02-08 13:15:14.000000000","message":"Done","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"3d54de8cfbc7e2be2b03c9db4816782dab840e4a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    )"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    properties_schema \u003d {"},{"line_number":75,"context_line":"        DATASTORE_TYPE: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.STRING,"},{"line_number":77,"context_line":"            _(\"Name of registered datastore type. \""},{"line_number":78,"context_line":"              \"This parameter provided to allow users\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FqYc%3D","line":75,"updated":"2014-01-09 23:11:01.000000000","message":"I\u0027m finding the documentation difficult to come by, but this seems as if it can just be simplified to a DATASTORE_TYPE property and an optional DATASTORE_VERSION property. This would be much clearer, IMO, and certainly simplify the handle_create code. As it stands, its quite confusing to have basically two ways to specify the same thing when you could add a single line to validate that makes sure that type is specified when version is specified.","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    )"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    properties_schema \u003d {"},{"line_number":75,"context_line":"        DATASTORE_TYPE: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.STRING,"},{"line_number":77,"context_line":"            _(\"Name of registered datastore type. \""},{"line_number":78,"context_line":"              \"This parameter provided to allow users\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bz8k%3D","line":75,"in_reply_to":"AAAAUH%2F%2B0IQ%3D","updated":"2014-01-21 21:53:58.000000000","message":"Yes, I would like to see datastore_type required\u003dTrue and a datastore_version required\u003dFalse.\n\nAlso instances.create only takes a singe type, so specifying a list of type/version pairs is unnecessary.","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"eb0497920e2541ef776f33b99ee0d256b0d03bdb","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    )"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    properties_schema \u003d {"},{"line_number":75,"context_line":"        DATASTORE_TYPE: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.STRING,"},{"line_number":77,"context_line":"            _(\"Name of registered datastore type. \""},{"line_number":78,"context_line":"              \"This parameter provided to allow users\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2F9Ts%3D","line":75,"in_reply_to":"AAAAUH%2F%2Bz8k%3D","updated":"2014-02-08 13:15:14.000000000","message":"Done","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e25aa73fe63b17805e6ce118a756e05c128e872c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    )"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    properties_schema \u003d {"},{"line_number":75,"context_line":"        DATASTORE_TYPE: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.STRING,"},{"line_number":77,"context_line":"            _(\"Name of registered datastore type. \""},{"line_number":78,"context_line":"              \"This parameter provided to allow users\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2B0IQ%3D","line":75,"in_reply_to":"AAAAUH%2F%2Fol8%3D","updated":"2014-01-21 20:19:20.000000000","message":"Type is required, version is optional. Im not sure it has to be more complex than that.","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"edf743faa51214e79ccb3922405c0acfc56c8283","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    )"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    properties_schema \u003d {"},{"line_number":75,"context_line":"        DATASTORE_TYPE: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.STRING,"},{"line_number":77,"context_line":"            _(\"Name of registered datastore type. \""},{"line_number":78,"context_line":"              \"This parameter provided to allow users\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Fol8%3D","line":75,"in_reply_to":"AAAAUH%2F%2FqYc%3D","updated":"2014-01-10 09:07:49.000000000","message":"Trove instance could be provisioned with datastore only or datastore and datastore_version. Since version and type are connected we need to restrict way of how parameters should be passed.\nThat is why i design such way of pairing type and version.\nResource could be provisioned with only datastore type, and if user want to create resource with version he would need to pass version and type which are connected (please read Trove datastore management documentation).","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        RESTORE_POINT: properties.Schema("},{"line_number":220,"context_line":"            properties.Schema.STRING,"},{"line_number":221,"context_line":"            _(\u0027DB instance restore point.\u0027),"},{"line_number":222,"context_line":"            required\u003dFalse)"},{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    attributes_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bz8M%3D","line":222,"updated":"2014-01-21 21:53:58.000000000","message":"required is False by default so this is not strictly necessary.","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"eb0497920e2541ef776f33b99ee0d256b0d03bdb","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        RESTORE_POINT: properties.Schema("},{"line_number":220,"context_line":"            properties.Schema.STRING,"},{"line_number":221,"context_line":"            _(\u0027DB instance restore point.\u0027),"},{"line_number":222,"context_line":"            required\u003dFalse)"},{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    attributes_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2F9To%3D","line":222,"in_reply_to":"AAAAUH%2F%2Bz8M%3D","updated":"2014-02-08 13:15:14.000000000","message":"Done","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        return super(OSDBInstance, self).physical_resource_name()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def handle_create(self):"},{"line_number":251,"context_line":"        \"\"\""},{"line_number":252,"context_line":"        Create cloud database instance."},{"line_number":253,"context_line":"        \"\"\""},{"line_number":254,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bz78%3D","line":251,"updated":"2014-01-21 21:53:58.000000000","message":"These quote changes make it more difficult to focus on the real content of this review.","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"eb0497920e2541ef776f33b99ee0d256b0d03bdb","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        return super(OSDBInstance, self).physical_resource_name()"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def handle_create(self):"},{"line_number":251,"context_line":"        \"\"\""},{"line_number":252,"context_line":"        Create cloud database instance."},{"line_number":253,"context_line":"        \"\"\""},{"line_number":254,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2F9Tk%3D","line":251,"in_reply_to":"AAAAUH%2F%2Bz78%3D","updated":"2014-02-08 13:15:14.000000000","message":"Done","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            restorePoint\u003drestore_point,"},{"line_number":296,"context_line":"            availability_zone\u003dzone,"},{"line_number":297,"context_line":"            datastore\u003dself.datastore_type,"},{"line_number":298,"context_line":"            datastore_version\u003dNone or self.datastore_version)"},{"line_number":299,"context_line":"        self.resource_id_set(instance.id)"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        return instance"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BzsE%3D","line":298,"updated":"2014-01-21 21:53:58.000000000","message":"It looks like the \u0027None or\u0027 has no effect here","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"eb0497920e2541ef776f33b99ee0d256b0d03bdb","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            restorePoint\u003drestore_point,"},{"line_number":296,"context_line":"            availability_zone\u003dzone,"},{"line_number":297,"context_line":"            datastore\u003dself.datastore_type,"},{"line_number":298,"context_line":"            datastore_version\u003dNone or self.datastore_version)"},{"line_number":299,"context_line":"        self.resource_id_set(instance.id)"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        return instance"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2F9Tg%3D","line":298,"in_reply_to":"AAAAUH%2F%2BzsE%3D","updated":"2014-02-08 13:15:14.000000000","message":"Done","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"38c13ab484d97ec3ed53d140f0e55b32a1c395de","unresolved":false,"context_lines":[{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        try:"},{"line_number":359,"context_line":"            # Some period of time trove instance"},{"line_number":360,"context_line":"            # lives with SHUTDOWN status"},{"line_number":361,"context_line":"            instance.get()"},{"line_number":362,"context_line":"        except NotFound:"},{"line_number":363,"context_line":"            self.resource_id_set(None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bz7U%3D","line":360,"updated":"2014-01-21 21:53:58.000000000","message":"Given this comment, it looks like you could achieve a quicker resource delete by returning true if instance.status \u003d\u003d SHUTDOWN?","commit_id":"e954c5a2cf1d8affcdaceabb3c8183a10250b5fb"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9eca5758a1c307a7e5cd4a1d784ea3423bd6b5cb","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    TROVE_STATUS \u003d (ERROR, FAILED, BUILD, ACTIVE,"},{"line_number":35,"context_line":"                    ) \u003d (\u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F93cc%3D","line":35,"updated":"2014-04-01 15:08:20.000000000","message":"missing \"SHUTDOWN\"","commit_id":"48895053fe13a5243346e3d5cfc930713cda08fa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9eca5758a1c307a7e5cd4a1d784ea3423bd6b5cb","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    TROVE_STATUS \u003d (ERROR, FAILED, BUILD, ACTIVE,"},{"line_number":35,"context_line":"                    ) \u003d (\u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    PROPERTIES \u003d ("},{"line_number":40,"context_line":"        NAME, FLAVOR, SIZE, DATABASES, USERS, AVAILABILITY_ZONE,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F93ck%3D","line":37,"updated":"2014-04-01 15:08:20.000000000","message":"missing \"SHUTDOWN\"","commit_id":"48895053fe13a5243346e3d5cfc930713cda08fa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9eca5758a1c307a7e5cd4a1d784ea3423bd6b5cb","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        restore_point \u003d self.properties.get(self.RESTORE_POINT, None)"},{"line_number":229,"context_line":"        zone \u003d self.properties.get(self.AVAILABILITY_ZONE, None)"},{"line_number":230,"context_line":"        self.datastore_type \u003d self.properties.get(self.DATASTORE_TYPE, None)"},{"line_number":231,"context_line":"        self.datastore_version \u003d \\"},{"line_number":232,"context_line":"            self.properties.get(self.DATASTORE_VERSION) or None"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # convert user databases to format required for troveclient."}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F93cQ%3D","line":231,"updated":"2014-04-01 15:08:20.000000000","message":"i\u0027d not suggest to use \\","commit_id":"48895053fe13a5243346e3d5cfc930713cda08fa"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        self.databases \u003d self.properties.get(self.DATABASES)"},{"line_number":227,"context_line":"        self.users \u003d self.properties.get(self.USERS)"},{"line_number":228,"context_line":"        restore_point \u003d self.properties.get(self.RESTORE_POINT, None)"},{"line_number":229,"context_line":"        zone \u003d self.properties.get(self.AVAILABILITY_ZONE, None)"},{"line_number":230,"context_line":"        self.datastore_type \u003d self.properties.get(self.DATASTORE_TYPE, None)"},{"line_number":231,"context_line":"        self.datastore_version \u003d self.properties.get("},{"line_number":232,"context_line":"            self.DATASTORE_VERSION) or None"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7wI%3D","line":229,"updated":"2014-04-08 12:54:16.000000000","message":"Also, Could you share reason, why do you use None options here?\n\nAFAIK, it does not work for Properties class now.\nhttps://github.com/openstack/heat/blob/master/heat/engine/properties.py#L324","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        self.databases \u003d self.properties.get(self.DATABASES)"},{"line_number":227,"context_line":"        self.users \u003d self.properties.get(self.USERS)"},{"line_number":228,"context_line":"        restore_point \u003d self.properties.get(self.RESTORE_POINT, None)"},{"line_number":229,"context_line":"        zone \u003d self.properties.get(self.AVAILABILITY_ZONE, None)"},{"line_number":230,"context_line":"        self.datastore_type \u003d self.properties.get(self.DATASTORE_TYPE, None)"},{"line_number":231,"context_line":"        self.datastore_version \u003d self.properties.get("},{"line_number":232,"context_line":"            self.DATASTORE_VERSION) or None"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FzYg%3D","line":229,"in_reply_to":"AAAAWn%2F%2F7wI%3D","updated":"2014-04-10 10:09:28.000000000","message":"IMO this is exactly what .get() does - it swallows KeyError if __getitem__ raises it and returns the default value. collections.Mapping provides exactly that - \nhttp://hg.python.org/cpython/file/2.7/Lib/_abcoll.py#l360\n\nbut indeed, the default to get() is None, so it could be omitted","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        self.users \u003d self.properties.get(self.USERS)"},{"line_number":228,"context_line":"        restore_point \u003d self.properties.get(self.RESTORE_POINT, None)"},{"line_number":229,"context_line":"        zone \u003d self.properties.get(self.AVAILABILITY_ZONE, None)"},{"line_number":230,"context_line":"        self.datastore_type \u003d self.properties.get(self.DATASTORE_TYPE, None)"},{"line_number":231,"context_line":"        self.datastore_version \u003d self.properties.get("},{"line_number":232,"context_line":"            self.DATASTORE_VERSION) or None"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F8HI%3D","line":230,"updated":"2014-04-08 12:54:16.000000000","message":"DATASTORE_TYPE is required property, so I think that using default value is redundantly.","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        self.users \u003d self.properties.get(self.USERS)"},{"line_number":228,"context_line":"        restore_point \u003d self.properties.get(self.RESTORE_POINT, None)"},{"line_number":229,"context_line":"        zone \u003d self.properties.get(self.AVAILABILITY_ZONE, None)"},{"line_number":230,"context_line":"        self.datastore_type \u003d self.properties.get(self.DATASTORE_TYPE, None)"},{"line_number":231,"context_line":"        self.datastore_version \u003d self.properties.get("},{"line_number":232,"context_line":"            self.DATASTORE_VERSION) or None"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FzaU%3D","line":230,"in_reply_to":"AAAAWn%2F%2F8HI%3D","updated":"2014-04-10 10:09:28.000000000","message":"I will remove the required from datastore_type, as it is actually an optional parameter to instance.create in latest troveclient","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        Check if cloud DB instance creation is complete."},{"line_number":268,"context_line":"        \u0027\u0027\u0027"},{"line_number":269,"context_line":"        self._refresh_instance(instance)  # get updated attributes"},{"line_number":270,"context_line":"        if instance.status in self.BAD_STATUSES:"},{"line_number":271,"context_line":"            raise exception.Error(_(\"Database instance creation failed.\"))"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        if instance.status !\u003d self.ACTIVE:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7uA%3D","line":270,"updated":"2014-04-08 12:54:16.000000000","message":"I don\u0027t think that creating attribute BAD_STATUSES for using it ones reasonably.\nHowever it works, so let\u0027s leave it without changes.","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            return False"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        msg \u003d _(\"Database instance %(database)s created (flavor:%(flavor)s, \""},{"line_number":277,"context_line":"                \"volume:%(volume)s, datastore:%(datastore_type)s,\""},{"line_number":278,"context_line":"                \" datastore_version:%(datastore_version)s)\")"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger.info(msg % ({\u0027database\u0027: self.dbinstancename,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7tQ%3D","line":277,"updated":"2014-04-08 12:54:16.000000000","message":"Cosmetic note: I suggest to use whitespace at the end of line instead at the start of new line.","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            return False"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        msg \u003d _(\"Database instance %(database)s created (flavor:%(flavor)s, \""},{"line_number":277,"context_line":"                \"volume:%(volume)s, datastore:%(datastore_type)s,\""},{"line_number":278,"context_line":"                \" datastore_version:%(datastore_version)s)\")"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger.info(msg % ({\u0027database\u0027: self.dbinstancename,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FzXs%3D","line":277,"in_reply_to":"AAAAWn%2F%2F7tQ%3D","updated":"2014-04-10 10:09:28.000000000","message":"Done","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        db_names \u003d set([db[self.DATABASE_NAME] for db in databases])"},{"line_number":363,"context_line":"        for user in users:"},{"line_number":364,"context_line":"            if not user.get(self.USER_DATABASES, []):"},{"line_number":365,"context_line":"                msg \u003d _(\u0027Must provide access to at least one database for \u0027"},{"line_number":366,"context_line":"                        \u0027user %s\u0027) % user[self.USER_NAME]"},{"line_number":367,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7k4%3D","line":364,"updated":"2014-04-08 12:54:16.000000000","message":"USER_DATABASES is required property too and you also could not use [].","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        db_names \u003d set([db[self.DATABASE_NAME] for db in databases])"},{"line_number":363,"context_line":"        for user in users:"},{"line_number":364,"context_line":"            if not user.get(self.USER_DATABASES, []):"},{"line_number":365,"context_line":"                msg \u003d _(\u0027Must provide access to at least one database for \u0027"},{"line_number":366,"context_line":"                        \u0027user %s\u0027) % user[self.USER_NAME]"},{"line_number":367,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FzXo%3D","line":364,"in_reply_to":"AAAAWn%2F%2F7k4%3D","updated":"2014-04-10 10:09:28.000000000","message":"Done","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fe53a43f7200087edfe1cc63c571169e878c45ee","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    OpenStack cloud database instance resource."},{"line_number":31,"context_line":"    \u0027\u0027\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    TROVE_STATUS \u003d (ERROR, FAILED, BUILD, ACTIVE, SHUTDOWN"},{"line_number":34,"context_line":"                    ) \u003d (\u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027, \u0027SHUTDOWN\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FhYw%3D","line":33,"updated":"2014-04-14 00:57:40.000000000","message":"Could you use the same whitespace style as PROPERTIES?","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb78087893b0dde61edd4d0683ad27c7d021b322","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    OpenStack cloud database instance resource."},{"line_number":31,"context_line":"    \u0027\u0027\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    TROVE_STATUS \u003d (ERROR, FAILED, BUILD, ACTIVE, SHUTDOWN"},{"line_number":34,"context_line":"                    ) \u003d (\u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027, \u0027SHUTDOWN\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fe4Y%3D","line":33,"in_reply_to":"AAAAW3%2F%2FhYw%3D","updated":"2014-04-14 10:41:53.000000000","message":"Done","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fe53a43f7200087edfe1cc63c571169e878c45ee","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        DATASTORE_VERSION: properties.Schema("},{"line_number":68,"context_line":"            properties.Schema.STRING,"},{"line_number":69,"context_line":"            _(\"Name of the registered datastore version. \""},{"line_number":70,"context_line":"              \"It must exsist for provided datastore type. \""},{"line_number":71,"context_line":"              \"Defaults to using single active version. \""},{"line_number":72,"context_line":"              \"If several active versions exist for provided datastore type, \""},{"line_number":73,"context_line":"              \"explicit value for this parameter must be specified.\"),"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FhYU%3D","line":70,"updated":"2014-04-14 00:57:40.000000000","message":"exist","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb78087893b0dde61edd4d0683ad27c7d021b322","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        DATASTORE_VERSION: properties.Schema("},{"line_number":68,"context_line":"            properties.Schema.STRING,"},{"line_number":69,"context_line":"            _(\"Name of the registered datastore version. \""},{"line_number":70,"context_line":"              \"It must exsist for provided datastore type. \""},{"line_number":71,"context_line":"              \"Defaults to using single active version. \""},{"line_number":72,"context_line":"              \"If several active versions exist for provided datastore type, \""},{"line_number":73,"context_line":"              \"explicit value for this parameter must be specified.\"),"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fe4U%3D","line":70,"in_reply_to":"AAAAW3%2F%2FhYU%3D","updated":"2014-04-14 10:41:53.000000000","message":"Done","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fe53a43f7200087edfe1cc63c571169e878c45ee","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":220,"context_line":"                                               self.properties[self.FLAVOR])"},{"line_number":221,"context_line":"        if self.SIZE in self.properties:"},{"line_number":222,"context_line":"            self.volume \u003d {\u0027size\u0027: self.properties[self.SIZE]}"},{"line_number":223,"context_line":"        else:"},{"line_number":224,"context_line":"            self.volume \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FhX0%3D","line":221,"updated":"2014-04-14 00:57:40.000000000","message":"size will always be in self.properties, but sometimes set to None. A better check might be:\n\nif self.properties.get(self.SIZE):","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb78087893b0dde61edd4d0683ad27c7d021b322","unresolved":false,"context_lines":[{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":220,"context_line":"                                               self.properties[self.FLAVOR])"},{"line_number":221,"context_line":"        if self.SIZE in self.properties:"},{"line_number":222,"context_line":"            self.volume \u003d {\u0027size\u0027: self.properties[self.SIZE]}"},{"line_number":223,"context_line":"        else:"},{"line_number":224,"context_line":"            self.volume \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fe38%3D","line":221,"in_reply_to":"AAAAW3%2F%2FhX0%3D","updated":"2014-04-14 10:41:53.000000000","message":"Done","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fe53a43f7200087edfe1cc63c571169e878c45ee","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                    msg \u003d _(\"Datastore version %(dsversion)s \""},{"line_number":338,"context_line":"                            \"for datastore type %(dstype)s is not valid.\") % {"},{"line_number":339,"context_line":"                                \u0027dstype\u0027: datastore_type,"},{"line_number":340,"context_line":"                                \u0027dsversion\u0027: datastore_version}"},{"line_number":341,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":342,"context_line":"            else:"},{"line_number":343,"context_line":"                if len(allowed_versions) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FhW8%3D","line":340,"updated":"2014-04-14 00:57:40.000000000","message":"maybe allowed_version_names should be included in the validation message so they are not left guessing.","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb78087893b0dde61edd4d0683ad27c7d021b322","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                    msg \u003d _(\"Datastore version %(dsversion)s \""},{"line_number":338,"context_line":"                            \"for datastore type %(dstype)s is not valid.\") % {"},{"line_number":339,"context_line":"                                \u0027dstype\u0027: datastore_type,"},{"line_number":340,"context_line":"                                \u0027dsversion\u0027: datastore_version}"},{"line_number":341,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":342,"context_line":"            else:"},{"line_number":343,"context_line":"                if len(allowed_versions) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FezU%3D","line":340,"in_reply_to":"AAAAW3%2F%2FhW8%3D","updated":"2014-04-14 10:41:53.000000000","message":"Done","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fe53a43f7200087edfe1cc63c571169e878c45ee","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                    msg \u003d _(\"Multiple active datastore versions exist for \""},{"line_number":345,"context_line":"                            \"datastore type %(dstype)s. \""},{"line_number":346,"context_line":"                            \"Explicit datastore version must be provided.\") % {"},{"line_number":347,"context_line":"                                \u0027dstype\u0027: datastore_type}"},{"line_number":348,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":349,"context_line":"        else:"},{"line_number":350,"context_line":"            if datastore_version:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FhW4%3D","line":347,"updated":"2014-04-14 00:57:40.000000000","message":"same here","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fb78087893b0dde61edd4d0683ad27c7d021b322","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                    msg \u003d _(\"Multiple active datastore versions exist for \""},{"line_number":345,"context_line":"                            \"datastore type %(dstype)s. \""},{"line_number":346,"context_line":"                            \"Explicit datastore version must be provided.\") % {"},{"line_number":347,"context_line":"                                \u0027dstype\u0027: datastore_type}"},{"line_number":348,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":349,"context_line":"        else:"},{"line_number":350,"context_line":"            if datastore_version:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FezQ%3D","line":347,"in_reply_to":"AAAAW3%2F%2FhW4%3D","updated":"2014-04-14 10:41:53.000000000","message":"Done","commit_id":"ae87f8d26c8f02c9ad949b00a01ad7ca3b08596f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"afe8ec87fe2f7ea5a79fec937ebbf978c72488f3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        RESTORE_POINT, DATASTORE_TYPE, DATASTORE_VERSION,"},{"line_number":44,"context_line":"    ) \u003d ("},{"line_number":45,"context_line":"        \u0027name\u0027, \u0027flavor\u0027, \u0027size\u0027, \u0027databases\u0027, \u0027users\u0027, \u0027availability_zone\u0027,"},{"line_number":46,"context_line":"        \u0027restore_point\u0027, \u0027datastore_type\u0027, \u0027datastore_version\u0027"},{"line_number":47,"context_line":"    )"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    _DATABASE_KEYS \u003d ("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FXQ4%3D","line":46,"updated":"2014-04-15 06:44:37.000000000","message":"missed comma at the end. (I suppose that 43 and 46 lines should be consistent)","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6025cec6f53478929b185e2e84d5c9438a93e408","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        RESTORE_POINT, DATASTORE_TYPE, DATASTORE_VERSION,"},{"line_number":44,"context_line":"    ) \u003d ("},{"line_number":45,"context_line":"        \u0027name\u0027, \u0027flavor\u0027, \u0027size\u0027, \u0027databases\u0027, \u0027users\u0027, \u0027availability_zone\u0027,"},{"line_number":46,"context_line":"        \u0027restore_point\u0027, \u0027datastore_type\u0027, \u0027datastore_version\u0027"},{"line_number":47,"context_line":"    )"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    _DATABASE_KEYS \u003d ("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FWxk%3D","line":46,"in_reply_to":"AAAAW3%2F%2FXQ4%3D","updated":"2014-04-15 08:06:39.000000000","message":"Done","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    TROVE_STATUS \u003d ("},{"line_number":34,"context_line":"        ERROR, FAILED, BUILD, ACTIVE, SHUTDOWN,"},{"line_number":35,"context_line":"    ) \u003d ("},{"line_number":36,"context_line":"        \u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027, \u0027SHUTDOWN\u0027,"},{"line_number":37,"context_line":"    )"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVxY%3D","line":36,"updated":"2014-04-15 10:15:21.000000000","message":"Looks like \u0027BUILD\u0027 and \u0027SHUTDOWN\u0027, are never used.","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    TROVE_STATUS \u003d ("},{"line_number":34,"context_line":"        ERROR, FAILED, BUILD, ACTIVE, SHUTDOWN,"},{"line_number":35,"context_line":"    ) \u003d ("},{"line_number":36,"context_line":"        \u0027ERROR\u0027, \u0027FAILED\u0027, \u0027BUILD\u0027, \u0027ACTIVE\u0027, \u0027SHUTDOWN\u0027,"},{"line_number":37,"context_line":"    )"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    BAD_STATUSES \u003d (ERROR, FAILED)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUzs%3D","line":36,"in_reply_to":"AAAAW3%2F%2FVxY%3D","updated":"2014-04-15 11:29:40.000000000","message":"those were added for the sake of completeness, but probably indeed could be removed","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6743d656db06b39b0d64e3248358c5e1fb39bea4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ),"},{"line_number":93,"context_line":"        SIZE: properties.Schema("},{"line_number":94,"context_line":"            properties.Schema.INTEGER,"},{"line_number":95,"context_line":"            _(\u0027Database volume size in GB.\u0027),"},{"line_number":96,"context_line":"            constraints\u003d["},{"line_number":97,"context_line":"                constraints.Range(1, 150),"},{"line_number":98,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":22,"id":"3ae8d1ca_61cb971e","line":95,"updated":"2014-05-29 06:37:54.000000000","message":"This change is not mentioned in the commit message.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9de6aaa7e9c424538576c98f11624bb6c7cccdd8","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ),"},{"line_number":93,"context_line":"        SIZE: properties.Schema("},{"line_number":94,"context_line":"            properties.Schema.INTEGER,"},{"line_number":95,"context_line":"            _(\u0027Database volume size in GB.\u0027),"},{"line_number":96,"context_line":"            constraints\u003d["},{"line_number":97,"context_line":"                constraints.Range(1, 150),"},{"line_number":98,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_01c13c80","line":95,"in_reply_to":"1ae5cdf2_090328b9","updated":"2014-05-30 10:51:37.000000000","message":"I have spoken with some trove people, and AFAIU with default trove service settings this property must be required. Will change it back then.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe3e2a075befd352b4ef60d5bf4f26ceab098777","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        ),"},{"line_number":93,"context_line":"        SIZE: properties.Schema("},{"line_number":94,"context_line":"            properties.Schema.INTEGER,"},{"line_number":95,"context_line":"            _(\u0027Database volume size in GB.\u0027),"},{"line_number":96,"context_line":"            constraints\u003d["},{"line_number":97,"context_line":"                constraints.Range(1, 150),"},{"line_number":98,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_090328b9","line":95,"in_reply_to":"3ae8d1ca_61cb971e","updated":"2014-05-30 08:51:24.000000000","message":"looking at the troveclient code [1] I see that actually only name and flavor are required arguments, all others have None as default.\n\nBut you are right, I\u0027ll mention it in the commit message.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6743d656db06b39b0d64e3248358c5e1fb39bea4","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        RESTORE_POINT: properties.Schema("},{"line_number":186,"context_line":"            properties.Schema.STRING,"},{"line_number":187,"context_line":"            _(\u0027DB instance restore point.\u0027)"},{"line_number":188,"context_line":"        )"},{"line_number":189,"context_line":"    }"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    attributes_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":22,"id":"3ae8d1ca_81d263d0","line":188,"updated":"2014-05-29 06:37:54.000000000","message":"this is unnecessary and makes the code less maintainable long term (just leaving it allows adding more entries without changing this line.)","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe3e2a075befd352b4ef60d5bf4f26ceab098777","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        RESTORE_POINT: properties.Schema("},{"line_number":186,"context_line":"            properties.Schema.STRING,"},{"line_number":187,"context_line":"            _(\u0027DB instance restore point.\u0027)"},{"line_number":188,"context_line":"        )"},{"line_number":189,"context_line":"    }"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    attributes_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_492c504b","line":188,"in_reply_to":"3ae8d1ca_81d263d0","updated":"2014-05-30 08:51:24.000000000","message":"Will do","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6743d656db06b39b0d64e3248358c5e1fb39bea4","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        Create cloud database instance."},{"line_number":219,"context_line":"        \u0027\u0027\u0027"},{"line_number":220,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":223,"context_line":"                                               self.properties[self.FLAVOR])"},{"line_number":224,"context_line":"        if self.properties.get(self.SIZE):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3ae8d1ca_e1fde73c","line":221,"updated":"2014-05-29 06:37:54.000000000","message":"Make sure to read http://legacy.python.org/dev/peps/pep-0008/ \"Blank Lines\" .. the line above is really not unrelated to the lines below and thus this doesn\u0027t really count as using blank lines sparingly.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe3e2a075befd352b4ef60d5bf4f26ceab098777","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        Create cloud database instance."},{"line_number":219,"context_line":"        \u0027\u0027\u0027"},{"line_number":220,"context_line":"        self.dbinstancename \u003d self.physical_resource_name()"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        self.flavor \u003d nova_utils.get_flavor_id(self.trove(),"},{"line_number":223,"context_line":"                                               self.properties[self.FLAVOR])"},{"line_number":224,"context_line":"        if self.properties.get(self.SIZE):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_69310ca2","line":221,"in_reply_to":"3ae8d1ca_e1fde73c","updated":"2014-05-30 08:51:24.000000000","message":"Will do","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6743d656db06b39b0d64e3248358c5e1fb39bea4","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        db_names \u003d set([db[self.DATABASE_NAME] for db in databases])"},{"line_number":374,"context_line":"        for user in users:"},{"line_number":375,"context_line":"            if not user[self.USER_DATABASES]:"},{"line_number":376,"context_line":"                msg \u003d _(\u0027Must provide access to at least one database for \u0027"},{"line_number":377,"context_line":"                        \u0027user %s\u0027) % user[self.USER_NAME]"},{"line_number":378,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3ae8d1ca_01abb31d","line":375,"updated":"2014-05-29 06:37:54.000000000","message":"What is the point of this change? It seems unnecessary and makes the code more fragile since it could now raise a KeyError.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"40686aed292cb79ab969d3cf0221f50007371d4f","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        db_names \u003d set([db[self.DATABASE_NAME] for db in databases])"},{"line_number":374,"context_line":"        for user in users:"},{"line_number":375,"context_line":"            if not user[self.USER_DATABASES]:"},{"line_number":376,"context_line":"                msg \u003d _(\u0027Must provide access to at least one database for \u0027"},{"line_number":377,"context_line":"                        \u0027user %s\u0027) % user[self.USER_NAME]"},{"line_number":378,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_1cfc3f3e","line":375,"in_reply_to":"1ae5cdf2_495e10eb","updated":"2014-05-30 13:08:06.000000000","message":"strike that last comment, the check is for empty list in fact. But the change is valid still, as USER_DATABASES is required sub-property for USERS, so it will always be present, otherwise the schema will not validate. On the other hand I will still remove this block and simply add a length constraint to USER_DATABASES.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"fe3e2a075befd352b4ef60d5bf4f26ceab098777","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        db_names \u003d set([db[self.DATABASE_NAME] for db in databases])"},{"line_number":374,"context_line":"        for user in users:"},{"line_number":375,"context_line":"            if not user[self.USER_DATABASES]:"},{"line_number":376,"context_line":"                msg \u003d _(\u0027Must provide access to at least one database for \u0027"},{"line_number":377,"context_line":"                        \u0027user %s\u0027) % user[self.USER_NAME]"},{"line_number":378,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1ae5cdf2_495e10eb","line":375,"in_reply_to":"3ae8d1ca_01abb31d","updated":"2014-05-30 08:51:24.000000000","message":"in fact it seems this whole if-block can be safely omitted, as the USER_DATABASES is required property for every user in USERS, so missing it would raise validation error on line 326 when the whole schema is validated for consistency.","commit_id":"29a409c1d73e2e01837edfbc3fb51b6d552b4b26"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7ee32f332bf501c3e947daab5c63d66ab0aa1a85","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":364,"context_line":"        else:"},{"line_number":365,"context_line":"            if datastore_version:"},{"line_number":366,"context_line":"                msg \u003d _(\"Not allowed - %(dsver)s without %(dstype)s\") % {"},{"line_number":367,"context_line":"                    \u0027dsver\u0027: self.DATASTORE_VERSION,"},{"line_number":368,"context_line":"                    \u0027dstype\u0027: self.DATASTORE_TYPE}"},{"line_number":369,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_ab755e99","line":366,"updated":"2014-06-03 09:45:49.000000000","message":"missed dot in the end of sentence","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dc168529212f637e07284a50ff1396ed09393f8e","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                    raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":364,"context_line":"        else:"},{"line_number":365,"context_line":"            if datastore_version:"},{"line_number":366,"context_line":"                msg \u003d _(\"Not allowed - %(dsver)s without %(dstype)s\") % {"},{"line_number":367,"context_line":"                    \u0027dsver\u0027: self.DATASTORE_VERSION,"},{"line_number":368,"context_line":"                    \u0027dstype\u0027: self.DATASTORE_TYPE}"},{"line_number":369,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_c1936b4d","line":366,"in_reply_to":"1ae5cdf2_ab755e99","updated":"2014-06-03 10:28:42.000000000","message":"Done","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7ee32f332bf501c3e947daab5c63d66ab0aa1a85","unresolved":false,"context_lines":[{"line_number":386,"context_line":""},{"line_number":387,"context_line":"            if missing_db:"},{"line_number":388,"context_line":"                msg \u003d (_(\u0027Database %(dbs)s specified for user does \u0027"},{"line_number":389,"context_line":"                         \u0027not exist in databases for resource %(name)s\u0027)"},{"line_number":390,"context_line":"                       % {\u0027dbs\u0027: missing_db, \u0027name\u0027: self.name})"},{"line_number":391,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_eba6860f","line":389,"updated":"2014-06-03 09:45:49.000000000","message":"missed dot in the end of sentence.","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dc168529212f637e07284a50ff1396ed09393f8e","unresolved":false,"context_lines":[{"line_number":386,"context_line":""},{"line_number":387,"context_line":"            if missing_db:"},{"line_number":388,"context_line":"                msg \u003d (_(\u0027Database %(dbs)s specified for user does \u0027"},{"line_number":389,"context_line":"                         \u0027not exist in databases for resource %(name)s\u0027)"},{"line_number":390,"context_line":"                       % {\u0027dbs\u0027: missing_db, \u0027name\u0027: self.name})"},{"line_number":391,"context_line":"                raise exception.StackValidationFailed(message\u003dmsg)"},{"line_number":392,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_21a40fa5","line":389,"in_reply_to":"1ae5cdf2_eba6860f","updated":"2014-06-03 10:28:42.000000000","message":"Done","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"}],"heat/tests/test_os_database.py":[{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                {"},{"line_number":122,"context_line":"                    \u0027name\u0027: \u0027test\u0027,"},{"line_number":123,"context_line":"                }"},{"line_number":124,"context_line":"            ))"},{"line_number":125,"context_line":"        stack \u003d parser.Stack(None,"},{"line_number":126,"context_line":"                             stack_name,"},{"line_number":127,"context_line":"                             template,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u1g%3D","line":124,"updated":"2013-12-06 16:08:13.000000000","message":"If possible, I would remove that \"correct_setup\" parameter, as it\u0027s only used once. It needs to be renamed otherwise.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1059aaaebb1975e7bd7d924e786ca15d1352c28e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                {"},{"line_number":122,"context_line":"                    \u0027name\u0027: \u0027test\u0027,"},{"line_number":123,"context_line":"                }"},{"line_number":124,"context_line":"            ))"},{"line_number":125,"context_line":"        stack \u003d parser.Stack(None,"},{"line_number":126,"context_line":"                             stack_name,"},{"line_number":127,"context_line":"                             template,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uvs%3D","line":124,"in_reply_to":"AAAATn%2F9u1g%3D","updated":"2013-12-06 16:19:41.000000000","message":"would it be better to name it like: allow_incorrect_env ?","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                  availability_zone\u003dNone,"},{"line_number":167,"context_line":"                                  datastore\u003ddatastore_type,"},{"line_number":168,"context_line":"                                  datastore_version\u003ddatastore_version)."},{"line_number":169,"context_line":"         AndReturn(fake_dbinstance))"},{"line_number":170,"context_line":"        self.m.ReplayAll()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def pre_setup(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u08%3D","line":169,"updated":"2013-12-06 16:08:13.000000000","message":"Preferably written this way:\n\n          self.fc.instances.create(\u0027test\u0027, 1, volume\u003d{\u0027size\u0027: 30},\n                                   databases\u003ddatabases,\n                                   users\u003dusers,\n                                   restorePoint\u003dNone,\n                                   availability_zone\u003dNone,\n                                   datastore\u003ddatastore_type,\n                                   datastore_version\u003ddatastore_version\n          ).AndReturn(fake_dbinstance))","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1059aaaebb1975e7bd7d924e786ca15d1352c28e","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                                  availability_zone\u003dNone,"},{"line_number":167,"context_line":"                                  datastore\u003ddatastore_type,"},{"line_number":168,"context_line":"                                  datastore_version\u003ddatastore_version)."},{"line_number":169,"context_line":"         AndReturn(fake_dbinstance))"},{"line_number":170,"context_line":"        self.m.ReplayAll()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def pre_setup(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uwo%3D","line":169,"in_reply_to":"AAAATn%2F9u08%3D","updated":"2013-12-06 16:19:41.000000000","message":"Ok.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"f6d928df0fa9a50cd535c38e54f4ffa40ad243a1","unresolved":false,"context_lines":[{"line_number":169,"context_line":"         AndReturn(fake_dbinstance))"},{"line_number":170,"context_line":"        self.m.ReplayAll()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def pre_setup(self):"},{"line_number":173,"context_line":"        t \u003d template_format.parse(wp_template)"},{"line_number":174,"context_line":"        props \u003d t[\u0027Resources\u0027][\u0027MySqlCloudDB\u0027][\u0027Properties\u0027]"},{"line_number":175,"context_line":"        return t, props"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9u0k%3D","line":172,"updated":"2013-12-06 16:08:13.000000000","message":"Please come up with a better method name. Maybe get_template_and_properties?","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1059aaaebb1975e7bd7d924e786ca15d1352c28e","unresolved":false,"context_lines":[{"line_number":169,"context_line":"         AndReturn(fake_dbinstance))"},{"line_number":170,"context_line":"        self.m.ReplayAll()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def pre_setup(self):"},{"line_number":173,"context_line":"        t \u003d template_format.parse(wp_template)"},{"line_number":174,"context_line":"        props \u003d t[\u0027Resources\u0027][\u0027MySqlCloudDB\u0027][\u0027Properties\u0027]"},{"line_number":175,"context_line":"        return t, props"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9uwg%3D","line":172,"in_reply_to":"AAAATn%2F9u0k%3D","updated":"2013-12-06 16:19:41.000000000","message":"Ok.","commit_id":"c9550fb60683a459dbbed22c020bfe32182bc86b"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9c19dfe04525579c384ff66afb164e5345a3205f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"  \"AWSTemplateFormatVersion\" : \"2010-09-09\","},{"line_number":30,"context_line":"  \"Description\" : \"MySQL instance running on openstack DBaaS cloud\","},{"line_number":31,"context_line":"  \"Parameters\" : {"},{"line_number":32,"context_line":"    \"datastore_type\": {"},{"line_number":33,"context_line":"      \"Description\" : \"Datastore type\","},{"line_number":34,"context_line":"      \"Type\": \"String\""},{"line_number":35,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9uHI%3D","line":32,"updated":"2013-12-06 19:05:06.000000000","message":"No need to add these as parameters if you\u0027re going to set values explicitly in lines 60-61.","commit_id":"5087b638cc886bff3b42f63c786ff33c9e069d6e"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9c19dfe04525579c384ff66afb164e5345a3205f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        stack_name \u003d \u0027%s_stack\u0027 % name"},{"line_number":109,"context_line":"        t \u003d parsed_t"},{"line_number":110,"context_line":"        template \u003d parser.Template(t)"},{"line_number":111,"context_line":"        env \u003d (environment.Environment("},{"line_number":112,"context_line":"            {"},{"line_number":113,"context_line":"                \u0027name\u0027: \u0027test\u0027,"},{"line_number":114,"context_line":"                \u0027datastore_type\u0027: \u0027MySQL\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9uG0%3D","line":111,"updated":"2013-12-06 19:05:06.000000000","message":"Per comment line 32: This can be reverted to the original code since you don\u0027t need to pass these as parameters.","commit_id":"5087b638cc886bff3b42f63c786ff33c9e069d6e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\"flavor\": {"},{"line_number":43,"context_line":"    \"Description\" : \"Flavor reference\","},{"line_number":44,"context_line":"    \"Type\": \"String\","},{"line_number":45,"context_line":"    \"Default\": \u00271GB\u0027"},{"line_number":46,"context_line":"},"},{"line_number":47,"context_line":"\"size\": {"},{"line_number":48,"context_line":"    \"Description\" : \"The volume size\","}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7hE%3D","line":45,"updated":"2014-04-08 12:54:16.000000000","message":"Is it really reference on Flavor? or may be size?","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\"flavor\": {"},{"line_number":43,"context_line":"    \"Description\" : \"Flavor reference\","},{"line_number":44,"context_line":"    \"Type\": \"String\","},{"line_number":45,"context_line":"    \"Default\": \u00271GB\u0027"},{"line_number":46,"context_line":"},"},{"line_number":47,"context_line":"\"size\": {"},{"line_number":48,"context_line":"    \"Description\" : \"The volume size\","}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2Fza0%3D","line":45,"in_reply_to":"AAAAWn%2F%2F7hE%3D","updated":"2014-04-10 10:09:28.000000000","message":"I will change it to something less confusing","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ec5472c8a9fddb1fd7d77e696d75be7e53ed9f39","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        self.m.ReplayAll()"},{"line_number":402,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":403,"context_line":"                               instance.validate)"},{"line_number":404,"context_line":"        expected_msg \u003d _(\"Property %s not assigned\") % \u0027datastore_type\u0027"},{"line_number":405,"context_line":"        self.assertIn(expected_msg, str(ex))"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAWn%2F%2F7cM%3D","line":404,"updated":"2014-04-08 12:54:16.000000000","message":"why did not you use  _(\"Property datastore_type not assigned\") without substitution ?","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"9e08f8ca696e7c5c25a1de48175fd43f4c7d7b2b","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        self.m.ReplayAll()"},{"line_number":402,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":403,"context_line":"                               instance.validate)"},{"line_number":404,"context_line":"        expected_msg \u003d _(\"Property %s not assigned\") % \u0027datastore_type\u0027"},{"line_number":405,"context_line":"        self.assertIn(expected_msg, str(ex))"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAW3%2F%2FzbI%3D","line":404,"in_reply_to":"AAAAWn%2F%2F7cM%3D","updated":"2014-04-10 10:09:28.000000000","message":"this is for i18n to work - \u0027datastore_type\u0027 should not be translated, but everything else should","commit_id":"bdff0214bda0e09a0a9b565e4807e717ed55dfb0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"afe8ec87fe2f7ea5a79fec937ebbf978c72488f3","unresolved":false,"context_lines":[{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def test_osdatabase_prop_validation_success(self):"},{"line_number":357,"context_line":"        t \u003d template_format.parse(self.template)"},{"line_number":358,"context_line":"        test_env \u003d {"},{"line_number":359,"context_line":"            \u0027name\u0027: \u0027test\u0027,"},{"line_number":360,"context_line":"            \u0027datastore_type\u0027: \u0027mysql\u0027,"},{"line_number":361,"context_line":"            \u0027datastore_version\u0027: \u0027MariaDB-5.5\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FXJA%3D","line":358,"updated":"2014-04-15 06:44:37.000000000","message":"This variable is used in some tests without changes how about to move it in setUp. It will help to remove redundant code.","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6025cec6f53478929b185e2e84d5c9438a93e408","unresolved":false,"context_lines":[{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def test_osdatabase_prop_validation_success(self):"},{"line_number":357,"context_line":"        t \u003d template_format.parse(self.template)"},{"line_number":358,"context_line":"        test_env \u003d {"},{"line_number":359,"context_line":"            \u0027name\u0027: \u0027test\u0027,"},{"line_number":360,"context_line":"            \u0027datastore_type\u0027: \u0027mysql\u0027,"},{"line_number":361,"context_line":"            \u0027datastore_version\u0027: \u0027MariaDB-5.5\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FWwk%3D","line":358,"in_reply_to":"AAAAW3%2F%2FXJA%3D","updated":"2014-04-15 08:06:39.000000000","message":"good catch. It is actually defined in _setup_test_clouddbinstance as default, so I will leave only those where test_env is not the same as in this method (only 3 tests).","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"afe8ec87fe2f7ea5a79fec937ebbf978c72488f3","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":408,"context_line":"                               instance.validate)"},{"line_number":409,"context_line":"        exp_msg \u003d \"Not allowed - datastore_version without datastore_type\""},{"line_number":410,"context_line":"        self.assertEqual(exp_msg, str(ex))"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FXKg%3D","line":409,"updated":"2014-04-15 06:44:37.000000000","message":"Could you explain, why you use some expected messages with translating line 456 and other without like this ?","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6025cec6f53478929b185e2e84d5c9438a93e408","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":408,"context_line":"                               instance.validate)"},{"line_number":409,"context_line":"        exp_msg \u003d \"Not allowed - datastore_version without datastore_type\""},{"line_number":410,"context_line":"        self.assertEqual(exp_msg, str(ex))"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FWvE%3D","line":409,"in_reply_to":"AAAAW3%2F%2FXKg%3D","updated":"2014-04-15 08:06:39.000000000","message":"There is Liang\u0027s patch in the queue that enables lazy translation in heat, but not while running tests, and I asked on IRC, so I will remove the i18n from everywhere now.","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"afe8ec87fe2f7ea5a79fec937ebbf978c72488f3","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        self._stubout_validate(instance)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        ret \u003d instance.validate()"},{"line_number":423,"context_line":"        self.assertIsNone(ret)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def test_osdatabase_prop_validation_wrong_dsversion(self):"},{"line_number":426,"context_line":"        t \u003d template_format.parse(self.template)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FXKw%3D","line":423,"updated":"2014-04-15 06:44:37.000000000","message":"Enough:\nself.assertIsNone(instance.validate())","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"6025cec6f53478929b185e2e84d5c9438a93e408","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        self._stubout_validate(instance)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        ret \u003d instance.validate()"},{"line_number":423,"context_line":"        self.assertIsNone(ret)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def test_osdatabase_prop_validation_wrong_dsversion(self):"},{"line_number":426,"context_line":"        t \u003d template_format.parse(self.template)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAW3%2F%2FWsQ%3D","line":423,"in_reply_to":"AAAAW3%2F%2FXKw%3D","updated":"2014-04-15 08:06:39.000000000","message":"Done","commit_id":"bb1ce8fe1a93b35d43cb2dc1ece88377733fca62"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class FakeDBInstance(object):"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, modify\u003dFalse):"},{"line_number":93,"context_line":"        self.id \u003d 12345"},{"line_number":94,"context_line":"        self.hostname \u003d \"testhost\""},{"line_number":95,"context_line":"        self.links \u003d ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVYg%3D","line":92,"updated":"2014-04-15 10:15:21.000000000","message":"\u0027modify\u0027 is never used in tests. I think that you could remove it and define \nself.datastore_type and self.datastore_version without conditions.","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class FakeDBInstance(object):"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, modify\u003dFalse):"},{"line_number":93,"context_line":"        self.id \u003d 12345"},{"line_number":94,"context_line":"        self.hostname \u003d \"testhost\""},{"line_number":95,"context_line":"        self.links \u003d ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUuQ%3D","line":92,"in_reply_to":"AAAAW3%2F%2FVYg%3D","updated":"2014-04-15 11:29:40.000000000","message":"Done","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        self.m.StubOutWithMock(self.fc, \u0027datastore_versions\u0027)"},{"line_number":132,"context_line":"        self.fc.datastore_versions \u003d self.m.CreateMockAnything()"},{"line_number":133,"context_line":"        self.template \u003d (template % {\u0027params\u0027: test_parameters,"},{"line_number":134,"context_line":"                                     \u0027props\u0027: test_properties})"},{"line_number":135,"context_line":"        utils.setup_dummy_db()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.addCleanup(self.m.VerifyAll)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVW0%3D","line":134,"updated":"2014-04-15 10:15:21.000000000","message":"There are a lot of places with:\ntemplate_format.parse(self.template).\nCould you move it in setUp too?","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        self.m.StubOutWithMock(self.fc, \u0027datastore_versions\u0027)"},{"line_number":132,"context_line":"        self.fc.datastore_versions \u003d self.m.CreateMockAnything()"},{"line_number":133,"context_line":"        self.template \u003d (template % {\u0027params\u0027: test_parameters,"},{"line_number":134,"context_line":"                                     \u0027props\u0027: test_properties})"},{"line_number":135,"context_line":"        utils.setup_dummy_db()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.addCleanup(self.m.VerifyAll)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUm8%3D","line":134,"in_reply_to":"AAAAW3%2F%2FVW0%3D","updated":"2014-04-15 11:29:40.000000000","message":"Done","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.m.StubOutWithMock(instance, \u0027trove\u0027)"},{"line_number":162,"context_line":"        instance.trove().MultipleTimes().AndReturn(self.fc)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _stubout_create(self, instance, fake_dbinstance, modified\u003dFalse):"},{"line_number":165,"context_line":"        self._stubout_trove(instance)"},{"line_number":166,"context_line":"        self.m.StubOutWithMock(nova_utils, \u0027get_flavor_id\u0027)"},{"line_number":167,"context_line":"        nova_utils.get_flavor_id(self.fc, instance.properties[\u0027flavor\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVd0%3D","line":164,"updated":"2014-04-15 10:15:21.000000000","message":"Looks like you never use this option in tests.\nMay be remove it and define users and databases without conditions.?","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.m.StubOutWithMock(instance, \u0027trove\u0027)"},{"line_number":162,"context_line":"        instance.trove().MultipleTimes().AndReturn(self.fc)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _stubout_create(self, instance, fake_dbinstance, modified\u003dFalse):"},{"line_number":165,"context_line":"        self._stubout_trove(instance)"},{"line_number":166,"context_line":"        self.m.StubOutWithMock(nova_utils, \u0027get_flavor_id\u0027)"},{"line_number":167,"context_line":"        nova_utils.get_flavor_id(self.fc, instance.properties[\u0027flavor\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUuA%3D","line":164,"in_reply_to":"AAAAW3%2F%2FVd0%3D","updated":"2014-04-15 11:29:40.000000000","message":"Done","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":433,"context_line":"        t \u003d template_format.parse(self.template)"},{"line_number":434,"context_line":"        t[\u0027Resources\u0027][\u0027MySqlCloudDB\u0027][\u0027Properties\u0027]["},{"line_number":435,"context_line":"            \u0027datastore_version\u0027] \u003d None"},{"line_number":436,"context_line":"        instance \u003d self._setup_test_clouddbinstance(\u0027dbinstance_test\u0027, t)"},{"line_number":437,"context_line":"        self._stubout_trove(instance)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVbQ%3D","line":434,"updated":"2014-04-15 10:15:21.000000000","message":"how about ?\n\ndel t[\u0027Resources\u0027][\u0027MySqlCloudDB\u0027][\u0027Properties\u0027][\u0027datastore_version\u0027]","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":433,"context_line":"        t \u003d template_format.parse(self.template)"},{"line_number":434,"context_line":"        t[\u0027Resources\u0027][\u0027MySqlCloudDB\u0027][\u0027Properties\u0027]["},{"line_number":435,"context_line":"            \u0027datastore_version\u0027] \u003d None"},{"line_number":436,"context_line":"        instance \u003d self._setup_test_clouddbinstance(\u0027dbinstance_test\u0027, t)"},{"line_number":437,"context_line":"        self._stubout_trove(instance)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUtA%3D","line":434,"in_reply_to":"AAAAW3%2F%2FVbQ%3D","updated":"2014-04-15 11:29:40.000000000","message":"Done","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"5c1b436fc4fc768ede0938ac99816619efc912c5","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        self._stubout_trove(instance)"},{"line_number":438,"context_line":"        self.fc.datastore_versions.list("},{"line_number":439,"context_line":"            instance.properties[\u0027datastore_type\u0027]"},{"line_number":440,"context_line":"        ).AndReturn([FakeVersion(\u0027MariaDB-5.5\u0027), FakeVersion(\u0027MariaDB-5.0\u0027)])"},{"line_number":441,"context_line":"        self.m.ReplayAll()"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FVc8%3D","line":440,"updated":"2014-04-15 10:15:21.000000000","message":"You could use default value here:\nFakeVersion()","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"4553ec13f31bf68d278236a33d009611fc7d7a9e","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        self._stubout_trove(instance)"},{"line_number":438,"context_line":"        self.fc.datastore_versions.list("},{"line_number":439,"context_line":"            instance.properties[\u0027datastore_type\u0027]"},{"line_number":440,"context_line":"        ).AndReturn([FakeVersion(\u0027MariaDB-5.5\u0027), FakeVersion(\u0027MariaDB-5.0\u0027)])"},{"line_number":441,"context_line":"        self.m.ReplayAll()"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAW3%2F%2FUs0%3D","line":440,"in_reply_to":"AAAAW3%2F%2FVc8%3D","updated":"2014-04-15 11:29:40.000000000","message":"Done","commit_id":"44fb24ae32f8e3dffbd6773563bb407e57d0fb53"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7ee32f332bf501c3e947daab5c63d66ab0aa1a85","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":342,"context_line":"                               instance.validate)"},{"line_number":343,"context_line":"        exp_msg \u003d \"Not allowed - datastore_version without datastore_type\""},{"line_number":344,"context_line":"        self.assertEqual(exp_msg, str(ex))"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"},{"line_number":347,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_6b919698","line":344,"updated":"2014-06-03 09:45:49.000000000","message":"please use six.text_type","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dc168529212f637e07284a50ff1396ed09393f8e","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        ex \u003d self.assertRaises(exception.StackValidationFailed,"},{"line_number":342,"context_line":"                               instance.validate)"},{"line_number":343,"context_line":"        exp_msg \u003d \"Not allowed - datastore_version without datastore_type\""},{"line_number":344,"context_line":"        self.assertEqual(exp_msg, str(ex))"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_osdatabase_prop_validation_no_dsversion(self):"},{"line_number":347,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_61ae1787","line":344,"in_reply_to":"1ae5cdf2_6b919698","updated":"2014-06-03 10:28:42.000000000","message":"Done","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7ee32f332bf501c3e947daab5c63d66ab0aa1a85","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        expected_msg \u003d (\"Datastore version SomeVersion for datastore type \""},{"line_number":368,"context_line":"                        \"mysql is not valid. \""},{"line_number":369,"context_line":"                        \"Allowed versions are MariaDB-5.5.\")"},{"line_number":370,"context_line":"        self.assertEqual(expected_msg, str(ex))"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":373,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_ebf4c6f3","line":370,"updated":"2014-06-03 09:45:49.000000000","message":"please use six.text_type","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dc168529212f637e07284a50ff1396ed09393f8e","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        expected_msg \u003d (\"Datastore version SomeVersion for datastore type \""},{"line_number":368,"context_line":"                        \"mysql is not valid. \""},{"line_number":369,"context_line":"                        \"Allowed versions are MariaDB-5.5.\")"},{"line_number":370,"context_line":"        self.assertEqual(expected_msg, str(ex))"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":373,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_81a9637d","line":370,"in_reply_to":"1ae5cdf2_ebf4c6f3","updated":"2014-06-03 10:28:42.000000000","message":"Done","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"7ee32f332bf501c3e947daab5c63d66ab0aa1a85","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                        \"datastore type mysql. \""},{"line_number":391,"context_line":"                        \"Explicit datastore version must be provided. \""},{"line_number":392,"context_line":"                        \"Allowed versions are MariaDB-5.5, MariaDB-5.0.\")"},{"line_number":393,"context_line":"        self.assertEqual(expected_msg, str(ex))"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_eb7da66f","line":393,"updated":"2014-06-03 09:45:49.000000000","message":"please use six.text_type","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"dc168529212f637e07284a50ff1396ed09393f8e","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                        \"datastore type mysql. \""},{"line_number":391,"context_line":"                        \"Explicit datastore version must be provided. \""},{"line_number":392,"context_line":"                        \"Allowed versions are MariaDB-5.5, MariaDB-5.0.\")"},{"line_number":393,"context_line":"        self.assertEqual(expected_msg, str(ex))"}],"source_content_type":"text/x-python","patch_set":23,"id":"1ae5cdf2_c1ba8bbf","line":393,"in_reply_to":"1ae5cdf2_eb7da66f","updated":"2014-06-03 10:28:42.000000000","message":"Done","commit_id":"01a7ce4fbb4cb0b5a43a1e5bcd07caea2c2871c2"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"94d6b0e27702a491e50822831dde76b014ab10ba","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        expected_msg \u003d (\"Datastore version SomeVersion for datastore type \""},{"line_number":370,"context_line":"                        \"mysql is not valid. \""},{"line_number":371,"context_line":"                        \"Allowed versions are MariaDB-5.5.\")"},{"line_number":372,"context_line":"        self.assertEqual(expected_msg, six.text_type(ex))"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":375,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":28,"id":"baada198_a3e3baa2","line":372,"updated":"2014-07-03 17:29:44.000000000","message":"All of these tests are missing calls to self.m.VerifyAll()?","commit_id":"b36c97ecb17cd243e89c9820b1b9a02eb8dee8df"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"7530abe2a4f308bf52dd754c2893c9e03519d1e2","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        expected_msg \u003d (\"Datastore version SomeVersion for datastore type \""},{"line_number":370,"context_line":"                        \"mysql is not valid. \""},{"line_number":371,"context_line":"                        \"Allowed versions are MariaDB-5.5.\")"},{"line_number":372,"context_line":"        self.assertEqual(expected_msg, six.text_type(ex))"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def test_osdatabase_prop_validation_implicit_version_fail(self):"},{"line_number":375,"context_line":"        t \u003d template_format.parse(db_template)"}],"source_content_type":"text/x-python","patch_set":28,"id":"baada198_440acf79","line":372,"in_reply_to":"baada198_a3e3baa2","updated":"2014-07-04 09:12:33.000000000","message":"Done","commit_id":"b36c97ecb17cd243e89c9820b1b9a02eb8dee8df"}]}
