)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"1624a69682dadb8dab497bc0165caed4469006f4","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2015-03-30 05:11:01 +0000"},{"line_number":4,"context_line":"Commit:     sridhargaddam \u003csridhar.gaddam@enovance.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-03-30 18:09:47 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add sanity_check for keepalived ipv6 support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently Neutron does not validate the version of Keepalived."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"da9b358b_9fb041df","line":6,"updated":"2015-03-30 18:14:00.000000000","message":"I recently had to check what keepalived version each distro offers.\n\n    Ubuntu 14.04 offers 1.2.7\n\nThe other distros are fine:\n    Debian offers 1.2.13\n    Fedora 20, 21 and 22 now offer 1.2.15 that is based on upstream 1.2.15 + a fix for the 1.2.14/15 no-preempt bug\n\n    CentOS 7 and RHEL 7 offer 1.2.13\n\nThis patch means that the sanity tool will fail on Ubuntu 14.04. At least admins will get a message telling them that L3 HA + ipv6 won\u0027t work if their installer of choice actually runs the sanity check (I don\u0027t know if any installer uses this tool yet, I don\u0027t think if we\u0027ve communicated its existence and purpose well enough).\n\nThis is an open question - What should we do about Ubuntu 14.04 here? Maybe the more direct and productive thing to do is to try and find a volunteer to package keepalived for Ubuntu? It\u0027s still on 1.2.7 which was released in 2012.","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"e9deaee277e2f32827d4af60dae893574f097cd7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2015-03-30 05:11:01 +0000"},{"line_number":4,"context_line":"Commit:     sridhargaddam \u003csridhar.gaddam@enovance.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-03-30 18:09:47 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add sanity_check for keepalived ipv6 support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently Neutron does not validate the version of Keepalived."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"da9b358b_a8229bff","line":6,"in_reply_to":"da9b358b_9fb041df","updated":"2015-03-31 04:41:28.000000000","message":"I\u0027ll bring it up in today\u0027s IPv6 subteam meeting to see if there is any volunteer who can package keepalived for Ubuntu. If necessary, I\u0027ll send out an email to the mailing list. Thanks for reviewing the patch @Assaf.","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"5baba6517d0a76b91effb116cb20a4c55d89d572","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2015-03-30 05:11:01 +0000"},{"line_number":4,"context_line":"Commit:     sridhargaddam \u003csridhar.gaddam@enovance.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-03-30 18:09:47 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add sanity_check for keepalived ipv6 support"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently Neutron does not validate the version of Keepalived."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"da9b358b_d81e9f62","line":6,"in_reply_to":"da9b358b_a8229bff","updated":"2015-04-01 05:13:55.000000000","message":"We discussed this in IPv6 subteam meeting [1]. \nThanks to Zigo, for having a quick chat with \"Alexander Wirt\" (who packages keepalived for Ubuntu) explaining the requirement. \nThe requirement is now brought to the notice of Keepalived maintainer in Ubuntu and I\u0027ve also raised a bug on Keepalived package in Ubuntu [2] for tracking purpose.\n\n[1] - http://eavesdrop.openstack.org/meetings/neutron_ipv6/2015/neutron_ipv6.2015-03-31-15.01.log.html\n[2] - https://bugs.launchpad.net/ubuntu/+source/keepalived/+bug/1438757","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3ce25422d8bec13d529f522d32ba275a79458cb2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently Neutron does not validate the version of Keepalived."},{"line_number":10,"context_line":"In order to support configuring IPv6 default route, the minimum"},{"line_number":11,"context_line":"version [1] of keepalived that is required is 1.2.10"},{"line_number":12,"context_line":"This patch adds a sanity check to validate the keepalived version."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Although keepalived changelog mentions that IPv6 virtual_routes and"},{"line_number":15,"context_line":"static_routes are supported in version 1.2.8, it is seen that in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7a016987_12e4b4a9","line":12,"updated":"2015-05-30 20:38:24.000000000","message":"This sounds like you are checking the version number.\n\n\"This patch adds a sanity check to validate that the installed version of keepalived supports the features needed by neutron.\"","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8502391ea83f4051a5e741d3e8bda67b2b0929f0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently Neutron does not validate the version of Keepalived."},{"line_number":10,"context_line":"In order to support configuring IPv6 default route, the minimum"},{"line_number":11,"context_line":"version [1] of keepalived that is required is 1.2.10"},{"line_number":12,"context_line":"This patch adds a sanity check to validate the keepalived version."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Although keepalived changelog mentions that IPv6 virtual_routes and"},{"line_number":15,"context_line":"static_routes are supported in version 1.2.8, it is seen that in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7a016987_d4360102","line":12,"in_reply_to":"7a016987_12e4b4a9","updated":"2015-06-01 04:10:30.000000000","message":"Nice observation @Henry. I\u0027ll update the description.","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"}],"neutron/cmd/sanity/checks.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":"import shutil"},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":"import tempfile"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_ba8d5c7d","line":21,"updated":"2015-03-30 15:43:07.000000000","message":"tempfile is stdlib, and so is shutil.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":"from oslo_log import log as logging"},{"line_number":21,"context_line":"import shutil"},{"line_number":22,"context_line":"import six"},{"line_number":23,"context_line":"import tempfile"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_0e1e45ba","line":21,"in_reply_to":"da9b358b_ba8d5c7d","updated":"2015-03-30 17:25:21.000000000","message":"Done","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def start_keepalived_process(self):"},{"line_number":195,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_baef9caf","line":196,"updated":"2015-03-30 15:43:07.000000000","message":"It does not seem that you ever restore the overridden values for the rest of active checks.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e669926dbd2aaaeb29879faf7006422aa713dbad","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def start_keepalived_process(self):"},{"line_number":195,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_d10a42d2","line":196,"in_reply_to":"da9b358b_2efd893a","updated":"2015-03-30 17:30:05.000000000","message":"First, it\u0027s not a unit test. It\u0027s a tool that can be executed on (pre-)production machines.\n\nIf someone later adds another check for another service that relies on default value of the configuration option, then it will be broken depending on whether it was the first one to be called, or not.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def start_keepalived_process(self):"},{"line_number":195,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_2efd893a","line":196,"in_reply_to":"da9b358b_baef9caf","updated":"2015-03-30 17:25:21.000000000","message":"As you know, in this testcase we spawn only a single process of keepalived to validate IPv6 address assignment and default route addition. So I do not think we will have to restore the overridden value. Am i missing something?","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"},{"line_number":200,"context_line":"        cfg.CONF.set_override(\u0027state_path\u0027, self.config_path)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_1ad20801","line":199,"updated":"2015-03-30 15:43:07.000000000","message":"Why do you need to explicitly set the directory?","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"},{"line_number":200,"context_line":"        cfg.CONF.set_override(\u0027state_path\u0027, self.config_path)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_8beda78d","line":199,"in_reply_to":"da9b358b_1ad20801","updated":"2015-03-30 17:25:21.000000000","message":"Keepalived is spawned as follows \n\"keepalived -P -f /tmp/tmpssirxQ/router1/keepalived.conf -p /tmp/tmpssirxQ/router1.pid -r /tmp/tmpssirxQ/router1.pid-vrrp\"\nSo the idea is to store the keepalived.conf/router1.pid and router1.pid-vrrp files in a temporary directory which can be deleted after the test is completed.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e669926dbd2aaaeb29879faf7006422aa713dbad","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":199,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"},{"line_number":200,"context_line":"        cfg.CONF.set_override(\u0027state_path\u0027, self.config_path)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_f1d30637","line":199,"in_reply_to":"da9b358b_8beda78d","updated":"2015-03-30 17:30:05.000000000","message":"Sure. But why not using default temporary directory for the system instead of hardcoding /tmp/? I assume there can be distributions and environments where /tmp is not available to write into, or not existing, or the preferred place for temp files is different.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":203,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.kaconfig,"},{"line_number":204,"context_line":"            namespace\u003dself.nsname, process_monitor\u003dself.pm,"},{"line_number":205,"context_line":"            conf_path\u003dcfg.CONF.state_path)"},{"line_number":206,"context_line":"        self.manager.spawn()"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def verify_ipv6_address_assignment(self, gw_dev):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_7a7eb4e5","line":205,"updated":"2015-03-30 15:43:07.000000000","message":"Will it work if we pass self.config_path directly without overriding the value on global CONF object?","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":203,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.kaconfig,"},{"line_number":204,"context_line":"            namespace\u003dself.nsname, process_monitor\u003dself.pm,"},{"line_number":205,"context_line":"            conf_path\u003dcfg.CONF.state_path)"},{"line_number":206,"context_line":"        self.manager.spawn()"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def verify_ipv6_address_assignment(self, gw_dev):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_abb62b88","line":205,"in_reply_to":"da9b358b_7a7eb4e5","updated":"2015-03-30 17:25:21.000000000","message":"Yes @Ihar it should work. I\u0027ll modify it accordingly.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        self.pm.stop()"},{"line_number":224,"context_line":"        if self.manager:"},{"line_number":225,"context_line":"            self.manager.disable()"},{"line_number":226,"context_line":"            shutil.rmtree(self.config_path, ignore_errors\u003dTrue)"},{"line_number":227,"context_line":"        ip_lib.IPWrapper().netns.delete(self.nsname)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_3ab5cccc","line":226,"updated":"2015-03-30 15:43:07.000000000","message":"The cleanup is not ideal. If we fail after mkdtemp call but before self.manager is initialized, we leave the directory on the file system. You could instead clean it up independently of self.manager.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        self.pm.stop()"},{"line_number":224,"context_line":"        if self.manager:"},{"line_number":225,"context_line":"            self.manager.disable()"},{"line_number":226,"context_line":"            shutil.rmtree(self.config_path, ignore_errors\u003dTrue)"},{"line_number":227,"context_line":"        ip_lib.IPWrapper().netns.delete(self.nsname)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_0e1be573","line":226,"in_reply_to":"da9b358b_3ab5cccc","updated":"2015-03-30 17:25:21.000000000","message":"Done","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":243,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":244,"context_line":"    ha_port \u003d \"ha-\" + random_str"},{"line_number":245,"context_line":"    gw_port \u003d \"qg-\" + random_str"},{"line_number":246,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":247,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_9a05f8c3","line":244,"updated":"2015-03-30 15:43:07.000000000","message":"Use HA_DEV_PREFIX.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":243,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":244,"context_line":"    ha_port \u003d \"ha-\" + random_str"},{"line_number":245,"context_line":"    gw_port \u003d \"qg-\" + random_str"},{"line_number":246,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":247,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_b120de9c","line":244,"in_reply_to":"da9b358b_9a05f8c3","updated":"2015-03-30 17:25:21.000000000","message":"Actually we can use any name for the ports. Anyway, no issues, i\u0027ll use the constants.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e669926dbd2aaaeb29879faf7006422aa713dbad","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":243,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":244,"context_line":"    ha_port \u003d \"ha-\" + random_str"},{"line_number":245,"context_line":"    gw_port \u003d \"qg-\" + random_str"},{"line_number":246,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":247,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_31c96e79","line":244,"in_reply_to":"da9b358b_b120de9c","updated":"2015-03-30 17:30:05.000000000","message":"Ah, ok. Still a good thing to see it consistent with what actual production code does.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ef25870ff7197b4080f76441728a69aa5bbd6602","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":243,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":244,"context_line":"    ha_port \u003d \"ha-\" + random_str"},{"line_number":245,"context_line":"    gw_port \u003d \"qg-\" + random_str"},{"line_number":246,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":247,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_ba69dc8d","line":245,"updated":"2015-03-30 15:43:07.000000000","message":"Please use INTERNAL_DEV_PREFIX constant here.","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"015b8fdfac8432bd62246efe08882500fc1e2542","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":243,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":244,"context_line":"    ha_port \u003d \"ha-\" + random_str"},{"line_number":245,"context_line":"    gw_port \u003d \"qg-\" + random_str"},{"line_number":246,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":247,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da9b358b_9125daac","line":245,"in_reply_to":"da9b358b_ba69dc8d","updated":"2015-03-30 17:25:21.000000000","message":"Done","commit_id":"3a5e1f1bc421001b0105bd42050ca777bb6450a0"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"809fe4f7af7331a1c71ed1df00451f07a881acfb","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def start_keepalived_process(self):"},{"line_number":198,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":199,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":202,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_11742a33","line":199,"updated":"2015-03-30 17:31:41.000000000","message":"I still think we should clean up the values on __exit__.","commit_id":"34337fdf1903b118bb3a8162b28b3fdff714796f"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8dcee6461cbdc010a5ef31d8a4466a9a45555f7d","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def start_keepalived_process(self):"},{"line_number":198,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":199,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":202,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_b4120c61","line":199,"in_reply_to":"da9b358b_11742a33","updated":"2015-03-30 18:10:17.000000000","message":"Sure @Ihar, I\u0027ll add the associated change.","commit_id":"34337fdf1903b118bb3a8162b28b3fdff714796f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"809fe4f7af7331a1c71ed1df00451f07a881acfb","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":202,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":205,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.kaconfig,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_71a496a5","line":202,"updated":"2015-03-30 17:31:41.000000000","message":"Explicit dir\u003d may be unneeded.","commit_id":"34337fdf1903b118bb3a8162b28b3fdff714796f"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8dcee6461cbdc010a5ef31d8a4466a9a45555f7d","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":202,"context_line":"        self.config_path \u003d tempfile.mkdtemp(dir\u003d\u0027/tmp/\u0027)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":205,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.kaconfig,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da9b358b_5f4cf941","line":202,"in_reply_to":"da9b358b_71a496a5","updated":"2015-03-30 18:10:17.000000000","message":"Done","commit_id":"34337fdf1903b118bb3a8162b28b3fdff714796f"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"1624a69682dadb8dab497bc0165caed4469006f4","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                                                          self.default_gw,"},{"line_number":193,"context_line":"                                                          self.gw_port)"},{"line_number":194,"context_line":"        instance1.virtual_routes.append(virtual_route)"},{"line_number":195,"context_line":"        config.add_instance(instance1)"},{"line_number":196,"context_line":"        self.kaconfig \u003d config"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def start_keepalived_process(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_df880925","line":195,"updated":"2015-03-30 18:14:00.000000000","message":"self.config should work. I don\u0027t think \u0027ka\u0027 is a very popular acronym. Also, please set self.config to None in __init__.","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"e9deaee277e2f32827d4af60dae893574f097cd7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                                                          self.default_gw,"},{"line_number":193,"context_line":"                                                          self.gw_port)"},{"line_number":194,"context_line":"        instance1.virtual_routes.append(virtual_route)"},{"line_number":195,"context_line":"        config.add_instance(instance1)"},{"line_number":196,"context_line":"        self.kaconfig \u003d config"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def start_keepalived_process(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_08e867b3","line":195,"in_reply_to":"da9b358b_df880925","updated":"2015-03-31 04:41:28.000000000","message":"Done","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"1624a69682dadb8dab497bc0165caed4469006f4","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":250,"context_line":"    ha_port \u003d ha_router.HA_DEV_PREFIX + random_str"},{"line_number":251,"context_line":"    gw_port \u003d namespaces.INTERNAL_DEV_PREFIX + random_str"},{"line_number":252,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":253,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    with ovs_lib.OVSBridge(br_name) as br:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_df8fe921","line":252,"updated":"2015-03-30 18:14:00.000000000","message":"Let\u0027s not skimp on letters here :)\n    exp -\u003e expected\n    dflt (Kudos this is a very imaginitive shortening) -\u003e default","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"e9deaee277e2f32827d4af60dae893574f097cd7","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":250,"context_line":"    ha_port \u003d ha_router.HA_DEV_PREFIX + random_str"},{"line_number":251,"context_line":"    gw_port \u003d namespaces.INTERNAL_DEV_PREFIX + random_str"},{"line_number":252,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":253,"context_line":"    exp_dflt_gw \u003d \u0027fe80:f816::1\u0027"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    with ovs_lib.OVSBridge(br_name) as br:"}],"source_content_type":"text/x-python","patch_set":4,"id":"da9b358b_2808cb90","line":252,"in_reply_to":"da9b358b_df8fe921","updated":"2015-03-31 04:41:28.000000000","message":"LOL. I had to do this to fit L256 in \u003c 80 chars. No issues, I\u0027ll update it.","commit_id":"179de3a5696ca1729952bd4a7c9ba65a90da7109"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"fb706c45047c1a9ec3c0ca63b813363e731566cd","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_f9b6443c","line":204,"updated":"2015-04-07 15:39:15.000000000","message":"use:\n\n  self.useFixture(fixtures.TempDir())\n\nTempDir will handle directory create/delete","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"52adbfc93dbd669a8bb68c184217687a59ff5d8b","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_31cb9820","line":204,"in_reply_to":"9aa53dc9_06b17ce1","updated":"2015-04-07 21:38:35.000000000","message":"Ok Cedric, I\u0027ll use fixtures for TempDir() as suggested.","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"bf8b8545daf8be6d8c32210ae21c26d4522de7c9","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_20d7c824","line":204,"in_reply_to":"9aa53dc9_0c1be81c","updated":"2015-04-07 18:51:46.000000000","message":"@Cedric, fixtures seem to be used along with test frameworks that support TestCase.addCleanup(). In our unit/functional tests we use unittest/testtools which have methods like setUp() and addCleanup() but here in Sanity tests each test is an independent test which validates the required functionality and cleans it up once  the test is completed. As you can see, in the current patch it is handled via \"with\" (__enter__, __exit__). \n\nIf you see any issues with the current patch please let me know and I will address it. Otherwise, I would prefer to continue with the current patch instead of identifying/modifying the code to use fixtures. Please let me know your thoughts. Thanks.","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0166ab10c42adcbfc62d43a1564b0e61f70deb62","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_06b17ce1","line":204,"in_reply_to":"9aa53dc9_20d7c824","updated":"2015-04-07 19:46:43.000000000","message":"In neutron, fixtures are in unittest/testtools classes but it\u0027s not a requirement. You can use them as context:\n\n  with fixtures.TempDir() as fixture:\n    path \u003d fixture.path\n    ....\n\nor using explicit setUp/cleanUp calls\n\n  fixture \u003d fixtures.TempDir()\n  fixture.setUp()\n  path \u003d fixture.path\n  ....\n  fixture.cleanUp()","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"9ed8e422c023627a6db45332298be2c6e367ce51","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_0c1be81c","line":204,"in_reply_to":"9aa53dc9_b91d5c75","updated":"2015-04-07 15:47:52.000000000","message":"Fixtures are primarily for unit testing but we can use them outside of tests ... even more in sanity checks!\n\n  with fixture:\n    ...\n\nor\n\n  fixture.setUp()\n  ...\n  fixture.cleanUp()","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"589f3b21121dd3e172476ef67347e87d92d23655","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":204,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        # Instantiate keepalived manager with the IPv6 configuration."},{"line_number":207,"context_line":"        self.manager \u003d keepalived.KeepalivedManager(\u0027router1\u0027, self.config,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_b91d5c75","line":204,"in_reply_to":"9aa53dc9_f9b6443c","updated":"2015-04-07 15:41:31.000000000","message":"Cedric, however similar, it\u0027s not a unit test. :)","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"fb706c45047c1a9ec3c0ca63b813363e731566cd","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    \"\"\""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":250,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":251,"context_line":"    ha_port \u003d ha_router.HA_DEV_PREFIX + random_str"},{"line_number":252,"context_line":"    gw_port \u003d namespaces.INTERNAL_DEV_PREFIX + random_str"},{"line_number":253,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_f9c5245b","line":250,"updated":"2015-04-07 15:39:15.000000000","message":"prefer:\n\n  self.useFixture(OVSBridgeFixture(prefix\u003d\u0027ka-test-\u0027))\n\n(neutron.tests.common.net_helpers)\n\nit delegates bridge name generate/length + bridge create/delete","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"6bb362d0824f2b37b4c10d0ed568f702206c35c5","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    \"\"\""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":250,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":251,"context_line":"    ha_port \u003d ha_router.HA_DEV_PREFIX + random_str"},{"line_number":252,"context_line":"    gw_port \u003d namespaces.INTERNAL_DEV_PREFIX + random_str"},{"line_number":253,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_e8b090df","line":250,"in_reply_to":"9aa53dc9_e35fa53f","updated":"2015-04-08 09:24:26.000000000","message":"you can add prefix support or depend on https://review.openstack.org/#/c/123000/50/neutron/tests/common/net_helpers.py","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"52adbfc93dbd669a8bb68c184217687a59ff5d8b","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    \"\"\""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    random_str \u003d utils.get_random_string(6)"},{"line_number":250,"context_line":"    br_name \u003d \"ka-test-\" + random_str"},{"line_number":251,"context_line":"    ha_port \u003d ha_router.HA_DEV_PREFIX + random_str"},{"line_number":252,"context_line":"    gw_port \u003d namespaces.INTERNAL_DEV_PREFIX + random_str"},{"line_number":253,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_e35fa53f","line":250,"in_reply_to":"9aa53dc9_f9c5245b","updated":"2015-04-07 21:38:35.000000000","message":"@Cedric, I\u0027m afraid we cannot invoke useFixture here as this is a function and not a method of any class. Also, OVSBridgeFixture does not seem to take any prefix. \n\nCan we please leave this part of code in the current state, as we are anyway creating the OVS bridge with context where cleanup is handled properly. I\u0027ll be happy to fix any issue in the code if you find any flaw with this implementation.","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"fb706c45047c1a9ec3c0ca63b813363e731566cd","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    with ovs_lib.OVSBridge(br_name) as br:"},{"line_number":257,"context_line":"        with KeepalivedIPv6Test(ha_port, gw_port, gw_vip,"},{"line_number":258,"context_line":"                                expected_default_gw) as ka:"},{"line_number":259,"context_line":"            br.add_port(ha_port, (\u0027type\u0027, \u0027internal\u0027))"},{"line_number":260,"context_line":"            br.add_port(gw_port, (\u0027type\u0027, \u0027internal\u0027))"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"            ha_dev \u003d ip_lib.IPDevice(ha_port)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_d9c70011","line":259,"updated":"2015-04-07 15:39:15.000000000","message":"prefer:\n\n  self.useFixture(OVSPortFixture(bridge, namespace\u003dka.nsname))\n\n(neutron.tests.common.net_helpers)","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1261ec217d7521029b92b3997dbeb6d885f68241","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.manager \u003d None"},{"line_number":182,"context_line":"        self.config \u003d None"},{"line_number":183,"context_line":"        self.nsname \u003d \"keepalivedtest-\" + uuidutils.generate_uuid()"},{"line_number":184,"context_line":"        ip_lib.IPWrapper().netns.add(self.nsname)"},{"line_number":185,"context_line":"        self.pm \u003d external_process.ProcessMonitor(cfg.CONF, \u0027router\u0027)"},{"line_number":186,"context_line":"        self.orig_interval \u003d cfg.CONF.AGENT.check_child_processes_interval"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_322330bf","line":184,"updated":"2015-05-30 20:51:37.000000000","message":"the namespace should be created in __enter__ as nothing ensures the class will be used as a context","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8502391ea83f4051a5e741d3e8bda67b2b0929f0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        self.manager \u003d None"},{"line_number":182,"context_line":"        self.config \u003d None"},{"line_number":183,"context_line":"        self.nsname \u003d \"keepalivedtest-\" + uuidutils.generate_uuid()"},{"line_number":184,"context_line":"        ip_lib.IPWrapper().netns.add(self.nsname)"},{"line_number":185,"context_line":"        self.pm \u003d external_process.ProcessMonitor(cfg.CONF, \u0027router\u0027)"},{"line_number":186,"context_line":"        self.orig_interval \u003d cfg.CONF.AGENT.check_child_processes_interval"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_b43945f4","line":184,"in_reply_to":"7a016987_322330bf","updated":"2015-06-01 04:10:30.000000000","message":"Done","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1261ec217d7521029b92b3997dbeb6d885f68241","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        return self"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def __exit__(self, exc_type, exc_value, exc_tb):"},{"line_number":232,"context_line":"        self.pm.stop()"},{"line_number":233,"context_line":"        if self.manager:"},{"line_number":234,"context_line":"            self.manager.disable()"},{"line_number":235,"context_line":"        ip_lib.IPWrapper().netns.delete(self.nsname)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_5228ec99","line":232,"updated":"2015-05-30 20:51:37.000000000","message":"this method seems not bulletproof: the namespace is not deleted if self.pm is not started or if self.manager.disable() crashs","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8502391ea83f4051a5e741d3e8bda67b2b0929f0","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        return self"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def __exit__(self, exc_type, exc_value, exc_tb):"},{"line_number":232,"context_line":"        self.pm.stop()"},{"line_number":233,"context_line":"        if self.manager:"},{"line_number":234,"context_line":"            self.manager.disable()"},{"line_number":235,"context_line":"        ip_lib.IPWrapper().netns.delete(self.nsname)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_943c09e2","line":232,"in_reply_to":"7a016987_1205d412","updated":"2015-06-01 04:10:30.000000000","message":"Ok @Cedric, I\u0027ll use a fixture. Thanks.","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"5c3cb6c710e2e58342487145e90c4d33f9572390","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        return self"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def __exit__(self, exc_type, exc_value, exc_tb):"},{"line_number":232,"context_line":"        self.pm.stop()"},{"line_number":233,"context_line":"        if self.manager:"},{"line_number":234,"context_line":"            self.manager.disable()"},{"line_number":235,"context_line":"        ip_lib.IPWrapper().netns.delete(self.nsname)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_1205d412","line":232,"in_reply_to":"7a016987_5228ec99","updated":"2015-05-30 20:54:25.000000000","message":"Defining a fixture using addCleanup provides a good solution to avoid such trouble","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3ce25422d8bec13d529f522d32ba275a79458cb2","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                              self.orig_interval, \u0027AGENT\u0027)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"def keepalived_IPv6_supported():"},{"line_number":241,"context_line":"    \"\"\"Check if keepalived supports IPv6 functionality."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    Validation is done as follows."}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_3200d033","line":240,"updated":"2015-05-30 20:38:24.000000000","message":"Nit: ipv6 (all lowercase for function names)","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8502391ea83f4051a5e741d3e8bda67b2b0929f0","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                              self.orig_interval, \u0027AGENT\u0027)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"def keepalived_IPv6_supported():"},{"line_number":241,"context_line":"    \"\"\"Check if keepalived supports IPv6 functionality."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    Validation is done as follows."}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_542331bd","line":240,"in_reply_to":"7a016987_3200d033","updated":"2015-06-01 04:10:30.000000000","message":"Done","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"41f3864015acaf1f43307c5fabb9eb16e0c6fa66","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_3898a869","line":18,"updated":"2015-06-18 14:03:13.000000000","message":"To use this here means you would need to move fixtures from test-requirements.txt to requirements.txt\n\nI am not sure if that is something we want to do.","commit_id":"b7746760f1bee875c9e60704c76594920e8b8411"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"26ea7032054b994070fd58dc0f91df5e1fa32991","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_b380598c","line":18,"in_reply_to":"fa32b979_3898a869","updated":"2015-06-18 14:31:31.000000000","message":"Good remark","commit_id":"b7746760f1bee875c9e60704c76594920e8b8411"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"1a25897ccbc0738ee7f09273c224d16f53f3a8b9","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_9a43e1ae","line":18,"in_reply_to":"fa32b979_3898a869","updated":"2015-06-18 16:46:01.000000000","message":"Thanks @Henry for reviewing the patch. \n\nHenry if adding fixtures to requirements.txt is not a recommended solution, I can revert the changes related to fixtures. \n\nBasically, it got introduced during review of patch5. Please take a look at the comments and suggest.\nhttps://review.openstack.org/#/c/168781/5..10/neutron/cmd/sanity/checks.py","commit_id":"b7746760f1bee875c9e60704c76594920e8b8411"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"efb23080f9e95c2329d13bf5d4061bd52bb7469b","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"import netaddr"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_80192e24","line":18,"in_reply_to":"fa32b979_9a43e1ae","updated":"2015-06-18 17:25:19.000000000","message":"Yes, please revert. Using fixtures is a good idea, but first we need to understand if it is OK to add the dependency to neutron.","commit_id":"b7746760f1bee875c9e60704c76594920e8b8411"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"26ea7032054b994070fd58dc0f91df5e1fa32991","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    gw_vip \u003d \u0027fdf8:f53b:82e4::10/64\u0027"},{"line_number":265,"context_line":"    expected_default_gw \u003d \u0027fe80:f816::1\u0027"},{"line_number":266,"context_line":"    ns_fixture \u003d fixtures.FunctionFixture(namespace_create, namespace_delete)"},{"line_number":267,"context_line":"    ns_fixture.setUp()"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    with ovs_lib.OVSBridge(br_name) as br, fixtures.TempDir() as tempdir:"},{"line_number":270,"context_line":"        with KeepalivedIPv6Test(ns_fixture.fn_result, ha_port, gw_port, gw_vip,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_2ea4de05","line":267,"updated":"2015-06-18 14:31:31.000000000","message":"you should use:\n\n  with ns_fixture:\n\nto ensure cleanUp call.\n\nMoreover there is a namespace fixture in neutron.tests.common.net_helpers but we should choose 1st if we want to add fixtures in requirements.txt","commit_id":"b7746760f1bee875c9e60704c76594920e8b8411"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"55ab8037e304b739fa830e384458ee1ded545408","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        self.config \u003d config"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def start_keepalived_process(self):"},{"line_number":209,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":210,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        # Create a temp directory to store keepalived configuration."}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_f8719545","line":209,"updated":"2015-06-26 13:42:34.000000000","message":"I think the comments in this methods can be removed, they don\u0027t add much info.","commit_id":"a04f44412bca2fce75ee32d16c71f6787b8a1682"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"513dc138e8a452494ed39596ec18b72acde9f548","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def start_keepalived_process(self):"},{"line_number":209,"context_line":"        # Disable process monitoring for Keepalived process."},{"line_number":210,"context_line":"        cfg.CONF.set_override(\u0027check_child_processes_interval\u0027, 0, \u0027AGENT\u0027)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        # Create a temp directory to store keepalived configuration."},{"line_number":213,"context_line":"        self.config_path \u003d tempfile.mkdtemp()"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a41bdd9_e40b2f2a","line":210,"updated":"2015-07-17 08:08:30.000000000","message":"(No action required) nit: I\u0027d disable it for all sanity checks in general. This way you don\u0027t need to re-enable it at the end either.","commit_id":"a04f44412bca2fce75ee32d16c71f6787b8a1682"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"55ab8037e304b739fa830e384458ee1ded545408","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def verify_ipv6_address_assignment(self, gw_dev):"},{"line_number":222,"context_line":"        process \u003d self.manager.get_process()"},{"line_number":223,"context_line":"        agent_utils.wait_until_true(lambda: process.active)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        def _gw_vip_assigned():"},{"line_number":226,"context_line":"            iface_ip \u003d gw_dev.addr.list(ip_version\u003d6, scope\u003d\u0027global\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_58a3e100","line":223,"updated":"2015-06-26 13:42:34.000000000","message":"lambda is not needed","commit_id":"a04f44412bca2fce75ee32d16c71f6787b8a1682"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"1ca0c55a585cdcc7c546d518d82e34463fa86f3f","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def verify_ipv6_address_assignment(self, gw_dev):"},{"line_number":222,"context_line":"        process \u003d self.manager.get_process()"},{"line_number":223,"context_line":"        agent_utils.wait_until_true(lambda: process.active)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        def _gw_vip_assigned():"},{"line_number":226,"context_line":"            iface_ip \u003d gw_dev.addr.list(ip_version\u003d6, scope\u003d\u0027global\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a41bdd9_3aba8c6f","line":223,"in_reply_to":"9a41bdd9_a7bd2904","updated":"2015-07-17 08:39:33.000000000","message":"Agree with Ajo. process.active is a @property, so we require lambda. \n\nThanks @Rosella and @Ajo for reviewing the patch.","commit_id":"a04f44412bca2fce75ee32d16c71f6787b8a1682"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"513dc138e8a452494ed39596ec18b72acde9f548","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def verify_ipv6_address_assignment(self, gw_dev):"},{"line_number":222,"context_line":"        process \u003d self.manager.get_process()"},{"line_number":223,"context_line":"        agent_utils.wait_until_true(lambda: process.active)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        def _gw_vip_assigned():"},{"line_number":226,"context_line":"            iface_ip \u003d gw_dev.addr.list(ip_version\u003d6, scope\u003d\u0027global\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a41bdd9_a7bd2904","line":223,"in_reply_to":"fa32b979_58a3e100","updated":"2015-07-17 08:08:30.000000000","message":"I believe, lambda is needed, wait_until_true expects a function.","commit_id":"a04f44412bca2fce75ee32d16c71f6787b8a1682"}],"neutron/cmd/sanity_check.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"fb706c45047c1a9ec3c0ca63b813363e731566cd","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.agent import dhcp_agent"},{"line_number":22,"context_line":"from neutron.cmd.sanity import checks"},{"line_number":23,"context_line":"from neutron.common import config"},{"line_number":24,"context_line":"from neutron.db.l3_hamode_db import L3_HA_OPTS"},{"line_number":25,"context_line":"from neutron.i18n import _LE, _LW"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_36239bbf","line":24,"updated":"2015-04-07 15:39:15.000000000","message":"we should import modules not module attributes.","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"bf8b8545daf8be6d8c32210ae21c26d4522de7c9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.agent import dhcp_agent"},{"line_number":22,"context_line":"from neutron.cmd.sanity import checks"},{"line_number":23,"context_line":"from neutron.common import config"},{"line_number":24,"context_line":"from neutron.db.l3_hamode_db import L3_HA_OPTS"},{"line_number":25,"context_line":"from neutron.i18n import _LE, _LW"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_40bbece5","line":24,"in_reply_to":"9aa53dc9_36239bbf","updated":"2015-04-07 18:51:46.000000000","message":"ok, will update it. Thanks for reviewing the patch.","commit_id":"28dccaaa167d8416f58a5ffe927af3bacb0f9f0b"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"3ce25422d8bec13d529f522d32ba275a79458cb2","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    return result"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def check_keepalived_IPv6_support():"},{"line_number":108,"context_line":"    result \u003d checks.keepalived_IPv6_supported()"},{"line_number":109,"context_line":"    if not result:"},{"line_number":110,"context_line":"        LOG.error(_LE(\u0027The installed version of keepalived does not support \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_3287b0b6","line":107,"updated":"2015-05-30 20:38:24.000000000","message":"Nit: lowercase","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"8502391ea83f4051a5e741d3e8bda67b2b0929f0","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    return result"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def check_keepalived_IPv6_support():"},{"line_number":108,"context_line":"    result \u003d checks.keepalived_IPv6_supported()"},{"line_number":109,"context_line":"    if not result:"},{"line_number":110,"context_line":"        LOG.error(_LE(\u0027The installed version of keepalived does not support \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_d41de173","line":107,"in_reply_to":"7a016987_3287b0b6","updated":"2015-06-01 04:10:30.000000000","message":"Done","commit_id":"9366f1724e481b791cc895220b4ab3278c3f58ea"}]}
