)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"815d96df6570ba72394dff9ad17e6f324bdefcd2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Extend the \"AggregateMultiTenancyIsolation\" scheduler filter"},{"line_number":10,"context_line":"in order to optionally exclude instances from being schedule"},{"line_number":11,"context_line":"for deployment in hosts that don\u0027t belong to the defined"},{"line_number":12,"context_line":"aggregate(s)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I1c0d650e16904790a964c5626612c576ce1de213"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1ae5cdf2_c9d50d1d","line":12,"updated":"2014-06-12 18:03:58.000000000","message":"I think you need a BP in launchpad and link to that in the commit message.","commit_id":"ecc6e032ade5341a0db365006811d5ef1452ecb3"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"eca6bba773b4d648ddf46fdfbd2d58915c746ffd","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Extend the \"AggregateMultiTenancyIsolation\" scheduler filter"},{"line_number":10,"context_line":"in order to optionally exclude instances from being schedule"},{"line_number":11,"context_line":"for deployment in hosts that don\u0027t belong to the defined"},{"line_number":12,"context_line":"aggregate(s)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I1c0d650e16904790a964c5626612c576ce1de213"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1ae5cdf2_a987cf5f","line":12,"in_reply_to":"1ae5cdf2_c9d50d1d","updated":"2014-06-13 06:13:31.000000000","message":"The bp already exists in launchpad and the link is on the specs. I\u0027m updating the commit message. Thanks.","commit_id":"ecc6e032ade5341a0db365006811d5ef1452ecb3"}],"specs/juno/tenant-aggregate-exclusive-filter.rst":[{"author":{"_account_id":4573,"name":"yunhong-jiang","email":"yunhong.jiang@intel.com","username":"yunhong-jiang"},"change_message_id":"73a2334c9fd58008b1e08812a867ee1670c8de2f","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"However, it doesn\u0027t exclude instances from other tenants to be scheduled in"},{"line_number":28,"context_line":"the aggregate. Is not possible to exclusively dedicate an aggregate to a set"},{"line_number":29,"context_line":"of tenants."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1ae5cdf2_78094183","line":29,"updated":"2014-06-11 22:43:55.000000000","message":"Are you sure? From the followed code, seems the instance from other tenant can\u0027t be scheduled on such host?\n\nIn scheduler/filters/aggregate_multitenancy_isolation.py:\n\n        if metadata !\u003d {}:\n            if tenant_id not in metadata[\"filter_tenant_id\"]:\n                LOG.debug(\"%s fails tenant id on aggregate\", host_state)\n                return False","commit_id":"740ed347956616ed7e1c7821881945556efe158f"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"36127cfe806c82323e51e1bba114f34139dee3bc","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"However, it doesn\u0027t exclude instances from other tenants to be scheduled in"},{"line_number":28,"context_line":"the aggregate. Is not possible to exclusively dedicate an aggregate to a set"},{"line_number":29,"context_line":"of tenants."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1ae5cdf2_625507c1","line":29,"in_reply_to":"1ae5cdf2_78094183","updated":"2014-06-12 06:39:52.000000000","message":"I explained it wrong. It\u0027s the other way around... In the blueprint it\u0027s correct.\nI\u0027m pushing a new version.","commit_id":"740ed347956616ed7e1c7821881945556efe158f"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"fef2b559964876602a95ea873fdb1dcc72b5a105","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We propose the introduction of the \"filter_tenant_exclusive\" aggregate"},{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_825cd37e","line":37,"updated":"2014-06-12 07:03:12.000000000","message":"If its defined and it\u0027s value is \"true\", the tenants defined in \"filter_tenant_id\" will only be able to schedule instances for deployment to aggregates that include the tenant in the \"filter_tenant_id\" list.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"afc7d6a1d751a367fda7ddb5f9fc525f9b19e5a9","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We propose the introduction of the \"filter_tenant_exclusive\" aggregate"},{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_273f8cb5","line":37,"in_reply_to":"1ae5cdf2_825cd37e","updated":"2014-06-12 08:49:17.000000000","message":"Honestly I prefer how is described now. Please comment if you strongly disagree.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"fef2b559964876602a95ea873fdb1dcc72b5a105","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_a2db8feb","line":39,"updated":"2014-06-12 07:03:12.000000000","message":"This will allow the scheduling of any instance builds by a list of tenants to be exclusively scheduled to specified aggregates.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"afc7d6a1d751a367fda7ddb5f9fc525f9b19e5a9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_27494c31","line":39,"in_reply_to":"1ae5cdf2_a2db8feb","updated":"2014-06-12 08:49:17.000000000","message":"Honestly I prefer how is described now. Please comment if you strongly disagree.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"fef2b559964876602a95ea873fdb1dcc72b5a105","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":" * Modify \"AggregateMultiTenancyIsolation\" to dedicate an aggregate to a set"},{"line_number":97,"context_line":"   of defined tenants if \"filter_tenant_exclusive\" aggregate metadata is"},{"line_number":98,"context_line":"   defined and is \"true\"."},{"line_number":99,"context_line":" * Add a new DB query \"aggregate_metadata_get_all_by_key()\" in order to get"},{"line_number":100,"context_line":"   all aggregates with a specific metadata key."},{"line_number":101,"context_line":" * Change the scheduler filter documentation reflecting the new functionality."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_62e507a3","line":98,"updated":"2014-06-12 07:03:12.000000000","message":"Modify \"AggregateMultiTenancyIsolation\" to set a list of tenant\u0027s builds to exclusively build on an aggregate if \"filter_tenant_exclusive\" aggregate metadata is defined and is \"true\".","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"afc7d6a1d751a367fda7ddb5f9fc525f9b19e5a9","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":" * Modify \"AggregateMultiTenancyIsolation\" to dedicate an aggregate to a set"},{"line_number":97,"context_line":"   of defined tenants if \"filter_tenant_exclusive\" aggregate metadata is"},{"line_number":98,"context_line":"   defined and is \"true\"."},{"line_number":99,"context_line":" * Add a new DB query \"aggregate_metadata_get_all_by_key()\" in order to get"},{"line_number":100,"context_line":"   all aggregates with a specific metadata key."},{"line_number":101,"context_line":" * Change the scheduler filter documentation reflecting the new functionality."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_074c5041","line":98,"in_reply_to":"1ae5cdf2_62e507a3","updated":"2014-06-12 08:49:17.000000000","message":"Honestly I prefer how is described now. Please comment if you strongly disagree.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"fef2b559964876602a95ea873fdb1dcc72b5a105","unresolved":false,"context_lines":[{"line_number":121,"context_line":"Additional unit tests:"},{"line_number":122,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dtrue."},{"line_number":123,"context_line":"   Validate that if the tenant is not in the filter_tenant_id list then the"},{"line_number":124,"context_line":"   host fails."},{"line_number":125,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dtrue."},{"line_number":126,"context_line":"   Validate that if the tenant is in the filter_tenant_id list then the host"},{"line_number":127,"context_line":"   passes."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_028d23d3","line":124,"updated":"2014-06-12 07:03:12.000000000","message":"This item should already be in the existing tests.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"afc7d6a1d751a367fda7ddb5f9fc525f9b19e5a9","unresolved":false,"context_lines":[{"line_number":121,"context_line":"Additional unit tests:"},{"line_number":122,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dtrue."},{"line_number":123,"context_line":"   Validate that if the tenant is not in the filter_tenant_id list then the"},{"line_number":124,"context_line":"   host fails."},{"line_number":125,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dtrue."},{"line_number":126,"context_line":"   Validate that if the tenant is in the filter_tenant_id list then the host"},{"line_number":127,"context_line":"   passes."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_c46b46b7","line":124,"in_reply_to":"1ae5cdf2_028d23d3","updated":"2014-06-12 08:49:17.000000000","message":"Is in existing tests, however the new metadata \"filter_tenant_exclusive\u003dtrue\" should be considered.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"fef2b559964876602a95ea873fdb1dcc72b5a105","unresolved":false,"context_lines":[{"line_number":126,"context_line":"   Validate that if the tenant is in the filter_tenant_id list then the host"},{"line_number":127,"context_line":"   passes."},{"line_number":128,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dfalse."},{"line_number":129,"context_line":"   Validate that the host passes for any tenant."},{"line_number":130,"context_line":" * Validate db query \"aggregate_metadata_get_all_by_key()\"."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_82a13348","line":129,"updated":"2014-06-12 07:03:12.000000000","message":"Set aggregate metadata filter_tenant_exclusive\u003dtrue. Validate that if the tenant is in the filter_tenant_id list then all hosts that are not in the aggregate fail.","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"afc7d6a1d751a367fda7ddb5f9fc525f9b19e5a9","unresolved":false,"context_lines":[{"line_number":126,"context_line":"   Validate that if the tenant is in the filter_tenant_id list then the host"},{"line_number":127,"context_line":"   passes."},{"line_number":128,"context_line":" * Set aggregate metadata filter_tenant_exclusive\u003dfalse."},{"line_number":129,"context_line":"   Validate that the host passes for any tenant."},{"line_number":130,"context_line":" * Validate db query \"aggregate_metadata_get_all_by_key()\"."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"Documentation Impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1ae5cdf2_c4798683","line":129,"in_reply_to":"1ae5cdf2_82a13348","updated":"2014-06-12 08:49:17.000000000","message":"Done","commit_id":"5f048c15ca15f89bd075224aad9da1f14504f807"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"297ac747e86c8bb6d2ab2ccc9eace4cc180c0b1e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_689e2509","line":39,"updated":"2014-06-17 16:01:16.000000000","message":"A table like this would be helpful.\n\nGiven following filter_tenant_id key defined in 3 host aggregates\nAg01: proj-a, proj-b\nAg02: proj-b\nAg03: \u003cempty\u003e\n\nWith \"AggregateMultiTenancyIsolation\" filer, whether a host (from an aggregate) would be picked:\n--\nproj \\ ag  Ag01  Ag02  Ag03\nproject a\tY\tY\tY\nproject b\tY\tN\tY\nproject c\tN\tN\tY\n\nGiven following filter_tenant_exclusive key defined in 3 host aggregates\nAg01: proj-a, proj-b\nAg02: proj-b\nAg03: \u003cempty\u003e\n\nWith current filter being proposed, whether a host (from an aggregate) would be picked:\nproj \\ ag  Ag01  Ag02  Ag03\nproj-a\tY\tY\tN\nproj-b\tY\tN\tN\nproj-c\tN\tN\tY","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"2e4952d71ff9930b4ebe1f90cc4e6b534b260b31","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_2e620ead","line":39,"in_reply_to":"1ae5cdf2_3f6a5f1a","updated":"2014-06-26 20:52:54.000000000","message":"Qiu Yu, in your example I see that you are expecting that more than one tenant can be defined per aggregate. However the current \"aggregate_multitenancy_isolation\" filter only considers one tenant per aggregate.\nEven if what I proposed in https://review.openstack.org/#/c/28635 supported multiple projects, because we are keeping the same filter probably is better to preserve the actual behavior. Multiple tenants can be defined for other projects.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"115494d7239ebf100e7042dac4e94580f47012ff","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_911ee30b","line":39,"in_reply_to":"1ae5cdf2_3f6a5f1a","updated":"2014-06-26 21:17:53.000000000","message":"The example pointed by Qiu Yu, made me think about the following conflicting scenario:\nAggrA - filter_tenant_id\u003dproject X - filter_tenant_exclusive\u003dtrue;\nAggrB - filter_tenant_id\u003dproject X - filter_tenant_exclusive\u003dfalse;\nAggrC \n\nIf a user from \"project X\" creates a VM, AggrC should or not be considered?\n\nI don\u0027t see that we can have some logic to avoid these scenarios.\nHaving a global configuration option \"aggregate_multitenancy_isolation_tenant_exclusive \u003d true/false\" would solve this problem since it switches the filter between the two states (actual behavior or exclusive).\n\nThoughts? before updating a new spec.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"d62235e0ea35c32d7bec3bd2926a3b93952096d9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_3f6a5f1a","line":39,"in_reply_to":"1ae5cdf2_526c8f9d","updated":"2014-06-18 13:48:50.000000000","message":"Sorry, the format got messed up after posting in comment like this. The idea was to use a table presenting scheduling result in all cases.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"79568ba221f6dcfe55571b96cf8ffe069175807a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_526c8f9d","line":39,"in_reply_to":"1ae5cdf2_689e2509","updated":"2014-06-18 08:01:34.000000000","message":"Qiu Yu, \nyes, I can add a table explaining the change. \nBut, or I\u0027m not understanding your example or I disagree with it.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"3f3222572f873af0f0a0a9f2eeb034c9de83ad1a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_9df89b4b","line":39,"in_reply_to":"1ae5cdf2_911ee30b","updated":"2014-06-27 14:34:57.000000000","message":"In that situation the available hosts would be those in AggrA and AggrB. AggrC would not be available to project X. AggrB and AggrC would be available for instances spawned by project Y (not defined in the aggregate metadata). I still think that a per aggregate setting using the metadata is best to allow maximum flexibility.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"e8d497b8a37a9b072143cb0641505ae2966fa109","unresolved":false,"context_lines":[{"line_number":36,"context_line":"metadata key in the \"AggregateMultiTenancyIsolation\" scheduler filter. If"},{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"dab895d6_f8196823","line":39,"in_reply_to":"1ae5cdf2_9df89b4b","updated":"2014-06-29 22:06:02.000000000","message":"Jesse, I feel this behavior really confusing... Using the previous example, in AggrB filter_tenant_exclusive\u003dfalse which means that AggrC can be used, however because AggrA filter_tenant_exclusive\u003dtrue it can\u0027t. And this is a simple example...\nUsing a configuration option will avoid these scenarios.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"bacf3502f93413e43b1a9b8e41797e49f9b26b93","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_d0acaea1","line":40,"updated":"2014-06-13 15:36:58.000000000","message":"I get the concept but I don\u0027t see how you would make this work in practice from within a filter called on a host by host basis.\n\nConsider Host A that is in the Aggregate and Host B that isn\u0027t.   With this new logic host B has to reject the request because an exclusive aggregate exists.   But to do that host B needs to look up aggregates that its not a member of - which isn\u0027t currently supported by the db api (short of trawling through all of the aggregates).\n\nIt kind of feels that you need a scheduler hint passed in by users who want to be constrained to their isolation aggregate - which host B would see in the request spec and could then tell that it needs to be in an aggregate and isn\u0027t.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"00ff59ceb8447b3245983c650689a677178e14c6","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_c7e044fd","line":40,"in_reply_to":"1ae5cdf2_24f7335b","updated":"2014-06-16 12:10:43.000000000","message":"OK, I guess that could be made to work - although the details will have to be different from that patch as filters will be given metadata (for all aggregates) in the request spec and aggregate membership in the host state.\n\nCan you add text please explaining this additional change, as you\u0027re now going to need a new database method as well as the changes to the filter - and introduce an additional DB lookup in each call of the filter which will be a performance concern at scale.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"fbbd05cb7880fdf95f3dcbd11549929143ecbedb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_4e54e321","line":40,"in_reply_to":"1ae5cdf2_43f848c4","updated":"2014-06-18 12:20:58.000000000","message":"In terms of caching - there is another BP which will make the aggregate data available as a combination of request (metadata) and host_state (aggregate membership) - so I don;t think you need to do that in this spec.\n\nYou might want to link to that one though - as without it performance will be horrible\n\nhttps://review.openstack.org/#/c/89893","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"d62235e0ea35c32d7bec3bd2926a3b93952096d9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_9a4aa181","line":40,"in_reply_to":"1ae5cdf2_43f848c4","updated":"2014-06-18 13:48:50.000000000","message":"It basically do the same thing as aggregate_metadata_get_all_by_key() would do in your https://review.openstack.org/#/c/28635\n\nWith aggregate_metadata_get_all_by_key(), it will returns you a metadata key - metadata value dict. \nhttps://review.openstack.org/#/c/28635/6/nova/db/sqlalchemy/api.py\n\nWhile with aggregate_host_get_by_metadata_key(), it will gives a host - metadata value dict. So you can iterate throught the result to test whether a tenat id in that metadata value part. \nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L5106","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"2e4952d71ff9930b4ebe1f90cc4e6b534b260b31","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_fbfd460a","line":40,"in_reply_to":"1ae5cdf2_9a4aa181","updated":"2014-06-26 20:52:54.000000000","message":"Qiu Yu, yes, this is great! Thanks for pointing this out.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"dbb627c091eb50d117915d50b67c9fc2a86adb50","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_c833b9f5","line":40,"in_reply_to":"1ae5cdf2_c7e044fd","updated":"2014-06-17 15:43:35.000000000","message":"I think it is possible to use existing aggregate_host_get_by_metadata_key db api for checking whether other exclusive aggregate defined for the tenant.\n\nThis is also the way we did internally for this tenant exclusive aggregate scenario.\n\nAs for the performance concern, what we did is by adding a cache by aggregate metadata key layer. Not sure if it worth another spec proposal.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"79568ba221f6dcfe55571b96cf8ffe069175807a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_43f848c4","line":40,"in_reply_to":"1ae5cdf2_c833b9f5","updated":"2014-06-18 08:01:34.000000000","message":"Qiu Yu, can you explain how are you using \"aggregate_host_get_by_metadata_key\" to verify if a metadata exists in aggregates even if the host doesn\u0027t belong to them?\n\nHaving a cache would be great, however I\u0027m not aware of a generic mechanism in the scheduler to have this in the filters. Something specific to this filter should be avoided","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"a8eef5714dccbe3ea9908619c6e625729c987bff","unresolved":false,"context_lines":[{"line_number":37,"context_line":"defined and its value is \"true\" instances from the defined tenants in"},{"line_number":38,"context_line":"\"filter_tenant_id\" will only be scheduled for deployment to the aggregate."},{"line_number":39,"context_line":"This will allow the exclusive dedication of an aggregate to a set of tenants."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Alternatives"},{"line_number":42,"context_line":"------------"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_24f7335b","line":40,"in_reply_to":"1ae5cdf2_d0acaea1","updated":"2014-06-16 07:09:32.000000000","message":"Phil, yes, host B needs to check if there are aggregate(s) defined for the tenant. The logic is the same as: https://review.openstack.org/#/c/28635/\n\nScheduler hint is not considered because it needs to be passed by users.\nThis filter is for private cloud admins to define in which set of hosts a project can create instances, transparently to users.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6214dbc1f63e00f9bd88c8af33f45671b8c61f2b","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"The filter will have another DB query if \"filter_tenant_exclusive\u003dtrue\"."},{"line_number":77,"context_line":"Depending in the deployment size it could have a performance impact."},{"line_number":78,"context_line":"Documentation will reflect this."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Other deployer impact"},{"line_number":81,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_eae8e5b4","line":78,"updated":"2014-06-13 08:48:50.000000000","message":"Please note there are current efforts for changing how scheduler is requesting aggregates metadata here : https://review.openstack.org/89893\n\nDepending on the timeframe, either it would be a DB call to be done, or a lookup in the filter_property object","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ab5352222fa4ccb8a362c731759382527cee6a25","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"The filter will have another DB query if \"filter_tenant_exclusive\u003dtrue\"."},{"line_number":77,"context_line":"Depending in the deployment size it could have a performance impact."},{"line_number":78,"context_line":"Documentation will reflect this."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Other deployer impact"},{"line_number":81,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_9d7136ab","line":78,"in_reply_to":"1ae5cdf2_475c41f1","updated":"2014-06-16 07:43:44.000000000","message":"Ok, turning my vote to +1, considering you\u0027re aware of the possible dramatic impact your change would require if the bp/isolate-scheduler-db get merged before :-)","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"604d72ce2e9a6a8bc35dbc37ae8fdb7407f75373","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"The filter will have another DB query if \"filter_tenant_exclusive\u003dtrue\"."},{"line_number":77,"context_line":"Depending in the deployment size it could have a performance impact."},{"line_number":78,"context_line":"Documentation will reflect this."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Other deployer impact"},{"line_number":81,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_94fce3b6","line":78,"in_reply_to":"1ae5cdf2_eae8e5b4","updated":"2014-06-13 10:30:02.000000000","message":"Are you simply asking for https://review.openstack.org/89893 to be listed as a dependency?","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"a8eef5714dccbe3ea9908619c6e625729c987bff","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"The filter will have another DB query if \"filter_tenant_exclusive\u003dtrue\"."},{"line_number":77,"context_line":"Depending in the deployment size it could have a performance impact."},{"line_number":78,"context_line":"Documentation will reflect this."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Other deployer impact"},{"line_number":81,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1ae5cdf2_475c41f1","line":78,"in_reply_to":"1ae5cdf2_eae8e5b4","updated":"2014-06-16 07:09:32.000000000","message":"Sylvain, thanks for the pointer. I agree that if your proposal is approved the filter should use it. And that would be great! However, I don\u0027t believe it should be a specification dependency at this stage.","commit_id":"a9cf9ad2ef7ee89acd331e9414e6555c87512054"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"7433fbe639b183473d812cc6d5af238bec742c48","unresolved":false,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/multi-tenancy-isolation-only\\"},{"line_number":12,"context_line":"-aggregates"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Extend the \"AggregateMultiTenancyIsolation\" scheduler filter in order to"},{"line_number":15,"context_line":"optionally exclude instances from being schedule for deployment in hosts that"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_3b368304","line":12,"updated":"2014-06-30 14:43:08.000000000","message":"In the doc build the line break isn\u0027t handled correctly.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"bcb72914d075a2a2ce43c1512e3a20d1037d4ea0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/multi-tenancy-isolation-only\\"},{"line_number":12,"context_line":"-aggregates"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Extend the \"AggregateMultiTenancyIsolation\" scheduler filter in order to"},{"line_number":15,"context_line":"optionally exclude instances from being schedule for deployment in hosts that"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_c60e3c32","line":12,"in_reply_to":"baada198_3b368304","updated":"2014-07-02 12:02:35.000000000","message":"Yeah, I am not sure the best way to handle these, I would just drop the \\ to save confusion.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"7433fbe639b183473d812cc6d5af238bec742c48","unresolved":false,"context_lines":[{"line_number":45,"context_line":"Aggregate_A \u003d\u003e filter_tenant_id \u003d project_a"},{"line_number":46,"context_line":"Aggregate_B \u003d\u003e filter_tenant_id \u003d project_b"},{"line_number":47,"context_line":"Aggregate_C \u003d\u003e filter_tenant_id \u003d project_a"},{"line_number":48,"context_line":"Aggregate_D"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"If aggregate_multitenancy_isolation_tenant_exclusive\u003dfalse (current behavior)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_9b5dcf4b","line":48,"updated":"2014-06-30 14:43:08.000000000","message":"In the doc build this all comes out as one line.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"bcb72914d075a2a2ce43c1512e3a20d1037d4ea0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"   Aggregate_B"},{"line_number":65,"context_line":" * Instance_3 from project_x can run in:"},{"line_number":66,"context_line":"   Aggregate_D"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Alternatives"},{"line_number":70,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_2690d842","line":67,"updated":"2014-07-02 12:02:35.000000000","message":"Hmm, not sure I like this.\n\nCould we not just add a special value to Aggregate_D:\n\nfilter_teant_id\u003d_exclude_tenants_with_exisiting_aggregate_","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"6862dce46b1f37e614cfe3da2e4ce273e5dcd25a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"   Aggregate_B"},{"line_number":65,"context_line":" * Instance_3 from project_x can run in:"},{"line_number":66,"context_line":"   Aggregate_D"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Alternatives"},{"line_number":70,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_1062cd3d","line":67,"in_reply_to":"baada198_2690d842","updated":"2014-07-04 11:28:08.000000000","message":"John, that will not exclude nodes that don\u0027t belong to any aggregate.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":6816,"name":"Jesse Pretorius","email":"jesse@odyssey4.me","username":"jesse-pretorius"},"change_message_id":"f0ba54449076bd7b68a81a15585a6f9388259ae3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"   Aggregate_B"},{"line_number":65,"context_line":" * Instance_3 from project_x can run in:"},{"line_number":66,"context_line":"   Aggregate_D"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Alternatives"},{"line_number":70,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_965324e1","line":67,"in_reply_to":"baada198_2690d842","updated":"2014-07-14 10:23:08.000000000","message":"This was the original proposal, which I still prefer as it retains more flexibility. See patch set 4 of the spec for the discussion in this regard.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4b76a99529057e500df79b05906794b3c73b679a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"   Aggregate_B"},{"line_number":65,"context_line":" * Instance_3 from project_x can run in:"},{"line_number":66,"context_line":"   Aggregate_D"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Alternatives"},{"line_number":70,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"baada198_bd8d072d","line":67,"in_reply_to":"baada198_965324e1","updated":"2014-07-16 11:05:08.000000000","message":"I think this should be discussed in the alternatives section.\n\nIf we can add a host that is not in any aggregate to the above examples, I think that would help here.","commit_id":"e2c8693d6718d6d3c4e77a064fe02afa59202a73"}]}
