)]}'
{"doc/source/restapi/rest_api_v1.0.rst":[{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"c55c82411210b40ab2884ba716f82450dfd31517","unresolved":false,"context_lines":[{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"Normal Response Code: 202 (ACCEPTED)"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"Errors: none"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"This operation returns the updated Cluster Template."},{"line_number":1860,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba7be1f8_a1d5cd44","line":1857,"updated":"2015-02-20 20:04:10.000000000","message":"Can errors here be not found or failed to update?\n\nIf so the same would be true of the node group change","commit_id":"0823e79652f70fce5a51f2463b93779f642ab1bb"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"61b5e8bccf7fda5161dc1a4e9757be5bc9adb24a","unresolved":false,"context_lines":[{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"Normal Response Code: 202 (ACCEPTED)"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"Errors: none"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"This operation returns the updated Cluster Template."},{"line_number":1860,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba7be1f8_e47273e4","line":1857,"in_reply_to":"ba7be1f8_a1d5cd44","updated":"2015-02-20 20:39:55.000000000","message":"None of the others seem to list things that could go wrong (notfound, etc).  I was just making sure to fit in here.","commit_id":"0823e79652f70fce5a51f2463b93779f642ab1bb"},{"author":{"_account_id":7125,"name":"Alexander Ignatov","email":"aignatov@mirantis.com","username":"aignatov"},"change_message_id":"f9925a12dc58684d06bb14745c16d232472950e1","unresolved":false,"context_lines":[{"line_number":1850,"context_line":"5.5 Update Cluster Template"},{"line_number":1851,"context_line":"---------------------------"},{"line_number":1852,"context_line":""},{"line_number":1853,"context_line":".. http:post:: /v1.0/{tenant_id}/cluster-templates/{cluster_template_id}"},{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"Normal Response Code: 202 (ACCEPTED)"},{"line_number":1856,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba7be1f8_60e50bdb","line":1853,"updated":"2015-02-25 10:52:45.000000000","message":"http:put :)","commit_id":"cf95df4653951c58de0ab7ae9aca4096f115c132"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"daf0afe07726eaf7980d1e45ac2003c251b88260","unresolved":false,"context_lines":[{"line_number":1850,"context_line":"5.5 Update Cluster Template"},{"line_number":1851,"context_line":"---------------------------"},{"line_number":1852,"context_line":""},{"line_number":1853,"context_line":".. http:post:: /v1.0/{tenant_id}/cluster-templates/{cluster_template_id}"},{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"Normal Response Code: 202 (ACCEPTED)"},{"line_number":1856,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"ba7be1f8_c69c0560","line":1853,"in_reply_to":"ba7be1f8_60e50bdb","updated":"2015-02-25 14:05:47.000000000","message":"Done","commit_id":"cf95df4653951c58de0ab7ae9aca4096f115c132"},{"author":{"_account_id":12707,"name":"Jacob Bin Wang","email":"wangbin@awcloud.com","username":"Jacob"},"change_message_id":"c095cdc4769d68d1b15c65de36aa692847c918dd","unresolved":false,"context_lines":[{"line_number":1951,"context_line":"                \"cluster_configs\": {},"},{"line_number":1952,"context_line":"                \"created_at\": \"2014-08-28 20:00:40\","},{"line_number":1953,"context_line":"                \"default_image_id\": null,"},{"line_number":1954,"context_line":"                \"updated_at\": null,"},{"line_number":1955,"context_line":"                \"plugin_name\": \"vanilla\","},{"line_number":1956,"context_line":"                \"anti_affinity\": [],"},{"line_number":1957,"context_line":"                \"tenant_id\": \"28a4d0e49b024dc0875ed6a862b129f0\","}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba7be1f8_23b92f79","line":1954,"updated":"2015-02-26 06:12:13.000000000","message":"This field should be updated.","commit_id":"3adb77f9e5d297b227f7717752a24e9d1a9b7dc6"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"2d39f7d1b64634e5d0400dfd492948ef55f82578","unresolved":false,"context_lines":[{"line_number":1951,"context_line":"                \"cluster_configs\": {},"},{"line_number":1952,"context_line":"                \"created_at\": \"2014-08-28 20:00:40\","},{"line_number":1953,"context_line":"                \"default_image_id\": null,"},{"line_number":1954,"context_line":"                \"updated_at\": null,"},{"line_number":1955,"context_line":"                \"plugin_name\": \"vanilla\","},{"line_number":1956,"context_line":"                \"anti_affinity\": [],"},{"line_number":1957,"context_line":"                \"tenant_id\": \"28a4d0e49b024dc0875ed6a862b129f0\","}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba7be1f8_1761b0d2","line":1954,"in_reply_to":"ba7be1f8_23b92f79","updated":"2015-02-26 14:52:22.000000000","message":"Good catch...it is...just my documenting it was bad :)","commit_id":"3adb77f9e5d297b227f7717752a24e9d1a9b7dc6"}],"sahara/api/v10.py":[{"author":{"_account_id":7125,"name":"Alexander Ignatov","email":"aignatov@mirantis.com","username":"aignatov"},"change_message_id":"f9925a12dc58684d06bb14745c16d232472950e1","unresolved":false,"context_lines":[{"line_number":99,"context_line":"@rest.put(\u0027/cluster-templates/\u003ccluster_template_id\u003e\u0027)"},{"line_number":100,"context_line":"@acl.enforce(\"cluster-templates:modify\")"},{"line_number":101,"context_line":"@v.check_exists(api.get_cluster_template, \u0027cluster_template_id\u0027)"},{"line_number":102,"context_line":"def cluster_templates_update(cluster_template_id, data):"},{"line_number":103,"context_line":"    return u.render("},{"line_number":104,"context_line":"        api.update_cluster_template("},{"line_number":105,"context_line":"            cluster_template_id, data).to_wrapped_dict())"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_8c4cf99f","line":102,"updated":"2015-02-25 10:52:45.000000000","message":"Validation checks are missed. \n\nExample:\n\nI can create cluster template as is follows:\n\nThis is valid cluster for my env assuming that all IDs for node group templates anf neutron_management_network are correct.\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n        {\n            \"plugin_name\": \"vanilla\",\n            \"hadoop_version\": \"2.4.1\",\n            \"node_groups\": [\n                {\n                    \"name\": \"worker\",\n                    \"count\": 3,\n                    \"node_group_template_id\": \"4816e6d9-1aa1-4f80-ac10-f3850daca696\"\n                }\n            ],\n            \"name\": \"cluster-template1\",\n            \"neutron_management_network\": \"wrong-network\",\n            \"cluster_configs\": {}\n        }\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nNow I\u0027m trying to update this template with the following JSON:\n\n        {\n            \"plugin_name\": \"WRONG_PLUGIN\",\n            \"hadoop_version\": \"-100500\",\n            \"node_groups\": [\n                {\n                    \"name\": \"worker\",\n                    \"count\": 3,\n                    \"node_group_template_id\": \"4816e6d9-1aa1-4f80-ac10-f3850daca696\"\n                }\n            ],\n            \"name\": \"cluster-template1\",\n            \"neutron_management_network\": \"WRONG_NETWORK\",\n            \"cluster_configs\": {}\n        }\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nAnd this request will be accepted","commit_id":"cf95df4653951c58de0ab7ae9aca4096f115c132"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"daf0afe07726eaf7980d1e45ac2003c251b88260","unresolved":false,"context_lines":[{"line_number":99,"context_line":"@rest.put(\u0027/cluster-templates/\u003ccluster_template_id\u003e\u0027)"},{"line_number":100,"context_line":"@acl.enforce(\"cluster-templates:modify\")"},{"line_number":101,"context_line":"@v.check_exists(api.get_cluster_template, \u0027cluster_template_id\u0027)"},{"line_number":102,"context_line":"def cluster_templates_update(cluster_template_id, data):"},{"line_number":103,"context_line":"    return u.render("},{"line_number":104,"context_line":"        api.update_cluster_template("},{"line_number":105,"context_line":"            cluster_template_id, data).to_wrapped_dict())"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_86676d4c","line":102,"in_reply_to":"ba7be1f8_8c4cf99f","updated":"2015-02-25 14:05:47.000000000","message":"Good catch.\nDone.","commit_id":"cf95df4653951c58de0ab7ae9aca4096f115c132"}],"sahara/conductor/api.py":[{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"e3bfc4591af4ea56b18c862910d0f97322c3bda7","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        \"\"\""},{"line_number":187,"context_line":"        self._manager.cluster_template_destroy(context,"},{"line_number":188,"context_line":"                                               _get_id(cluster_template))"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def cluster_template_update(self, context, id, cluster_template):"},{"line_number":191,"context_line":"        \"\"\"Update the cluster template or raise if it does not exist."},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_6ac81775","line":189,"updated":"2015-02-20 16:58:00.000000000","message":"don\u0027t forget wrap and return here","commit_id":"16b845353ec2edc984647971655e004d77690c87"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"c55c82411210b40ab2884ba716f82450dfd31517","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self._manager.cluster_template_destroy(context,"},{"line_number":188,"context_line":"                                               _get_id(cluster_template))"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def cluster_template_update(self, context, id, cluster_template):"},{"line_number":191,"context_line":"        \"\"\"Update the cluster template or raise if it does not exist."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        :returns: the updated cluster template"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_4155f1c4","line":190,"updated":"2015-02-20 20:04:10.000000000","message":"still missing \"wrap\" and return","commit_id":"0823e79652f70fce5a51f2463b93779f642ab1bb"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"61b5e8bccf7fda5161dc1a4e9757be5bc9adb24a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self._manager.cluster_template_destroy(context,"},{"line_number":188,"context_line":"                                               _get_id(cluster_template))"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def cluster_template_update(self, context, id, cluster_template):"},{"line_number":191,"context_line":"        \"\"\"Update the cluster template or raise if it does not exist."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        :returns: the updated cluster template"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_44589f56","line":190,"in_reply_to":"ba7be1f8_4155f1c4","updated":"2015-02-20 20:39:55.000000000","message":"Done","commit_id":"0823e79652f70fce5a51f2463b93779f642ab1bb"}],"sahara/db/sqlalchemy/api.py":[{"author":{"_account_id":12038,"name":"Vitaly Gridnev","email":"gridnevvvit@gmail.com","username":"vgridnev"},"change_message_id":"e2806f94ac4a14368df8a828094a1dbb83766229","unresolved":false,"context_lines":[{"line_number":496,"context_line":""},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"def cluster_template_update(context, values):"},{"line_number":499,"context_line":"    node_groups \u003d values.pop(\"node_groups\") or []"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    session \u003d get_session()"},{"line_number":502,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_023abbe6","line":499,"updated":"2015-02-24 15:36:08.000000000","message":"what if values doesn\u0027t contain \u0027node_groups\u0027? I think, exception would be raised? Or it always be in values? I think, we should change to -\u003e values.get(\u0027node_group\u0027, []) (or pop)","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"dd3a1a80d4cd1107cb4c42f8a1ede98b27ecc577","unresolved":false,"context_lines":[{"line_number":496,"context_line":""},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"def cluster_template_update(context, values):"},{"line_number":499,"context_line":"    node_groups \u003d values.pop(\"node_groups\") or []"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    session \u003d get_session()"},{"line_number":502,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_18ceaab4","line":499,"in_reply_to":"ba7be1f8_023abbe6","updated":"2015-02-24 15:50:24.000000000","message":"Line 261 in https://review.openstack.org/#/c/157460/6/sahara/conductor/manager.py creates \"node_groups\", so it\u0027s probably okay.\n\nHowever, values.pop(\"node_groups\", []) covers the bases pretty well.\nThe only thing it doesn\u0027t cover is a None/False etc but I think that\u0027s\nunnecessary.","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"2f10177a6e3275957000659cd19d0554e2dccc65","unresolved":false,"context_lines":[{"line_number":496,"context_line":""},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"def cluster_template_update(context, values):"},{"line_number":499,"context_line":"    node_groups \u003d values.pop(\"node_groups\") or []"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    session \u003d get_session()"},{"line_number":502,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_5efba3c0","line":499,"in_reply_to":"ba7be1f8_18ceaab4","updated":"2015-02-24 18:38:23.000000000","message":"I\u0027ll go with values.pop(\"node_groups\", [])","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":6786,"name":"Sergey Lukjanov","email":"me@slukjanov.name","username":"slukjanov"},"change_message_id":"56f834c8c1bb46e333415486bec95813ab51b7f0","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            cluster_template_id\u003dcluster_template_id).delete()"},{"line_number":520,"context_line":"        for ng in node_groups:"},{"line_number":521,"context_line":"            node_group \u003d m.TemplatesRelation()"},{"line_number":522,"context_line":"            node_group.update({\"cluster_template_id\": cluster_template_id})"},{"line_number":523,"context_line":"            node_group.update(ng)"},{"line_number":524,"context_line":"            node_group.save(session\u003dsession)"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_f3549700","line":522,"updated":"2015-02-24 16:04:31.000000000","message":"IMO we should swap this line and the next one to ensure that it\u0027s not possible to override the cluster_template_id property.","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"2f10177a6e3275957000659cd19d0554e2dccc65","unresolved":false,"context_lines":[{"line_number":519,"context_line":"            cluster_template_id\u003dcluster_template_id).delete()"},{"line_number":520,"context_line":"        for ng in node_groups:"},{"line_number":521,"context_line":"            node_group \u003d m.TemplatesRelation()"},{"line_number":522,"context_line":"            node_group.update({\"cluster_template_id\": cluster_template_id})"},{"line_number":523,"context_line":"            node_group.update(ng)"},{"line_number":524,"context_line":"            node_group.save(session\u003dsession)"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_7ef867c3","line":522,"in_reply_to":"ba7be1f8_f3549700","updated":"2015-02-24 18:38:23.000000000","message":"Done","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":12707,"name":"Jacob Bin Wang","email":"wangbin@awcloud.com","username":"Jacob"},"change_message_id":"c095cdc4769d68d1b15c65de36aa692847c918dd","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            raise ex.UpdateFailedException("},{"line_number":512,"context_line":"                cluster_template_id,"},{"line_number":513,"context_line":"                _(\"ClusterTemplate id \u0027%s\u0027 can not be updated. \""},{"line_number":514,"context_line":"                  \"It is referenced by an existing cluster.\")"},{"line_number":515,"context_line":"            )"},{"line_number":516,"context_line":"        cluster_template.update(values)"},{"line_number":517,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba7be1f8_6da15893","line":514,"updated":"2015-02-26 06:12:13.000000000","message":"an -\u003e at least one","commit_id":"3adb77f9e5d297b227f7717752a24e9d1a9b7dc6"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"2d39f7d1b64634e5d0400dfd492948ef55f82578","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            raise ex.UpdateFailedException("},{"line_number":512,"context_line":"                cluster_template_id,"},{"line_number":513,"context_line":"                _(\"ClusterTemplate id \u0027%s\u0027 can not be updated. \""},{"line_number":514,"context_line":"                  \"It is referenced by an existing cluster.\")"},{"line_number":515,"context_line":"            )"},{"line_number":516,"context_line":"        cluster_template.update(values)"},{"line_number":517,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ba7be1f8_977be079","line":514,"in_reply_to":"ba7be1f8_6da15893","updated":"2015-02-26 14:52:22.000000000","message":"Done","commit_id":"3adb77f9e5d297b227f7717752a24e9d1a9b7dc6"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"5f3dc801b15ed9b813e65d9a57760ee64264a55f","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            raise ex.UpdateFailedException("},{"line_number":512,"context_line":"                cluster_template_id,"},{"line_number":513,"context_line":"                _(\"ClusterTemplate id \u0027%s\u0027 can not be updated. \""},{"line_number":514,"context_line":"                  \"It is referenced by at least one existing cluster.\")"},{"line_number":515,"context_line":"            )"},{"line_number":516,"context_line":"        cluster_template.update(values)"},{"line_number":517,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_42d3685f","line":514,"updated":"2015-02-26 15:08:23.000000000","message":"\"existing\" is redundant now.  It can\u0027t be referenced by a non-existent cluster :)","commit_id":"d1d4b5b5f2191bb82ad6cd77f833923fa115c88d"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"42ddefec161278cc7f774688b87951b2ccc280de","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                cluster_template_id,"},{"line_number":509,"context_line":"                _(\"Cluster Template id \u0027%s\u0027 not found!\"))"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        name \u003d values.get(\u0027name\u0027)"},{"line_number":512,"context_line":"        if name:"},{"line_number":513,"context_line":"            same_name_tmpls \u003d model_query("},{"line_number":514,"context_line":"                m.ClusterTemplate, context).filter_by("}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_b64a5faa","line":511,"updated":"2015-02-27 20:32:57.000000000","message":"some would this should just be \"if values.get(\u0027name\u0027):\" since name isn\u0027t referenced,\nor alternatively use name below instead of values[\u0027name\u0027] where it\u0027s referenced.\n\nBut imho it\u0027s not worth a -1","commit_id":"74197ad6f4f83c8c781ef8316a0a603302a2499e"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"c89774d85d0b4bdc00a000884b3f6b9475fc9d90","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                cluster_template_id,"},{"line_number":509,"context_line":"                _(\"Cluster Template id \u0027%s\u0027 not found!\"))"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        name \u003d values.get(\u0027name\u0027)"},{"line_number":512,"context_line":"        if name:"},{"line_number":513,"context_line":"            same_name_tmpls \u003d model_query("},{"line_number":514,"context_line":"                m.ClusterTemplate, context).filter_by("}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_516ccd36","line":511,"in_reply_to":"ba7be1f8_b64a5faa","updated":"2015-02-27 21:01:38.000000000","message":"Yeah, I think I\u0027ll use name \"below\".","commit_id":"74197ad6f4f83c8c781ef8316a0a603302a2499e"}],"sahara/service/validations/base.py":[{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"d7e0a29210fe701f581f8f2180c32a3a1856fe9a","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"def check_cluster_template_unique_name_edit(id, update_name):"},{"line_number":300,"context_line":"    templates \u003d api.get_cluster_templates()"},{"line_number":301,"context_line":"    for t in templates:"},{"line_number":302,"context_line":"        if t.name \u003d\u003d update_name and t.id !\u003d id:"},{"line_number":303,"context_line":"            raise ex.NameAlreadyExistsException("}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_5505a712","line":300,"updated":"2015-02-27 16:09:10.000000000","message":"hmm, the unique-ness test above was written before filter support.\nI think both this test  and the one above in check_cluster_template_unique_name()\ncan be improved by passing name\u003dupdate_name and letting sqlalchemy do the filter.\n\nAbove, if you get a non-empty list back it\u0027s an error.\nHere, if the length is greater than 1 (can\u0027t be, but ...) or templates[0].id doesn\u0027t match it\u0027s an error. Something like:\n\nif templates and (len(templates) \u003e 1 or templates[0].id !\u003d id):\n    raise ....","commit_id":"9eab73b324ceacdb8788f12e4ba340152033b3bb"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"0f4dc3afc275684663f31f8a0464a6149243e3f6","unresolved":false,"context_lines":[{"line_number":297,"context_line":""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"def check_cluster_template_unique_name_edit(id, update_name):"},{"line_number":300,"context_line":"    templates \u003d api.get_cluster_templates()"},{"line_number":301,"context_line":"    for t in templates:"},{"line_number":302,"context_line":"        if t.name \u003d\u003d update_name and t.id !\u003d id:"},{"line_number":303,"context_line":"            raise ex.NameAlreadyExistsException("}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_76af122c","line":300,"in_reply_to":"ba7be1f8_5505a712","updated":"2015-02-27 16:36:29.000000000","message":"I\u0027ll change the edit method.  I\u0027ll make a separate bug for changing the other method.","commit_id":"9eab73b324ceacdb8788f12e4ba340152033b3bb"}],"sahara/service/validations/cluster_templates.py":[{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"fd2f7e25a927485698120c37ca7586ea4dea4171","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                        data[\u0027hadoop_version\u0027])"},{"line_number":149,"context_line":"        b.check_all_configurations(data)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    if data.get(\u0027default_image_id\u0027):"},{"line_number":152,"context_line":"        b.check_image_registered(data[\u0027default_image_id\u0027])"},{"line_number":153,"context_line":"        b.check_required_image_tags(data[\u0027plugin_name\u0027],"},{"line_number":154,"context_line":"                                    data[\u0027hadoop_version\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_926b23f0","line":151,"updated":"2015-02-25 15:24:10.000000000","message":"this should be indented, you can still get key error here with plugin_name and hadoop_version","commit_id":"19c4fbe05ccc9edbca1b6c87f495e8e51a48cfe6"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"22389de6ad101a3314919902b40e2a119046e233","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                        data[\u0027hadoop_version\u0027])"},{"line_number":149,"context_line":"        b.check_all_configurations(data)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    if data.get(\u0027default_image_id\u0027):"},{"line_number":152,"context_line":"        b.check_image_registered(data[\u0027default_image_id\u0027])"},{"line_number":153,"context_line":"        b.check_required_image_tags(data[\u0027plugin_name\u0027],"},{"line_number":154,"context_line":"                                    data[\u0027hadoop_version\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_e063aa3f","line":151,"in_reply_to":"ba7be1f8_926b23f0","updated":"2015-02-25 15:38:13.000000000","message":"Done","commit_id":"19c4fbe05ccc9edbca1b6c87f495e8e51a48cfe6"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"fd2f7e25a927485698120c37ca7586ea4dea4171","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                    data[\u0027hadoop_version\u0027],"},{"line_number":155,"context_line":"                                    data[\u0027default_image_id\u0027])"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    if data.get(\u0027anti_affinity\u0027):"},{"line_number":158,"context_line":"        b.check_node_processes(data[\u0027plugin_name\u0027], data[\u0027hadoop_version\u0027],"},{"line_number":159,"context_line":"                               data[\u0027anti_affinity\u0027])"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_127f33ac","line":157,"updated":"2015-02-25 15:24:10.000000000","message":"ditto","commit_id":"19c4fbe05ccc9edbca1b6c87f495e8e51a48cfe6"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"22389de6ad101a3314919902b40e2a119046e233","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                    data[\u0027hadoop_version\u0027],"},{"line_number":155,"context_line":"                                    data[\u0027default_image_id\u0027])"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    if data.get(\u0027anti_affinity\u0027):"},{"line_number":158,"context_line":"        b.check_node_processes(data[\u0027plugin_name\u0027], data[\u0027hadoop_version\u0027],"},{"line_number":159,"context_line":"                               data[\u0027anti_affinity\u0027])"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_0067de4d","line":157,"in_reply_to":"ba7be1f8_127f33ac","updated":"2015-02-25 15:38:13.000000000","message":"Done","commit_id":"19c4fbe05ccc9edbca1b6c87f495e8e51a48cfe6"},{"author":{"_account_id":12707,"name":"Jacob Bin Wang","email":"wangbin@awcloud.com","username":"Jacob"},"change_message_id":"c640b74c50ee68762f255ceeebbba02330b170e3","unresolved":false,"context_lines":[{"line_number":139,"context_line":"             \u0027clusters\u0027:  \u0027, \u0027.join(users)})"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def check_cluster_template_update(data, **kwargs):"},{"line_number":143,"context_line":"    if data.get(\u0027plugin_name\u0027):"},{"line_number":144,"context_line":"        b.check_plugin_name_exists(data[\u0027plugin_name\u0027])"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba7be1f8_3903f077","line":142,"updated":"2015-02-27 01:36:10.000000000","message":"Is the name allowed to be changed? If so, the name should also be checked to ensure uniqueness.","commit_id":"0d33cf0a25a43baeacc0bcdc28c802e7bbd63833"},{"author":{"_account_id":8411,"name":"Andrew Lazarev","email":"alazarev@mirantis.com","username":"alazarev"},"change_message_id":"2f332a049fcd1f46cff1633a3e3dd4801950203c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    if data.get(\u0027plugin_name\u0027) and data.get(\u0027hadoop_version\u0027):"},{"line_number":144,"context_line":"        b.check_plugin_supports_version(data[\u0027plugin_name\u0027],"},{"line_number":145,"context_line":"                                        data[\u0027hadoop_version\u0027])"},{"line_number":146,"context_line":"        b.check_all_configurations(data)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if data.get(\u0027default_image_id\u0027):"},{"line_number":149,"context_line":"            b.check_image_registered(data[\u0027default_image_id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_13b09ddc","line":146,"updated":"2015-02-27 20:07:06.000000000","message":"why all this code inside \"data.get(\u0027plugin_name\u0027)\" block? Is it normal?","commit_id":"7d4eeacf36c7ac86dd524fe843dc59faee5007df"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"04d4e295608a3866663acfced672ee78185f1184","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    if data.get(\u0027plugin_name\u0027) and data.get(\u0027hadoop_version\u0027):"},{"line_number":144,"context_line":"        b.check_plugin_supports_version(data[\u0027plugin_name\u0027],"},{"line_number":145,"context_line":"                                        data[\u0027hadoop_version\u0027])"},{"line_number":146,"context_line":"        b.check_all_configurations(data)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if data.get(\u0027default_image_id\u0027):"},{"line_number":149,"context_line":"            b.check_image_registered(data[\u0027default_image_id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_b3a6f151","line":146,"in_reply_to":"ba7be1f8_13b09ddc","updated":"2015-02-27 20:15:43.000000000","message":"It is what is intended.  Not sure if it\u0027s \"normal\".  The configuration stuff also relies on the plugin name/version.","commit_id":"7d4eeacf36c7ac86dd524fe843dc59faee5007df"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"fd0e340ca6212e376cc7f28bb0fe22084209aa7e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    if data.get(\u0027plugin_name\u0027) and data.get(\u0027hadoop_version\u0027):"},{"line_number":144,"context_line":"        b.check_plugin_supports_version(data[\u0027plugin_name\u0027],"},{"line_number":145,"context_line":"                                        data[\u0027hadoop_version\u0027])"},{"line_number":146,"context_line":"        b.check_all_configurations(data)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if data.get(\u0027default_image_id\u0027):"},{"line_number":149,"context_line":"            b.check_image_registered(data[\u0027default_image_id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_33eda18c","line":146,"in_reply_to":"ba7be1f8_13b09ddc","updated":"2015-02-27 20:11:15.000000000","message":"so the tests don\u0027t need to be repeated. Several of these checks\nrequire that plugin_name and hadoop_version are defined.","commit_id":"7d4eeacf36c7ac86dd524fe843dc59faee5007df"}],"sahara/tests/unit/conductor/manager/test_templates.py":[{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"e3bfc4591af4ea56b18c862910d0f97322c3bda7","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        updated_clt \u003d self.api.cluster_template_update(ctx,"},{"line_number":278,"context_line":"                                                       clt_id,"},{"line_number":279,"context_line":"                                                       update_values)"},{"line_number":280,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":283,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_aac76f11","line":280,"updated":"2015-02-20 16:58:00.000000000","message":"same note as on node group tests, try a fresh get and make sure the result matches","commit_id":"16b845353ec2edc984647971655e004d77690c87"},{"author":{"_account_id":10670,"name":"Michael McCune","email":"elmiko@redhat.com","username":"mimccune"},"change_message_id":"01b2708c702b89ce1b9eb2e243b3587868921c0d","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":286,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_a2fe4fac","line":286,"updated":"2015-02-24 15:23:22.000000000","message":"i think we should add a test for the UpdateFailedException","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"dd3a1a80d4cd1107cb4c42f8a1ede98b27ecc577","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":286,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_35fa9775","line":286,"in_reply_to":"ba7be1f8_a2fe4fac","updated":"2015-02-24 15:50:24.000000000","message":"+1, I had that in mind too but forgot about it","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"845f7f1a31a709feca23d89f1e726055bf415196","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":286,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_f996313e","line":286,"in_reply_to":"ba7be1f8_a2fe4fac","updated":"2015-02-24 19:27:00.000000000","message":"Done","commit_id":"d1206f421fbbfb4dab1e77a1d075c42371616506"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"090bacc29383fa716679116fff5a94422317bdcc","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        updated_clt \u003d self.api.cluster_template_get(ctx, clt_id)"},{"line_number":285,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":288,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        # create a cluster and try updating the referenced cluster template"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e47688a3","line":287,"updated":"2015-02-24 19:18:52.000000000","message":"Just a question for others.  We use both \"with testtools.ExpectedException\" and \"assertRaises\" all through the unit tests.\n\nWhich is better?  Which do we want to standardize on in the future?  Or do we not care?","commit_id":"4e3116888af7866a185675659470e52f3744ca20"},{"author":{"_account_id":10670,"name":"Michael McCune","email":"elmiko@redhat.com","username":"mimccune"},"change_message_id":"1489392638fb8b2443c1eaf411e2f800ea9e94f4","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        updated_clt \u003d self.api.cluster_template_get(ctx, clt_id)"},{"line_number":285,"context_line":"        self.assertEqual(UPDATE_NAME, updated_clt[\"name\"])"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        with testtools.ExpectedException(ex.NotFoundException):"},{"line_number":288,"context_line":"            self.api.cluster_template_update(ctx, -1, update_values)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        # create a cluster and try updating the referenced cluster template"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e4912848","line":287,"in_reply_to":"ba7be1f8_e47688a3","updated":"2015-02-24 19:27:29.000000000","message":"i don\u0027t think there is a \"better\" between the two usages. they just expose different types of behavior. in this specific case we could use either.\n\nthe docs do a nice job of illustrating why you might use one over the other, https://docs.python.org/3/library/unittest.html","commit_id":"4e3116888af7866a185675659470e52f3744ca20"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"090bacc29383fa716679116fff5a94422317bdcc","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        cluster_val[\u0027name\u0027] \u003d \"ClusterTempalteUpdateTestCluster\""},{"line_number":294,"context_line":"        cluster_val[\u0027cluster_template_id\u0027] \u003d clt[\u0027id\u0027]"},{"line_number":295,"context_line":"        self.api.cluster_create(ctx, cluster_val)"},{"line_number":296,"context_line":"        self.api.cluster_create(ctx, cluster_tests.SAMPLE_CLUSTER)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        with testtools.ExpectedException(ex.UpdateFailedException):"},{"line_number":299,"context_line":"            self.api.cluster_template_update(ctx, clt[\u0027id\u0027], update_values)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_a4b73039","line":296,"updated":"2015-02-24 19:18:52.000000000","message":"Is there a reason to create a second cluster? I don\u0027t think it proves anything test-wise","commit_id":"4e3116888af7866a185675659470e52f3744ca20"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"75b616cd84a401a03c30f3c468fcbdce530a4e48","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        cluster_val[\u0027name\u0027] \u003d \"ClusterTempalteUpdateTestCluster\""},{"line_number":294,"context_line":"        cluster_val[\u0027cluster_template_id\u0027] \u003d clt[\u0027id\u0027]"},{"line_number":295,"context_line":"        self.api.cluster_create(ctx, cluster_val)"},{"line_number":296,"context_line":"        self.api.cluster_create(ctx, cluster_tests.SAMPLE_CLUSTER)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        with testtools.ExpectedException(ex.UpdateFailedException):"},{"line_number":299,"context_line":"            self.api.cluster_template_update(ctx, clt[\u0027id\u0027], update_values)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_248180fb","line":296,"in_reply_to":"ba7be1f8_a4b73039","updated":"2015-02-24 19:26:21.000000000","message":"Good catch...second entry was part of my debugging stuff.","commit_id":"4e3116888af7866a185675659470e52f3744ca20"},{"author":{"_account_id":8091,"name":"Trevor McKay","email":"tmckay@redhat.com","username":"tmckay"},"change_message_id":"5fa844c42e9ff12ceaea6cfffd4a11e02e9e7dbc","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        lst \u003d self.api.cluster_template_get_all(ctx, **{\u0027badfield\u0027: \u0027junk\u0027})"},{"line_number":270,"context_line":"        self.assertEqual(len(lst), 0)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_clt_update(self):"},{"line_number":273,"context_line":"        ctx \u003d context.ctx()"},{"line_number":274,"context_line":"        clt \u003d self.api.cluster_template_create(ctx, SAMPLE_CLT)"},{"line_number":275,"context_line":"        clt_id \u003d clt[\"id\"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_1095fd87","line":272,"updated":"2015-02-27 16:12:10.000000000","message":"can we add a test for name collision failure?","commit_id":"9eab73b324ceacdb8788f12e4ba340152033b3bb"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"0f4dc3afc275684663f31f8a0464a6149243e3f6","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        lst \u003d self.api.cluster_template_get_all(ctx, **{\u0027badfield\u0027: \u0027junk\u0027})"},{"line_number":270,"context_line":"        self.assertEqual(len(lst), 0)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_clt_update(self):"},{"line_number":273,"context_line":"        ctx \u003d context.ctx()"},{"line_number":274,"context_line":"        clt \u003d self.api.cluster_template_create(ctx, SAMPLE_CLT)"},{"line_number":275,"context_line":"        clt_id \u003d clt[\"id\"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_56720ee6","line":272,"in_reply_to":"ba7be1f8_1095fd87","updated":"2015-02-27 16:36:29.000000000","message":"will do","commit_id":"9eab73b324ceacdb8788f12e4ba340152033b3bb"},{"author":{"_account_id":8090,"name":"Chad Roberts","email":"croberts@redhat.com","username":"croberts"},"change_message_id":"cfd61295364419dad626649c3cce38a9c35f1c8e","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        lst \u003d self.api.cluster_template_get_all(ctx, **{\u0027badfield\u0027: \u0027junk\u0027})"},{"line_number":270,"context_line":"        self.assertEqual(len(lst), 0)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_clt_update(self):"},{"line_number":273,"context_line":"        ctx \u003d context.ctx()"},{"line_number":274,"context_line":"        clt \u003d self.api.cluster_template_create(ctx, SAMPLE_CLT)"},{"line_number":275,"context_line":"        clt_id \u003d clt[\"id\"]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_eaedd58f","line":272,"in_reply_to":"ba7be1f8_56720ee6","updated":"2015-02-27 17:48:34.000000000","message":"Actually, I don\u0027t think this would be the place to test the validation code, right?  Where is the right place?  Or should I remove the validation and just make the impl code do the check at that time so that we raise the appropriate exception here?","commit_id":"9eab73b324ceacdb8788f12e4ba340152033b3bb"}]}
