)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ae880633be9122565b94f3dfb8412ca61de184da","unresolved":false,"context_lines":[{"line_number":16,"context_line":"6. removed strategy from api calls"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I12d09fd70ab028da1cd2818fe380310e99b66d2d"},{"line_number":19,"context_line":"Implements: blueprint upgrade-guestagent"},{"line_number":20,"context_line":"Closes-Bug: #1211924"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"AAAAXH%2F%2FDBM%3D","line":19,"updated":"2014-04-24 11:53:31.000000000","message":"Only one type(!!!) of change is allowed, but not both!\n\nPlease choose which one to leave and which one to drop","commit_id":"76df30756da0405121368d24ab06f10c10f8f7c1"}],"trove/common/apischema.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"51477f2393b16b4ca9a82324c4a06aa7634a50e5","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        \"required\": [\"instance_id\","},{"line_number":444,"context_line":"                     \"instance_version\","},{"line_number":445,"context_line":"                     \"strategy\","},{"line_number":446,"context_line":"                     \"location\"],"},{"line_number":447,"context_line":"        \"properties\": {"},{"line_number":448,"context_line":"            \"instance_id\": uuid,"},{"line_number":449,"context_line":"            \"instance_version\": non_empty_string,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2BbLQ%3D","line":446,"updated":"2014-03-26 21:17:06.000000000","message":"One thing to consider is whether you want to allow additional properties and to explicitly call it out.","commit_id":"8ff487ea3d7824482b59a3ccc7ea15b27372ab98"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"7acc984749e79604a7dd481bf5febf5d6a0be3c2","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        \"required\": [\"instance_id\","},{"line_number":444,"context_line":"                     \"instance_version\","},{"line_number":445,"context_line":"                     \"strategy\","},{"line_number":446,"context_line":"                     \"location\"],"},{"line_number":447,"context_line":"        \"properties\": {"},{"line_number":448,"context_line":"            \"instance_id\": uuid,"},{"line_number":449,"context_line":"            \"instance_version\": non_empty_string,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2BbHQ%3D","line":446,"in_reply_to":"AAAAWH%2F%2BbLQ%3D","updated":"2014-03-26 21:28:31.000000000","message":"I was considering adding \"additionalProperties\": True\nI\u0027m talking with Ops to see what they may or may not want but it wouldn\u0027t hurt.","commit_id":"8ff487ea3d7824482b59a3ccc7ea15b27372ab98"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c1d9229f3a15d033ae211ab99fad77a7d9a19bb3","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            \"location\": non_empty_string,"},{"line_number":453,"context_line":"            \"metadata\": {}"},{"line_number":454,"context_line":"        }"},{"line_number":455,"context_line":"    }"},{"line_number":456,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FwuU%3D","line":455,"updated":"2014-04-10 15:41:23.000000000","message":"what if it will look like previous examples:\n\nupgrade \u003d {\n\t\t\t    \"create\": {\n\t\t\t        \"type\": \"object\",\n\t\t\t        \"required\": [\"upgrade\"],\n\t\t\t        \"additionalProperties\": True,\n\t\t\t        \"properties\": {\n\t\t\t            \"upgrade\":\n\t\t\t                \"instance_id\": uuid,\n\t\t\t                \"instance_version\": non_empty_string,\n\t\t\t                \"strategy\": non_empty_string,\n\t\t\t                \"location\": non_empty_string,\n\t\t\t                \"metadata\": {}\n\t\t\t        }\n\t\t\t    }","commit_id":"641670dcd2fc30af254e6c64677653f8e8b015ba"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"77e115bbfa6edc442344afc1bd606cee9ce33962","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            \"location\": non_empty_string,"},{"line_number":453,"context_line":"            \"metadata\": {}"},{"line_number":454,"context_line":"        }"},{"line_number":455,"context_line":"    }"},{"line_number":456,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FwRM%3D","line":455,"in_reply_to":"AAAAW3%2F%2FwuU%3D","updated":"2014-04-10 15:57:26.000000000","message":"I was thinking about this also.  I left it this way because it looked weird to have a root element upgrade \u003d\u003e properties \u003d\u003e upgrade.\n\nI\u0027ll consider this some more though.","commit_id":"641670dcd2fc30af254e6c64677653f8e8b015ba"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"6f841187289232a6936b30b34183a8e0c4797393","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                    \"instance_id\": uuid,"},{"line_number":455,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":456,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":457,"context_line":"                    \"location\": non_empty_string,"},{"line_number":458,"context_line":"                    \"metadata\": {}"},{"line_number":459,"context_line":"                }"},{"line_number":460,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2Fwqk%3D","line":457,"updated":"2014-04-17 16:41:54.000000000","message":"\"location\": url_ref","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"4d3f767e5144d334a999d6f63cc7d5121bfaaede","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                    \"instance_id\": uuid,"},{"line_number":455,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":456,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":457,"context_line":"                    \"location\": non_empty_string,"},{"line_number":458,"context_line":"                    \"metadata\": {}"},{"line_number":459,"context_line":"                }"},{"line_number":460,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FuTs%3D","line":457,"in_reply_to":"AAAAXH%2F%2FwNE%3D","updated":"2014-04-17 22:12:00.000000000","message":"A deployer may choose to push out a package to each guest agent.  Effectively \u0027staging\u0027 the new package for install.\n\nIn this scenario the artifact or package may already be local to the guest instance.  Pip install would just need to know where the file lives on disk.\n\nFurthermore, that regexp for url_ref only allows for http[s].\nWhat if I choose ftp?  I\u0027d rather not restrict the location to http at this point.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"14dc1fc9b7ad2df484d127da93557f384f2f42bc","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                    \"instance_id\": uuid,"},{"line_number":455,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":456,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":457,"context_line":"                    \"location\": non_empty_string,"},{"line_number":458,"context_line":"                    \"metadata\": {}"},{"line_number":459,"context_line":"                }"},{"line_number":460,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FwNE%3D","line":457,"in_reply_to":"AAAAXH%2F%2Fwaw%3D","updated":"2014-04-17 17:41:33.000000000","message":"Please give me the case when it\u0027s being something else than UR?","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"16bad18fd67522eeef9ebfb2e814ce694a9fc313","unresolved":false,"context_lines":[{"line_number":454,"context_line":"                    \"instance_id\": uuid,"},{"line_number":455,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":456,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":457,"context_line":"                    \"location\": non_empty_string,"},{"line_number":458,"context_line":"                    \"metadata\": {}"},{"line_number":459,"context_line":"                }"},{"line_number":460,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2Fwaw%3D","line":457,"in_reply_to":"AAAAXH%2F%2Fwqk%3D","updated":"2014-04-17 17:16:36.000000000","message":"It might not always be a url_ref.  There are cases where we will just point to a location on disk.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"8bdfee0903a1bfead588418059c16b0c9440d3e3","unresolved":false,"context_lines":[{"line_number":451,"context_line":"                \"additionalProperties\": True,"},{"line_number":452,"context_line":"                \"properties\": {"},{"line_number":453,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":454,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":455,"context_line":"                    \"location\": non_empty_string,"},{"line_number":456,"context_line":"                    \"metadata\": {}"},{"line_number":457,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXH%2F%2FPsM%3D","line":454,"updated":"2014-04-23 03:07:57.000000000","message":"It seems that the strategy is defined by a CONF value according to: https://review.openstack.org/#/c/85225/16/trove/guestagent/upgrade/upgradeagent.py\n\nWhat\u0027s the reason for passing it in as an API argument?","commit_id":"368c46e127591c1cb9729f9f6e23c6684ad33a32"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"e5b53bd15266cff7680a536a1cd11acfc3a80eb3","unresolved":false,"context_lines":[{"line_number":451,"context_line":"                \"additionalProperties\": True,"},{"line_number":452,"context_line":"                \"properties\": {"},{"line_number":453,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":454,"context_line":"                    \"strategy\": non_empty_string,"},{"line_number":455,"context_line":"                    \"location\": non_empty_string,"},{"line_number":456,"context_line":"                    \"metadata\": {}"},{"line_number":457,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXH%2F%2FKlg%3D","line":454,"in_reply_to":"AAAAXH%2F%2FPsM%3D","updated":"2014-04-23 15:46:51.000000000","message":"Done","commit_id":"368c46e127591c1cb9729f9f6e23c6684ad33a32"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"d0bb6dd6c952ba82f36b6f029025f0da5d19b115","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"},{"line_number":453,"context_line":"                    \"metadata\": {}"},{"line_number":454,"context_line":"                }"},{"line_number":455,"context_line":"            }"},{"line_number":456,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":23,"id":"facab960_08908beb","line":453,"updated":"2014-04-28 21:39:16.000000000","message":"I am not sure what this is supposed to do. there should be a type specified here","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"5317b4c1e764aece0a5d76e39e9ed4c12f4425ba","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"},{"line_number":453,"context_line":"                    \"metadata\": {}"},{"line_number":454,"context_line":"                }"},{"line_number":455,"context_line":"            }"},{"line_number":456,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":23,"id":"facab960_0b2c05ab","line":453,"in_reply_to":"facab960_08908beb","updated":"2014-04-28 22:39:22.000000000","message":"metadata is meant to be generic to provide the details that strategy will know how to deal with.","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"},{"author":{"_account_id":11316,"name":"Steve Leon","email":"kokhang@gmail.com","username":"kokhang"},"change_message_id":"50d80a646ab4a721915b3f97fbe6d952565ae55e","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                \"additionalProperties\": True,"},{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"},{"line_number":453,"context_line":"                    \"metadata\": {}"},{"line_number":454,"context_line":"                }"},{"line_number":455,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":29,"id":"7adec928_d46f3d29","line":452,"range":{"start_line":452,"start_character":21,"end_line":452,"end_character":29},"updated":"2014-05-19 20:40:13.000000000","message":"Should the \u0027location\u0027 type be \u0027url_ref\u0027 instead? From the BP, it seems that this would be a url","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"9c74391bc9b43ee42841e1d255393c5b8b1ce403","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                \"additionalProperties\": True,"},{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"},{"line_number":453,"context_line":"                    \"metadata\": {}"},{"line_number":454,"context_line":"                }"},{"line_number":455,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":29,"id":"3ae8d1ca_dbf2c199","line":452,"range":{"start_line":452,"start_character":21,"end_line":452,"end_character":29},"in_reply_to":"7adec928_d46f3d29","updated":"2014-05-28 07:56:43.000000000","message":"Agreed","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"d825e1b71075457aacd3fbc8c5f25bcf3ef64ab5","unresolved":false,"context_lines":[{"line_number":449,"context_line":"                \"additionalProperties\": True,"},{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"},{"line_number":453,"context_line":"                    \"metadata\": {}"},{"line_number":454,"context_line":"                }"},{"line_number":455,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":29,"id":"3ae8d1ca_7e834656","line":452,"in_reply_to":"7adec928_d46f3d29","updated":"2014-05-28 17:46:18.000000000","message":"I have already discussed this with Denis M.  The url_ref is too strict for what we are trying to build here.\n\nIf you look at the regexp it only allows http[s].  I\u0027m trying to keep things more generic.","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"59dac074fcd759a2a72a92a09263f50008c6327f","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            \"upgrade\": {"},{"line_number":447,"context_line":"                \"type\": \"object\","},{"line_number":448,"context_line":"                \"required\": [],"},{"line_number":449,"context_line":"                \"additionalProperties\": True,"},{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_3342e568","line":449,"updated":"2014-06-24 12:31:37.000000000","message":"According to following code, instance_version and location are required attributes, but here they\u0027re mentioned as non-required.\nWe need to be consistent.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"5f35d533f8c1f71f77206d94b14a6ef662efcc13","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            \"upgrade\": {"},{"line_number":447,"context_line":"                \"type\": \"object\","},{"line_number":448,"context_line":"                \"required\": [],"},{"line_number":449,"context_line":"                \"additionalProperties\": True,"},{"line_number":450,"context_line":"                \"properties\": {"},{"line_number":451,"context_line":"                    \"instance_version\": non_empty_string,"},{"line_number":452,"context_line":"                    \"location\": non_empty_string,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_33b74023","line":449,"in_reply_to":"1ae5cdf2_3342e568","updated":"2014-06-24 14:13:03.000000000","message":"Hey Denis, I know this looks a bit odd but there was a need to keep this generic because not everyone will use the instance_version and location.\n\nThey actually are not required but if they are provided we just check that they are not valid strings.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"}],"trove/extensions/mgmt/upgrade/models.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"d0bb6dd6c952ba82f36b6f029025f0da5d19b115","unresolved":false,"context_lines":[{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d cls.validate(instance_id, 36)"},{"line_number":30,"context_line":"        instance_version \u003d cls.validate(instance_version, 255)"},{"line_number":31,"context_line":"        location \u003d cls.validate(location, 255)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        def _create_resources():"}],"source_content_type":"text/x-python","patch_set":23,"id":"facab960_28bc6f6c","line":30,"updated":"2014-04-28 21:39:16.000000000","message":"the validation in the json schema does not specify length yet there is validation here.  Suggest moving validation to json schema","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"5317b4c1e764aece0a5d76e39e9ed4c12f4425ba","unresolved":false,"context_lines":[{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d cls.validate(instance_id, 36)"},{"line_number":30,"context_line":"        instance_version \u003d cls.validate(instance_version, 255)"},{"line_number":31,"context_line":"        location \u003d cls.validate(location, 255)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        def _create_resources():"}],"source_content_type":"text/x-python","patch_set":23,"id":"facab960_96259cad","line":30,"in_reply_to":"facab960_28bc6f6c","updated":"2014-04-28 22:39:22.000000000","message":"The validation above is meant to be here to provide a check before the database column lengths are exceeded.\n\nHaving validation at the API level would be nice too but if the code is called from elsewhere in the code it would still get validated right?","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"11cc1eaa77b3d92f47b5a388318c317ec2566a8f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d cls.validate(instance_id, 36)"},{"line_number":30,"context_line":"        instance_version \u003d cls.validate(instance_version, 255)"},{"line_number":31,"context_line":"        location \u003d cls.validate(location, 255)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        def _create_resources():"}],"source_content_type":"text/x-python","patch_set":23,"id":"9ad9bd40_49551ec5","line":30,"in_reply_to":"facab960_96259cad","updated":"2014-04-30 18:52:17.000000000","message":"no the validation only works for paths that go through the api layer.  however if there are validations on the messages shouldn\u0027t they also be in the api schema?","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"},{"author":{"_account_id":5390,"name":"Steve Leon","username":"steve-leon","inactive":true},"change_message_id":"30033b22a3da126934d18f32b2d7a737d37c3642","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from trove.guestagent import api"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class UpgradeNotification(object):"}],"source_content_type":"text/x-python","patch_set":26,"id":"bad4c104_00e4e639","line":16,"updated":"2014-04-29 00:51:27.000000000","message":"Instead of directly importing the guestagent API, use the remote.create_guest_client. It does the same as what you are doing but having it accessed it from remote keeps it centralized.","commit_id":"41deb304d8d5ed2f7cbbaabf6e6a677def05d5c0"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"ca169217f66e1d134d56f300c4ef3fbd4bcdde56","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def create(context, instance_id, instance_version, location,"},{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d UpgradeNotification._validate(instance_id, 36)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        if instance_version:"},{"line_number":32,"context_line":"            instance_version \u003d UpgradeNotification._validate("}],"source_content_type":"text/x-python","patch_set":29,"id":"9ad9bd40_3ec15c54","line":29,"updated":"2014-05-06 22:59:16.000000000","message":"I would echo Justin\u0027s comments on Patchset 23.  If there is a need to validate here, why not also perform the same validation in the json schema?\n\nAnd if you do that validation there.. doesn\u0027t this validation just become redundant since the values are being copied from the request body to the guest message?","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"db099790d9d243bceaca0e4b9cab551b1fe00372","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def create(context, instance_id, instance_version, location,"},{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d UpgradeNotification._validate(instance_id, 36)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        if instance_version:"},{"line_number":32,"context_line":"            instance_version \u003d UpgradeNotification._validate("}],"source_content_type":"text/x-python","patch_set":29,"id":"9ad9bd40_46b7363a","line":29,"in_reply_to":"9ad9bd40_3906d61d","updated":"2014-05-07 04:54:07.000000000","message":"So after some poking around it appears that is already happens.\n\nnon_empty_string \u003d {\n    \"type\": \"string\",\n    \"minLength\": 1,\n    \"maxLength\": 255,\n    \"pattern\": \"^.*[0-9a-zA-Z]+.*$\"\n}\n\n\nupgrade \u003d {\n\n...\n\n\"properties\": {\n                    \"instance_version\": non_empty_string,\n                    \"location\": non_empty_string,\n...\n\n}\n\n\nInstance id, can\u0027t be validated using the apischema because you ask to have it moved into the URL instead of the POST body.","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"805b341c12dabca2224f514502caab25ae5c3e33","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def create(context, instance_id, instance_version, location,"},{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d UpgradeNotification._validate(instance_id, 36)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        if instance_version:"},{"line_number":32,"context_line":"            instance_version \u003d UpgradeNotification._validate("}],"source_content_type":"text/x-python","patch_set":29,"id":"9ad9bd40_3906d61d","line":29,"in_reply_to":"9ad9bd40_3ec15c54","updated":"2014-05-06 23:28:40.000000000","message":"k, after our discussion, we will add the length restrictions to the API schema to appease everyone.\n\nWe\u0027ll leave the validation here to avoid issues where another method may one day call create directly.","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"d5fe8fce594d939ba5f4ef6f25aab5cc7ca5be1a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def create(context, instance_id, instance_version, location,"},{"line_number":27,"context_line":"               metadata\u003dNone):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        instance_id \u003d UpgradeNotification._validate(instance_id, 36)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        if instance_version:"},{"line_number":32,"context_line":"            instance_version \u003d UpgradeNotification._validate("}],"source_content_type":"text/x-python","patch_set":29,"id":"9ad9bd40_064d2e3e","line":29,"in_reply_to":"9ad9bd40_46b7363a","updated":"2014-05-07 05:02:52.000000000","message":"Ah ok.  Thanks for the clarification.","commit_id":"0b17cce187999198dc4f890c04987139fe252f42"}],"trove/extensions/mgmt/upgrade/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    @admin_context"},{"line_number":34,"context_line":"    def create(self, req, body, tenant_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(\"Sending upgrade notification\")"},{"line_number":37,"context_line":"        LOG.debug(\"Admin tenant_id: %s\" % tenant_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F49o%3D","line":36,"updated":"2014-04-08 17:43:02.000000000","message":"_()","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def create(self, req, body, tenant_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(\"Sending upgrade notification\")"},{"line_number":37,"context_line":"        LOG.debug(\"Admin tenant_id: %s\" % tenant_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F49k%3D","line":37,"updated":"2014-04-08 17:43:02.000000000","message":"_()","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        instance_id \u003d body.get(\u0027instance_id\u0027)"},{"line_number":42,"context_line":"        instance_version \u003d body.get(\u0027instance_version\u0027)"},{"line_number":43,"context_line":"        strategy \u003d body.get(\u0027strategy\u0027)"},{"line_number":44,"context_line":"        location \u003d body.get(\u0027location\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F49A%3D","line":41,"updated":"2014-04-08 17:43:02.000000000","message":"i think this attributes should be retrieved in the more restrict way, because they are required\n\nbody[key]","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"bcbba77273f98b0d282d4942960d819218da3efa","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    schemas \u003d apischema.upgrade"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @admin_context"},{"line_number":34,"context_line":"    def create(self, req, body, tenant_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAW3%2F%2FY0M%3D","line":34,"updated":"2014-04-14 23:12:53.000000000","message":"Seems like the more restful approach, since we\u0027re upgrading a instance at a time would be to extend the MgmtInstanceController.  A the upgrade path could look like /mgmt/instances/{id}/upgrade","commit_id":"7f5504354a50b234f229c390abe1559a189d73d8"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"b6622fd996d8aab3fbe888c3900a1b169d9719a0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    schemas \u003d apischema.upgrade"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @admin_context"},{"line_number":34,"context_line":"    def create(self, req, body, tenant_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAW3%2F%2FPKA%3D","line":34,"in_reply_to":"AAAAW3%2F%2FSgQ%3D","updated":"2014-04-15 21:15:49.000000000","message":"Sorry, i missed that in the original BP.  The issue i have with this URL is that it isn\u0027t clear that you\u0027re upgrading a instance resource.  If this URL actually upgraded all resources for a tenant, then it would make a lot more sense.","commit_id":"7f5504354a50b234f229c390abe1559a189d73d8"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"96d6fe4fa05ed8d6a20dfd02f63e1aa5edbc6ceb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    schemas \u003d apischema.upgrade"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @admin_context"},{"line_number":34,"context_line":"    def create(self, req, body, tenant_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAW3%2F%2FSgQ%3D","line":34,"in_reply_to":"AAAAW3%2F%2FY0M%3D","updated":"2014-04-15 14:52:51.000000000","message":"I prefer the simpler URL that is presented.  There is a blueprint and wiki page that accompanies this review.","commit_id":"7f5504354a50b234f229c390abe1559a189d73d8"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"a98a7a4f285b2092df13ce14523a590f02ff3029","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        instance_version \u003d upgrade[\u0027instance_version\u0027]"},{"line_number":43,"context_line":"        location \u003d upgrade[\u0027location\u0027]"},{"line_number":44,"context_line":"        metadata \u003d upgrade.get(\u0027metadata\u0027, None)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        notify \u003d UpgradeNotification.create("},{"line_number":47,"context_line":"            context, instance_id, instance_version, location,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAXH%2F%2FDBk%3D","line":44,"updated":"2014-04-24 11:52:21.000000000","message":"None is not required, because get returns None if dict has no such attribute","commit_id":"76df30756da0405121368d24ab06f10c10f8f7c1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"58860819e5a36dd8c20ec055fbafa606100ce8cb","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        location \u003d upgrade.get(\u0027location\u0027)"},{"line_number":44,"context_line":"        metadata \u003d upgrade.get(\u0027metadata\u0027)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        notify \u003d UpgradeNotification.create("},{"line_number":47,"context_line":"            context, instance_id, instance_version, location, metadata)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        notify()"}],"source_content_type":"text/x-python","patch_set":30,"id":"1ae5cdf2_9659b95c","line":46,"updated":"2014-06-02 22:23:28.000000000","message":"As for me, i feel a bit uncomfortable with naming here.\nNotifications is totally different thing inside OpenStack. Take a look at https://github.com/openstack/trove/blob/master/trove/taskmanager/models.py#L73-L133\n\nI\u0027d really suggest to rename class and its usage to avoid terms collision/mis-understanding.","commit_id":"19e4a647c4c51e719c839df13dea50f792631e67"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"e72b31891c26d8bb29c07912a6e54e124ebca1ee","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        location \u003d upgrade.get(\u0027location\u0027)"},{"line_number":44,"context_line":"        metadata \u003d upgrade.get(\u0027metadata\u0027)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        notify \u003d UpgradeNotification.create("},{"line_number":47,"context_line":"            context, instance_id, instance_version, location, metadata)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        notify()"}],"source_content_type":"text/x-python","patch_set":30,"id":"1ae5cdf2_542ba92f","line":46,"in_reply_to":"1ae5cdf2_9659b95c","updated":"2014-06-02 23:30:25.000000000","message":"I see your point.  Notifications is used in another part of the code.  How about UpgradeMessage?","commit_id":"19e4a647c4c51e719c839df13dea50f792631e67"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"59dac074fcd759a2a72a92a09263f50008c6327f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def create(self, req, body, tenant_id, instance_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"},{"line_number":40,"context_line":"        upgrade \u003d body[\u0027upgrade\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_b3a7d54f","line":37,"updated":"2014-06-24 12:31:37.000000000","message":"debug should come without translation","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"d966e370ba5c54e69afee2fc4c0a7430c336827e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def create(self, req, body, tenant_id, instance_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"},{"line_number":40,"context_line":"        upgrade \u003d body[\u0027upgrade\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"dab895d6_c8f4d789","line":37,"in_reply_to":"1ae5cdf2_735f08e5","updated":"2014-06-29 09:45:37.000000000","message":"You just need to remove the leading _ for the LOG.debug messages. That\u0027s what does the translation, and debug logs don\u0027t need translation.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"5f35d533f8c1f71f77206d94b14a6ef662efcc13","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def create(self, req, body, tenant_id, instance_id):"},{"line_number":35,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":36,"context_line":"        LOG.info(_(\"Sending upgrade notification\"))"},{"line_number":37,"context_line":"        LOG.debug(_(\"Admin tenant_id: %s\") % tenant_id)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        context \u003d req.environ.get(wsgi.CONTEXT_KEY)"},{"line_number":40,"context_line":"        upgrade \u003d body[\u0027upgrade\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_735f08e5","line":37,"in_reply_to":"1ae5cdf2_b3a7d54f","updated":"2014-06-24 14:13:03.000000000","message":"I need to read up on how we are doing this.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"}],"trove/extensions/routes/mgmt.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c1d9229f3a15d033ae211ab99fad77a7d9a19bb3","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        resources.append(host_instances)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        upgrade \u003d extensions.ResourceExtension("},{"line_number":84,"context_line":"            \u0027{tenant_id}/mgmt/upgrade\u0027,"},{"line_number":85,"context_line":"            UpgradeController(),"},{"line_number":86,"context_line":"            member_actions\u003d{})"},{"line_number":87,"context_line":"        resources.append(upgrade)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FwsA%3D","line":84,"updated":"2014-04-10 15:41:23.000000000","message":"i think the route should be like {tenant_id}/mgmt/guest_upgrade","commit_id":"641670dcd2fc30af254e6c64677653f8e8b015ba"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"77e115bbfa6edc442344afc1bd606cee9ce33962","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        resources.append(host_instances)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        upgrade \u003d extensions.ResourceExtension("},{"line_number":84,"context_line":"            \u0027{tenant_id}/mgmt/upgrade\u0027,"},{"line_number":85,"context_line":"            UpgradeController(),"},{"line_number":86,"context_line":"            member_actions\u003d{})"},{"line_number":87,"context_line":"        resources.append(upgrade)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAW3%2F%2FwSk%3D","line":84,"in_reply_to":"AAAAW3%2F%2FwsA%3D","updated":"2014-04-10 15:57:26.000000000","message":"I think I will leave it like this for now as it was already agreed upon in the bp.  Also, it maps closer to the RPC method that is invoked.","commit_id":"641670dcd2fc30af254e6c64677653f8e8b015ba"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"7f9381cbb358d1f66e50511187f6d82be97c0160","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        resources.append(host_instances)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        upgrade \u003d extensions.ResourceExtension("},{"line_number":84,"context_line":"            \u0027{tenant_id}/mgmt/instances/upgrade\u0027,"},{"line_number":85,"context_line":"            UpgradeController(),"},{"line_number":86,"context_line":"            member_actions\u003d{})"},{"line_number":87,"context_line":"        resources.append(upgrade)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2Fvlc%3D","line":84,"updated":"2014-04-17 19:04:45.000000000","message":"Thanks for adding \u0027instances\u0027 to this route.  Now the only question i have is why is the instance_id part of the body, and not the route?  \n\nThe backend code seems to upgrade a single instance.  In that case, the ID should be in the URI i\u0027d think.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"0143bf7e5d173294719e6bf9de40051cddc4f6cb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        resources.append(host_instances)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        upgrade \u003d extensions.ResourceExtension("},{"line_number":84,"context_line":"            \u0027{tenant_id}/mgmt/instances/upgrade\u0027,"},{"line_number":85,"context_line":"            UpgradeController(),"},{"line_number":86,"context_line":"            member_actions\u003d{})"},{"line_number":87,"context_line":"        resources.append(upgrade)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FuA0%3D","line":84,"in_reply_to":"AAAAXH%2F%2Fvlc%3D","updated":"2014-04-17 22:58:56.000000000","message":"We can do this but if we wanted to include a list of guest agents one day what would the URL look like?","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"}],"trove/guestagent/api.py":[{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"7f9381cbb358d1f66e50511187f6d82be97c0160","unresolved":false,"context_lines":[{"line_number":271,"context_line":"    def upgrade(self, instance_version, strategy, location, metadata\u003dNone):"},{"line_number":272,"context_line":"        \"\"\"Make an asynchronous call to self upgrade the guest agent\"\"\""},{"line_number":273,"context_line":"        LOG.debug(_(\"Sending an upgrade call to nova-guest\"))"},{"line_number":274,"context_line":"        self._cast_with_consumer(\"upgrade\","},{"line_number":275,"context_line":"                                 instance_id\u003dself.id,"},{"line_number":276,"context_line":"                                 instance_version\u003dinstance_version,"},{"line_number":277,"context_line":"                                 strategy\u003dstrategy,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2Fvmo%3D","line":274,"updated":"2014-04-17 19:04:45.000000000","message":"We should be using just a _cast() here I think.  The cast_with_consumer actually creates an additional consumer for this instance.  The guest agent is our consumer, and we shouldn\u0027t need to create another one on the producer side.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"4d3f767e5144d334a999d6f63cc7d5121bfaaede","unresolved":false,"context_lines":[{"line_number":271,"context_line":"    def upgrade(self, instance_version, strategy, location, metadata\u003dNone):"},{"line_number":272,"context_line":"        \"\"\"Make an asynchronous call to self upgrade the guest agent\"\"\""},{"line_number":273,"context_line":"        LOG.debug(_(\"Sending an upgrade call to nova-guest\"))"},{"line_number":274,"context_line":"        self._cast_with_consumer(\"upgrade\","},{"line_number":275,"context_line":"                                 instance_id\u003dself.id,"},{"line_number":276,"context_line":"                                 instance_version\u003dinstance_version,"},{"line_number":277,"context_line":"                                 strategy\u003dstrategy,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FuRo%3D","line":274,"in_reply_to":"AAAAXH%2F%2Fvmo%3D","updated":"2014-04-17 22:12:00.000000000","message":"I need to check with hub_cap on this because this was what the original implementation had.  I\u0027m okay with changing it, just have to confirm.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"7f9381cbb358d1f66e50511187f6d82be97c0160","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return self._call(\"get_filesystem_stats\", AGENT_LOW_TIMEOUT,"},{"line_number":286,"context_line":"                          fs_path\u003dNone)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def update_guest(self):"},{"line_number":289,"context_line":"        \"\"\"Make a synchronous call to update the guest agent.\"\"\""},{"line_number":290,"context_line":"        self._call(\"update_guest\", AGENT_HIGH_TIMEOUT)"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2Fvpc%3D","line":288,"updated":"2014-04-17 19:04:45.000000000","message":"Should this method be removed?  I see upgrade and update_guest() in this API.  No implementation exists for either in the guest manager.  Should we remove one of them to clean this up?","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"4d3f767e5144d334a999d6f63cc7d5121bfaaede","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        return self._call(\"get_filesystem_stats\", AGENT_LOW_TIMEOUT,"},{"line_number":286,"context_line":"                          fs_path\u003dNone)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def update_guest(self):"},{"line_number":289,"context_line":"        \"\"\"Make a synchronous call to update the guest agent.\"\"\""},{"line_number":290,"context_line":"        self._call(\"update_guest\", AGENT_HIGH_TIMEOUT)"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FuRk%3D","line":288,"in_reply_to":"AAAAXH%2F%2Fvpc%3D","updated":"2014-04-17 22:12:00.000000000","message":"I think this might be used somewhere, I\u0027ll check again.","commit_id":"88834fa74e721dfb707970eb234fa0cea84d5d2b"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"8bdfee0903a1bfead588418059c16b0c9440d3e3","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        \"\"\"Make an asynchronous call to self upgrade the guest agent\"\"\""},{"line_number":273,"context_line":"        LOG.debug(_(\"Sending an upgrade call to nova-guest\"))"},{"line_number":274,"context_line":"        self._cast(\"upgrade\","},{"line_number":275,"context_line":"                   instance_id\u003dself.id,"},{"line_number":276,"context_line":"                   instance_version\u003dinstance_version,"},{"line_number":277,"context_line":"                   strategy\u003dstrategy,"},{"line_number":278,"context_line":"                   location\u003dlocation,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXH%2F%2FPrg%3D","line":275,"updated":"2014-04-23 03:07:57.000000000","message":"instance_id seems unnecessary to pass to the Guest.  Doesn\u0027t seem like we do anything with it downstream.  The guest already should know it based on agent.config","commit_id":"368c46e127591c1cb9729f9f6e23c6684ad33a32"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"e5b53bd15266cff7680a536a1cd11acfc3a80eb3","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        \"\"\"Make an asynchronous call to self upgrade the guest agent\"\"\""},{"line_number":273,"context_line":"        LOG.debug(_(\"Sending an upgrade call to nova-guest\"))"},{"line_number":274,"context_line":"        self._cast(\"upgrade\","},{"line_number":275,"context_line":"                   instance_id\u003dself.id,"},{"line_number":276,"context_line":"                   instance_version\u003dinstance_version,"},{"line_number":277,"context_line":"                   strategy\u003dstrategy,"},{"line_number":278,"context_line":"                   location\u003dlocation,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAXH%2F%2FKlU%3D","line":275,"in_reply_to":"AAAAXH%2F%2FPrg%3D","updated":"2014-04-23 15:46:51.000000000","message":"Done","commit_id":"368c46e127591c1cb9729f9f6e23c6684ad33a32"}],"trove/guestagent/datastore/mysql/manager.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"c1dffb4bb90850283f5f6731608625b7eab15119","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        app.apply_overrides(overrides)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def upgrade(self, context):"},{"line_number":206,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Bw04%3D","line":206,"updated":"2014-03-24 14:55:23.000000000","message":"please follow new way of rising exceptions if operation is not supported","commit_id":"188228e0434500925715233c325c4f6c40508651"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"dbe318c4231ddf5d6a9f9bcdcac7a2fd61b9b6bd","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        app.apply_overrides(overrides)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def upgrade(self, context):"},{"line_number":206,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Bvf8%3D","line":206,"in_reply_to":"AAAAWH%2F%2Bw04%3D","updated":"2014-03-24 17:27:34.000000000","message":"Yo Denis,\n\nThis is work in progress :)","commit_id":"188228e0434500925715233c325c4f6c40508651"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        TODO: DN 03-25-2014"},{"line_number":210,"context_line":"        implement the upgrade here based on the strategy"},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":"        LOG.info(\"%s, %s, %s, %s, %s\" % ("},{"line_number":213,"context_line":"            instance_id, instance_version, strategy, location, metadata))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F48E%3D","line":212,"updated":"2014-04-08 17:43:02.000000000","message":"_()","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        implement the upgrade here based on the strategy"},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":"        LOG.info(\"%s, %s, %s, %s, %s\" % ("},{"line_number":213,"context_line":"            instance_id, instance_version, strategy, location, metadata))"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F47o%3D","line":213,"updated":"2014-04-08 17:43:02.000000000","message":"list formatting is not acceptable for the localization","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"bcbba77273f98b0d282d4942960d819218da3efa","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        app.apply_overrides(overrides)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def upgrade(self, context, instance_id, instance_version, strategy,"},{"line_number":206,"context_line":"                location, metadata\u003dNone):"},{"line_number":207,"context_line":"        \"\"\""},{"line_number":208,"context_line":"        Upgrade the guest agent based on the strategy"},{"line_number":209,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAW3%2F%2FY6k%3D","line":206,"updated":"2014-04-14 23:12:53.000000000","message":"Is this still a work in progress?  not seeing any actual upgrade happening here.","commit_id":"7f5504354a50b234f229c390abe1559a189d73d8"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"96d6fe4fa05ed8d6a20dfd02f63e1aa5edbc6ceb","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        app.apply_overrides(overrides)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def upgrade(self, context, instance_id, instance_version, strategy,"},{"line_number":206,"context_line":"                location, metadata\u003dNone):"},{"line_number":207,"context_line":"        \"\"\""},{"line_number":208,"context_line":"        Upgrade the guest agent based on the strategy"},{"line_number":209,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAW3%2F%2FSjY%3D","line":206,"in_reply_to":"AAAAW3%2F%2FY6k%3D","updated":"2014-04-15 14:52:51.000000000","message":"There is another patch that \u0027picks up\u0027 where this one leaves off.\nIt allows for this review to be more straight forward to the reviewer.","commit_id":"7f5504354a50b234f229c390abe1559a189d73d8"}],"trove/tests/unittests/guestagent/test_api.py":[{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"51477f2393b16b4ca9a82324c4a06aa7634a50e5","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)"},{"line_number":306,"context_line":"        exp_msg \u003d RpcMsgMatcher(\u0027upgrade\u0027, \u0027instance_id\u0027, \u0027instance_version\u0027,"},{"line_number":307,"context_line":"                                \u0027strategy\u0027, \u0027location\u0027)"},{"line_number":308,"context_line":"        when(rpc).cast(any(), any(), exp_msg).thenReturn(None)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        self.api.upgrade(instance_version, strategy, location)"},{"line_number":311,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2BbQw%3D","line":308,"updated":"2014-03-26 21:17:06.000000000","message":"Nikhil is replacing Mockito with Mock, might be good to get ahead of the curve.","commit_id":"8ff487ea3d7824482b59a3ccc7ea15b27372ab98"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"7acc984749e79604a7dd481bf5febf5d6a0be3c2","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)"},{"line_number":306,"context_line":"        exp_msg \u003d RpcMsgMatcher(\u0027upgrade\u0027, \u0027instance_id\u0027, \u0027instance_version\u0027,"},{"line_number":307,"context_line":"                                \u0027strategy\u0027, \u0027location\u0027)"},{"line_number":308,"context_line":"        when(rpc).cast(any(), any(), exp_msg).thenReturn(None)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        self.api.upgrade(instance_version, strategy, location)"},{"line_number":311,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2BbH4%3D","line":308,"in_reply_to":"AAAAWH%2F%2BbQw%3D","updated":"2014-03-26 21:28:31.000000000","message":"Yep, I was considering that.  I opted to wait for Nikhil to finish his stuff.","commit_id":"8ff487ea3d7824482b59a3ccc7ea15b27372ab98"}],"trove/tests/unittests/upgrade/test_controller.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"aa2c388eb2d2c2aa3c362e8aeec2d274c4ec1300","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            instance_version \u003d self.body[\u0027instance_version\u0027]"},{"line_number":156,"context_line":"            strategy \u003d self.body[\u0027strategy\u0027]"},{"line_number":157,"context_line":"            location \u003d self.body[\u0027location\u0027]"},{"line_number":158,"context_line":"            metadata \u003d self.body[\u0027metadata\u0027]"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            UpgradeNotification.create.assert_called_once_with("},{"line_number":161,"context_line":"                context, instance_id, instance_version, strategy, location,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAWn%2F%2F47E%3D","line":158,"updated":"2014-04-08 17:43:02.000000000","message":"As said before, in the controller class you getting body attributes like they are not required, but here you\u0027re doing totally opposite thing. Please update the controller class","commit_id":"a3c1abd3bcc83df3a03bd5c02de4d3dea98fcc9a"},{"author":{"_account_id":6156,"name":"Justin Hopper","email":"justin.hopper@hp.com","username":"justin-hopper"},"change_message_id":"d0bb6dd6c952ba82f36b6f029025f0da5d19b115","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        UpgradeNotification.create.assert_called_once_with("},{"line_number":143,"context_line":"            context, instance_id, instance_version, location, metadata)"},{"line_number":144,"context_line":"        self.assertEqual(202, resp.status)"}],"source_content_type":"text/x-python","patch_set":23,"id":"facab960_48c1b3e3","line":144,"updated":"2014-04-28 21:39:16.000000000","message":"Nice tests","commit_id":"27bd2c194423f899cd5346e8941bcd1cb8653513"}],"trove/tests/unittests/upgrade/test_models.py":[{"author":{"_account_id":5390,"name":"Steve Leon","username":"steve-leon","inactive":true},"change_message_id":"30033b22a3da126934d18f32b2d7a737d37c3642","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        param \u003d \u00277169f46a-ac53-401a-ba35\u0027"},{"line_number":46,"context_line":"        self.assertTrue(UpgradeNotification._validate(param, 36))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_create(self):"},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        Test creating notification"},{"line_number":51,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"bad4c104_a0941a45","line":48,"updated":"2014-04-29 00:51:27.000000000","message":"Hey Dan, im not sure all these four tests are doing much. The assert is testing what you are already mocking. And the assert_called_with just tests the param you are passing. Not sure if these tests is useful. Looking at the logic for UpgradeNotification.create, it is mostly validating the params. So i would change this test to test the exceptions thrown depending on the params but you already covered this in test_validate.\n\nI say just remove these tests since they are not doing anything useful and the logic for create doesnt really need tests.\n\nThe only test i would have here is the test_validate","commit_id":"41deb304d8d5ed2f7cbbaabf6e6a677def05d5c0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"59dac074fcd759a2a72a92a09263f50008c6327f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_5315b147","line":1,"updated":"2014-06-24 12:31:37.000000000","message":"Please add tests for empty/non-empty instance_version and location.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"},{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"5f35d533f8c1f71f77206d94b14a6ef662efcc13","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":34,"id":"1ae5cdf2_b3b510ef","line":1,"in_reply_to":"1ae5cdf2_5315b147","updated":"2014-06-24 14:13:03.000000000","message":"That\u0027s not a bad idea.  I\u0027d like to get this in first and follow up with another patch as this one has gone on way too long.\n\nThere is still a bit of work on our end to implement the virtualenv upgrade path and I think others will want to do the same.  The reference implementation here is intended to be a guide.","commit_id":"ac45127c86e5b9d4723b0cb8a58a8b5d1570c706"}]}
