)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dc7d58b97e57bf1d2b38ddc92baada8c8fad2b4e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yikun Jiang \u003cyikunkero@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-07-05 09:43:33 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change the anti-affinity Filter to adapt to new policy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the anti-affinity filter will get the"},{"line_number":10,"context_line":"max_server_per_host limit from policy rules, and compare it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"5f7c97a3_1ec6ad4a","line":7,"range":{"start_line":7,"start_character":11,"end_line":7,"end_character":32},"updated":"2018-07-05 16:01:24.000000000","message":"ServerGroupAntiAffinityFilter","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yikun Jiang \u003cyikunkero@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-07-05 09:43:33 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change the anti-affinity Filter to adapt to new policy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this patch, the anti-affinity filter will get the"},{"line_number":10,"context_line":"max_server_per_host limit from policy rules, and compare it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"5f7c97a3_6154b854","line":7,"range":{"start_line":7,"start_character":11,"end_line":7,"end_character":32},"in_reply_to":"5f7c97a3_1ec6ad4a","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"}],"nova/objects/request_spec.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dc7d58b97e57bf1d2b38ddc92baada8c8fad2b4e","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            policies \u003d list(filter_properties.get(\u0027group_policies\u0027))"},{"line_number":211,"context_line":"            hosts \u003d list(filter_properties.get(\u0027group_hosts\u0027))"},{"line_number":212,"context_line":"            members \u003d list(filter_properties.get(\u0027group_members\u0027))"},{"line_number":213,"context_line":"            self.instance_group \u003d objects.InstanceGroup(policies\u003dpolicies,"},{"line_number":214,"context_line":"                                                        hosts\u003dhosts,"},{"line_number":215,"context_line":"                                                        members\u003dmembers)"},{"line_number":216,"context_line":"            # hosts has to be not part of the updates for saving the object"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_5273b9b4","line":213,"updated":"2018-07-05 16:01:24.000000000","message":"Wouldn\u0027t you need to handle this to pass policy rather than policies? This is a compat routine for old scheduler interaction.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            policies \u003d list(filter_properties.get(\u0027group_policies\u0027))"},{"line_number":211,"context_line":"            hosts \u003d list(filter_properties.get(\u0027group_hosts\u0027))"},{"line_number":212,"context_line":"            members \u003d list(filter_properties.get(\u0027group_members\u0027))"},{"line_number":213,"context_line":"            self.instance_group \u003d objects.InstanceGroup(policies\u003dpolicies,"},{"line_number":214,"context_line":"                                                        hosts\u003dhosts,"},{"line_number":215,"context_line":"                                                        members\u003dmembers)"},{"line_number":216,"context_line":"            # hosts has to be not part of the updates for saving the object"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_44e66a15","line":213,"in_reply_to":"5f7c97a3_5273b9b4","updated":"2018-07-09 08:48:08.000000000","message":"Yes, I will process these policies in a separate patch","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"}],"nova/scheduler/filters/affinity_filter.py":[{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"937c1a3a396c382eb4cc227d138c209bc0de98b7","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy and policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_72fd9a06","line":105,"range":{"start_line":105,"start_character":11,"end_line":105,"end_character":21},"updated":"2018-06-22 09:22:45.000000000","message":"because of L93~94, there is no need to check if policy is none or not here, right?","commit_id":"9c3bd65d65866813397433b643372b026e654e6b"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"c559664747c44ffab3b3d2781f522b8f8697004b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy and policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_56995b1b","line":105,"range":{"start_line":105,"start_character":11,"end_line":105,"end_character":21},"in_reply_to":"5f7c97a3_72fd9a06","updated":"2018-06-25 02:13:47.000000000","message":"Done","commit_id":"9c3bd65d65866813397433b643372b026e654e6b"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"e047efc3e869cf11c49fee9f9220e09de2e1778f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy and policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_921dd674","line":106,"range":{"start_line":106,"start_character":16,"end_line":106,"end_character":22},"updated":"2018-06-22 10:22:38.000000000","message":"wouldn\u0027t \"servers\" sound better?","commit_id":"9c3bd65d65866813397433b643372b026e654e6b"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"c559664747c44ffab3b3d2781f522b8f8697004b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy and policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_b6c1cfe6","line":106,"range":{"start_line":106,"start_character":16,"end_line":106,"end_character":22},"in_reply_to":"5f7c97a3_921dd674","updated":"2018-06-25 02:13:47.000000000","message":"We decided to use max_server_per_host in [1], so, in here, we just use same name with rule name.\n\n[1] https://review.openstack.org/#/c/546925/","commit_id":"9c3bd65d65866813397433b643372b026e654e6b"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"00440a9801c109f9feac7852e1380beb0daf62c2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        if spec_obj.instance_uuid in host_state.instances.keys():"},{"line_number":99,"context_line":"            return True"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        instances \u003d set(host_state.instances.keys())"},{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_fde829e0","line":103,"range":{"start_line":101,"start_character":8,"end_line":103,"end_character":57},"updated":"2018-06-28 08:38:29.000000000","message":"Image the following situation:\n1. instanceA (belonging to anti-affinity groupAT) is running on hostH (instances includes instanceA)\n2. groupAT has rules {\u0027max_server_per_host\u0027: 2}\n3. now schedule instanceB and instanceC with groupAT in a single call\nthen hostH will pass this filter for both instanceB and instanceC because instances will not have got updated to include instanceB (no codes does that) when filtering hosts for instanceC. This is not the desired behavior for this filter.","commit_id":"afc9305db283494db0131be3343c385603a0fe51"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"b63e72b9c27d1e156e54faa44ca674f00b59de9e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        if spec_obj.instance_uuid in host_state.instances.keys():"},{"line_number":99,"context_line":"            return True"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        instances \u003d set(host_state.instances.keys())"},{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_f8d277fd","line":103,"range":{"start_line":101,"start_character":8,"end_line":103,"end_character":57},"in_reply_to":"5f7c97a3_fde829e0","updated":"2018-07-02 12:04:13.000000000","message":"So, we have the double check mechanism[1] to solve this problem, before we decided to create a vm in specific host.\n\n[1] https://review.openstack.org/#/c/571465","commit_id":"afc9305db283494db0131be3343c385603a0fe51"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        group_hosts \u003d (spec_obj.instance_group.hosts"},{"line_number":102,"context_line":"                       if spec_obj.instance_group else [])"},{"line_number":103,"context_line":"        LOG.debug(\"Group anti affinity: check if %(host)s not \""},{"line_number":104,"context_line":"                  \"in %(configured)s\", {\u0027host\u0027: host_state.host,"},{"line_number":105,"context_line":"                                        \u0027configured\u0027: group_hosts})"},{"line_number":106,"context_line":"        if group_hosts:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_9214f1eb","side":"PARENT","line":103,"range":{"start_line":103,"start_character":12,"end_line":103,"end_character":17},"updated":"2018-07-05 16:17:26.000000000","message":"Should probably maintain some form of a debug log for this filter.","commit_id":"c1b341a17ea8830ff87e068fa7ddbcf9534e96cf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        if spec_obj.instance_uuid in host_state.instances.keys():"},{"line_number":99,"context_line":"            return True"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        instances \u003d set(host_state.instances.keys())"},{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_7230359f","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":17},"updated":"2018-07-05 16:17:26.000000000","message":"So this is the list of instances (UUIDs) on the given host.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            return True"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        instances \u003d set(host_state.instances.keys())"},{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_32263d69","line":102,"updated":"2018-07-05 16:17:26.000000000","message":"And this is the list of instances (UUID) which are members of this group.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        instances \u003d set(host_state.instances.keys())"},{"line_number":102,"context_line":"        members \u003d set(spec_obj.instance_group.members)"},{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_f21be518","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":23},"updated":"2018-07-05 16:17:26.000000000","message":"And this is the set of instances on the host that are also members of this group.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_12c54190","line":106,"range":{"start_line":106,"start_character":51,"end_line":106,"end_character":54},"updated":"2018-07-05 16:17:26.000000000","message":"You\u0027ll get a NoneType error here if this rule isn\u0027t set:\n\n\u003e\u003e\u003e int(None)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: int() argument must be a string, a bytes-like object or a number, not\n \u0027NoneType\u0027\n\u003e\u003e\u003e\n\nSo you likely need a check like this:\n\nif policy.rules and \u0027max_server_per_host\u0027 in policy.rules:\n    max_server_per_host \u003d int(policy.rules[\u0027max_server_per_host\u0027])","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if policy.rules:"},{"line_number":106,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_c1e7ccaa","line":106,"range":{"start_line":106,"start_character":51,"end_line":106,"end_character":54},"in_reply_to":"5f7c97a3_12c54190","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        return len(servers_on_host) \u003c max_server_per_host"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"class ServerGroupAntiAffinityFilter(_GroupAntiAffinityFilter):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_f2c9a578","line":110,"updated":"2018-07-05 16:17:26.000000000","message":"So in the default case, this filter will accept the given host iff there are 0 servers from the group already on this host. Got it. This might be a useful comment to leave in the code since it\u0027s not exactly clear.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        else:"},{"line_number":108,"context_line":"            max_server_per_host \u003d 1"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        return len(servers_on_host) \u003c max_server_per_host"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"class ServerGroupAntiAffinityFilter(_GroupAntiAffinityFilter):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_61b0388c","line":110,"in_reply_to":"5f7c97a3_f2c9a578","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc5ad25b4622e314cac04ced797b4f9fdef0cf57","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if policy.rules and \u0027max_server_per_host\u0027 in policy.rules:"},{"line_number":108,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            max_server_per_host \u003d 1"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_07ef0f87","line":108,"range":{"start_line":108,"start_character":34,"end_line":108,"end_character":37},"updated":"2018-07-09 13:51:05.000000000","message":"We don\u0027t need this explicit cast anymore.","commit_id":"1150e0e4674b8a30b1af1f540517c3208181ec4f"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"014369bbbfd2676574f912f64f18317b35d7549e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        servers_on_host \u003d instances.intersection(members)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if policy.rules and \u0027max_server_per_host\u0027 in policy.rules:"},{"line_number":108,"context_line":"            max_server_per_host \u003d int(policy.rules.get(\u0027max_server_per_host\u0027))"},{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            max_server_per_host \u003d 1"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_fa262aba","line":108,"range":{"start_line":108,"start_character":34,"end_line":108,"end_character":37},"in_reply_to":"5f7c97a3_07ef0f87","updated":"2018-07-09 13:59:52.000000000","message":"Done","commit_id":"1150e0e4674b8a30b1af1f540517c3208181ec4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8b0d63ed40c2fd9b5fbb4c228a56160403ea9d6b","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            max_server_per_host \u003d 1"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        LOG.debug(\"Group affinity: check if server of %(host)s less than\""},{"line_number":113,"context_line":"                  \" %(max_server)s\", {\u0027host\u0027: host_state.host,"},{"line_number":114,"context_line":"                                      \u0027max_server\u0027: max_server_per_host})"},{"line_number":115,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_a463b9dc","line":112,"range":{"start_line":112,"start_character":25,"end_line":112,"end_character":33},"updated":"2018-07-09 12:47:30.000000000","message":"anti-affinity, but this is still a bit confusing. How about we word it like this:\n\n\"Group anti-affinity: check if the number of servers from group %(group_uuid)s on host %(host)s is less than %(max_server)s.\"","commit_id":"1150e0e4674b8a30b1af1f540517c3208181ec4f"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"014369bbbfd2676574f912f64f18317b35d7549e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            max_server_per_host \u003d 1"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        LOG.debug(\"Group affinity: check if server of %(host)s less than\""},{"line_number":113,"context_line":"                  \" %(max_server)s\", {\u0027host\u0027: host_state.host,"},{"line_number":114,"context_line":"                                      \u0027max_server\u0027: max_server_per_host})"},{"line_number":115,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_67da83e6","line":112,"range":{"start_line":112,"start_character":25,"end_line":112,"end_character":33},"in_reply_to":"5f7c97a3_a463b9dc","updated":"2018-07-09 13:59:52.000000000","message":"Done","commit_id":"1150e0e4674b8a30b1af1f540517c3208181ec4f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f6e26be1e28ee24cce0bfe8272a00deba59e285","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        LOG.debug(\"Group anti-affinity: check if the number of servers from \""},{"line_number":113,"context_line":"                  \"group %(group_uuid)s on host %(host)s is less than \""},{"line_number":114,"context_line":"                  \"%(max_server)s.\","},{"line_number":115,"context_line":"                  {\u0027group_uuid\u0027: spec_obj.instance_group.uuid,"},{"line_number":116,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":117,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":118,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f7c97a3_bac6729b","line":115,"range":{"start_line":115,"start_character":33,"end_line":115,"end_character":61},"updated":"2018-07-09 14:05:54.000000000","message":"\u0027uuid\u0027 might not be set if we\u0027re getting the spec.instance_group from a very old request spec and using that populate_group_info compat routine, so we need to guard for that.","commit_id":"9c4d0f5664110bcee861184960ee0e5d7cd0ccd6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"871fbba45072dbbb00705fc182f194e3912a47e6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        LOG.debug(\"Group anti-affinity: check if the number of servers from \""},{"line_number":113,"context_line":"                  \"group %(group_uuid)s on host %(host)s is less than \""},{"line_number":114,"context_line":"                  \"%(max_server)s.\","},{"line_number":115,"context_line":"                  {\u0027group_uuid\u0027: spec_obj.instance_group.uuid,"},{"line_number":116,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":117,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":118,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f7c97a3_9dd61053","line":115,"range":{"start_line":115,"start_character":33,"end_line":115,"end_character":61},"in_reply_to":"5f7c97a3_bac6729b","updated":"2018-07-09 14:49:47.000000000","message":"Done","commit_id":"9c4d0f5664110bcee861184960ee0e5d7cd0ccd6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f6af4f3d4d7e16d8a223b7fd2e1ff9be604a2ea8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Only invoke the filter if \u0027anti-affinity\u0027 is configured"},{"line_number":91,"context_line":"        instance_group \u003d spec_obj.instance_group"},{"line_number":92,"context_line":"        policy \u003d instance_group.policy if instance_group else None"},{"line_number":93,"context_line":"        if not policy or self.policy_name !\u003d policy:"},{"line_number":94,"context_line":"            return True"},{"line_number":95,"context_line":"        # NOTE(hanrong): Move operations like resize can check the same source"},{"line_number":96,"context_line":"        # compute node where the instance is. That case, AntiAffinityFilter"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_b8dcff17","line":93,"range":{"start_line":93,"start_character":11,"end_line":93,"end_character":24},"updated":"2018-07-11 16:24:35.000000000","message":"this is redundant. If policy is None then the self.policy_name !\u003d policy will be true anyhow","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f6af4f3d4d7e16d8a223b7fd2e1ff9be604a2ea8","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        group_uuid \u003d (instance_group.uuid"},{"line_number":115,"context_line":"                      if instance_group and \u0027uuid\u0027 in instance_group"},{"line_number":116,"context_line":"                      else \u0027n/a\u0027)"},{"line_number":117,"context_line":"        LOG.debug(\"Group anti-affinity: check if the number of servers from \""},{"line_number":118,"context_line":"                  \"group %(group_uuid)s on host %(host)s is less than \""},{"line_number":119,"context_line":"                  \"%(max_server)s.\","},{"line_number":120,"context_line":"                  {\u0027group_uuid\u0027: group_uuid,"},{"line_number":121,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":122,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":123,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"},{"line_number":124,"context_line":"        # the given host if there are 0 servers from the group already on"},{"line_number":125,"context_line":"        # this host."},{"line_number":126,"context_line":"        return len(servers_on_host) \u003c max_server_per_host"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_384d4fc5","line":123,"range":{"start_line":117,"start_character":0,"end_line":123,"end_character":1},"updated":"2018-07-11 16:24:35.000000000","message":"I would add the server_on_host to be more informative about why the check will pass / fail below","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b12d1b80aec67fa75cc209365a014430e2da753","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        group_uuid \u003d (instance_group.uuid"},{"line_number":115,"context_line":"                      if instance_group and \u0027uuid\u0027 in instance_group"},{"line_number":116,"context_line":"                      else \u0027n/a\u0027)"},{"line_number":117,"context_line":"        LOG.debug(\"Group anti-affinity: check if the number of servers from \""},{"line_number":118,"context_line":"                  \"group %(group_uuid)s on host %(host)s is less than \""},{"line_number":119,"context_line":"                  \"%(max_server)s.\","},{"line_number":120,"context_line":"                  {\u0027group_uuid\u0027: group_uuid,"},{"line_number":121,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":122,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":123,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"},{"line_number":124,"context_line":"        # the given host if there are 0 servers from the group already on"},{"line_number":125,"context_line":"        # this host."},{"line_number":126,"context_line":"        return len(servers_on_host) \u003c max_server_per_host"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_82998d1f","line":123,"range":{"start_line":117,"start_character":0,"end_line":123,"end_character":1},"in_reply_to":"5f7c97a3_384d4fc5","updated":"2018-07-11 18:59:17.000000000","message":"You just mean add that detail to the comment, right?","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8dcbe022de832ee5cc3b4aaa91995b917ba76418","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        group_uuid \u003d (instance_group.uuid"},{"line_number":115,"context_line":"                      if instance_group and \u0027uuid\u0027 in instance_group"},{"line_number":116,"context_line":"                      else \u0027n/a\u0027)"},{"line_number":117,"context_line":"        LOG.debug(\"Group anti-affinity: check if the number of servers from \""},{"line_number":118,"context_line":"                  \"group %(group_uuid)s on host %(host)s is less than \""},{"line_number":119,"context_line":"                  \"%(max_server)s.\","},{"line_number":120,"context_line":"                  {\u0027group_uuid\u0027: group_uuid,"},{"line_number":121,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":122,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":123,"context_line":"        # In the default case(max_server_per_host\u003d1), this filter will accept"},{"line_number":124,"context_line":"        # the given host if there are 0 servers from the group already on"},{"line_number":125,"context_line":"        # this host."},{"line_number":126,"context_line":"        return len(servers_on_host) \u003c max_server_per_host"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_7bfbae47","line":123,"range":{"start_line":117,"start_character":0,"end_line":123,"end_character":1},"in_reply_to":"5f7c97a3_82998d1f","updated":"2018-07-12 10:36:02.000000000","message":"I would add that to the debug log.","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f6a7f37bfdff19e1056393330d4bf892791df82","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                  {\u0027group_uuid\u0027: group_uuid,"},{"line_number":121,"context_line":"                   \u0027host\u0027: host_state.host,"},{"line_number":122,"context_line":"                   \u0027max_server\u0027: max_server_per_host})"},{"line_number":123,"context_line":"        # Note(yikun): If the number of servers from same group on this host"},{"line_number":124,"context_line":"        # is less than the max_server_per_host, this filter will accept the"},{"line_number":125,"context_line":"        # given host. In the default case(max_server_per_host\u003d1), this filter"},{"line_number":126,"context_line":"        # will accept the given host if there are 0 servers from the group"}],"source_content_type":"text/x-python","patch_set":27,"id":"5f7c97a3_ccaa4683","line":123,"range":{"start_line":123,"start_character":10,"end_line":123,"end_character":14},"updated":"2018-07-12 12:18:16.000000000","message":"nit: NOTE","commit_id":"a77f57acf7cf1b69a64d68d1a45c2217ec8fad79"}],"nova/tests/unit/scheduler/filters/test_affinity_filters.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"6d37c8b3509982e2aa8506b2e203b7945ae790e2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"},{"line_number":205,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":206,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":207,"context_line":"            {\"max_server_per_host\": 1}, [uuids.inst1])"},{"line_number":208,"context_line":"        self.assertFalse(result)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def test_group_anti_affinity_filter_with_rules_pass(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_35003a02","line":207,"range":{"start_line":207,"start_character":36,"end_line":207,"end_character":37},"updated":"2018-05-31 12:56:37.000000000","message":"better have a failed test with rules other than default value.","commit_id":"89204f398d9b46f37a48e3413be169ed07575190"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"03cafd60a7a0862512282bd9f72fc860311e8bb2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"},{"line_number":205,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":206,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":207,"context_line":"            {\"max_server_per_host\": 1}, [uuids.inst1])"},{"line_number":208,"context_line":"        self.assertFalse(result)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def test_group_anti_affinity_filter_with_rules_pass(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_44a7180d","line":207,"range":{"start_line":207,"start_character":36,"end_line":207,"end_character":37},"in_reply_to":"5f7c97a3_35003a02","updated":"2018-06-04 03:51:01.000000000","message":"Done","commit_id":"89204f398d9b46f37a48e3413be169ed07575190"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":182,"context_line":"                policy)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _test_group_anti_affinity_filter_with_rules(self, filt_cls, rules,"},{"line_number":185,"context_line":"                                                    members):"},{"line_number":186,"context_line":"        inst1 \u003d objects.Instance(uuid\u003duuids.inst1)"},{"line_number":187,"context_line":"        inst2 \u003d objects.Instance(uuid\u003duuids.inst2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_f29c455c","line":184,"range":{"start_line":184,"start_character":58,"end_line":184,"end_character":66},"updated":"2018-07-05 16:17:26.000000000","message":"Do we really need this? It\u0027s always the same class in every test that calls this method.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":182,"context_line":"                policy)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _test_group_anti_affinity_filter_with_rules(self, filt_cls, rules,"},{"line_number":185,"context_line":"                                                    members):"},{"line_number":186,"context_line":"        inst1 \u003d objects.Instance(uuid\u003duuids.inst1)"},{"line_number":187,"context_line":"        inst2 \u003d objects.Instance(uuid\u003duuids.inst2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_843562dd","line":184,"range":{"start_line":184,"start_character":58,"end_line":184,"end_character":66},"in_reply_to":"5f7c97a3_f29c455c","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        # 2 instances on same host"},{"line_number":196,"context_line":"        host_wit_2_inst \u003d fakes.FakeHostState("},{"line_number":197,"context_line":"            \u0027host1\u0027, \u0027node1\u0027, {}, instances\u003d[inst1, inst2])"},{"line_number":198,"context_line":"        affinity_filter.ServerGroupAntiAffinityFilter()"},{"line_number":199,"context_line":"        return filt_cls.host_passes(host_wit_2_inst, spec_obj)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_group_anti_affinity_filter_with_max_0(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_528c192d","line":198,"range":{"start_line":198,"start_character":8,"end_line":198,"end_character":55},"updated":"2018-07-05 16:17:26.000000000","message":"This isn\u0027t used.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        # 2 instances on same host"},{"line_number":196,"context_line":"        host_wit_2_inst \u003d fakes.FakeHostState("},{"line_number":197,"context_line":"            \u0027host1\u0027, \u0027node1\u0027, {}, instances\u003d[inst1, inst2])"},{"line_number":198,"context_line":"        affinity_filter.ServerGroupAntiAffinityFilter()"},{"line_number":199,"context_line":"        return filt_cls.host_passes(host_wit_2_inst, spec_obj)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def test_group_anti_affinity_filter_with_max_0(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_41fdfc06","line":198,"range":{"start_line":198,"start_character":8,"end_line":198,"end_character":55},"in_reply_to":"5f7c97a3_528c192d","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def test_group_anti_affinity_filter_with_max_0(self):"},{"line_number":202,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":203,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":204,"context_line":"            {\"max_server_per_host\": 0}, [])"},{"line_number":205,"context_line":"        self.assertFalse(result)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_92be31ad","line":204,"range":{"start_line":204,"start_character":36,"end_line":204,"end_character":37},"updated":"2018-07-05 16:17:26.000000000","message":"This would never happen according to the spec:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/complex-anti-affinity-policies.html#proposed-change\n\nThe max_server_per_host rule must have a positive int value.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def test_group_anti_affinity_filter_with_max_0(self):"},{"line_number":202,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":203,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":204,"context_line":"            {\"max_server_per_host\": 0}, [])"},{"line_number":205,"context_line":"        self.assertFalse(result)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_643a86cd","line":204,"range":{"start_line":204,"start_character":36,"end_line":204,"end_character":37},"in_reply_to":"5f7c97a3_92be31ad","updated":"2018-07-09 08:48:08.000000000","message":"Yep, will remove this case","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            {\"max_server_per_host\": 0}, [])"},{"line_number":205,"context_line":"        self.assertFalse(result)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"},{"line_number":208,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":209,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":210,"context_line":"            {\"max_server_per_host\": 1}, [uuids.inst1])"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_12e0e1ca","line":207,"range":{"start_line":207,"start_character":8,"end_line":207,"end_character":55},"updated":"2018-07-05 16:17:26.000000000","message":"A docstring comment for the test about why it fails would be nice.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            {\"max_server_per_host\": 0}, [])"},{"line_number":205,"context_line":"        self.assertFalse(result)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_group_anti_affinity_filter_with_rules_fail(self):"},{"line_number":208,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":209,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":210,"context_line":"            {\"max_server_per_host\": 1}, [uuids.inst1])"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_24c00e2b","line":207,"range":{"start_line":207,"start_character":8,"end_line":207,"end_character":55},"in_reply_to":"5f7c97a3_12e0e1ca","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        self.assertFalse(result)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_group_anti_affinity_filter_with_rules_pass(self):"},{"line_number":218,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":219,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":220,"context_line":"            {\"max_server_per_host\": 1}, [])"},{"line_number":221,"context_line":"        self.assertTrue(result)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":224,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_92ecf1bc","line":221,"range":{"start_line":218,"start_character":8,"end_line":221,"end_character":31},"updated":"2018-07-05 16:17:26.000000000","message":"This is a bit redundant with test_group_anti_affinity_filter_passes but I suppose it\u0027s OK since it\u0027s testing an explicit value of 1 with the rules being specified rather than coming from the default w/o rules being specified.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87625b63dfbc0844651a2a4ae0dbe8f3a644c552","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            {\"max_server_per_host\": 1}, [])"},{"line_number":221,"context_line":"        self.assertTrue(result)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":224,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":225,"context_line":"            {\"max_server_per_host\": 2}, [uuids.inst1])"},{"line_number":226,"context_line":"        self.assertTrue(result)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def test_group_anti_affinity_filter_allows_instance_to_same_host(self):"},{"line_number":229,"context_line":"        fake_uuid \u003d uuids.fake"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_122ea1f8","line":226,"range":{"start_line":223,"start_character":8,"end_line":226,"end_character":31},"updated":"2018-07-05 16:17:26.000000000","message":"OK this passes because there is 1 member from the group on the host which has 2 instances on it, and max_server_per_host\u003d2 which means we can have at most 2 members from the same group on the same host. Might want to add a comment for documenting the test.","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"1805c2127c6f54cb3d7b35bdd1d7f3952d4b541c","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            {\"max_server_per_host\": 1}, [])"},{"line_number":221,"context_line":"        self.assertTrue(result)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":224,"context_line":"            affinity_filter.ServerGroupAntiAffinityFilter(),"},{"line_number":225,"context_line":"            {\"max_server_per_host\": 2}, [uuids.inst1])"},{"line_number":226,"context_line":"        self.assertTrue(result)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def test_group_anti_affinity_filter_allows_instance_to_same_host(self):"},{"line_number":229,"context_line":"        fake_uuid \u003d uuids.fake"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f7c97a3_e4dbf61d","line":226,"range":{"start_line":223,"start_character":8,"end_line":226,"end_character":31},"in_reply_to":"5f7c97a3_122ea1f8","updated":"2018-07-09 08:48:08.000000000","message":"Done","commit_id":"d0625456bae606f6437bfa456b88ba4b83bb4904"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8f47c9174f734070feb9792fc634d9ddd27874fc","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            policy\u003d\u0027affinity\u0027))"},{"line_number":150,"context_line":"        self.assertTrue(filt_cls.host_passes(host, spec_obj))"},{"line_number":151,"context_line":"        spec_obj \u003d objects.RequestSpec(instance_group\u003dobjects.InstanceGroup("},{"line_number":152,"context_line":"            policy\u003dpolicy, members\u003d[], rules\u003d{}), instance_uuid\u003duuids.fake)"},{"line_number":153,"context_line":"        spec_obj.instance_group.hosts \u003d []"},{"line_number":154,"context_line":"        self.assertTrue(filt_cls.host_passes(host, spec_obj))"},{"line_number":155,"context_line":"        spec_obj.instance_group.hosts \u003d [\u0027host2\u0027]"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_5c613a10","line":152,"range":{"start_line":152,"start_character":39,"end_line":152,"end_character":47},"updated":"2018-07-10 18:09:13.000000000","message":"nit: we probably don\u0027t need to default these to {} now since InstanceGroup.rules will do that for us if \u0027_rules\u0027 is not set.","commit_id":"afffa80ae0a164fca2d38954d9642646ed321c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f6af4f3d4d7e16d8a223b7fd2e1ff9be604a2ea8","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def test_group_anti_affinity_filter_with_rules_pass(self):"},{"line_number":206,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":207,"context_line":"            # Use a string for the value to verify InstanceGroupPolicy.rules"},{"line_number":208,"context_line":"            # casts the value to an int"},{"line_number":209,"context_line":"            {\"max_server_per_host\": \"1\"}, [])"},{"line_number":210,"context_line":"        self.assertTrue(result)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_58992b1c","line":208,"range":{"start_line":207,"start_character":0,"end_line":208,"end_character":39},"updated":"2018-07-11 16:24:35.000000000","message":"I think we should not test the casting here. BTW all the other tests passes an int, that is stored in the DictOfString _rules field that is casted back to int by the rules property so you already test the casting in every case implicitly here.","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b12d1b80aec67fa75cc209365a014430e2da753","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def test_group_anti_affinity_filter_with_rules_pass(self):"},{"line_number":206,"context_line":"        result \u003d self._test_group_anti_affinity_filter_with_rules("},{"line_number":207,"context_line":"            # Use a string for the value to verify InstanceGroupPolicy.rules"},{"line_number":208,"context_line":"            # casts the value to an int"},{"line_number":209,"context_line":"            {\"max_server_per_host\": \"1\"}, [])"},{"line_number":210,"context_line":"        self.assertTrue(result)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_028d7dd3","line":208,"range":{"start_line":207,"start_character":0,"end_line":208,"end_character":39},"in_reply_to":"5f7c97a3_58992b1c","updated":"2018-07-11 18:59:17.000000000","message":"The filter was explicitly casting to int originally and I pointed out it could be removed, so then this wrinkle was added. I don\u0027t care if we leave the string here or not.","commit_id":"06a184a4140557bcf74b555930e89de87eed8174"}]}
