)]}'
{"rally/plugins/openstack/context/cleanup/resources.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"aca97b96b2c6fdb459e76f9724fb6ea4e3728da5","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            if (utils.name_matches_object(net.label,"},{"line_number":144,"context_line":"                                          nova_utils.NovaScenario) or"},{"line_number":145,"context_line":"                utils.name_matches_object(net.label,"},{"line_number":146,"context_line":"                                          network_wrapper.NovaNetworkWrapper))]"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a2ca52d_28188a74","line":146,"updated":"2015-10-16 10:45:41.000000000","message":"This is actually network_wrapper.NetworkWrapper","commit_id":"32131f1eb609dfeb9285bdcf3f508fd26165a52b"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0164224bb6095ddda0b1e6774c40fbe8513c91a7","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            if (utils.name_matches_object(net.label,"},{"line_number":144,"context_line":"                                          nova_utils.NovaScenario) or"},{"line_number":145,"context_line":"                utils.name_matches_object(net.label,"},{"line_number":146,"context_line":"                                          network_wrapper.NetworkWrapper))]"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a29b11f_6646a150","line":146,"updated":"2015-10-22 03:00:54.000000000","message":"just curios why this method accepts cls and not just template string?","commit_id":"5dc4c1965e618ef42dd737612fe4559a6235ab42"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"2d156a28ed492965fbbe5b282aa99dccb1e7604b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            if (utils.name_matches_object(net.label,"},{"line_number":144,"context_line":"                                          nova_utils.NovaScenario) or"},{"line_number":145,"context_line":"                utils.name_matches_object(net.label,"},{"line_number":146,"context_line":"                                          network_wrapper.NetworkWrapper))]"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a29b11f_f294968b","line":146,"in_reply_to":"3a29b11f_6646a150","updated":"2015-10-22 13:59:06.000000000","message":"There are two methods in rally.common.utils: name_matches_object() and name_matches_pattern(). You can use whichever you find more appropriate. I liked name_matches_object() here (and probably in most places), since it doesn\u0027t require me to extract the format string and the allowed characters list from the object.","commit_id":"5dc4c1965e618ef42dd737612fe4559a6235ab42"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e55409b5800c725072b9c51d8e2c074783916240","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            if (utils.name_matches_object(net.label,"},{"line_number":144,"context_line":"                                          nova_utils.NovaScenario) or"},{"line_number":145,"context_line":"                utils.name_matches_object(net.label,"},{"line_number":146,"context_line":"                                          network_wrapper.NetworkWrapper))]"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a29b11f_fd02fb08","line":146,"updated":"2015-10-23 14:30:48.000000000","message":"This will raise AttributeError since NetworkWrapper does not have RESOURCE_NAME_FORMAT","commit_id":"7f4815968f4c3a70b8fac17501487e6d653e4a81"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ef02603e9635b6c65803f111592ad5f53ae9592a","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def list(self):"},{"line_number":140,"context_line":"        return [net for net in self._manager().list()"},{"line_number":141,"context_line":"                if net.project_id \u003d\u003d self.tenant_uuid]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_9facf88d","line":141,"updated":"2015-10-26 09:01:27.000000000","message":"Why not match by name?","commit_id":"6df80e340f83939bb6af5b4a6cdebfa3be80cc1f"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"0295a1071fdedb532b37af71ef9113aa4a2e7eb4","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def list(self):"},{"line_number":140,"context_line":"        return [net for net in self._manager().list()"},{"line_number":141,"context_line":"                if net.project_id \u003d\u003d self.tenant_uuid]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_c7c057e3","line":141,"in_reply_to":"3a29b11f_9facf88d","updated":"2015-10-26 23:01:26.000000000","message":"Since networks can be \"owned\" by any plugin, they can follow the name pattern of any plugin. In order to match by name, we\u0027d need to keep a list of every plugin that created a network via the wrapper, then pass that list to cleanup so that it could check against each object. Just checking by project is much easier and cleaner.","commit_id":"6df80e340f83939bb6af5b4a6cdebfa3be80cc1f"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"a4bfaec02442d43435526a763ac70a7022be1550","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def list(self):"},{"line_number":140,"context_line":"        return [net for net in self._manager().list()"},{"line_number":141,"context_line":"                if net.project_id \u003d\u003d self.tenant_uuid]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_3dc82a22","line":141,"updated":"2015-10-29 10:05:39.000000000","message":"What if we use deployment with existing users (so existing tenants as well, and potentially existing networks also) - can this affect existing tenants and remove networks that Rally hasn\u0027t create?","commit_id":"37573e81f19a5e12d5f9096b06c740cbb76faf82"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"00db69fdb62a8d35292341b7a260799de85f20ef","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def list(self):"},{"line_number":140,"context_line":"        return [net for net in self._manager().list()"},{"line_number":141,"context_line":"                if net.project_id \u003d\u003d self.tenant_uuid]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_e0e3e303","line":141,"in_reply_to":"1a26ad4f_3dc82a22","updated":"2015-11-04 21:15:06.000000000","message":"Done","commit_id":"37573e81f19a5e12d5f9096b06c740cbb76faf82"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"58577cdbf86f2258a6642e8745d1884253f2b4a2","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"da85f559_e581f0fc","line":149,"updated":"2015-11-08 06:53:39.000000000","message":"This is the sample of the issue that I was talking about before.\n \nYou see in *classes there will RandomNameGeneratorMixin related to context classes and it will delete resource created by context class which is the thing that we must not do. \n\nOne of the ideas of refactoring of cleanups was to use these Resource classes in 3 different ways: \n  - Disaster cleanup (that deletes everything related to specific task)\n  - Regular scenario cleanups (that deletes resource created by scenarios no matter are they created by wrappers or scenario utils) \n  - Context cleanups (resources creates by context, if there is many of them) no matter are they created by wrappers or context it self. \n\nI believe we should wait with this patch and make a spec or at least a patch  that will show how to resolve this.","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"67c22ba8b0b97e5ad5d66cd911a5e9bfc8a40dda","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"da85f559_925fff0d","line":149,"in_reply_to":"da85f559_1c49e68b","updated":"2015-11-09 03:31:18.000000000","message":"It is not OK. \n\nHow you are going to use this class delete context resources then? \nAnd what about disaster cleanup case?","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"13a7a6f20e0dbe2b18c1e993e98419441159d670","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"da85f559_eddc6a48","line":149,"in_reply_to":"da85f559_4d79f692","updated":"2015-11-09 04:58:03.000000000","message":"Chris, sorry \n\n  \u003e\u003e We\u0027re going to finish implementing the consistent-resource-names blueprint and only then will we worry about cleanup-refactoring.\n\nbut this is wrong approach. These 2 tasks are tightly related to each other. \nAnd this code demonstrates us that we are moving in wrong direction (and seems like we will need to rewrite all generation of names one more time). \n\nI would like to pause this work until we will have clear vision of what and why we are doing.","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4b338af0a25da3ee025d9d1b686d01854916e3f5","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"da85f559_4d79f692","line":149,"in_reply_to":"da85f559_925fff0d","updated":"2015-11-09 04:42:24.000000000","message":"We aren\u0027t going to do that right now. We\u0027re going to finish implementing the consistent-resource-names blueprint and only then will we worry about cleanup-refactoring. Otherwise those two large, otherwise distinct pieces of work will get muddied together in a wild tangle of commits. It\u0027ll be impossible to tell where one ends and where the other begins. I agree that the code here isn\u0027t perfect, but using what I proposed can move us towards completion of consistent-resource-names without any regressions, whereupon we can restructure this code properly along the lines you\u0027ve laid out. There definitely needs to be more discussion about that -- the cleanup-refactoring spec is notoriously short on details -- and perhaps even a second spec, but that shouldn\u0027t block completion of this work in progress.","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"4581be5bc6a0c1cba9ce510a441a84962b15da33","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"da85f559_1c49e68b","line":149,"in_reply_to":"da85f559_e581f0fc","updated":"2015-11-09 02:11:45.000000000","message":"Shouldn\u0027t this work?\n\n    classes \u003d [c for c in discover.itersubclasses(utils.RandomNameGeneratorMixin)\n               if not issubclass(c, context.Context)]\n\nOr, perhaps more correctly:\n\n    classes \u003d [c for c in discover.itersubclasses(scenario.Scenario)\n               if issubclass(c, utils.RandomNameGeneratorMixin)]\n\nOr if that\u0027s too ugly, make itersubclasses accept a list of classes. I don\u0027t think that rises to the level of a spec, though.","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ee1c7760dfd66309e8147d7a40d1912a374e29ca","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # implements RandomNameGeneratorMixin"},{"line_number":147,"context_line":"        classes \u003d list(discover.itersubclasses(utils.RandomNameGeneratorMixin))"},{"line_number":148,"context_line":"        return [net for net in self._manager().list()"},{"line_number":149,"context_line":"                if utils.name_matches_object(net.label, *classes)]"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# EC2"}],"source_content_type":"text/x-python","patch_set":29,"id":"ba8a016a_66397641","line":149,"in_reply_to":"da85f559_eddc6a48","updated":"2015-11-21 00:23:12.000000000","message":"After your spec that is on review, I know how to address issues with cleaning up resources: \n\nhttps://review.openstack.org/#/c/246484/\n\nso we can continue work on this","commit_id":"b33bc9c9111e5baa4f4220d0af3db08a5e979bd6"}],"rally/plugins/openstack/wrappers/network.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"0164224bb6095ddda0b1e6774c40fbe8513c91a7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    service, which hides most differences and routines behind the scenes."},{"line_number":64,"context_line":"    This allows to significantly re-use and simplify code."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    RESOURCE_NAME_FORMAT \u003d \"netwrap_rally_XXXXXXXX_XXXXXXXX\""},{"line_number":67,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":68,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a29b11f_8643bd41","line":66,"updated":"2015-10-22 03:00:54.000000000","message":"so this is bad idea definitely. \n\nWe have resource that belongs to  scenario or context but not to netwrap. This will make harder do do cleanup stuff and I believe that we should be smarter here and refactor this to accept name perfix..","commit_id":"5dc4c1965e618ef42dd737612fe4559a6235ab42"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"2d156a28ed492965fbbe5b282aa99dccb1e7604b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    service, which hides most differences and routines behind the scenes."},{"line_number":64,"context_line":"    This allows to significantly re-use and simplify code."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    RESOURCE_NAME_FORMAT \u003d \"netwrap_rally_XXXXXXXX_XXXXXXXX\""},{"line_number":67,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":68,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a29b11f_8d9e6761","line":66,"in_reply_to":"3a29b11f_8643bd41","updated":"2015-10-22 13:59:06.000000000","message":"That makes sense to me, but on the other hand the network wrapper knows what its backend is, not the scenario, and so it should be in charge of setting the name format. If Neutron and nova-net differed in their name format, the only way to handle that would be by keeping the resource name format in the network wrapper. And if a scenario required a name format that was incompatible with nova-net or neutron, it would somehow need to know to pass a different name format to the network wrapper.\n\nLet\u0027s talk about this more in IRC (or in person). I\u0027m not sure this is quite so straightforward. :/","commit_id":"5dc4c1965e618ef42dd737612fe4559a6235ab42"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"beb48aa629852213f0cc949ee6f15eb1b18aebc0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    service, which hides most differences and routines behind the scenes."},{"line_number":64,"context_line":"    This allows to significantly re-use and simplify code."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    RESOURCE_NAME_FORMAT \u003d \"netwrap_rally_XXXXXXXX_XXXXXXXX\""},{"line_number":67,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":68,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_775ce318","line":66,"updated":"2015-10-22 21:37:50.000000000","message":"not sure that you need this anymore","commit_id":"a28f4df59e271b3c03f7ab51be92a913402c49ef"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"20c82e322847b94382e822fa62887253d2402124","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    service, which hides most differences and routines behind the scenes."},{"line_number":64,"context_line":"    This allows to significantly re-use and simplify code."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    RESOURCE_NAME_FORMAT \u003d \"netwrap_rally_XXXXXXXX_XXXXXXXX\""},{"line_number":67,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":68,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_57c3e737","line":66,"in_reply_to":"3a29b11f_775ce318","updated":"2015-10-22 22:05:33.000000000","message":"Done","commit_id":"a28f4df59e271b3c03f7ab51be92a913402c49ef"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ef02603e9635b6c65803f111592ad5f53ae9592a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":67,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, clients, owner, config\u003dNone):"},{"line_number":70,"context_line":"        if hasattr(clients, self.SERVICE_IMPL):"},{"line_number":71,"context_line":"            self.client \u003d getattr(clients, self.SERVICE_IMPL)()"},{"line_number":72,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_1f8228c9","line":69,"updated":"2015-10-26 09:01:27.000000000","message":"This method have the same arguments as \u0027wrap\u0027 but it would be nice to have docstring here too.\n\nOr at least comment \"see \u0027wrap\u0027 method below\"","commit_id":"6df80e340f83939bb6af5b4a6cdebfa3be80cc1f"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"0295a1071fdedb532b37af71ef9113aa4a2e7eb4","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    START_CIDR \u003d \"10.2.0.0/24\""},{"line_number":67,"context_line":"    SERVICE_IMPL \u003d None"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, clients, owner, config\u003dNone):"},{"line_number":70,"context_line":"        if hasattr(clients, self.SERVICE_IMPL):"},{"line_number":71,"context_line":"            self.client \u003d getattr(clients, self.SERVICE_IMPL)()"},{"line_number":72,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_c767f723","line":69,"in_reply_to":"3a29b11f_1f8228c9","updated":"2015-10-26 23:01:26.000000000","message":"Done","commit_id":"6df80e340f83939bb6af5b4a6cdebfa3be80cc1f"}]}
