)]}'
{"neutron_tempest_plugin/common/socat.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _open_ssh_channel(ssh_client):"},{"line_number":41,"context_line":"    return ssh_client.connect().get_transport().open_session()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def address(address, args\u003dNone, options\u003dNone, **replace_vars):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_f7504ad7","line":41,"updated":"2018-05-03 20:25:31.000000000","message":"do You really need special function for that?","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"e2e3b3050a1c9f16ef176f6fae39ba046027025e","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _open_ssh_channel(ssh_client):"},{"line_number":41,"context_line":"    return ssh_client.connect().get_transport().open_session()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def address(address, args\u003dNone, options\u003dNone, **replace_vars):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_c5e8ef17","line":41,"in_reply_to":"5f7c97a3_f7504ad7","updated":"2018-05-04 08:35:48.000000000","message":"True. It is used only once.","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    return option(\u0027bind\u0027, host)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"fork \u003d \u0027fork\u0027"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def ip_multicast_ttl(ttl):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_17738682","line":77,"updated":"2018-05-03 20:25:31.000000000","message":"where this is used?","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    ssh_client.exec_command(INSTALL_COMMAND)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def socat(ssh_client, source\u003dSTDIO, destination\u003dSTDIO, command\u003dCOMMAND,"},{"line_number":32,"context_line":"          timeout\u003dREAD_WRITE_TIMEOUT, **replace_vars):"},{"line_number":33,"context_line":"    command \u003d \u0027 \u0027.join([command, source, destination]).format(**replace_vars)"},{"line_number":34,"context_line":"    channel \u003d ssh_client.connect().get_transport().open_session()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d2927757","line":31,"updated":"2018-05-28 09:47:22.000000000","message":"For me it looks like this could be class name and below functions like \"address\", \"udp_datagram\" and others could be defined inside this class as methods like e.g.:\naddress \u003d\u003e format_address()\noption \u003d\u003e format_option()\n\nand other as attributes.","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    return option(\u0027bind\u0027, host)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"fork \u003d \u0027fork\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def ip_multicast_ttl(ttl):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_729b6372","line":73,"updated":"2018-05-28 09:47:22.000000000","message":"If You want to use it as \"constant\" maybe it should be defined at top of this file and should be written with uppercase","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"}],"neutron_tempest_plugin/config.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                    \u0027\"cidr\"\u003cSUBNET/MASK\u003e - string \u0027"},{"line_number":59,"context_line":"                    \u0027\"provider:segmentation_id\":\u003cVLAN_ID\u003e - integer\u0027),"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    # Multicast tests options"},{"line_number":62,"context_line":"    cfg.StrOpt(\u0027multicast_group_range\u0027,"},{"line_number":63,"context_line":"               default\u003d\u0027224.0.0.120-224.0.0.250\u0027,"},{"line_number":64,"context_line":"               help\u003d\u0027Unallocated multicast IPv4 range, which will be used to \u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_f280d3f9","line":61,"updated":"2018-05-28 09:47:22.000000000","message":"IMHO this comment is not necessary","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"030b6c4885a306b7ab181d78be38b3abc14b2440","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                    \u0027test the multicast support.\u0027),"},{"line_number":64,"context_line":"    cfg.StrOpt(\u0027multicast_scenarios\u0027,"},{"line_number":65,"context_line":"               default\u003d\u0027[[\"default\", {}]]\u0027,"},{"line_number":66,"context_line":"               help\u003d\u0027JSON text containing a list of scenarios network \u0027"},{"line_number":67,"context_line":"                    \u0027creation parameters for test_multicast. \u0027"},{"line_number":68,"context_line":"                    \u0027Scenario list schema:\\n\u0027"},{"line_number":69,"context_line":"                    \u0027  [[\u003cscenario-name1:string\u003e, \u003cparams1:object\u003e],\\n\u0027"},{"line_number":70,"context_line":"                    \u0027   [\u003cscenario-name2:string\u003e, \u003cparams2:object\u003e],\\n\u0027"},{"line_number":71,"context_line":"                    \u0027   ...]\\n\u0027"},{"line_number":72,"context_line":"                    \u0027Param objects JSON schema:\\n\u0027"},{"line_number":73,"context_line":"                    \u0027  {\u003cnetwork-param1:string\u003e: \u003cparam-value1\u003e,\\n\u0027"},{"line_number":74,"context_line":"                    \u0027   \u003cnetwork-param2:string\u003e: \u003cparam-value1\u003e,\\n\u0027"},{"line_number":75,"context_line":"                    \u0027   ...}\\n\u0027"},{"line_number":76,"context_line":"                    \u0027For parameters references please see OS documentation:\\n\u0027"},{"line_number":77,"context_line":"                    \u0027  https://developer.openstack.org/api-ref/network/v2/\u0027"},{"line_number":78,"context_line":"                    \u0027#create-network\\n\u0027"},{"line_number":79,"context_line":"                    \u0027\\n\u0027"},{"line_number":80,"context_line":"                    \u0027Example:\\n\u0027"},{"line_number":81,"context_line":"                    \u0027  [\"custom\": {\"ip_multicast_ttl\": 1,\\n\u0027"},{"line_number":82,"context_line":"                    \u0027              \"sender_network_id\": \"\u003csome-network-id\u003e\",\\n\u0027"},{"line_number":83,"context_line":"                    \u0027              \"receiver_network_id: \"\u003csome-network-id\u003e\"}]\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"]"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_0e76d140","line":83,"range":{"start_line":66,"start_character":20,"end_line":83,"end_character":79},"updated":"2018-06-19 08:24:40.000000000","message":"do You need those new-line chars here?","commit_id":"3c4e49224835bd40d73ee339d51343612b9b8053"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"208ba6d8f2e7e4492ffda9c32f68c02382e3d407","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                    \u0027test the multicast support.\u0027),"},{"line_number":64,"context_line":"    cfg.StrOpt(\u0027multicast_scenarios\u0027,"},{"line_number":65,"context_line":"               default\u003d\u0027[[\"default\", {}]]\u0027,"},{"line_number":66,"context_line":"               help\u003d\u0027JSON text containing a list of scenarios network \u0027"},{"line_number":67,"context_line":"                    \u0027creation parameters for test_multicast. \u0027"},{"line_number":68,"context_line":"                    \u0027Scenario list schema:\\n\u0027"},{"line_number":69,"context_line":"                    \u0027  [[\u003cscenario-name1:string\u003e, \u003cparams1:object\u003e],\\n\u0027"},{"line_number":70,"context_line":"                    \u0027   [\u003cscenario-name2:string\u003e, \u003cparams2:object\u003e],\\n\u0027"},{"line_number":71,"context_line":"                    \u0027   ...]\\n\u0027"},{"line_number":72,"context_line":"                    \u0027Param objects JSON schema:\\n\u0027"},{"line_number":73,"context_line":"                    \u0027  {\u003cnetwork-param1:string\u003e: \u003cparam-value1\u003e,\\n\u0027"},{"line_number":74,"context_line":"                    \u0027   \u003cnetwork-param2:string\u003e: \u003cparam-value1\u003e,\\n\u0027"},{"line_number":75,"context_line":"                    \u0027   ...}\\n\u0027"},{"line_number":76,"context_line":"                    \u0027For parameters references please see OS documentation:\\n\u0027"},{"line_number":77,"context_line":"                    \u0027  https://developer.openstack.org/api-ref/network/v2/\u0027"},{"line_number":78,"context_line":"                    \u0027#create-network\\n\u0027"},{"line_number":79,"context_line":"                    \u0027\\n\u0027"},{"line_number":80,"context_line":"                    \u0027Example:\\n\u0027"},{"line_number":81,"context_line":"                    \u0027  [\"custom\": {\"ip_multicast_ttl\": 1,\\n\u0027"},{"line_number":82,"context_line":"                    \u0027              \"sender_network_id\": \"\u003csome-network-id\u003e\",\\n\u0027"},{"line_number":83,"context_line":"                    \u0027              \"receiver_network_id: \"\u003csome-network-id\u003e\"}]\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"]"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_31969240","line":83,"range":{"start_line":66,"start_character":20,"end_line":83,"end_character":79},"in_reply_to":"5f7c97a3_0e76d140","updated":"2018-06-19 09:01:16.000000000","message":"Actually I thing so as this message is going to be printed to the user (to be verified).","commit_id":"3c4e49224835bd40d73ee339d51343612b9b8053"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"030b6c4885a306b7ab181d78be38b3abc14b2440","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    \u0027  [\"custom\": {\"ip_multicast_ttl\": 1,\\n\u0027"},{"line_number":82,"context_line":"                    \u0027              \"sender_network_id\": \"\u003csome-network-id\u003e\",\\n\u0027"},{"line_number":83,"context_line":"                    \u0027              \"receiver_network_id: \"\u003csome-network-id\u003e\"}]\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"# TODO(amuller): Redo configuration options registration as part of the planned"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_eef6f590","line":84,"updated":"2018-06-19 08:24:40.000000000","message":"Why do You need to have such \"complicated\" config option with scenarios for test defined there? Can\u0027t You just define some scenarios in code directly? Do we really need to add such additional config option?","commit_id":"3c4e49224835bd40d73ee339d51343612b9b8053"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"208ba6d8f2e7e4492ffda9c32f68c02382e3d407","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    \u0027  [\"custom\": {\"ip_multicast_ttl\": 1,\\n\u0027"},{"line_number":82,"context_line":"                    \u0027              \"sender_network_id\": \"\u003csome-network-id\u003e\",\\n\u0027"},{"line_number":83,"context_line":"                    \u0027              \"receiver_network_id: \"\u003csome-network-id\u003e\"}]\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"# TODO(amuller): Redo configuration options registration as part of the planned"}],"source_content_type":"text/x-python","patch_set":40,"id":"5f7c97a3_310bf27d","line":84,"in_reply_to":"5f7c97a3_eef6f590","updated":"2018-06-19 09:01:16.000000000","message":"I see your point. I personally find tempest.conf not the best location for a so detailed costomization. The fact is multicast feature is not fully implemented on a basic OpenStack implementation mainly because of missing support on neutron provisioned router. There could be instead interest in having this feature tested with physical routers and on such case receiver and sender networks should be provided by the user, or when using some SDN controller that is able to provide requested features. Let simplify this and leave this \"configurability\" for another change to be discussed in the future when real user cases reach to me with more details.","commit_id":"3c4e49224835bd40d73ee339d51343612b9b8053"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f03149ef760feb392d65ab091f990e094c1ac31d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"               help\u003d\u0027Unallocated multi-cast IPv4 range, which will be used to \u0027"},{"line_number":72,"context_line":"                    \u0027test the multi-cast support.\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027multicast_v6_group_range\u0027,"},{"line_number":74,"context_line":"               default\u003d\u0027FF01::/8\u0027,"},{"line_number":75,"context_line":"               help\u003d\u0027Unallocated multi-cast IPv6 range, which will be used to \u0027"},{"line_number":76,"context_line":"                    \u0027test the multi-cast support.\u0027),"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_35b9882d","line":74,"updated":"2019-07-11 12:50:13.000000000","message":"I think the range is FF01::/8-FF0F::/8\n\nhttps://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml\n\nAlthough I\u0027m not exactly sure which addresses we\u0027d use in a test.","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"796202cd4749b26df13965cd109bac7791de56ff","unresolved":false,"context_lines":[{"line_number":71,"context_line":"               help\u003d\u0027Unallocated multi-cast IPv4 range, which will be used to \u0027"},{"line_number":72,"context_line":"                    \u0027test the multi-cast support.\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027multicast_v6_group_range\u0027,"},{"line_number":74,"context_line":"               default\u003d\u0027FF01::/8\u0027,"},{"line_number":75,"context_line":"               help\u003d\u0027Unallocated multi-cast IPv6 range, which will be used to \u0027"},{"line_number":76,"context_line":"                    \u0027test the multi-cast support.\u0027),"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_276e3b95","line":74,"in_reply_to":"7faddb67_35b9882d","updated":"2019-07-11 13:51:17.000000000","message":"Lets not add it now as there is no IPv6 multicast test in this patch. It can be added later","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"}],"neutron_tempest_plugin/scenario/test_multicast.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                \"Errors receiving multicast message.\")"},{"line_number":196,"context_line":"            self.assertEqual("},{"line_number":197,"context_line":"                \u0027\\n\u0027, data[-1],"},{"line_number":198,"context_line":"                \"Message not terminated by \u0027\\n\u0027 as expected\")"},{"line_number":199,"context_line":"            message \u003d data[:-1]"},{"line_number":200,"context_line":"            LOG.debug(\"Multicast message received: %r\", message)"},{"line_number":201,"context_line":"            return message"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b71892d3","line":198,"updated":"2018-05-03 20:25:31.000000000","message":"missing \".\" at the end of message","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                    exit_status\u003dchannel.recv_exit_status(),"},{"line_number":214,"context_line":"                    stderr\u003dself._recv_stderr(channel)))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _check_servers_interconnectivity(self, sender, receiver):"},{"line_number":217,"context_line":"        \"\"\"Send 1 ping message from sender server to receiver server"},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_d720aefa","line":216,"updated":"2018-05-03 20:25:31.000000000","message":"Why You don\u0027t use https://github.com/openstack/neutron-tempest-plugin/blob/7681a5cf5769211dc355e2bf8cd7499795f6de22/neutron_tempest_plugin/scenario/base.py#L256 ?","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            multicast_ip\u003dmulticast_ip, management_ip\u003dmanagement_ip)"},{"line_number":285,"context_line":"        return server"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def install_socat(self, server):"},{"line_number":288,"context_line":"        try:"},{"line_number":289,"context_line":"            LOG.debug(\"Installing socat on %r server.\", server.name)"},{"line_number":290,"context_line":"            channel \u003d socat.install_socat(server.ssh)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b77df2e8","line":287,"range":{"start_line":287,"start_character":8,"end_line":287,"end_character":21},"updated":"2018-05-03 20:25:31.000000000","message":"why this name not starts with \"_\" as other \"private\" methods?","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        else:"},{"line_number":296,"context_line":"            return channel"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def socat(self, server, source\u003dsocat.STDIO, destination\u003dsocat.STDIO):"},{"line_number":299,"context_line":"        try:"},{"line_number":300,"context_line":"            LOG.debug(\"Execute socat on %r server with source %r \""},{"line_number":301,"context_line":"                      \"and destination %r.\", server.name, source, destination)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_77875ad9","line":298,"range":{"start_line":298,"start_character":8,"end_line":298,"end_character":13},"updated":"2018-05-03 20:25:31.000000000","message":"this name is confusing IMO. It should be something like \"run_socat\" or \"get_socat\" or something like that","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            return channel"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"class MulticastTestServer("},{"line_number":314,"context_line":"        collections.namedtuple("},{"line_number":315,"context_line":"            \u0027MulticastTestServer\u0027,"},{"line_number":316,"context_line":"            [\u0027server\u0027, \u0027name\u0027, \u0027ssh\u0027, \u0027management_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b7cbb21c","line":313,"updated":"2018-05-03 20:25:31.000000000","message":"nit: I would personally move it to top of this file - IMHO it would be more readable then","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"e2e3b3050a1c9f16ef176f6fae39ba046027025e","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            return channel"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"class MulticastTestServer("},{"line_number":314,"context_line":"        collections.namedtuple("},{"line_number":315,"context_line":"            \u0027MulticastTestServer\u0027,"},{"line_number":316,"context_line":"            [\u0027server\u0027, \u0027name\u0027, \u0027ssh\u0027, \u0027management_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_65cd5b5c","line":313,"in_reply_to":"5f7c97a3_b7cbb21c","updated":"2018-05-04 08:35:48.000000000","message":"The order is not relevant in Python. I personally prefer a top down approach. It makes me easier to read starting from entry point top level, then read about details. But it is just a matter of personal style. The reason most of people does the opposite is because of old languages like C that requires things to be defined before use (until you don\u0027t put declarations into header file). Python like Java and most of modern languages doesn\u0027t care about it as object binding doesn\u0027t happen during first parsing as was happening in early languages that had to run on computers with low memory. But old developers habits resist to tools improvements as I see and I don\u0027t have problems in changing the order of things because really it doesn\u0027t matter much to me.","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        return self.server[\u0027id\u0027]"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"def _rand_name(name\u003dNone):"},{"line_number":328,"context_line":"    if name:"},{"line_number":329,"context_line":"        return data_utils.rand_name(\u0027multicast-\u0027 + name)"},{"line_number":330,"context_line":"    else:"},{"line_number":331,"context_line":"        return data_utils.rand_name(\u0027multicast\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"def _debug_args(**kwargs):"},{"line_number":335,"context_line":"    if LOG.isEnabledFor(log.DEBUG):"},{"line_number":336,"context_line":"        return \", \".join(\"%s\u003d%r\" % item for item in six.iteritems(kwargs))"},{"line_number":337,"context_line":"    else:"},{"line_number":338,"context_line":"        return \"...\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_f7e04a99","line":338,"range":{"start_line":327,"start_character":0,"end_line":338,"end_character":20},"updated":"2018-05-03 20:25:31.000000000","message":"those 2 functions IMHO should be moved to top of file also","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7134776888e545677400094bb274af3e040c23f1","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    if LOG.isEnabledFor(log.DEBUG):"},{"line_number":336,"context_line":"        return \", \".join(\"%s\u003d%r\" % item for item in six.iteritems(kwargs))"},{"line_number":337,"context_line":"    else:"},{"line_number":338,"context_line":"        return \"...\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_37000235","line":338,"range":{"start_line":338,"start_character":8,"end_line":338,"end_character":20},"updated":"2018-05-03 20:25:31.000000000","message":"what is the use case to not have DEBUG enabled during the tests?","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"e2e3b3050a1c9f16ef176f6fae39ba046027025e","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        return self.server[\u0027id\u0027]"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"def _rand_name(name\u003dNone):"},{"line_number":328,"context_line":"    if name:"},{"line_number":329,"context_line":"        return data_utils.rand_name(\u0027multicast-\u0027 + name)"},{"line_number":330,"context_line":"    else:"},{"line_number":331,"context_line":"        return data_utils.rand_name(\u0027multicast\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"def _debug_args(**kwargs):"},{"line_number":335,"context_line":"    if LOG.isEnabledFor(log.DEBUG):"},{"line_number":336,"context_line":"        return \", \".join(\"%s\u003d%r\" % item for item in six.iteritems(kwargs))"},{"line_number":337,"context_line":"    else:"},{"line_number":338,"context_line":"        return \"...\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_25d763f0","line":338,"range":{"start_line":327,"start_character":0,"end_line":338,"end_character":20},"in_reply_to":"5f7c97a3_f7e04a99","updated":"2018-05-04 08:35:48.000000000","message":"This function is no more used. ;-)","commit_id":"eaa6193bb86d8e43c9d27dafe27f921bdc9ec676"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    [\u0027server\u0027, \u0027name\u0027, \u0027ssh\u0027, \u0027management_ip\u0027, \u0027multicast_ip\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _rand_name(name\u003dNone):"},{"line_number":44,"context_line":"    if name:"},{"line_number":45,"context_line":"        return data_utils.rand_name(\u0027multicast-\u0027 + name)"},{"line_number":46,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_52950732","line":43,"updated":"2018-05-28 09:47:22.000000000","message":"maybe \"multicast_rand_name\"?","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    [\u0027server\u0027, \u0027name\u0027, \u0027ssh\u0027, \u0027management_ip\u0027, \u0027multicast_ip\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _rand_name(name\u003dNone):"},{"line_number":44,"context_line":"    if name:"},{"line_number":45,"context_line":"        return data_utils.rand_name(\u0027multicast-\u0027 + name)"},{"line_number":46,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_26cd9b2f","line":43,"in_reply_to":"5f7c97a3_52950732","updated":"2018-05-30 03:52:34.000000000","message":"Done","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    _ip_version \u003d constants.IP_VERSION_4"},{"line_number":77,"context_line":"    _any_addresses \u003d \u00270.0.0.0/0\u0027"},{"line_number":78,"context_line":"    _multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"},{"line_number":79,"context_line":"    _ethertype \u003d \"IPv4\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_f2ae937f","line":79,"range":{"start_line":79,"start_character":17,"end_line":79,"end_character":23},"updated":"2018-05-28 09:47:22.000000000","message":"this is defined as constant in neutron_lib.constants also","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    _ip_version \u003d constants.IP_VERSION_4"},{"line_number":77,"context_line":"    _any_addresses \u003d \u00270.0.0.0/0\u0027"},{"line_number":78,"context_line":"    _multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"},{"line_number":79,"context_line":"    _ethertype \u003d \"IPv4\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_86f58f59","line":79,"range":{"start_line":79,"start_character":17,"end_line":79,"end_character":23},"in_reply_to":"5f7c97a3_f2ae937f","updated":"2018-05-30 03:52:34.000000000","message":"Done","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            stderr +\u003d channel.recv_stderr(1024)"},{"line_number":247,"context_line":"        return stderr"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def _create_network(self, name\u003dNone, tenent_id\u003dNone, ip_version\u003dNone,"},{"line_number":250,"context_line":"                        client\u003dNone, attach_router\u003dTrue, **network_params):"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        name \u003d name or _rand_name()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_520c27a4","line":249,"updated":"2018-05-28 09:47:22.000000000","message":"Isn\u0027t such method already available somewhere?","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            stderr +\u003d channel.recv_stderr(1024)"},{"line_number":247,"context_line":"        return stderr"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def _create_network(self, name\u003dNone, tenent_id\u003dNone, ip_version\u003dNone,"},{"line_number":250,"context_line":"                        client\u003dNone, attach_router\u003dTrue, **network_params):"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        name \u003d name or _rand_name()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_ebe69ab0","line":249,"in_reply_to":"5f7c97a3_520c27a4","updated":"2018-05-30 03:52:34.000000000","message":"This is a private wrapper method that a part of invoking create_network method, it creates a subnet on created network and eventually attach that subnet to the router set up before.\nThis method also checks network creation parameters to skip the test in case desired \u0027provider:network_type\u0027 value is not supported according to tempest.conf configuration.\nBecause this method does things that aren\u0027t implemented by wrapped method then the answer is no, there is no this method elsewhere, it just has a similar name.","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fcf3090cc3ad79f5b74c1b72c1cfd10356b78da9","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            stderr +\u003d channel.recv_stderr(1024)"},{"line_number":247,"context_line":"        return stderr"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def _create_network(self, name\u003dNone, tenent_id\u003dNone, ip_version\u003dNone,"},{"line_number":250,"context_line":"                        client\u003dNone, attach_router\u003dTrue, **network_params):"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        name \u003d name or _rand_name()"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_36861fbb","line":249,"in_reply_to":"5f7c97a3_ebe69ab0","updated":"2018-05-30 07:44:43.000000000","message":"ok, thx. I just though that I saw something similar somewhere :)","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                       subnet[\u0027id\u0027])"},{"line_number":277,"context_line":"        return network"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _create_server(self, name, network):"},{"line_number":280,"context_line":"        \"\"\"Create a server attached to given network"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"                                                          |------|"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_12022f70","line":279,"updated":"2018-05-28 09:47:22.000000000","message":"same question here","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                       subnet[\u0027id\u0027])"},{"line_number":277,"context_line":"        return network"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _create_server(self, name, network):"},{"line_number":280,"context_line":"        \"\"\"Create a server attached to given network"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"                                                          |------|"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_cb539e6a","line":279,"in_reply_to":"5f7c97a3_12022f70","updated":"2018-05-30 03:52:34.000000000","message":"This is a wrapper private method called that does something more than wrapped create_server method. It creates a server attached to given network. It returns an instance of MulticastTestServer class that contains (a part of result of wrapped create_server method), an SSH client connected to the floating IP of created server. Because it does fare more things than wrapper method then it is not true, this method doesn\u0027t exist.","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fcf3090cc3ad79f5b74c1b72c1cfd10356b78da9","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                       subnet[\u0027id\u0027])"},{"line_number":277,"context_line":"        return network"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _create_server(self, name, network):"},{"line_number":280,"context_line":"        \"\"\"Create a server attached to given network"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"                                                          |------|"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_96be1363","line":279,"in_reply_to":"5f7c97a3_cb539e6a","updated":"2018-05-30 07:44:43.000000000","message":"yep,  seems reasonable to have it here :)","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            multicast_ip\u003dmulticast_ip, management_ip\u003dmanagement_ip)"},{"line_number":322,"context_line":"        return server"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _wait_for_server_active(self, server):"},{"line_number":325,"context_line":"        waiters.wait_for_server_status("},{"line_number":326,"context_line":"            self.os_primary.servers_client,"},{"line_number":327,"context_line":"            server.server[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d2f7d78a","line":324,"updated":"2018-05-28 09:47:22.000000000","message":"if there is no such method yet, IMHO it should be added to some base class as it can be reused in different tests also","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            multicast_ip\u003dmulticast_ip, management_ip\u003dmanagement_ip)"},{"line_number":322,"context_line":"        return server"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _wait_for_server_active(self, server):"},{"line_number":325,"context_line":"        waiters.wait_for_server_status("},{"line_number":326,"context_line":"            self.os_primary.servers_client,"},{"line_number":327,"context_line":"            server.server[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_ab04224b","line":324,"in_reply_to":"5f7c97a3_d2f7d78a","updated":"2018-05-30 03:52:34.000000000","message":"Why not ;-)","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7a938c87f0a2841cf5a5af7fec81f5a8152519b7","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            server.server[\u0027id\u0027],"},{"line_number":328,"context_line":"            scenario_constants.SERVER_STATUS_ACTIVE)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def _install_socat(self, server):"},{"line_number":331,"context_line":"        try:"},{"line_number":332,"context_line":"            LOG.debug(\"Installing socat on %r server.\", server.name)"},{"line_number":333,"context_line":"            socat.install_socat(server.ssh)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_322c0b01","line":330,"updated":"2018-05-28 09:47:22.000000000","message":"maybe that could be moved to socat module?","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fcf3090cc3ad79f5b74c1b72c1cfd10356b78da9","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            server.server[\u0027id\u0027],"},{"line_number":328,"context_line":"            scenario_constants.SERVER_STATUS_ACTIVE)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def _install_socat(self, server):"},{"line_number":331,"context_line":"        try:"},{"line_number":332,"context_line":"            LOG.debug(\"Installing socat on %r server.\", server.name)"},{"line_number":333,"context_line":"            socat.install_socat(server.ssh)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_36afff2a","line":330,"in_reply_to":"5f7c97a3_2bbfb261","updated":"2018-05-30 07:44:43.000000000","message":"ok","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"5206c1b1032594e51078b3733f67a619753adbea","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            server.server[\u0027id\u0027],"},{"line_number":328,"context_line":"            scenario_constants.SERVER_STATUS_ACTIVE)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def _install_socat(self, server):"},{"line_number":331,"context_line":"        try:"},{"line_number":332,"context_line":"            LOG.debug(\"Installing socat on %r server.\", server.name)"},{"line_number":333,"context_line":"            socat.install_socat(server.ssh)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_2bbfb261","line":330,"in_reply_to":"5f7c97a3_322c0b01","updated":"2018-05-30 03:52:34.000000000","message":"It cannot. This is wrapper to socat module that handle errors and implement the behavior specific to the test case (skip test, or log VM console output). Socat module is only aware of executing a command on an existing SSH connection and handling its result. It is not responsible of test case and error handling. Just consider test case the top level control object and socat module a slave reusable lower level component unaware of the context where it is used.","commit_id":"16a385ea46a50ab618028aefa6450a36888b3e34"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a74b258ec3920dbd08e0f6acdb724047564ae458","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    # IP version specific parameters"},{"line_number":74,"context_line":"    _ip_version \u003d constants.IP_VERSION_4"},{"line_number":75,"context_line":"    _any_addresses \u003d \u00270.0.0.0/0\u0027"},{"line_number":76,"context_line":"    _multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"},{"line_number":77,"context_line":"    _ethertype \u003d constants.IPv4"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_5cbbc8e3","line":75,"range":{"start_line":75,"start_character":21,"end_line":75,"end_character":32},"updated":"2018-06-11 19:18:18.000000000","message":"constants.IPv4_ANY","commit_id":"24613c40da834c09648a07b42648becc6c75aade"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a74b258ec3920dbd08e0f6acdb724047564ae458","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    _ip_version \u003d constants.IP_VERSION_4"},{"line_number":75,"context_line":"    _any_addresses \u003d \u00270.0.0.0/0\u0027"},{"line_number":76,"context_line":"    _multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"},{"line_number":77,"context_line":"    _ethertype \u003d constants.IPv4"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @classmethod"},{"line_number":80,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_3cab6c88","line":77,"updated":"2018-06-11 19:18:18.000000000","message":"I\u0027m guessing you did this to eventually add a sub-class for IPv6?","commit_id":"24613c40da834c09648a07b42648becc6c75aade"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"208ba6d8f2e7e4492ffda9c32f68c02382e3d407","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    _ip_version \u003d constants.IP_VERSION_4"},{"line_number":75,"context_line":"    _any_addresses \u003d \u00270.0.0.0/0\u0027"},{"line_number":76,"context_line":"    _multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"},{"line_number":77,"context_line":"    _ethertype \u003d constants.IPv4"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @classmethod"},{"line_number":80,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_7379cef9","line":77,"in_reply_to":"5f7c97a3_3cab6c88","updated":"2018-06-19 09:01:16.000000000","message":"yes","commit_id":"24613c40da834c09648a07b42648becc6c75aade"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a74b258ec3920dbd08e0f6acdb724047564ae458","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        super(MulticastTest, cls).skip_checks()"},{"line_number":82,"context_line":"        skip_reason \u003d None"},{"line_number":83,"context_line":"        if not cls._image_is_advanced:"},{"line_number":84,"context_line":"            skip_reason \u003d \"CIRROS is lacking the proper tools for this test\""},{"line_number":85,"context_line":"        if cls._connection_method !\u003d \u0027floating\u0027:"},{"line_number":86,"context_line":"            skip_reason \u003d \"Unsupported connection method: {!r}\".format("},{"line_number":87,"context_line":"                cls._connection_method)"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_fccbb46e","line":84,"range":{"start_line":84,"start_character":27,"end_line":84,"end_character":33},"updated":"2018-06-11 19:18:18.000000000","message":"Image ? since we don\u0027t know if it\u0027s Cirros.","commit_id":"24613c40da834c09648a07b42648becc6c75aade"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a74b258ec3920dbd08e0f6acdb724047564ae458","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            socat_options.append("},{"line_number":165,"context_line":"                socat.SocatOption.ip_multicast_ttl(ip_multicast_ttl))"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        LOG.debug(\u0027Open channel to send messages to multicast group.\u0027)"},{"line_number":168,"context_line":"        sender_options \u003d socat_options + ["},{"line_number":169,"context_line":"            socat.SocatOption.ip_multicast_if(sender.multicast_ip)]"},{"line_number":170,"context_line":"        sender_destination \u003d socat.SocatAddress.udp_datagram("}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_7ccb241d","line":167,"updated":"2018-06-11 19:18:18.000000000","message":"Don\u0027t know if you need all the debug messages in this file, but it\u0027s not dumping too much in the test logs I guess.","commit_id":"24613c40da834c09648a07b42648becc6c75aade"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99e59fe8983aa3506787c0babb4075172010f79","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            raise cls.skipException(skip_reason)"},{"line_number":72,"context_line":"        if (cls.available_type_drivers and"},{"line_number":73,"context_line":"                constants.TYPE_VLAN not in cls.available_type_drivers):"},{"line_number":74,"context_line":"            skip_reason \u003d \"This VLAN driver type is not available.\""},{"line_number":75,"context_line":"            raise cls.skipException(skip_reason)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_5b86e967","line":74,"range":{"start_line":74,"start_character":27,"end_line":74,"end_character":31},"updated":"2018-06-18 09:12:23.000000000","message":"This? Shouldn\u0027t be \"The VLAN type driver\"?","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"68827506de9cbeab5e8879de737383a276a943a5","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            raise cls.skipException(skip_reason)"},{"line_number":72,"context_line":"        if (cls.available_type_drivers and"},{"line_number":73,"context_line":"                constants.TYPE_VLAN not in cls.available_type_drivers):"},{"line_number":74,"context_line":"            skip_reason \u003d \"This VLAN driver type is not available.\""},{"line_number":75,"context_line":"            raise cls.skipException(skip_reason)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_0ce9827d","line":74,"range":{"start_line":74,"start_character":27,"end_line":74,"end_character":31},"in_reply_to":"5f7c97a3_5b86e967","updated":"2018-06-25 16:07:17.000000000","message":"Done","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99e59fe8983aa3506787c0babb4075172010f79","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        self._test_multicast(sender_network\u003dnetwork, receiver_network\u003dnetwork)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _test_multicast(self, sender_network, receiver_network,"},{"line_number":112,"context_line":"                        ip_multicast_ttl\u003dNone):"},{"line_number":113,"context_line":"        \"\"\"Test multicast messaging between two servers"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        [Sender server] -\u003e ... some network topology ... -\u003e [Receiver server]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_bb47fd1e","line":112,"range":{"start_line":112,"start_character":24,"end_line":112,"end_character":45},"updated":"2018-06-18 09:12:23.000000000","message":"where You are using this parameter to pass some value to this method? Is it really necessary?","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"68827506de9cbeab5e8879de737383a276a943a5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        self._test_multicast(sender_network\u003dnetwork, receiver_network\u003dnetwork)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _test_multicast(self, sender_network, receiver_network,"},{"line_number":112,"context_line":"                        ip_multicast_ttl\u003dNone):"},{"line_number":113,"context_line":"        \"\"\"Test multicast messaging between two servers"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        [Sender server] -\u003e ... some network topology ... -\u003e [Receiver server]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_ac03ae41","line":112,"range":{"start_line":112,"start_character":24,"end_line":112,"end_character":45},"in_reply_to":"5f7c97a3_bb47fd1e","updated":"2018-06-25 16:07:17.000000000","message":"Done","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99e59fe8983aa3506787c0babb4075172010f79","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        receiver_server \u003d self.create_loginable_server(port\u003dreceiver_port,"},{"line_number":133,"context_line":"                                                       name\u003dreceiver_name)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # Make sure both servers get active and have socat installed"},{"line_number":136,"context_line":"        for server in [sender_server, receiver_server]:"},{"line_number":137,"context_line":"            self.wait_for_server_active(server)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_1bdf113b","line":135,"updated":"2018-06-18 09:12:23.000000000","message":"How You check here that socat is installed?","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"208ba6d8f2e7e4492ffda9c32f68c02382e3d407","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        receiver_server \u003d self.create_loginable_server(port\u003dreceiver_port,"},{"line_number":133,"context_line":"                                                       name\u003dreceiver_name)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # Make sure both servers get active and have socat installed"},{"line_number":136,"context_line":"        for server in [sender_server, receiver_server]:"},{"line_number":137,"context_line":"            self.wait_for_server_active(server)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_a6703d75","line":135,"in_reply_to":"5f7c97a3_1bdf113b","updated":"2018-06-19 09:01:16.000000000","message":"This method is intended to be used for more advanced tests than this one. The parameter is required only in the case you want to test multicast messaging between two VMs that are on two separates networks connected by a router. As default Neutron router doesn\u0027t supports IGMP protocol, this parameter is not being tested here. But I plan to create a test that allows user to configure in tempest.conf to execute this test on networks provider by him. On such case it could be possible to route multicast messages through another router type. On such case, according to the networking topology set up by the user, an appropriate TTL value should be provided to make multicast subscription exactly visible as far away as it has to be. IP multicast TTL tells the maximum number of routers multicast messages are allowed to travel through before being dropped away.","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"68827506de9cbeab5e8879de737383a276a943a5","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        receiver_server \u003d self.create_loginable_server(port\u003dreceiver_port,"},{"line_number":133,"context_line":"                                                       name\u003dreceiver_name)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # Make sure both servers get active and have socat installed"},{"line_number":136,"context_line":"        for server in [sender_server, receiver_server]:"},{"line_number":137,"context_line":"            self.wait_for_server_active(server)"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_8cf4b256","line":135,"in_reply_to":"5f7c97a3_a6703d75","updated":"2018-06-25 16:07:17.000000000","message":"Done","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99e59fe8983aa3506787c0babb4075172010f79","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                           source\u003dreceiver_source)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # Executes a ping from sender to receiver server to see ensure there"},{"line_number":168,"context_line":"        # is regular IGMP connectivity between the two VMs"},{"line_number":169,"context_line":"        self._check_remote_connectivity("},{"line_number":170,"context_line":"            self.ssh_client_to_port(sender_port), receiver_ip)"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_dbe0b9fb","line":168,"range":{"start_line":168,"start_character":21,"end_line":168,"end_character":25},"updated":"2018-06-18 09:12:23.000000000","message":"nity: ICMP","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"208ba6d8f2e7e4492ffda9c32f68c02382e3d407","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                           source\u003dreceiver_source)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # Executes a ping from sender to receiver server to see ensure there"},{"line_number":168,"context_line":"        # is regular IGMP connectivity between the two VMs"},{"line_number":169,"context_line":"        self._check_remote_connectivity("},{"line_number":170,"context_line":"            self.ssh_client_to_port(sender_port), receiver_ip)"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_f331195b","line":168,"range":{"start_line":168,"start_character":21,"end_line":168,"end_character":25},"in_reply_to":"5f7c97a3_dbe0b9fb","updated":"2018-06-19 09:01:16.000000000","message":"No. It is actually IGMP. It is the protocol used for multicast group subscription. It has nothing to do with ICMP that is used by ping command.\n\nhttps://en.wikipedia.org/wiki/Internet_Group_Management_Protocol","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"68827506de9cbeab5e8879de737383a276a943a5","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                                           source\u003dreceiver_source)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # Executes a ping from sender to receiver server to see ensure there"},{"line_number":168,"context_line":"        # is regular IGMP connectivity between the two VMs"},{"line_number":169,"context_line":"        self._check_remote_connectivity("},{"line_number":170,"context_line":"            self.ssh_client_to_port(sender_port), receiver_ip)"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_8c8912c8","line":168,"range":{"start_line":168,"start_character":21,"end_line":168,"end_character":25},"in_reply_to":"5f7c97a3_f331195b","updated":"2018-06-25 16:07:17.000000000","message":"Here were actually ICMP, sorry for the confusion. Anyway this verification is redundant and I removed it.","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b99e59fe8983aa3506787c0babb4075172010f79","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        # Executes a ping from sender to receiver server to see ensure there"},{"line_number":168,"context_line":"        # is regular IGMP connectivity between the two VMs"},{"line_number":169,"context_line":"        self._check_remote_connectivity("},{"line_number":170,"context_line":"            self.ssh_client_to_port(sender_port), receiver_ip)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        with sender_channel, receiver_channel:"},{"line_number":173,"context_line":"            # Send multicast messages from sender VM to receiver VM and check"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_9bea41d6","line":170,"updated":"2018-06-18 09:12:23.000000000","message":"shouldn\u0027t this be done before line 144?","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"68827506de9cbeab5e8879de737383a276a943a5","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        # Executes a ping from sender to receiver server to see ensure there"},{"line_number":168,"context_line":"        # is regular IGMP connectivity between the two VMs"},{"line_number":169,"context_line":"        self._check_remote_connectivity("},{"line_number":170,"context_line":"            self.ssh_client_to_port(sender_port), receiver_ip)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        with sender_channel, receiver_channel:"},{"line_number":173,"context_line":"            # Send multicast messages from sender VM to receiver VM and check"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_ec9a0611","line":170,"in_reply_to":"5f7c97a3_9bea41d6","updated":"2018-06-25 16:07:17.000000000","message":"Done","commit_id":"844e8e033ca21e1c4c870c2833fac1a99804bb4b"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def get_receiver_script(group, port):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    return \"\"\""},{"line_number":36,"context_line":"import socket"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_d4b218e5","line":33,"range":{"start_line":33,"start_character":0,"end_line":33,"end_character":37},"updated":"2019-07-08 15:31:34.000000000","message":"Suggestion: read this script from a file. In this way you can test the script locally on your PC.","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":42,"context_line":"mreq \u003d struct.pack(\u00274sl\u0027, socket.inet_aton(\u0027%(group)s\u0027), socket.INADDR_ANY)"},{"line_number":43,"context_line":"sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"print(sock.recv(1024))"},{"line_number":46,"context_line":"    \"\"\" % {\u0027group\u0027: group, \u0027port\u0027: port}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_fa638340","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":22},"updated":"2019-07-08 15:31:34.000000000","message":"To signal SSH client you are ready to listen you could close a stream (stderr for example) the test case could be listening from (using for example select).\n\n # Notify test case this is ready to receive\n sys.stderr.close()\n sys.stderr \u003d sys.stdout()\n\n # Wait for multicast message\n message \u003d sock.recv(1024)\n \n # Send read content and flush before exiting\n sys.stdout(message)\n sys.stdout.close()\n exit(0)\n\nIn this way you could use select module on SSHChannel [1] object to wait for STDERR stream to get closed before sending multicast message.\n\n[1] http://docs.paramiko.org/en/2.5/api/channel.html#paramiko.channel.Channel","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":43,"context_line":"sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"print(sock.recv(1024))"},{"line_number":46,"context_line":"    \"\"\" % {\u0027group\u0027: group, \u0027port\u0027: port}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_sender_script(group, port, message):"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_94c82055","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":40},"updated":"2019-07-08 15:31:34.000000000","message":"You could better get parameters from sys.argv or using argparse.","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \"\"\" % {\u0027group\u0027: group, \u0027port\u0027: port}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_sender_script(group, port, message):"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    return \"\"\""},{"line_number":52,"context_line":"import socket"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_34c3743a","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":43},"updated":"2019-07-08 15:31:34.000000000","message":"Suggestion: read this script from a file. In this way you can test the script locally on your PC.","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":54,"context_line":"sock \u003d socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)"},{"line_number":55,"context_line":"sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"sock.sendto(b\u0027%(message)s\u0027, (\u0027%(group)s\u0027, %(port)s))"},{"line_number":58,"context_line":"    \"\"\" % {\u0027group\u0027: group,"},{"line_number":59,"context_line":"           \u0027port\u0027: port,"},{"line_number":60,"context_line":"           \u0027message\u0027: message}"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_54be28ae","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":52},"updated":"2019-07-08 15:31:34.000000000","message":"same as above","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        cls.keypair \u003d cls.create_keypair()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        cls.secgroup \u003d cls.os_primary.network_client.create_security_group("},{"line_number":108,"context_line":"            name\u003d\u0027secgroup_mtu\u0027)"},{"line_number":109,"context_line":"        cls.security_groups.append(cls.secgroup[\u0027security_group\u0027])"},{"line_number":110,"context_line":"        cls.create_loginable_secgroup_rule("},{"line_number":111,"context_line":"            secgroup_id\u003dcls.secgroup[\u0027security_group\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_b40be47a","line":108,"range":{"start_line":108,"start_character":18,"end_line":108,"end_character":30},"updated":"2019-07-08 15:31:34.000000000","message":"mtu? what about \u0027muticast\u0027 as a name?","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _create_server(self):"},{"line_number":134,"context_line":"        name \u003d data_utils.rand_name(\"multicast-server\")"},{"line_number":135,"context_line":"        server \u003d self.create_server("},{"line_number":136,"context_line":"            flavor_ref\u003dself.flavor_ref,"},{"line_number":137,"context_line":"            image_ref\u003dself.image_ref,"},{"line_number":138,"context_line":"            key_name\u003dself.keypair[\u0027name\u0027], name\u003dname,"},{"line_number":139,"context_line":"            networks\u003d[{\u0027uuid\u0027: self.network[\u0027id\u0027]}],"},{"line_number":140,"context_line":"            security_groups\u003d[{\u0027name\u0027: self.secgroup[\u0027security_group\u0027][\u0027name\u0027]}]"},{"line_number":141,"context_line":"        )[\u0027server\u0027]"},{"line_number":142,"context_line":"        self.wait_for_server_active(server)"},{"line_number":143,"context_line":"        port \u003d self.client.list_ports("},{"line_number":144,"context_line":"            network_id\u003dself.network[\u0027id\u0027], device_id\u003dserver[\u0027id\u0027])[\u0027ports\u0027][0]"},{"line_number":145,"context_line":"        server[\u0027fip\u0027] \u003d self.create_floatingip(port\u003dport)"},{"line_number":146,"context_line":"        return server"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_f4639c40","line":144,"range":{"start_line":135,"start_character":0,"end_line":144,"end_character":78},"updated":"2019-07-08 15:31:34.000000000","message":"Why not to create port first, with port security disabled, then pass the port to the  create server function instead of the network? You don\u0027t need security groups for this test.","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        [Sender server] -\u003e (Multicast network) -\u003e [Receiver server]"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        sender \u003d self._create_server()"},{"line_number":176,"context_line":"        receivers \u003d [self._create_server() for _ in range(2)]"},{"line_number":177,"context_line":"        # Sender can be also receiver of multicast traffic"},{"line_number":178,"context_line":"        receivers.append(sender)"},{"line_number":179,"context_line":"        self._check_multicast_conectivity(sender\u003dsender, receivers\u003dreceivers)"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_972102b7","line":176,"range":{"start_line":176,"start_character":20,"end_line":176,"end_character":61},"updated":"2019-07-08 15:31:34.000000000","message":"Isn\u0027t this simpler? [self._create_server(), self._create_server()]","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        [Sender server] -\u003e (Multicast network) -\u003e [Receiver server]"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        sender \u003d self._create_server()"},{"line_number":176,"context_line":"        receivers \u003d [self._create_server() for _ in range(2)]"},{"line_number":177,"context_line":"        # Sender can be also receiver of multicast traffic"},{"line_number":178,"context_line":"        receivers.append(sender)"},{"line_number":179,"context_line":"        self._check_multicast_conectivity(sender\u003dsender, receivers\u003dreceivers)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _check_multicast_conectivity(self, sender, receivers):"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_770fae36","line":178,"range":{"start_line":176,"start_character":8,"end_line":178,"end_character":32},"updated":"2019-07-08 15:31:34.000000000","message":"Isn\u0027t this simpler?\n receivers \u003d [\n     self._create_server(),\n     self._create_server(),\n     sender]","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        mcast_address \u003d next(self.multicast_group_iter)"},{"line_number":188,"context_line":"        LOG.debug(\"Multicast group address: %s\", mcast_address)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        sender_ssh_client \u003d self._prepare_sender(sender, mcast_address)"},{"line_number":191,"context_line":"        receiver_ssh_clients \u003d []"},{"line_number":192,"context_line":"        for receiver in receivers:"},{"line_number":193,"context_line":"            receiver_ssh_client \u003d self._prepare_receiver("}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_7ab0f343","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":71},"updated":"2019-07-08 15:31:34.000000000","message":"You could do all at once preparing and sending the message running the scrip after senders are all listening.","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        sender_ssh_client \u003d self._prepare_sender(sender, mcast_address)"},{"line_number":191,"context_line":"        receiver_ssh_clients \u003d []"},{"line_number":192,"context_line":"        for receiver in receivers:"},{"line_number":193,"context_line":"            receiver_ssh_client \u003d self._prepare_receiver("},{"line_number":194,"context_line":"                receiver, mcast_address)"},{"line_number":195,"context_line":"            receiver_ssh_client.execute_script("},{"line_number":196,"context_line":"                \"python3 ~/multicast_traffic_receiver.py \u003e %s \u0026\" % output_file,"},{"line_number":197,"context_line":"                shell\u003d\"bash\")"},{"line_number":198,"context_line":"            receiver_ssh_clients.append(receiver_ssh_client)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Lets wait couple of seconds for receivers to be ready"},{"line_number":201,"context_line":"        time.sleep(5)"}],"source_content_type":"text/x-python","patch_set":67,"id":"9fb8cfa7_bae74bac","line":198,"range":{"start_line":193,"start_character":12,"end_line":198,"end_character":60},"updated":"2019-07-08 15:31:34.000000000","message":"all these operations should be in the same function:\n\n receiver_ssh_clients \u003d [\n  self.start_receiver(r, mcast_address)\n  for r in receivers]\n\n\n sender_ssh_client \u003d self.execute_seceiver(sender, mcast_address)","commit_id":"01057675d18ba3a88c256651b74afdc61b2facc1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4794f47fa85a51f76d779d1eacfb1c36c3a41473","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            self.assertIn(self.multicast_message, result)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class MulticastTestIPv4(base.BaseTempestTestCase, BaseMulticastTest):"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    # Import configuration options"},{"line_number":216,"context_line":"    multicast_group_range \u003d CONF.neutron_plugin_options.multicast_group_range"}],"source_content_type":"text/x-python","patch_set":68,"id":"9fb8cfa7_0a061b1e","line":213,"updated":"2019-07-02 14:47:34.000000000","message":"IPv6 too?  But we have to crawl before we can walk :)\n\nThe *_script() code above would need to change for that.","commit_id":"b3135838187cf1a9638773f07c24e62070565956"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                f.write(\u0027received reply \u0027 + str(data) + \u0027 from \u0027 + str(server))"},{"line_number":102,"context_line":"    finally:"},{"line_number":103,"context_line":"        sys.stdout.write(\u0027closing socket\u0027)"},{"line_number":104,"context_line":"        sock.close()"},{"line_number":105,"context_line":"    \"\"\" % {\u0027group\u0027: group,"},{"line_number":106,"context_line":"           \u0027port\u0027: port,"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_0219ed83","line":103,"range":{"start_line":103,"start_character":40,"end_line":103,"end_character":41},"updated":"2019-07-08 15:31:34.000000000","message":"NIT: I think you forgot the final \u0027\\n\u0027 here.","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"796202cd4749b26df13965cd109bac7791de56ff","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                f.write(\u0027received reply \u0027 + str(data) + \u0027 from \u0027 + str(server))"},{"line_number":102,"context_line":"    finally:"},{"line_number":103,"context_line":"        sys.stdout.write(\u0027closing socket\u0027)"},{"line_number":104,"context_line":"        sock.close()"},{"line_number":105,"context_line":"    \"\"\" % {\u0027group\u0027: group,"},{"line_number":106,"context_line":"           \u0027port\u0027: port,"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_87f4cfd0","line":103,"range":{"start_line":103,"start_character":40,"end_line":103,"end_character":41},"in_reply_to":"7faddb67_0219ed83","updated":"2019-07-11 13:51:17.000000000","message":"it\u0027s not needed TBH","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"36abc6b2c0d30c5d8b4c9f592db0f309d985c90a","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    multicast_port \u003d 5007"},{"line_number":122,"context_line":"    multicast_message \u003d \"Big Bang\""},{"line_number":123,"context_line":"    receiver_output_file \u003d \"/tmp/receiver_mcast_out\""},{"line_number":124,"context_line":"    sender_output_file \u003d \"/tmp/sender_mcast_out\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"},{"line_number":127,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_2877f8a2","line":124,"updated":"2019-07-10 21:17:27.000000000","message":"So does this leave temp files around?  Should use useFixture or something for this and even for the .py files?","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"013175f96698c489f209fcbe4666695991c86a05","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    multicast_port \u003d 5007"},{"line_number":122,"context_line":"    multicast_message \u003d \"Big Bang\""},{"line_number":123,"context_line":"    receiver_output_file \u003d \"/tmp/receiver_mcast_out\""},{"line_number":124,"context_line":"    sender_output_file \u003d \"/tmp/sender_mcast_out\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"},{"line_number":127,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_ba46c77b","line":124,"in_reply_to":"7faddb67_2877f8a2","updated":"2019-07-11 12:31:32.000000000","message":"it is created in vm spawned just for test. So after test it is deleted. I don\u0027t think we need to do more cleaning stuff here.","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f03149ef760feb392d65ab091f990e094c1ac31d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    multicast_port \u003d 5007"},{"line_number":122,"context_line":"    multicast_message \u003d \"Big Bang\""},{"line_number":123,"context_line":"    receiver_output_file \u003d \"/tmp/receiver_mcast_out\""},{"line_number":124,"context_line":"    sender_output_file \u003d \"/tmp/sender_mcast_out\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"},{"line_number":127,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_759860bf","line":124,"in_reply_to":"7faddb67_ba46c77b","updated":"2019-07-11 12:50:13.000000000","message":"Ack","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":27329,"name":"Federico Ressi","email":"fressi@redhat.com","username":"fressi_redhat"},"change_message_id":"fa2a70a90b8fb60284b15dd7ff0b2d00be935bed","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            receiver_ssh_client \u003d self._prepare_receiver("},{"line_number":254,"context_line":"                receiver, mcast_address)"},{"line_number":255,"context_line":"            receiver_ssh_client.execute_script("},{"line_number":256,"context_line":"                \"python3 ~/multicast_traffic_receiver.py \u0026\", shell\u003d\"bash\")"},{"line_number":257,"context_line":"            utils.wait_until_true("},{"line_number":258,"context_line":"                lambda: _message_received("},{"line_number":259,"context_line":"                    receiver_ssh_client, self.hello_message,"}],"source_content_type":"text/x-python","patch_set":69,"id":"7faddb67_954af924","line":256,"range":{"start_line":256,"start_character":57,"end_line":256,"end_character":58},"updated":"2019-07-08 15:31:34.000000000","message":"Smart guy! ;-)","commit_id":"dd3f9918075152efe895ea0862a5d94e3a58958a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8feb67de48b357a05a2659a98b9c1ec465b77028","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                                pkey\u003dself.keypair[\u0027private_key\u0027])"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        ssh_client.execute_script("},{"line_number":207,"context_line":"            \u0027echo \"%s\" \u003e ~/multicast_traffic_sender.py\u0027 % check_script)"},{"line_number":208,"context_line":"        return ssh_client"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _prepare_receiver(self, server, mcast_address):"}],"source_content_type":"text/x-python","patch_set":70,"id":"7faddb67_21f53584","line":207,"range":{"start_line":207,"start_character":25,"end_line":207,"end_character":27},"updated":"2019-07-22 15:08:52.000000000","message":"Nit: how about use \u0027/tmp\u0027 as you set in line 123 and 124 ?","commit_id":"a2aad94f9dd97377331f57b1088bc4920aad935e"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bc85d5877f80c73752575ae7d7a9effad8fa3592","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                                pkey\u003dself.keypair[\u0027private_key\u0027])"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        ssh_client.execute_script("},{"line_number":207,"context_line":"            \u0027echo \"%s\" \u003e ~/multicast_traffic_sender.py\u0027 % check_script)"},{"line_number":208,"context_line":"        return ssh_client"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _prepare_receiver(self, server, mcast_address):"}],"source_content_type":"text/x-python","patch_set":70,"id":"7faddb67_7e07401a","line":207,"range":{"start_line":207,"start_character":25,"end_line":207,"end_character":27},"in_reply_to":"7faddb67_21f53584","updated":"2019-07-23 08:14:10.000000000","message":"I can change it if I will need to respin this patch but I don\u0027t think it\u0027s critical to change. This file is uploaded to the vm which is created only for this test so there is no any risk with placing it in home directory.","commit_id":"a2aad94f9dd97377331f57b1088bc4920aad935e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8feb67de48b357a05a2659a98b9c1ec465b77028","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            self.username,"},{"line_number":218,"context_line":"            pkey\u003dself.keypair[\u0027private_key\u0027])"},{"line_number":219,"context_line":"        ssh_client.execute_script("},{"line_number":220,"context_line":"            \u0027echo \"%s\" \u003e ~/multicast_traffic_receiver.py\u0027 % check_script)"},{"line_number":221,"context_line":"        return ssh_client"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @decorators.idempotent_id(\u0027113486fc-24c9-4be4-8361-03b1c9892867\u0027)"}],"source_content_type":"text/x-python","patch_set":70,"id":"7faddb67_e1ee3db3","line":220,"range":{"start_line":220,"start_character":25,"end_line":220,"end_character":27},"updated":"2019-07-22 15:08:52.000000000","message":"ditto","commit_id":"a2aad94f9dd97377331f57b1088bc4920aad935e"}]}
