)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9e81bc566a692106a76488e97494b56d05083050","unresolved":false,"context_lines":[{"line_number":16,"context_line":"the unique root providers of trees associated with the same aggregate as"},{"line_number":17,"context_line":"the sharing provider."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The sharing provider may or may not itself be part of a tree; in either"},{"line_number":20,"context_line":"case, its root provider UUID is included in the result."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"If the sharing provider is not part of any aggregate, the empty list is"},{"line_number":23,"context_line":"returned."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"blueprint: granular-resource-requests"},{"line_number":26,"context_line":"Co-Authored-By: Jay Pipes \u003cjaypipes@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9f6a8fd7_a9978090","line":23,"range":{"start_line":19,"start_character":0,"end_line":23,"end_character":9},"updated":"2018-05-02 16:00:11.000000000","message":"Does it meant that if the sharing provider is not in any aggregate then its own root provider UUID is not returned?\n\n--- later ---\n\nThat case is s4 in the test. So the answer is yes and that is OK for me.","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"04d0f89b797199096829a3c65190a89a92cba8bb","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Get anchors for sharing providers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Individual request groups (numbered or un-numbered) in a granular"},{"line_number":10,"context_line":"resource request may be satisfied by a sharing provider.  In such cases,"},{"line_number":11,"context_line":"we will need to be able to figure out which non-sharing trees the"},{"line_number":12,"context_line":"sharing provider can be associated with."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change introduces a helper method, _anchors_for_sharing_provider,"},{"line_number":15,"context_line":"that accepts the ID of a sharing provider and returns the UUIDs of all"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_0dd05cf7","line":12,"range":{"start_line":10,"start_character":58,"end_line":12,"end_character":40},"updated":"2018-05-03 13:59:26.000000000","message":"So, this kinda contradicts the conversation we had yesterday about the set of anchor providers including sharing providers that share with the same set of non-sharing providers (i.e. the use case I asked you to add to the func test fixture).\n\nJust sayin\u0027. Not holding up for this, but it\u0027s indicative of the complexity that that particular edge case brings, as I\u0027m sure you agree.","commit_id":"e2b538dd32779ca122d33be7c96680b36b8340d4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3539b669fb5cd35474ca507e7c71f96d6a26bcdd","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Get anchors for sharing providers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Individual request groups (numbered or un-numbered) in a granular"},{"line_number":10,"context_line":"resource request may be satisfied by a sharing provider.  In such cases,"},{"line_number":11,"context_line":"we will need to be able to figure out which non-sharing trees the"},{"line_number":12,"context_line":"sharing provider can be associated with."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change introduces a helper method, _anchors_for_sharing_provider,"},{"line_number":15,"context_line":"that accepts the ID of a sharing provider and returns the UUIDs of all"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_e3fe51ad","line":12,"range":{"start_line":10,"start_character":58,"end_line":12,"end_character":40},"in_reply_to":"5f7c97a3_0dd05cf7","updated":"2018-05-03 15:09:56.000000000","message":"You\u0027re right; it\u0027s only *usually* a non-sharing tree.\n\nStrictly defined, I guess a sharing provider would be a) tagged with MISC_SHARES_VIA_AGGREGATE *and* b) a member of an aggregate.  The important point here being that there\u0027s nothing stopping a compute node RP (anywhere in a tree) from satisfying that definition.  We as humans kind of look at it and understand implicitly which ones we mean, but code-wise there\u0027s no way to distinguish.  We could draw a line in the sand and say that \"hostables\" are not allowed to have MISC_SHARES_VIA_AGGREGATE; but that doesn\u0027t seem to serve any purpose other than making it easier for humans to reason about this specific case.\n\nAnywho...","commit_id":"e2b538dd32779ca122d33be7c96680b36b8340d4"}],"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"61f3f324be03f37ff4b1d6e44a2abc2fc1b9f337","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"@db_api.api_context_manager.reader"},{"line_number":437,"context_line":"def _anchors_for_sharing_provider(context, rp_id):"},{"line_number":438,"context_line":"    # SELECT COALESCE(rps.uuid, shr_with_sps.uuid)"},{"line_number":439,"context_line":"    # FROM resource_providers AS sps"},{"line_number":440,"context_line":"    # INNER JOIN resource_provider_aggregates AS shr_aggs"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_53febc38","line":437,"range":{"start_line":437,"start_character":5,"end_line":437,"end_character":12},"updated":"2018-04-30 19:01:51.000000000","message":"Please add in a good docstring that very clearly explains what you are calling an \"anchor\" here.","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7286607fadcf149d94bef3a76977a822964a1ab0","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"@db_api.api_context_manager.reader"},{"line_number":437,"context_line":"def _anchors_for_sharing_provider(context, rp_id):"},{"line_number":438,"context_line":"    # SELECT COALESCE(rps.uuid, shr_with_sps.uuid)"},{"line_number":439,"context_line":"    # FROM resource_providers AS sps"},{"line_number":440,"context_line":"    # INNER JOIN resource_provider_aggregates AS shr_aggs"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_0eb33b4f","line":437,"range":{"start_line":437,"start_character":5,"end_line":437,"end_character":12},"in_reply_to":"9f6a8fd7_53febc38","updated":"2018-04-30 19:37:48.000000000","message":"ack.\n\nHm, I had written a docstring for this; I must have lost it in a local rebase swizzle.","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"61f3f324be03f37ff4b1d6e44a2abc2fc1b9f337","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        shr_aggs.c.aggregate_id \u003d\u003d shr_with_sps_aggs.c.aggregate_id)"},{"line_number":460,"context_line":"    join_chain \u003d sa.join("},{"line_number":461,"context_line":"        join_chain, shr_with_sps,"},{"line_number":462,"context_line":"        shr_with_sps_aggs.c.resource_provider_id \u003d\u003d shr_with_sps.c.id)"},{"line_number":463,"context_line":"    join_chain \u003d sa.outerjoin("},{"line_number":464,"context_line":"        join_chain, rps, shr_with_sps.c.root_provider_id \u003d\u003d rps.c.id)"},{"line_number":465,"context_line":"    sel \u003d sa.select([func.coalesce(rps.c.uuid, shr_with_sps.c.uuid)])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_53d55cb6","line":462,"updated":"2018-04-30 19:01:51.000000000","message":"slot in a TODO here to replace the outerjoin with an innerjoin when root_provider_id is made NOT NULL","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7286607fadcf149d94bef3a76977a822964a1ab0","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        shr_aggs.c.aggregate_id \u003d\u003d shr_with_sps_aggs.c.aggregate_id)"},{"line_number":460,"context_line":"    join_chain \u003d sa.join("},{"line_number":461,"context_line":"        join_chain, shr_with_sps,"},{"line_number":462,"context_line":"        shr_with_sps_aggs.c.resource_provider_id \u003d\u003d shr_with_sps.c.id)"},{"line_number":463,"context_line":"    join_chain \u003d sa.outerjoin("},{"line_number":464,"context_line":"        join_chain, rps, shr_with_sps.c.root_provider_id \u003d\u003d rps.c.id)"},{"line_number":465,"context_line":"    sel \u003d sa.select([func.coalesce(rps.c.uuid, shr_with_sps.c.uuid)])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_6e7d176d","line":462,"in_reply_to":"9f6a8fd7_53d55cb6","updated":"2018-04-30 19:37:48.000000000","message":"ack","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7b8f8049ee3f7e8c4493cce298936fc7dd5fb0fc","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"@db_api.api_context_manager.reader"},{"line_number":437,"context_line":"def _anchors_for_sharing_provider(context, rp_id):"},{"line_number":438,"context_line":"    \"\"\"Given the internal ID of a sharing provider, return the UUIDs of all the"},{"line_number":439,"context_line":"    unique root providers of trees associated with the same aggregate as the"},{"line_number":440,"context_line":"    sharing provider. (These are the providers that can \"anchor\" a single"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_1cc103e5","line":437,"range":{"start_line":437,"start_character":5,"end_line":437,"end_character":33},"updated":"2018-05-02 21:12:11.000000000","message":"As I\u0027ve mentioned, I\u0027m not thrilled with the use of the term \"anchor provider\" because I don\u0027t think the word anchor properly represents what we\u0027re trying to convey here.\n\nI spent some time thinking about how to describe what we\u0027re attempting to do here in this function, and it basically boils down to \"find me the provider trees that this RP is sharing with via a single level of aggregate linkage\".\n\nNow, of course, _get_provider_trees_with_single_level_aggregate_linkage_from_provider_id() is a tad long-winded.\n\nSo, I thought about how to shorten that and came up with:\n\n _get_providers_immediately_shared_with()\n\nI think that is as short and clear as I can come up with. It denotes exactly what this function is doing.\n\nThoughts?","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f7f9a87a720e16f13a1eb8042a21323219c38822","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"@db_api.api_context_manager.reader"},{"line_number":437,"context_line":"def _anchors_for_sharing_provider(context, rp_id):"},{"line_number":438,"context_line":"    \"\"\"Given the internal ID of a sharing provider, return the UUIDs of all the"},{"line_number":439,"context_line":"    unique root providers of trees associated with the same aggregate as the"},{"line_number":440,"context_line":"    sharing provider. (These are the providers that can \"anchor\" a single"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_95b7a43b","line":437,"range":{"start_line":437,"start_character":5,"end_line":437,"end_character":33},"in_reply_to":"9f6a8fd7_1cc103e5","updated":"2018-05-02 21:58:26.000000000","message":"cf. IRC: http://p.anticdent.org/logs/openstack-placement?dated\u003d2018-05-02%2021:13:37.051500#28Yg","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"}],"nova/tests/functional/api/openstack/placement/db/test_resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"61f3f324be03f37ff4b1d6e44a2abc2fc1b9f337","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"        c2 \u003d mkrp(\u0027c2\u0027, False, agg3, parent\u003dr2)"},{"line_number":1283,"context_line":"        # r3 stands alone, but is a member of three aggregates.  We use this to"},{"line_number":1284,"context_line":"        # show that we don\u0027t \"jump aggregates\" - when we ask for anchors for s2"},{"line_number":1285,"context_line":"        # we only get r3 (and s2 itself)."},{"line_number":1286,"context_line":"        r3 \u003d mkrp(\u0027r3\u0027, False, agg2, agg3, agg4)"},{"line_number":1287,"context_line":"        # s* are sharing providers"},{"line_number":1288,"context_line":"        s1 \u003d mkrp(\u0027s1\u0027, True, agg1, agg2, agg3)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_d3f2cc6f","line":1285,"updated":"2018-04-30 19:01:51.000000000","message":"might be nice to do one of your amazing ascii diagrams in this test just for posterity\u0027s sake :)","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7286607fadcf149d94bef3a76977a822964a1ab0","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"        c2 \u003d mkrp(\u0027c2\u0027, False, agg3, parent\u003dr2)"},{"line_number":1283,"context_line":"        # r3 stands alone, but is a member of three aggregates.  We use this to"},{"line_number":1284,"context_line":"        # show that we don\u0027t \"jump aggregates\" - when we ask for anchors for s2"},{"line_number":1285,"context_line":"        # we only get r3 (and s2 itself)."},{"line_number":1286,"context_line":"        r3 \u003d mkrp(\u0027r3\u0027, False, agg2, agg3, agg4)"},{"line_number":1287,"context_line":"        # s* are sharing providers"},{"line_number":1288,"context_line":"        s1 \u003d mkrp(\u0027s1\u0027, True, agg1, agg2, agg3)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_2e971f93","line":1285,"in_reply_to":"9f6a8fd7_d3f2cc6f","updated":"2018-04-30 19:37:48.000000000","message":"I tried, and gave up.  It\u0027s pretty ugly.  But I\u0027ll try again.","commit_id":"3e760e48bfb87141cae755a055bc03d20cc155ab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9e81bc566a692106a76488e97494b56d05083050","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"    def test_anchors_for_sharing_provider(self):"},{"line_number":1253,"context_line":"        \"\"\"Test _anchors_for_sharing_provider with the following setup."},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        +\u003d\u003d\u003d\u003d+                 +\u003d\u003d\u003d\u003d+                ..agg5.."},{"line_number":1256,"context_line":"        | r1 |.               .| r2 |               : +----+ :"},{"line_number":1257,"context_line":"        +\u003d+\u003d\u003d+ :             : +\u003d+\u003d\u003d+     +----+    : | s3 | :"},{"line_number":1258,"context_line":"          |    agg1         :    |        | s2 |    : +----+ :"},{"line_number":1259,"context_line":"        +\u003d+\u003d\u003d+   :       agg2  +\u003d+\u003d\u003d+     +----+     ........"},{"line_number":1260,"context_line":"        | c1 |    :       :    | c2 |       :"},{"line_number":1261,"context_line":"        +\u003d\u003d\u003d\u003d+     :     :     +\u003d\u003d\u003d\u003d+     agg4        +----+"},{"line_number":1262,"context_line":"                    :   :        :          :         | s4 |"},{"line_number":1263,"context_line":"                   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1264,"context_line":"                   | s1 |.......agg3......| r3 |"},{"line_number":1265,"context_line":"                   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1266,"context_line":"                      :.......agg2..........:"},{"line_number":1267,"context_line":"        \"\"\""},{"line_number":1268,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1269,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_89439caf","line":1266,"range":{"start_line":1255,"start_character":0,"end_line":1266,"end_character":45},"updated":"2018-05-02 16:00:11.000000000","message":"On the picture r1 is connected to agg1 while in the code below c1 is connected to agg1. I don\u0027t know if it is intentional or not.","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f1bc0ce4eabb5b02c1d4f17210ed24f196aa84cf","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"    def test_anchors_for_sharing_provider(self):"},{"line_number":1253,"context_line":"        \"\"\"Test _anchors_for_sharing_provider with the following setup."},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        +\u003d\u003d\u003d\u003d+                 +\u003d\u003d\u003d\u003d+                ..agg5.."},{"line_number":1256,"context_line":"        | r1 |.               .| r2 |               : +----+ :"},{"line_number":1257,"context_line":"        +\u003d+\u003d\u003d+ :             : +\u003d+\u003d\u003d+     +----+    : | s3 | :"},{"line_number":1258,"context_line":"          |    agg1         :    |        | s2 |    : +----+ :"},{"line_number":1259,"context_line":"        +\u003d+\u003d\u003d+   :       agg2  +\u003d+\u003d\u003d+     +----+     ........"},{"line_number":1260,"context_line":"        | c1 |    :       :    | c2 |       :"},{"line_number":1261,"context_line":"        +\u003d\u003d\u003d\u003d+     :     :     +\u003d\u003d\u003d\u003d+     agg4        +----+"},{"line_number":1262,"context_line":"                    :   :        :          :         | s4 |"},{"line_number":1263,"context_line":"                   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1264,"context_line":"                   | s1 |.......agg3......| r3 |"},{"line_number":1265,"context_line":"                   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1266,"context_line":"                      :.......agg2..........:"},{"line_number":1267,"context_line":"        \"\"\""},{"line_number":1268,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1269,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_bc7d776f","line":1266,"range":{"start_line":1255,"start_character":0,"end_line":1266,"end_character":45},"in_reply_to":"9f6a8fd7_89439caf","updated":"2018-05-02 19:55:05.000000000","message":"You\u0027re right.  It\u0027s the diagram I messed up - agg1 is definitely supposed to be connected to c1.  I can fix this in a fup.","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7b8f8049ee3f7e8c4493cce298936fc7dd5fb0fc","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"    def test_anchors_for_sharing_provider(self):"},{"line_number":1253,"context_line":"        \"\"\"Test _anchors_for_sharing_provider with the following setup."},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        +\u003d\u003d\u003d\u003d+                 +\u003d\u003d\u003d\u003d+                ..agg5.."},{"line_number":1256,"context_line":"        | r1 |.               .| r2 |               : +----+ :"},{"line_number":1257,"context_line":"        +\u003d+\u003d\u003d+ :             : +\u003d+\u003d\u003d+     +----+    : | s3 | :"},{"line_number":1258,"context_line":"          |    agg1         :    |        | s2 |    : +----+ :"},{"line_number":1259,"context_line":"        +\u003d+\u003d\u003d+   :       agg2  +\u003d+\u003d\u003d+     +----+     ........"},{"line_number":1260,"context_line":"        | c1 |    :       :    | c2 |       :"},{"line_number":1261,"context_line":"        +\u003d\u003d\u003d\u003d+     :     :     +\u003d\u003d\u003d\u003d+     agg4        +----+"},{"line_number":1262,"context_line":"                    :   :        :          :         | s4 |"},{"line_number":1263,"context_line":"                   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1264,"context_line":"                   | s1 |.......agg3......| r3 |"},{"line_number":1265,"context_line":"                   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1266,"context_line":"                      :.......agg2..........:"},{"line_number":1267,"context_line":"        \"\"\""},{"line_number":1268,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1269,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_bc98176a","line":1266,"range":{"start_line":1255,"start_character":0,"end_line":1266,"end_character":45},"in_reply_to":"9f6a8fd7_bc7d776f","updated":"2018-05-02 21:12:11.000000000","message":"An additional sharing provider should be added to this fixture. Add an s5 provider that is associated via agg1 to r1 and agg2 to r2. This will test the \"multiple sharing providers having the same linkage\" scenarios (and represents a fairly common real-world use, which would be having 2 identical filers providing shared disk storage for two rows of compute nodes.)","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f7f9a87a720e16f13a1eb8042a21323219c38822","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"    def test_anchors_for_sharing_provider(self):"},{"line_number":1253,"context_line":"        \"\"\"Test _anchors_for_sharing_provider with the following setup."},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        +\u003d\u003d\u003d\u003d+                 +\u003d\u003d\u003d\u003d+                ..agg5.."},{"line_number":1256,"context_line":"        | r1 |.               .| r2 |               : +----+ :"},{"line_number":1257,"context_line":"        +\u003d+\u003d\u003d+ :             : +\u003d+\u003d\u003d+     +----+    : | s3 | :"},{"line_number":1258,"context_line":"          |    agg1         :    |        | s2 |    : +----+ :"},{"line_number":1259,"context_line":"        +\u003d+\u003d\u003d+   :       agg2  +\u003d+\u003d\u003d+     +----+     ........"},{"line_number":1260,"context_line":"        | c1 |    :       :    | c2 |       :"},{"line_number":1261,"context_line":"        +\u003d\u003d\u003d\u003d+     :     :     +\u003d\u003d\u003d\u003d+     agg4        +----+"},{"line_number":1262,"context_line":"                    :   :        :          :         | s4 |"},{"line_number":1263,"context_line":"                   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1264,"context_line":"                   | s1 |.......agg3......| r3 |"},{"line_number":1265,"context_line":"                   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1266,"context_line":"                      :.......agg2..........:"},{"line_number":1267,"context_line":"        \"\"\""},{"line_number":1268,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1269,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_f51db80f","line":1266,"range":{"start_line":1255,"start_character":0,"end_line":1266,"end_character":45},"in_reply_to":"9f6a8fd7_bc98176a","updated":"2018-05-02 21:58:26.000000000","message":"Done.  cf. IRC: http://p.anticdent.org/logs/openstack-placement?dated\u003d2018-05-02%2021:36:11.812957#11vN","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"0ade3e56e54104cc5024b36eb0763e1d312ace03","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"        shr_trait \u003d rp_obj.Trait.get_by_name("},{"line_number":1274,"context_line":"            self.ctx, \"MISC_SHARES_VIA_AGGREGATE\")"},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        def mkrp(name, sharing, *aggs, **kwargs):"},{"line_number":1277,"context_line":"            rp_args \u003d dict(name\u003dname, uuid\u003dgetattr(uuidsentinel, name))"},{"line_number":1278,"context_line":"            parent \u003d kwargs.get(\u0027parent\u0027)"},{"line_number":1279,"context_line":"            if parent is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_57021a71","line":1276,"range":{"start_line":1276,"start_character":32,"end_line":1276,"end_character":37},"updated":"2018-05-01 14:11:28.000000000","message":"Took me a while to read this correctly, as it is so close to the standard catchall \u0027*args\u0027. :)\n\nIt would be more understandable to make this param simply \u0027aggs\u0027, and then pass in lists with the aggs instead of a series of separate params. Then just do \u0027rp.set_aggregates(*aggs) below.","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"975019f3ef5506e1f7c6e9a4f5600198ff48735c","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"        shr_trait \u003d rp_obj.Trait.get_by_name("},{"line_number":1274,"context_line":"            self.ctx, \"MISC_SHARES_VIA_AGGREGATE\")"},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        def mkrp(name, sharing, *aggs, **kwargs):"},{"line_number":1277,"context_line":"            rp_args \u003d dict(name\u003dname, uuid\u003dgetattr(uuidsentinel, name))"},{"line_number":1278,"context_line":"            parent \u003d kwargs.get(\u0027parent\u0027)"},{"line_number":1279,"context_line":"            if parent is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_5ad0fac9","line":1276,"range":{"start_line":1276,"start_character":32,"end_line":1276,"end_character":37},"in_reply_to":"9f6a8fd7_57021a71","updated":"2018-05-01 17:32:22.000000000","message":"Yeah, I agree.  Once [1] lands, I\u0027ll just be using [2] instead (which suffers the same issue, to be fair).\n\n[1] https://review.openstack.org/#/c/564590\n[2] https://review.openstack.org/#/c/564590/3/nova/tests/functional/api/openstack/placement/db/test_base.py@78","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7b8f8049ee3f7e8c4493cce298936fc7dd5fb0fc","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"        # is still considered its own root, even if the aggregate is only"},{"line_number":1307,"context_line":"        # associated with itself."},{"line_number":1308,"context_line":"        s3 \u003d mkrp(\u0027s3\u0027, True, agg5)"},{"line_number":1309,"context_line":"        # s4 is a sharing provider, but not a member of an aggregate.  It has"},{"line_number":1310,"context_line":"        # no \"anchor\"."},{"line_number":1311,"context_line":"        s4 \u003d mkrp(\u0027s4\u0027, True)"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"        # s1 gets s1 (self),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_3c6de797","line":1310,"range":{"start_line":1309,"start_character":8,"end_line":1310,"end_character":22},"updated":"2018-05-02 21:12:11.000000000","message":"This isn\u0027t actually a thing... the definition of a sharing provider (currently, at least) is that it shares via aggregate. :) I get what you mean though. You\u0027re saying that it\u0027s a provider that intends to share its resources via aggregate but isn\u0027t actually in an aggregate yet...","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f7f9a87a720e16f13a1eb8042a21323219c38822","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"        # is still considered its own root, even if the aggregate is only"},{"line_number":1307,"context_line":"        # associated with itself."},{"line_number":1308,"context_line":"        s3 \u003d mkrp(\u0027s3\u0027, True, agg5)"},{"line_number":1309,"context_line":"        # s4 is a sharing provider, but not a member of an aggregate.  It has"},{"line_number":1310,"context_line":"        # no \"anchor\"."},{"line_number":1311,"context_line":"        s4 \u003d mkrp(\u0027s4\u0027, True)"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"        # s1 gets s1 (self),"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_359d7059","line":1310,"range":{"start_line":1309,"start_character":8,"end_line":1310,"end_character":22},"in_reply_to":"9f6a8fd7_3c6de797","updated":"2018-05-02 21:58:26.000000000","message":"Yeah, something like that.  Reworded.","commit_id":"20a892fa1a189fb37b5f62fc1d2cdbeb0652aa5d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9f0eb8768930d7df22660c5381f9216419d8d96f","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"     :    +----+   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1266,"context_line":"     :....| s5 |   | s1 |.......agg3......| r3 |"},{"line_number":1267,"context_line":"     :    +----+   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1268,"context_line":"     :.........agg2...:"},{"line_number":1269,"context_line":"        \"\"\""},{"line_number":1270,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1271,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_6f2a2de8","line":1268,"updated":"2018-05-03 08:08:43.000000000","message":"nice \"workaround\" to get a planar graph :)","commit_id":"e2b538dd32779ca122d33be7c96680b36b8340d4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"04d0f89b797199096829a3c65190a89a92cba8bb","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"     :    +----+   +----+        :        +\u003d\u003d\u003d\u003d+      +----+"},{"line_number":1266,"context_line":"     :....| s5 |   | s1 |.......agg3......| r3 |"},{"line_number":1267,"context_line":"     :    +----+   +----+                 +\u003d\u003d\u003d\u003d+"},{"line_number":1268,"context_line":"     :.........agg2...:"},{"line_number":1269,"context_line":"        \"\"\""},{"line_number":1270,"context_line":"        agg1 \u003d uuidsentinel.agg1"},{"line_number":1271,"context_line":"        agg2 \u003d uuidsentinel.agg2"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_edd640f2","line":1268,"in_reply_to":"5f7c97a3_6f2a2de8","updated":"2018-05-03 13:59:26.000000000","message":"++","commit_id":"e2b538dd32779ca122d33be7c96680b36b8340d4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"04d0f89b797199096829a3c65190a89a92cba8bb","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"        # r1 via agg1 through c1,"},{"line_number":1320,"context_line":"        # r2 via agg2 AND via agg3 through c2"},{"line_number":1321,"context_line":"        # r3 via agg2 and agg3"},{"line_number":1322,"context_line":"        # s5 via agg1 and agg2"},{"line_number":1323,"context_line":"        expected \u003d [rp.uuid for rp in (s1, r1, r2, r3, s5)]"},{"line_number":1324,"context_line":"        self.assertItemsEqual("},{"line_number":1325,"context_line":"            expected, rp_obj._anchors_for_sharing_provider(self.ctx, s1.id))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_cdf2649b","line":1322,"updated":"2018-05-03 13:59:26.000000000","message":"This is the specific situation we discussed on IRC yesterday. s5 is a sharing provider that appears in the list of anchor providers for another sharing provider because s5 is sharing with an overlapping subset of the providers that s1 is sharing with.\n\nYeah. Fun. :)","commit_id":"e2b538dd32779ca122d33be7c96680b36b8340d4"}]}
