)]}'
{"tempest/scenario/manager.py":[{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            if not self.not_found_exception(e):"},{"line_number":148,"context_line":"                raise"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def delete_wrapper_wait_notfound(self, thing):"},{"line_number":151,"context_line":"        \"\"\"Ignores NotFound exceptions for delete operations."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        @param thing: object with delete() method."}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_caa9ec91","line":150,"updated":"2014-07-23 09:53:34.000000000","message":"probably it\u0027s better to name it \"delete_wrapper_wait_not_found\"?","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            if not self.not_found_exception(e):"},{"line_number":148,"context_line":"                raise"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def delete_wrapper_wait_notfound(self, thing):"},{"line_number":151,"context_line":"        \"\"\"Ignores NotFound exceptions for delete operations."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        @param thing: object with delete() method."}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_d9929a57","line":150,"in_reply_to":"baada198_caa9ec91","updated":"2014-07-23 16:23:28.000000000","message":"Done","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            destroys the resource"},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        def check_exists():"},{"line_number":159,"context_line":"            try:"},{"line_number":160,"context_line":"                thing.get()"},{"line_number":161,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_6aeaa0d9","line":158,"updated":"2014-07-23 09:53:34.000000000","message":"As I understand, this method returns True when a resource can not be found. So it might be logical to  rename it to \"check_not_found\" or \"check_does_not_exist\".","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            destroys the resource"},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        def check_exists():"},{"line_number":159,"context_line":"            try:"},{"line_number":160,"context_line":"                thing.get()"},{"line_number":161,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_3998f674","line":158,"in_reply_to":"baada198_6aeaa0d9","updated":"2014-07-23 16:23:28.000000000","message":"Done","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        return relevant_port[\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"    def _wait_for_status(self, resource_name, resource_id, status):"},{"line_number":810,"context_line":"        \"\"\""},{"line_number":811,"context_line":"        Runs a show command for a given result, compares the status of the"},{"line_number":812,"context_line":"        resource with a given value and keeps doing this until it reaches a"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c0554bfb","line":809,"updated":"2014-07-23 09:53:34.000000000","message":"This method duplicates the status_timeout a lot. So why not use it instead?","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"fa6d567741569e531f9ca11f8789901b9a548b52","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        return relevant_port[\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"    def _wait_for_status(self, resource_name, resource_id, status):"},{"line_number":810,"context_line":"        \"\"\""},{"line_number":811,"context_line":"        Runs a show command for a given result, compares the status of the"},{"line_number":812,"context_line":"        resource with a given value and keeps doing this until it reaches a"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_ab4bac5d","line":809,"in_reply_to":"baada198_a2eaf4d5","updated":"2014-07-24 11:52:03.000000000","message":"Thank you for the information. I added the NeutronRetriever class in the manager under NetworkScenarioTest class that it can be reused by other networking scenarios too. Also I removed the _net_resource_check_status from the code.","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"2ec3b83c0a002a7af5b13ef84f53e886360da883","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        return relevant_port[\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"    def _wait_for_status(self, resource_name, resource_id, status):"},{"line_number":810,"context_line":"        \"\"\""},{"line_number":811,"context_line":"        Runs a show command for a given result, compares the status of the"},{"line_number":812,"context_line":"        resource with a given value and keeps doing this until it reaches a"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_a2eaf4d5","line":809,"in_reply_to":"baada198_bc6f94c3","updated":"2014-07-24 11:14:51.000000000","message":"That is true, status_timeout is targeted to work with nova objects. But in general handling of getting objects is the only significant difference between status_timeout and your method. Even though I am definitely not against making it easier to work with neutron objects, the way it is done now involves too much duplication. One of the options I can suggest is to create a helper that would redefine the get method like it\u0027s done here https://github.com/openstack/tempest/blob/master/tempest/scenario/test_load_balancer_basic.py#L319","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        return relevant_port[\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"    def _wait_for_status(self, resource_name, resource_id, status):"},{"line_number":810,"context_line":"        \"\"\""},{"line_number":811,"context_line":"        Runs a show command for a given result, compares the status of the"},{"line_number":812,"context_line":"        resource with a given value and keeps doing this until it reaches a"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_bc6f94c3","line":809,"in_reply_to":"baada198_c0554bfb","updated":"2014-07-23 16:23:28.000000000","message":"_status_timeout was written for the compute client and assumes few things that do not work with the neutron client (for example things.get(thing_id)). I guess as _wait_for_status code is very specific to network client we can change the name to _net_resource_wait_for_status for example to be more explicit that it is for the network resources only.","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"881dd82b43912ecf9208eeb860198fcf17a2fc23","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            if not self.not_found_exception(e):"},{"line_number":174,"context_line":"                raise"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def delete_wrapper_wait_not_found(self, thing):"},{"line_number":177,"context_line":"        \"\"\"Ignores NotFound exceptions for delete operations."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        @param thing: object with delete() method."}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_6c669c2a","line":176,"updated":"2014-07-28 16:57:44.000000000","message":"You are duplicating some code from delete_wrapper().\n\nHave you concidered decorating the function delete_wrapper() ? Or maybe at least, call delete_wrapper() line 195","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"0e36f927064d1c2dc0ecc916b61b2de79c17a187","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            if not self.not_found_exception(e):"},{"line_number":174,"context_line":"                raise"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def delete_wrapper_wait_not_found(self, thing):"},{"line_number":177,"context_line":"        \"\"\"Ignores NotFound exceptions for delete operations."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        @param thing: object with delete() method."}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e6dd24df","line":176,"in_reply_to":"baada198_6c669c2a","updated":"2014-08-06 10:41:08.000000000","message":"delete_wrapper() / delete_wrapper_wait_not_found() are sent as a function argument to addCleanup and adding additional parameter to delete_wrapper would complicate the call from addCleanup.\nI fix it using the second approach by calling delete_wrapper() to delete the resource.","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"881dd82b43912ecf9208eeb860198fcf17a2fc23","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                raise"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        tempest.test.call_until_true(check_not_found,"},{"line_number":203,"context_line":"                               CONF.compute.ping_timeout, 1)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _wait_for_cleanups(self):"},{"line_number":206,"context_line":"        \"\"\"To handle async delete actions, a list of waits is added"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_4c60f834","line":203,"updated":"2014-07-28 16:57:44.000000000","message":"Why do you use compute.ping_timeout and not something else like network.build_timeout for instance ?","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"0e36f927064d1c2dc0ecc916b61b2de79c17a187","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                raise"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        tempest.test.call_until_true(check_not_found,"},{"line_number":203,"context_line":"                               CONF.compute.ping_timeout, 1)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _wait_for_cleanups(self):"},{"line_number":206,"context_line":"        \"\"\"To handle async delete actions, a list of waits is added"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_868468b3","line":203,"in_reply_to":"baada198_4c60f834","updated":"2014-08-06 10:41:08.000000000","message":"You are right. Better to use network.build_timeout which is exactly used for timeout for network operations.","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"881dd82b43912ecf9208eeb860198fcf17a2fc23","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        super(NetworkScenarioTest, cls).setUpClass()"},{"line_number":815,"context_line":"        cls.tenant_id \u003d cls.manager.identity_client.tenant_id"},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"    class NeutronRetriever(object):"},{"line_number":818,"context_line":"        \"\"\""},{"line_number":819,"context_line":"        Helper class to make possible handling neutron objects returned by GET"},{"line_number":820,"context_line":"        requests as attribute dicts."}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e7400537","line":817,"updated":"2014-07-28 16:57:44.000000000","message":"This is a copy/paste of class NeutronRetriever in ./scenario/test_load_balancer_basic.py\n\nIf you want to put the class NeutronRetriever at a higher level (ie in scenario/manager.py like you do in this patch) please do the cleanup in scenario/test_load_balancer_basic.py","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"0e36f927064d1c2dc0ecc916b61b2de79c17a187","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        super(NetworkScenarioTest, cls).setUpClass()"},{"line_number":815,"context_line":"        cls.tenant_id \u003d cls.manager.identity_client.tenant_id"},{"line_number":816,"context_line":""},{"line_number":817,"context_line":"    class NeutronRetriever(object):"},{"line_number":818,"context_line":"        \"\"\""},{"line_number":819,"context_line":"        Helper class to make possible handling neutron objects returned by GET"},{"line_number":820,"context_line":"        requests as attribute dicts."}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_a6a88c22","line":817,"in_reply_to":"baada198_e7400537","updated":"2014-08-06 10:41:08.000000000","message":"Done","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"1c5b77260b371c256699c89f970ee4d1b748939e","unresolved":false,"context_lines":[{"line_number":787,"context_line":"        cls.tenant_id \u003d cls.manager.identity_client.tenant_id"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"    class NeutronRetriever(object):"},{"line_number":790,"context_line":"        \"\"\""},{"line_number":791,"context_line":"        Helper class to make possible handling neutron objects returned by GET"},{"line_number":792,"context_line":"        requests as attribute dicts."},{"line_number":793,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_be2b4b2f","line":790,"updated":"2014-08-14 09:37:20.000000000","message":"Need to fix doc-string: Multi line docstrings should start without a leading new line.\n\nYou can found more info by the following link:\nhttp://docs.openstack.org/developer/hacking/#docstrings\n\nLet\u0027s change it to:\n\n\"\"\"Helper class to make possible handling neutron objects returned by GET\nrequests as attribute dicts.\n\nWhet get() method is called, the returned dictionary is wrapped into\na corresponding DeletableResource class which provides attribute access\nto dictionary values.\n\nUsage:\n    This retriever is used to allow using status_timeout from\n    tempest.manager with Neutron objects.\n\"\"\"","commit_id":"0e8c86393d0d13c4671b34d6d2d56dc36d59ba5b"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"1c5b77260b371c256699c89f970ee4d1b748939e","unresolved":false,"context_lines":[{"line_number":810,"context_line":"            return self.resource(client\u003dself.network_client, **obj.values()[0])"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"    def _get_router_external_ip(self, router_id):"},{"line_number":813,"context_line":"        \"\"\""},{"line_number":814,"context_line":"        Retrives external IP from a router"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        Retrieves the external IP address of a router by filtering the"}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_fe914353","line":813,"updated":"2014-08-14 09:37:20.000000000","message":"Need to fix doc-string: Multi line docstrings should start without a leading new line.\n\nYou can found more info by the following link:\nhttp://docs.openstack.org/developer/hacking/#docstrings\n\nLet\u0027s change it to:\n\n\"\"\"Retrieves external IP from a router\n\nRetrieves the external IP address of a router by filtering the\nports by device_id of the router and device_owner\u003d\nnetwork:router_gateway, selecting the first port that is owned\nby the given router and returning the IP address associated to\nthat port.\n\"\"\"","commit_id":"0e8c86393d0d13c4671b34d6d2d56dc36d59ba5b"}],"tempest/scenario/test_network_vpn_firewall.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3e8295d4c7e0d77394f0631485b3d303bbb29347","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        cls.check_preconditions()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if not test.is_extension_enabled(\u0027vpnaas\u0027, \u0027network\u0027)\\"},{"line_number":85,"context_line":"            and not test.is_extension_enabled(\u0027fwaas\u0027, \u0027network\u0027):"},{"line_number":86,"context_line":"            msg \u003d \"Neither of VPNaas or FWaas extension enabled.\""},{"line_number":87,"context_line":"            raise cls.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0a87e761","line":84,"updated":"2014-07-21 12:08:55.000000000","message":"Use parens vs backslash for continuation. Also, since this is used multiple times, you can pull out into a function and reuse.","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"a22acc022bd50ada7012c67d790c4cf0111b9c9c","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        cls.check_preconditions()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if not test.is_extension_enabled(\u0027vpnaas\u0027, \u0027network\u0027)\\"},{"line_number":85,"context_line":"            and not test.is_extension_enabled(\u0027fwaas\u0027, \u0027network\u0027):"},{"line_number":86,"context_line":"            msg \u003d \"Neither of VPNaas or FWaas extension enabled.\""},{"line_number":87,"context_line":"            raise cls.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_2daabb71","line":84,"in_reply_to":"baada198_0a87e761","updated":"2014-07-22 13:17:14.000000000","message":"Replaced backslash with parens in the whole file.\nRemoved this check as there are separate checks for every test scenario which cover this.","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3e8295d4c7e0d77394f0631485b3d303bbb29347","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        \u0027\u0027\u0027"},{"line_number":141,"context_line":"        tenant_id \u003d site1.tenant_id"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        vpnservice_name_prefix \u003d \\"},{"line_number":144,"context_line":"            \u0027TestNetworkVPNFirewall-%s-vpnservice\u0027 % site1.name"},{"line_number":145,"context_line":"        vpnservice \u003d self._create_vpnservice(tenant_id, site1.router.id,"},{"line_number":146,"context_line":"                                    site1.subnet.id, vpnservice_name_prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0aee0722","line":143,"updated":"2014-07-21 12:08:55.000000000","message":"Same backslash comment. Please go through the whole file.","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"a22acc022bd50ada7012c67d790c4cf0111b9c9c","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        \u0027\u0027\u0027"},{"line_number":141,"context_line":"        tenant_id \u003d site1.tenant_id"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        vpnservice_name_prefix \u003d \\"},{"line_number":144,"context_line":"            \u0027TestNetworkVPNFirewall-%s-vpnservice\u0027 % site1.name"},{"line_number":145,"context_line":"        vpnservice \u003d self._create_vpnservice(tenant_id, site1.router.id,"},{"line_number":146,"context_line":"                                    site1.subnet.id, vpnservice_name_prefix)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ad324b5c","line":143,"in_reply_to":"baada198_0aee0722","updated":"2014-07-22 13:17:14.000000000","message":"Replaced backslash with parens in the whole file","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3e8295d4c7e0d77394f0631485b3d303bbb29347","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            6. Confirm pings do not work between the server instances"},{"line_number":329,"context_line":"               on their private IPs"},{"line_number":330,"context_line":"        \u0027\u0027\u0027"},{"line_number":331,"context_line":"        if not test.is_extension_enabled(\u0027vpnaas\u0027, \u0027network\u0027)\\"},{"line_number":332,"context_line":"            or not test.is_extension_enabled(\u0027fwaas\u0027, \u0027network\u0027):"},{"line_number":333,"context_line":"            msg \u003d \"Both of VPNaas and FWaas extensions not enabled.\""},{"line_number":334,"context_line":"            raise self.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_4aa63f10","line":331,"updated":"2014-07-21 12:08:55.000000000","message":"Use parens vs backslashes for line continuation.  Function to remove duplication, as mentioned above.","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"a22acc022bd50ada7012c67d790c4cf0111b9c9c","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            6. Confirm pings do not work between the server instances"},{"line_number":329,"context_line":"               on their private IPs"},{"line_number":330,"context_line":"        \u0027\u0027\u0027"},{"line_number":331,"context_line":"        if not test.is_extension_enabled(\u0027vpnaas\u0027, \u0027network\u0027)\\"},{"line_number":332,"context_line":"            or not test.is_extension_enabled(\u0027fwaas\u0027, \u0027network\u0027):"},{"line_number":333,"context_line":"            msg \u003d \"Both of VPNaas and FWaas extensions not enabled.\""},{"line_number":334,"context_line":"            raise self.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ad808bc0","line":331,"in_reply_to":"baada198_4aa63f10","updated":"2014-07-22 13:17:14.000000000","message":"Added _check_extensions generic function to check for the enabled extensions and raise skip exception if not enabled.","commit_id":"eb3cf5f3a5baf3518f00570e02b7895112f40da9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"7da26ba580a210c03888319194056d13bb5d31c4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        exception_msg \u003d \u0027\u0027"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if check_vpnaas and not vpnaas_enabled:"},{"line_number":103,"context_line":"            exception_msg \u003d \u0027VPNaaS extension not enabled.\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if check_fwaas and not fwaas_enabled:"},{"line_number":106,"context_line":"            exception_msg \u003d exception_msg + \u0027FWaaS extension not enabled.\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_60990d79","line":103,"updated":"2014-07-22 15:34:58.000000000","message":"Add a space at the end of string, in case FW added.","commit_id":"7690e85dfe1e1fc0c60f48c222724e6a10e31d1f"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b023bc701914a29ac23edc141b468e573054e449","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        exception_msg \u003d \u0027\u0027"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if check_vpnaas and not vpnaas_enabled:"},{"line_number":103,"context_line":"            exception_msg \u003d \u0027VPNaaS extension not enabled.\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if check_fwaas and not fwaas_enabled:"},{"line_number":106,"context_line":"            exception_msg \u003d exception_msg + \u0027FWaaS extension not enabled.\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_f4095c85","line":103,"in_reply_to":"baada198_60990d79","updated":"2014-07-22 16:16:05.000000000","message":"Done","commit_id":"7690e85dfe1e1fc0c60f48c222724e6a10e31d1f"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        \u0027\u0027\u0027"},{"line_number":215,"context_line":"            Boot single server instance on specified site"},{"line_number":216,"context_line":"        \u0027\u0027\u0027"},{"line_number":217,"context_line":"        server_name \u003d data_utils.rand_name(\u0027vpn-firewall-server-%s-\u0027 %"},{"line_number":218,"context_line":"                                           site.name)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        security_groups \u003d [site.security_group.name]"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_bd8080f8","line":217,"updated":"2014-07-23 09:53:34.000000000","message":"you don\u0027t need to end the name with \u0027-\u0027 because it is automatically added in data_utils.rand_name()","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        \u0027\u0027\u0027"},{"line_number":215,"context_line":"            Boot single server instance on specified site"},{"line_number":216,"context_line":"        \u0027\u0027\u0027"},{"line_number":217,"context_line":"        server_name \u003d data_utils.rand_name(\u0027vpn-firewall-server-%s-\u0027 %"},{"line_number":218,"context_line":"                                           site.name)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        security_groups \u003d [site.security_group.name]"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_f9603ed2","line":217,"in_reply_to":"baada198_bd8080f8","updated":"2014-07-23 16:23:28.000000000","message":"Done","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.east_keypair \u003d self.create_keypair()"},{"line_number":264,"context_line":"        self.west_keypair \u003d self.create_keypair(self.alt_compute_client)"},{"line_number":265,"context_line":"        # create two instances on east"},{"line_number":266,"context_line":"        self._create_instances(self.east_keypair, self.east_site, 1)"},{"line_number":267,"context_line":"        # create two instances on west"},{"line_number":268,"context_line":"        self._create_instances(self.west_keypair, self.west_site, 1,"},{"line_number":269,"context_line":"                               self.alt_compute_client)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_5d4204ac","line":266,"updated":"2014-07-23 09:53:34.000000000","message":"When you write that you create two instances and pass 1 as num_instances it is a bit confusing. I\u0027d suggest pass 2 here and iterate from 0 to num_instances - 1 in _create_instances()","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.east_keypair \u003d self.create_keypair()"},{"line_number":264,"context_line":"        self.west_keypair \u003d self.create_keypair(self.alt_compute_client)"},{"line_number":265,"context_line":"        # create two instances on east"},{"line_number":266,"context_line":"        self._create_instances(self.east_keypair, self.east_site, 1)"},{"line_number":267,"context_line":"        # create two instances on west"},{"line_number":268,"context_line":"        self._create_instances(self.west_keypair, self.west_site, 1,"},{"line_number":269,"context_line":"                               self.alt_compute_client)"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_f9c67e68","line":266,"in_reply_to":"baada198_5d4204ac","updated":"2014-07-23 16:23:28.000000000","message":"This is a mistake in the comment. My initial intention was to boot two instances per site but later I changed it to single instance per site. Looks like I left the comment wrong. Also in _create_instances I changed the iteration to use rand instead of xrand as xrand was removed from python 3.","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":7293,"name":"Elena Ezhova","email":"ezhovaelena19@gmail.com","username":"elena"},"change_message_id":"a0129f59b8a3f8658017a96eb3f0ad6a07477796","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        # create two instances on east"},{"line_number":266,"context_line":"        self._create_instances(self.east_keypair, self.east_site, 1)"},{"line_number":267,"context_line":"        # create two instances on west"},{"line_number":268,"context_line":"        self._create_instances(self.west_keypair, self.west_site, 1,"},{"line_number":269,"context_line":"                               self.alt_compute_client)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _setup_firewalls(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_7d10a8ab","line":268,"updated":"2014-07-23 09:53:34.000000000","message":"ditto","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"8550446b06788a08e48a865ca46d6d02bc4df96d","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        # create two instances on east"},{"line_number":266,"context_line":"        self._create_instances(self.east_keypair, self.east_site, 1)"},{"line_number":267,"context_line":"        # create two instances on west"},{"line_number":268,"context_line":"        self._create_instances(self.west_keypair, self.west_site, 1,"},{"line_number":269,"context_line":"                               self.alt_compute_client)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def _setup_firewalls(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_599f6a65","line":268,"in_reply_to":"baada198_7d10a8ab","updated":"2014-07-23 16:23:28.000000000","message":"Fixed the comment","commit_id":"9210c13bccba908ee35f18dfd33c8e7c3502a802"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bbde69fe2828b2c45c38639a5b5569e2df5019b4","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    Basic Scenario Tests for VPN/Firewall integration test:"},{"line_number":30,"context_line":"        1. Create two tenants which will runing the two vpn sites"},{"line_number":31,"context_line":"        2. Create networks in each tenant with subnets that do not overlap"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_fef6155d","line":28,"updated":"2014-07-25 11:36:37.000000000","message":"Nit: PEP8/PEP257 Docstrings for classes should have a blank line before, summary docstring on same line as opening triple quote and ending with a period, and if multiple line docstring have a blank line between summary and rest of docstring.\n\nFunction docstring are similar, only without a blank line before.\n\nConsider updating all in file.\n\nRef: http://legacy.python.org/dev/peps/pep-0257/","commit_id":"9f47fbb2ae10564eaad5f34e90e4be40d662e95d"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"881dd82b43912ecf9208eeb860198fcf17a2fc23","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if check_fwaas and not fwaas_enabled:"},{"line_number":106,"context_line":"            exception_msg \u003d exception_msg + \u0027FWaaS extension not enabled.\u0027"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if exception_msg !\u003d \u0027\u0027:"},{"line_number":109,"context_line":"            raise self.skipException(exception_msg)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_07aa59d1","line":108,"updated":"2014-07-28 16:57:44.000000000","message":"\"if exception_msg\" is enough and more pythonic","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"0e36f927064d1c2dc0ecc916b61b2de79c17a187","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if check_fwaas and not fwaas_enabled:"},{"line_number":106,"context_line":"            exception_msg \u003d exception_msg + \u0027FWaaS extension not enabled.\u0027"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if exception_msg !\u003d \u0027\u0027:"},{"line_number":109,"context_line":"            raise self.skipException(exception_msg)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e618c4cf","line":108,"in_reply_to":"baada198_07aa59d1","updated":"2014-08-06 10:41:08.000000000","message":"Done","commit_id":"2da44cdfa142e1e49330433dc615554875cd78c9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"6c8a9736561d5cbea122f70fa942d26e8e930521","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    The following is the scenario outline:"},{"line_number":32,"context_line":"    1. Create two tenants which will runing the two vpn sites"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_5acbffa3","line":29,"updated":"2014-08-06 12:17:41.000000000","message":"Just a general nit about the docstrings in this file. Look at PEP257 for single-line, multi-line, and class docstrings:  http://legacy.python.org/dev/peps/pep-0257/","commit_id":"fe7ca1f949b6fa4859a308aa2b3fa4db577a9fd1"},{"author":{"_account_id":7227,"name":"Timur Nurlygayanov","email":"tnurlygayanov@mirantis.com","username":"tnurlygayanov"},"change_message_id":"48403589b8653e16b922f6d84a734aae3ff8f110","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    The following is the scenario outline:"},{"line_number":32,"context_line":"    1. Create two tenants which will runing the two vpn sites"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_7c2a3179","line":29,"in_reply_to":"baada198_5acbffa3","updated":"2014-08-08 10:24:38.000000000","message":"+1 for Paul, let\u0027s use one pattern, which used for all OpenStack components:\nhttp://docs.openstack.org/developer/hacking/#docstrings\n\nwe should just start text at the first line of the comment, like:\n\n\"\"\"Basic Scenario Tests for VPN/Firewall integration test\n\nThe following is the scenario outline:\n1. Create two tenants which will runing the two vpn sites\n2. Create networks in each tenant with subnets that do not overlap\n3. Attach the networks to the corresponding tenant routers\n4. Create vpn connection between the two sites\n5. Boot vm intsances in the two sites\n6. Check if the vms can ping each other across the tunnel\n7. Create firewall with icmp dny rule between the sites\n8. Check if the vms cannot ping each other any more\n\"\"\"\n\n\nCould you please use this pattern for all doc-strings?","commit_id":"fe7ca1f949b6fa4859a308aa2b3fa4db577a9fd1"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"a6c4985fae34f0d4b62e5dfe36be43a311e64716","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    The following is the scenario outline:"},{"line_number":32,"context_line":"    1. Create two tenants which will runing the two vpn sites"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_d8bd8db4","line":29,"in_reply_to":"baada198_5acbffa3","updated":"2014-08-12 18:06:11.000000000","message":"Done","commit_id":"fe7ca1f949b6fa4859a308aa2b3fa4db577a9fd1"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"a6c4985fae34f0d4b62e5dfe36be43a311e64716","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    The following is the scenario outline:"},{"line_number":32,"context_line":"    1. Create two tenants which will runing the two vpn sites"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_18fe256e","line":29,"in_reply_to":"baada198_7c2a3179","updated":"2014-08-12 18:06:11.000000000","message":"Hi Timur/Paul,\n\nThank you for the comment. I modified the doc-strings in accordance to your comments.","commit_id":"fe7ca1f949b6fa4859a308aa2b3fa4db577a9fd1"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\"Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    The following is the scenario outline: 1. Create two tenants which will"},{"line_number":31,"context_line":"    runing the two vpn sites. 2. Create networks in each tenant with subnets"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_bb5e1313","line":28,"updated":"2014-08-12 18:30:40.000000000","message":"Hate to nit more...\n\nFor class based docstrings, there should be a blank line between the class line and the docstring.\n\nFor all docstrings, the summary line should end with a period.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\"Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    The following is the scenario outline: 1. Create two tenants which will"},{"line_number":31,"context_line":"    runing the two vpn sites. 2. Create networks in each tenant with subnets"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_6cae83a3","line":28,"in_reply_to":"baada198_bb5e1313","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\"Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    The following is the scenario outline: 1. Create two tenants which will"},{"line_number":31,"context_line":"    runing the two vpn sites. 2. Create networks in each tenant with subnets"},{"line_number":32,"context_line":"    that do not overlap. 3. Attach the networks to the corresponding tenant"},{"line_number":33,"context_line":"    routers. 4. Create vpn connection between the two sites. 5. Boot vm"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_dbb74721","line":30,"updated":"2014-08-12 18:30:40.000000000","message":"You can keep the nice formatting of the original numbered bullets.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class TestNetworkVPNFirewall(manager.NetworkScenarioTest):"},{"line_number":28,"context_line":"    \"\"\"Basic Scenario Tests for VPN/Firewall integration test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    The following is the scenario outline: 1. Create two tenants which will"},{"line_number":31,"context_line":"    runing the two vpn sites. 2. Create networks in each tenant with subnets"},{"line_number":32,"context_line":"    that do not overlap. 3. Attach the networks to the corresponding tenant"},{"line_number":33,"context_line":"    routers. 4. Create vpn connection between the two sites. 5. Boot vm"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_8cb3d708","line":30,"in_reply_to":"baada198_dbb74721","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.servers \u003d []"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    class SiteServer():"},{"line_number":57,"context_line":"        \"\"\"Class bundling together properties of a VPN Site server.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        def __init__(self, server, ssh_handle, keypair, site, floating_ip,"},{"line_number":60,"context_line":"                     private_ip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3b3683b4","line":57,"updated":"2014-08-12 18:30:40.000000000","message":"Just add a blank line before the class docstring.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.servers \u003d []"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    class SiteServer():"},{"line_number":57,"context_line":"        \"\"\"Class bundling together properties of a VPN Site server.\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        def __init__(self, server, ssh_handle, keypair, site, floating_ip,"},{"line_number":60,"context_line":"                     private_ip):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_acc7bb65","line":57,"in_reply_to":"baada198_3b3683b4","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            raise self.skipException(exception_msg)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"},{"line_number":106,"context_line":"        \"\"\"Setup new site"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        1. Create site network. 2. Create new subnet that does not overlap"},{"line_number":109,"context_line":"        with the other site. 3. Attach the subnet to the tenant router."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_db4e6739","line":106,"updated":"2014-08-12 18:30:40.000000000","message":"add period.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            raise self.skipException(exception_msg)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"},{"line_number":106,"context_line":"        \"\"\"Setup new site"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        1. Create site network. 2. Create new subnet that does not overlap"},{"line_number":109,"context_line":"        with the other site. 3. Attach the subnet to the tenant router."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_ccc4ef63","line":106,"in_reply_to":"baada198_db4e6739","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"},{"line_number":106,"context_line":"        \"\"\"Setup new site"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        1. Create site network. 2. Create new subnet that does not overlap"},{"line_number":109,"context_line":"        with the other site. 3. Attach the subnet to the tenant router."},{"line_number":110,"context_line":"        4. Create security group to be used by this site"},{"line_number":111,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9b6b0f87","line":108,"updated":"2014-08-12 18:30:40.000000000","message":"You can fix the formatting to bullets.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    def _setup_site(self, ctype, site_name, other_site_cidr\u003dNone):"},{"line_number":106,"context_line":"        \"\"\"Setup new site"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        1. Create site network. 2. Create new subnet that does not overlap"},{"line_number":109,"context_line":"        with the other site. 3. Attach the subnet to the tenant router."},{"line_number":110,"context_line":"        4. Create security group to be used by this site"},{"line_number":111,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_ecc1b350","line":108,"in_reply_to":"baada198_9b6b0f87","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                         security_group)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _create_vpn_site_connection(self, site1, site2):"},{"line_number":143,"context_line":"        \"\"\"Create new vpn site connection"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        Creates new vpn service, ike policy and ipsec policy on specified"},{"line_number":146,"context_line":"        site. Create ipsec connection between site1 and site2"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_fb624ba6","line":143,"updated":"2014-08-12 18:30:40.000000000","message":"period","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                         security_group)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _create_vpn_site_connection(self, site1, site2):"},{"line_number":143,"context_line":"        \"\"\"Create new vpn site connection"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        Creates new vpn service, ike policy and ipsec policy on specified"},{"line_number":146,"context_line":"        site. Create ipsec connection between site1 and site2"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_4ca0dfa4","line":143,"in_reply_to":"baada198_fb624ba6","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        \"\"\"Create firewall policy and firewall for the provided site."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        After creating the firewall add a rule to Allow inbound ssh"},{"line_number":190,"context_line":"        and deny icmp"},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        ruleset \u003d dict(protocol\u003d\u0027tcp\u0027, action\u003d\u0027allow\u0027, destination_port\u003d\u002722\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_7b0e3be6","line":190,"updated":"2014-08-12 18:30:40.000000000","message":"nit: period at end","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        \"\"\"Create firewall policy and firewall for the provided site."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        After creating the firewall add a rule to Allow inbound ssh"},{"line_number":190,"context_line":"        and deny icmp"},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        ruleset \u003d dict(protocol\u003d\u0027tcp\u0027, action\u003d\u0027allow\u0027, destination_port\u003d\u002722\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_2c9bab7a","line":190,"in_reply_to":"baada198_7b0e3be6","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def _verify_connectivity(self, east_server_index\u003d0,"},{"line_number":265,"context_line":"                             west_server_index\u003d0, use_floating_ip\u003dFalse,"},{"line_number":266,"context_line":"                             should_succeed\u003dTrue):"},{"line_number":267,"context_line":"        \"\"\"Verifies if ping works between specified servers on west and east."},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        east_server \u003d self.east_site.servers[east_server_index]"},{"line_number":270,"context_line":"        west_server \u003d self.west_site.servers[west_server_index]"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9be06ffb","line":267,"updated":"2014-08-12 18:30:40.000000000","message":"Looks like line length issue. Can break into summary and detail lines, or try to shorten so that end quotes are on same line.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def _verify_connectivity(self, east_server_index\u003d0,"},{"line_number":265,"context_line":"                             west_server_index\u003d0, use_floating_ip\u003dFalse,"},{"line_number":266,"context_line":"                             should_succeed\u003dTrue):"},{"line_number":267,"context_line":"        \"\"\"Verifies if ping works between specified servers on west and east."},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        east_server \u003d self.east_site.servers[east_server_index]"},{"line_number":270,"context_line":"        west_server \u003d self.west_site.servers[west_server_index]"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_cc8b0f21","line":267,"in_reply_to":"baada198_9be06ffb","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":294,"context_line":"    def test_basic_vpn_scenario(self):"},{"line_number":295,"context_line":"        \"\"\"Run a basic vpn scenario."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        The following is the scenario outline: 1. Create two sites - west and"},{"line_number":298,"context_line":"        east. 2. Connect them using vpn service. 3. Boot server instances in"},{"line_number":299,"context_line":"        both sites. 4. Check ping between the private IPs of the servers"},{"line_number":300,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3bb923ec","line":297,"updated":"2014-08-12 18:30:40.000000000","message":"can preserve the bulleted list.","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":294,"context_line":"    def test_basic_vpn_scenario(self):"},{"line_number":295,"context_line":"        \"\"\"Run a basic vpn scenario."},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        The following is the scenario outline: 1. Create two sites - west and"},{"line_number":298,"context_line":"        east. 2. Connect them using vpn service. 3. Boot server instances in"},{"line_number":299,"context_line":"        both sites. 4. Check ping between the private IPs of the servers"},{"line_number":300,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_4c87ff11","line":297,"in_reply_to":"baada198_3bb923ec","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"28fd30736afcf4fb47af018214e7379a55e02602","unresolved":false,"context_lines":[{"line_number":308,"context_line":"    def test_basic_vpn_firewall_scenario(self):"},{"line_number":309,"context_line":"        \"\"\"Run a basic vpn \u0026 firewall integration scenario."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        The following is the scenario outline: 1. Create two sites - west and"},{"line_number":312,"context_line":"        east. 2. Connect them using vpn service. 3. Boot server instances in"},{"line_number":313,"context_line":"        both sites. 4. Confirm VPN connection is working. 5. Create firewall"},{"line_number":314,"context_line":"        rules to deny ICMP. 6. Confirm pings do not work between the server"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_bbc45362","line":311,"updated":"2014-08-12 18:30:40.000000000","message":"ditto","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"},{"author":{"_account_id":11361,"name":"Simeon Monov","email":"sdmonov@us.ibm.com","username":"sdmonov"},"change_message_id":"b1e176d01ecc722be377decc974067742ffc5bd2","unresolved":false,"context_lines":[{"line_number":308,"context_line":"    def test_basic_vpn_firewall_scenario(self):"},{"line_number":309,"context_line":"        \"\"\"Run a basic vpn \u0026 firewall integration scenario."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        The following is the scenario outline: 1. Create two sites - west and"},{"line_number":312,"context_line":"        east. 2. Connect them using vpn service. 3. Boot server instances in"},{"line_number":313,"context_line":"        both sites. 4. Confirm VPN connection is working. 5. Create firewall"},{"line_number":314,"context_line":"        rules to deny ICMP. 6. Confirm pings do not work between the server"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_6c7cc323","line":311,"in_reply_to":"baada198_bbc45362","updated":"2014-08-12 19:50:59.000000000","message":"Done","commit_id":"a248524e0a08ac00c96ae749bff9ca823406d0ce"}]}
