)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"873e2b9204033610cb038a4eefb5c2f750e69e44","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Andrzej Denisiewicz \u003candrzej.denisiewicz@orange.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-05-14 12:22:45 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a test test_bgpvpn_loopback_port_association_create_and_update"},{"line_number":8,"context_line":"to test many loopbacks (default 100)."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Change-Id: I3b7eec8b4e0003866d14f7a242768b14802f4906"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5f7c97a3_33204df7","line":8,"range":{"start_line":7,"start_character":0,"end_line":8,"end_character":37},"updated":"2018-05-15 11:39:23.000000000","message":"This commit message would deserve being rewritten to follow the guidelines at: https://wiki.openstack.org/wiki/GitCommitMessages#Information_in_commit_messages","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"}],"networking_bgpvpn_tempest/tests/scenario/test_bgpvpn_basic.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"91c304aab155e38176aea65446d753d64fc455e7","unresolved":false,"context_lines":[{"line_number":645,"context_line":"    @decorators.idempotent_id(\u0027d92a8a18-c4d0-40d5-8592-713d7dae7d25\u0027)"},{"line_number":646,"context_line":"    @utils.services(\u0027compute\u0027, \u0027network\u0027)"},{"line_number":647,"context_line":"    @utils.requires_ext(extension\u003d\u0027bgpvpn-routes-control\u0027, service\u003d\u0027network\u0027)"},{"line_number":648,"context_line":"    def test_bgpvpn_loopback_port_association_create_and_update(self):"},{"line_number":649,"context_line":"        \"\"\"This test checks port association in BGPVPN."},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        1. Create networks A and B with their respective subnets"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_3375adfa","line":648,"range":{"start_line":648,"start_character":8,"end_line":648,"end_character":63},"updated":"2018-05-15 11:41:38.000000000","message":"perhaps \"test_port_association_many_bgpvpn_routes\" would be a more descriptive name ?","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        \"\"\""},{"line_number":666,"context_line":"        ADD_LOOPBACKS \u003d 90"},{"line_number":667,"context_line":"        START_ADD_LOOPBACKS \u003d 31"},{"line_number":668,"context_line":"        IP_C_S1 \u003d []"},{"line_number":669,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":670,"context_line":"            IP_C_S1.append(str(S1C[ln + START_ADD_LOOPBACKS]))"},{"line_number":671,"context_line":"        self._create_networks_and_subnets(port_security\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_d8b7b6f4","line":668,"range":{"start_line":668,"start_character":8,"end_line":668,"end_character":15},"updated":"2018-05-15 10:35:31.000000000","message":"(\"loopacks\" would IMHO be a better name than \"IP_C_S1\" in my opinion)","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        \"\"\""},{"line_number":666,"context_line":"        ADD_LOOPBACKS \u003d 90"},{"line_number":667,"context_line":"        START_ADD_LOOPBACKS \u003d 31"},{"line_number":668,"context_line":"        IP_C_S1 \u003d []"},{"line_number":669,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":670,"context_line":"            IP_C_S1.append(str(S1C[ln + START_ADD_LOOPBACKS]))"},{"line_number":671,"context_line":"        self._create_networks_and_subnets(port_security\u003dFalse)"},{"line_number":672,"context_line":"        self._create_l3_bgpvpn()"},{"line_number":673,"context_line":"        self._create_servers([[self.networks[NET_A], IP_A_S1_1],"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_b8267a67","line":670,"range":{"start_line":668,"start_character":0,"end_line":670,"end_character":62},"updated":"2018-05-15 10:35:31.000000000","message":"This would achieve roughly the same purpose:\nIP_C_S1 \u003d S1C[START_ADD_LOOPBACKS:START_ADD_LOOPBACKS+ADD_LOOPBACKS]","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        # exists"},{"line_number":683,"context_line":"        LOG.debug(\"!!! preliminary check that no connectivity to \""},{"line_number":684,"context_line":"                  + IP_C_S1_1)"},{"line_number":685,"context_line":"        self._check_l3_bgpvpn_by_specific_ip("},{"line_number":686,"context_line":"            should_succeed\u003dFalse, to_server_ip\u003dIP_C_S1_1)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":689,"context_line":"            LOG.debug(\"!!! preliminary check that no connectivity to \""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_5815e6e3","line":686,"range":{"start_line":685,"start_character":0,"end_line":686,"end_character":57},"updated":"2018-05-15 10:35:31.000000000","message":"Why include IP_C_S1_1 as a particular case ?","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        self._check_l3_bgpvpn_by_specific_ip("},{"line_number":686,"context_line":"            should_succeed\u003dFalse, to_server_ip\u003dIP_C_S1_1)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":689,"context_line":"            LOG.debug(\"!!! preliminary check that no connectivity to \""},{"line_number":690,"context_line":"                      + IP_C_S1[ln])"},{"line_number":691,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":692,"context_line":"                should_succeed\u003dFalse, to_server_ip\u003dIP_C_S1[ln])"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        self._setup_ip_forwarding(1)"},{"line_number":695,"context_line":"        self._setup_ip_address(1, IP_C_S1_1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_58eac6d7","line":692,"range":{"start_line":688,"start_character":0,"end_line":692,"end_character":63},"updated":"2018-05-15 10:35:31.000000000","message":"With the suggestion for line 668-670, this would become:\n\nfor ip in IP_C_S1:\n    self._check(..., to_server_ip\u003dstr(ip))","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":694,"context_line":"        self._setup_ip_forwarding(1)"},{"line_number":695,"context_line":"        self._setup_ip_address(1, IP_C_S1_1)"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":698,"context_line":"            self._setup_ip_address(1, IP_C_S1[ln])"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        self.bgpvpn_client.create_network_association("},{"line_number":701,"context_line":"            self.bgpvpn[\u0027id\u0027], self.networks[NET_A][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_18c20e5a","line":698,"range":{"start_line":697,"start_character":0,"end_line":698,"end_character":50},"updated":"2018-05-15 10:35:31.000000000","message":"Same:\n\n    for ip in IP_C_S1:\n        self._setup_ip_address(1, str(ip))\n\nAnd similar in other places below.","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a7a3d347a25b6aedcaed8c692e045e40a173d4f5","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        self.bgpvpn_client.create_network_association("},{"line_number":701,"context_line":"            self.bgpvpn[\u0027id\u0027], self.networks[NET_A][\u0027id\u0027])"},{"line_number":702,"context_line":"        port_id \u003d self.ports[self.servers[1][\u0027id\u0027]][\u0027id\u0027]"},{"line_number":703,"context_line":"        port_routes \u003d []"},{"line_number":704,"context_line":"        port_routes.append({\u0027type\u0027: \u0027prefix\u0027,"},{"line_number":705,"context_line":"                            \u0027prefix\u0027: IP_C_S1_1 + \"/32\"})"},{"line_number":706,"context_line":"        for ln in range(ADD_LOOPBACKS):"},{"line_number":707,"context_line":"            port_routes.append({\u0027type\u0027: \u0027prefix\u0027,"},{"line_number":708,"context_line":"                                \u0027prefix\u0027: IP_C_S1[ln] + \"/32\"})"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        body \u003d self.bgpvpn_client.create_port_association(self.bgpvpn[\u0027id\u0027],"},{"line_number":711,"context_line":"                                                          port_id\u003dport_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_1890ce49","line":708,"range":{"start_line":703,"start_character":0,"end_line":708,"end_character":63},"updated":"2018-05-15 10:35:31.000000000","message":"This could become:\n\n   port_routes \u003d [{\u0027type\u0027: \u0027prefix\u0027,\n                   \u0027prefix\u0027: str(ip) + \"/32\"}\n                  for ip in IP_C_S1]","commit_id":"0405a778e10d4b1c59b423fbdae58ce268b8ddac"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0f8b1e4cd6fd1436802982000824574ea544a7df","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        self._associate_fip(0)"},{"line_number":679,"context_line":"        self._associate_fip(1)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        # preliminary check that no connectivity to 192.168.0.1 initially"},{"line_number":682,"context_line":"        # exists"},{"line_number":683,"context_line":"        for ip in LOOPBACKS:"},{"line_number":684,"context_line":"            LOG.debug(\"!!! preliminary check that no connectivity to \""},{"line_number":685,"context_line":"                      + str(ip))"},{"line_number":686,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":687,"context_line":"                should_succeed\u003dFalse, to_server_ip\u003dstr(ip))"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        self._setup_ip_forwarding(1)"},{"line_number":690,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_2dcbd872","line":687,"range":{"start_line":681,"start_character":0,"end_line":687,"end_character":59},"updated":"2018-05-17 08:54:14.000000000","message":"I think we could do this check on a subset of the IPs, for instance the first and last.","commit_id":"824b2bf35fc28bba66e6e8b2f40009de1e743b2f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0f8b1e4cd6fd1436802982000824574ea544a7df","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        self._setup_ip_forwarding(1)"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        for ip in LOOPBACKS:"},{"line_number":692,"context_line":"            self._setup_ip_address(1, str(ip))"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        self.bgpvpn_client.create_network_association("},{"line_number":695,"context_line":"            self.bgpvpn[\u0027id\u0027], self.networks[NET_A][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_adbfe8ce","line":692,"range":{"start_line":692,"start_character":12,"end_line":692,"end_character":46},"updated":"2018-05-17 08:54:14.000000000","message":"_setup_ip_address could be modified to take a list of IPs to configure, and do it as a single ssh command that will be a shell loop: \"for n in seq 1 90; do sudo ip addr add 1.2.3.$n dev lo\"","commit_id":"824b2bf35fc28bba66e6e8b2f40009de1e743b2f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0f8b1e4cd6fd1436802982000824574ea544a7df","unresolved":false,"context_lines":[{"line_number":703,"context_line":"                                                          routes\u003dport_routes)"},{"line_number":704,"context_line":"        port_association \u003d body[\u0027port_association\u0027]"},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        for ip in LOOPBACKS:"},{"line_number":707,"context_line":"            LOG.debug(\"!!! Check that server 1 can \""},{"line_number":708,"context_line":"                      + \"ping server\u0027s 2 alternative ip \""},{"line_number":709,"context_line":"                      + str(ip))"},{"line_number":710,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":711,"context_line":"                to_server_ip\u003dstr(ip))"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        self.bgpvpn_client.update_port_association("},{"line_number":714,"context_line":"            self.bgpvpn[\u0027id\u0027], port_association[\u0027id\u0027], routes\u003d[])"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_2d79982e","line":711,"range":{"start_line":706,"start_character":0,"end_line":711,"end_character":37},"updated":"2018-05-17 08:54:14.000000000","message":"This is significantly more work, but we could write an alternative implementation of _check_l3_bgpvpn_by_specific_ip that would allow pinging a set of IPs inside a shell loop (and fails if they are not all reachable), or use another OS image instead of cirros (like Ubuntu cloud) to easily install fping that allows testing a set of IPs with a single command.","commit_id":"824b2bf35fc28bba66e6e8b2f40009de1e743b2f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0f8b1e4cd6fd1436802982000824574ea544a7df","unresolved":false,"context_lines":[{"line_number":713,"context_line":"        self.bgpvpn_client.update_port_association("},{"line_number":714,"context_line":"            self.bgpvpn[\u0027id\u0027], port_association[\u0027id\u0027], routes\u003d[])"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        for ip in LOOPBACKS:"},{"line_number":717,"context_line":"            LOG.debug(\"!!! Check that server 1 cannot \""},{"line_number":718,"context_line":"                      + \"ping server\u0027s 2 alternative ip \""},{"line_number":719,"context_line":"                      + str(ip))"},{"line_number":720,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":721,"context_line":"                should_succeed\u003dFalse, to_server_ip\u003dstr(ip))"},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"    @decorators.idempotent_id(\u00279c3280b5-0b32-4562-800c-0b50d9d52bfd\u0027)"},{"line_number":724,"context_line":"    @utils.services(\u0027compute\u0027, \u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_0d7cdc1e","line":721,"range":{"start_line":716,"start_character":0,"end_line":721,"end_character":59},"updated":"2018-05-17 08:54:14.000000000","message":"I think we could do this check on a subset of the IPs, for instance the first and last.","commit_id":"824b2bf35fc28bba66e6e8b2f40009de1e743b2f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        \"\"\""},{"line_number":666,"context_line":"        AMOUNT_LOOPBACKS \u003d 90"},{"line_number":667,"context_line":"        START_IP_LOOPBACKS \u003d 31"},{"line_number":668,"context_line":"        LOOPBACKS \u003d list(S1C[START_IP_LOOPBACKS:START_IP_LOOPBACKS"},{"line_number":669,"context_line":"                             + AMOUNT_LOOPBACKS])"},{"line_number":670,"context_line":"        SUB_LOOPBACKS \u003d [LOOPBACKS[0], LOOPBACKS[-1]]"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        self._create_networks_and_subnets(port_security\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8138f4d2","line":669,"range":{"start_line":668,"start_character":20,"end_line":669,"end_character":49},"updated":"2018-05-31 08:09:24.000000000","message":"I realize that doing:\n\nLOOPBACKS \u003d [str(ip) for ip in\n             S1C[START_IP_LOOPBACKS:\n                 START_IP_LOOPBACKS+ AMOUNT_LOOPBACKS]]\n\n...would avoid doing \"str(ip)\" everywhere below","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":679,"context_line":"        self._associate_fip(0)"},{"line_number":680,"context_line":"        self._associate_fip(1)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        # preliminary check that no connectivity to 192.168.0.1 initially"},{"line_number":683,"context_line":"        # exists"},{"line_number":684,"context_line":"        for ip in SUB_LOOPBACKS:"},{"line_number":685,"context_line":"            LOG.debug(\"!!! preliminary check that no connectivity to \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_412e5c8c","line":682,"range":{"start_line":682,"start_character":49,"end_line":682,"end_character":63},"updated":"2018-05-31 08:09:24.000000000","message":"(remove this part)","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        # preliminary check that no connectivity to 192.168.0.1 initially"},{"line_number":683,"context_line":"        # exists"},{"line_number":684,"context_line":"        for ip in SUB_LOOPBACKS:"},{"line_number":685,"context_line":"            LOG.debug(\"!!! preliminary check that no connectivity to \""},{"line_number":686,"context_line":"                      + str(ip))"},{"line_number":687,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":688,"context_line":"                should_succeed\u003dFalse, to_server_ip\u003dstr(ip))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_813d54bc","line":685,"range":{"start_line":685,"start_character":23,"end_line":685,"end_character":69},"updated":"2018-05-31 08:09:24.000000000","message":"suggestion to make the comment simpler/more correct: remove \u0027!!!\u0027 and \"preliminary check that no connectivity exists\" (without giving IPs).","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        self._setup_ip_forwarding(1)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"        self._setup_range_ip_address(1, str(S1C.network)[:-1],"},{"line_number":693,"context_line":"                                     START_IP_LOOPBACKS,"},{"line_number":694,"context_line":"                                     START_IP_LOOPBACKS + AMOUNT_LOOPBACKS)"},{"line_number":695,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_2148005a","line":692,"range":{"start_line":692,"start_character":13,"end_line":692,"end_character":36},"updated":"2018-05-31 08:09:24.000000000","message":"with the comment below at line 1223, this would become simply:\n\n   self._setup_range_ip_address(1, LOOPBACKS)","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        port_association \u003d body[\u0027port_association\u0027]"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        for ip in LOOPBACKS:"},{"line_number":709,"context_line":"            LOG.debug(\"!!! Check that server 1 can \""},{"line_number":710,"context_line":"                      + \"ping server\u0027s 2 alternative ip \""},{"line_number":711,"context_line":"                      + str(ip))"},{"line_number":712,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":713,"context_line":"                to_server_ip\u003dstr(ip))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_616b58b6","line":710,"range":{"start_line":709,"start_character":21,"end_line":710,"end_character":57},"updated":"2018-05-31 08:09:24.000000000","message":"suggestion: \"Check that server 1 can ping server 2 alternative ip \"  \n\n(remove \"!!!\" and \"\u0027s\" because\"The possessive form is used with nouns referring to people, groups of people, countries, and animals.\" [1])\n\n[1] https://www.ef.com/english-resources/english-grammar/forming-possessive/","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":716,"context_line":"            self.bgpvpn[\u0027id\u0027], port_association[\u0027id\u0027], routes\u003d[])"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        for ip in SUB_LOOPBACKS:"},{"line_number":719,"context_line":"            LOG.debug(\"!!! Check that server 1 cannot \""},{"line_number":720,"context_line":"                      + \"ping server\u0027s 2 alternative ip \""},{"line_number":721,"context_line":"                      + str(ip))"},{"line_number":722,"context_line":"            self._check_l3_bgpvpn_by_specific_ip("},{"line_number":723,"context_line":"                should_succeed\u003dFalse, to_server_ip\u003dstr(ip))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8166b4ec","line":720,"range":{"start_line":719,"start_character":22,"end_line":720,"end_character":57},"updated":"2018-05-31 08:09:24.000000000","message":"similar comment here","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        ssh_client.exec_command(\"sudo sysctl -w net.ipv4.ip_forward\u003d1\")"},{"line_number":1214,"context_line":""},{"line_number":1215,"context_line":"    def _setup_ip_address(self, server_index, cidr, device\u003dNone):"},{"line_number":1216,"context_line":"        if device is None:"},{"line_number":1217,"context_line":"            device \u003d \u0027lo\u0027"},{"line_number":1218,"context_line":"        server \u003d self.servers[server_index]"},{"line_number":1219,"context_line":"        ssh_client \u003d self._setup_ssh_client(server)"},{"line_number":1220,"context_line":"        ssh_client.exec_command((\"sudo ip addr add {cidr} \""},{"line_number":1221,"context_line":"                                \"dev {dev}\").format(cidr\u003dcidr, dev\u003ddevice))"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"    def _setup_range_ip_address(self, server_index, net, start_ip, end_ip,"},{"line_number":1224,"context_line":"                                device\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_21b6c03f","line":1221,"range":{"start_line":1216,"start_character":0,"end_line":1221,"end_character":75},"updated":"2018-05-31 08:09:24.000000000","message":"To avoid code duplication, _setup_ip_address should call_setup_range_ip_address .","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        ssh_client.exec_command((\"sudo ip addr add {cidr} \""},{"line_number":1221,"context_line":"                                \"dev {dev}\").format(cidr\u003dcidr, dev\u003ddevice))"},{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"    def _setup_range_ip_address(self, server_index, net, start_ip, end_ip,"},{"line_number":1224,"context_line":"                                device\u003dNone):"},{"line_number":1225,"context_line":"        if device is None:"},{"line_number":1226,"context_line":"            device \u003d \u0027lo\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_01894473","line":1223,"range":{"start_line":1223,"start_character":52,"end_line":1223,"end_character":73},"updated":"2018-05-31 08:09:24.000000000","message":"I would suggest to replace these arguments by a simple list of IPs \u0027cidrs\u0027.  And with this change, _setup_ip_addresses would be a better name (because cidrs will not have to be a range).","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"1a363dd67519e1ce48e61b69eb7ba70960fede74","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"        if device is None:"},{"line_number":1226,"context_line":"            device \u003d \u0027lo\u0027"},{"line_number":1227,"context_line":"        server \u003d self.servers[server_index]"},{"line_number":1228,"context_line":"        ssh_client \u003d self._setup_ssh_client(server)"},{"line_number":1229,"context_line":"        ssh_client.exec_command("},{"line_number":1230,"context_line":"            (\"for n in $(seq {start} {end}); do sudo ip addr add {net}$n \""},{"line_number":1231,"context_line":"             \"dev {dev}; done\").format(start\u003dstart_ip, end\u003dend_ip, net\u003dnet,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_418adc63","line":1228,"updated":"2018-05-31 08:09:24.000000000","message":"You would then do:\n\n  ips \u003d \u0027 \u0027.join(cidrs)\n  ssh_client.exec_command(\"for ip in {ips}; do sudo ip addr add $ip dev {dev}; done\".format(ips\u003dips, dev\u003ddevice))","commit_id":"0f8174901761715e2e5223b351876cd0af66efa9"}]}
