)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"11316411e23a2e15b31e33acdb0bc51f9fd348fb","unresolved":false,"context_lines":[{"line_number":11,"context_line":"that matches the current logic."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Many D-G flags like DEVSTACK_GATE_NEUTRON, DEVSTACK_GATE_NEUTRON_DVR,"},{"line_number":14,"context_line":"when configuring a subnode (in multinode jobs) are now now specific"},{"line_number":15,"context_line":"roles, such as \"subnode_neutron\" and \"subnode_neutron_dvr\", while"},{"line_number":16,"context_line":"nova-net based runs use \"subnode_nova\""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a77a97e_07b6398a","line":14,"updated":"2016-11-15 01:29:16.000000000","message":"\u0027now now\u0027","commit_id":"f250c74ee896f0bb3e7fc736552dd3a0c5256a32"}],"devstack-vm-gate.sh":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e17d1ce143ebf2f050634493e8bc46730b83a1e9","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        if [[ \"$DEVSTACK_GATE_NEUTRON\" -eq \"1\" ]] \u0026\u0026 [[ $role \u003d sub ]]; then"},{"line_number":230,"context_line":"            MY_ENABLED_SERVICES+\u003d\",q-agt\""},{"line_number":231,"context_line":"            if [[ \"$DEVSTACK_GATE_NEUTRON_DVR\" -eq \"1\" ]]; then"},{"line_number":232,"context_line":"                # As per reference architecture described in"},{"line_number":233,"context_line":"                # https://wiki.openstack.org/wiki/Neutron/DVR"},{"line_number":234,"context_line":"                # for DVR multi-node, add the following services"}],"source_content_type":"text/x-sh","patch_set":6,"id":"fa6399be_49f7d18a","line":231,"updated":"2016-10-13 20:15:49.000000000","message":"I think you can collapse this into the feature matrix a bit more by putting q-agt in the neutron worker role. THen you are just left with:\n\n  if DVR then\n      enabled_services \u003d q-l3,q-meta\n\nAlso the else case can be collapsed into the role worker role for nova net. (note the else condition needs modifying if it needs to be kept as it should only apply to nova-net not neutron on the primary node.\n\nNote my -1 is due to the handling of nova net below otherwise everything else is just suggestion. Thank you for working on this.","commit_id":"528b1b3ad291d265fc9f89cc1b0fe838c8a870d5"},{"author":{"_account_id":7331,"name":"Julia Varlamova","email":"jvarlamova@mirantis.com","username":"jvarlamova"},"change_message_id":"b0986236cc16890f649ccacadf6fd910eb56b7b8","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        fi"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        MY_ENABLED_SERVICES\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role`"},{"line_number":272,"context_line":"        local original_enabled_services\u003d$MY_ENABLED_SERVICES"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        # Allow optional injection of ENABLED_SERVICES from the calling context"},{"line_number":275,"context_line":"        if [[ ! -z $ENABLED_SERVICES ]] ; then"}],"source_content_type":"text/x-sh","patch_set":14,"id":"9a629dbe_1713820e","line":272,"updated":"2016-11-08 18:01:44.000000000","message":"Maybe original_enabled_services should include services of primary node? In this case database would be configured properly on subnode. https://github.com/openstack-infra/devstack-gate/blob/master/devstack-vm-gate.sh#L551","commit_id":"b9a1a5e066d1f0107cfd4744363f75228547397d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea010a28bb78d9a19a38a137f26a83361c49be06","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        if [[ $role \u003d sub ]]; then"},{"line_number":259,"context_line":"            test_matrix_role\u003d\u0027subnode\u0027"},{"line_number":260,"context_line":"        fi"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        if [[ \"$DEVSTACK_GATE_NEUTRON\" -eq \"1\" ]] \u0026\u0026 [[ $role \u003d sub ]]; then"},{"line_number":263,"context_line":"            test_matrix_role\u003d\"subnode_neutron\""},{"line_number":264,"context_line":"            if [[ \"$DEVSTACK_GATE_NEUTRON_DVR\" -eq \"1\" ]]; then"}],"source_content_type":"text/x-sh","patch_set":17,"id":"5a74a57a_84819dfd","line":261,"updated":"2016-11-28 22:53:34.000000000","message":"I think this would be cleaner if for the subnode case, the current primary services were passed in. Or in the subnode case it calculates the primary services and then using the result of those services determines what the subnode services should be.","commit_id":"bdf5af97c4604d1bad7ac4c3358a8606f84b4665"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"c4694445dd2411b6bc6f1e6d89744b82ec122e31","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            test_matrix_role\u003d\u0027subnode\u0027"},{"line_number":260,"context_line":"        fi"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        MY_ENABLED_SERVICES\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role`"},{"line_number":263,"context_line":"        local original_enabled_services\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r primary`"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Allow optional injection of ENABLED_SERVICES from the calling context"}],"source_content_type":"text/x-sh","patch_set":19,"id":"5a74a57a_89c42960","line":262,"updated":"2016-11-29 16:59:36.000000000","message":"As long as this is being changed. What about using $(...)\n\n MY_ENABLED_SERVICES\u003d$(cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role)","commit_id":"772313d0ceba030782f356dd3ff1272ea7c99aba"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4d0d408d956e66f1407a4b4e4324aeff1974b05e","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            test_matrix_role\u003d\u0027subnode\u0027"},{"line_number":260,"context_line":"        fi"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        MY_ENABLED_SERVICES\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role`"},{"line_number":263,"context_line":"        local original_enabled_services\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r primary`"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Allow optional injection of ENABLED_SERVICES from the calling context"}],"source_content_type":"text/x-sh","patch_set":19,"id":"5a74a57a_6d35f9f5","line":262,"in_reply_to":"5a74a57a_89c42960","updated":"2016-11-30 09:11:50.000000000","message":"Both notations are used in the file, but if someone has a preference, then why not.","commit_id":"772313d0ceba030782f356dd3ff1272ea7c99aba"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"c4694445dd2411b6bc6f1e6d89744b82ec122e31","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        fi"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        MY_ENABLED_SERVICES\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role`"},{"line_number":263,"context_line":"        local original_enabled_services\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r primary`"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Allow optional injection of ENABLED_SERVICES from the calling context"},{"line_number":266,"context_line":"        if [[ ! -z $ENABLED_SERVICES ]] ; then"}],"source_content_type":"text/x-sh","patch_set":19,"id":"5a74a57a_699eed64","line":263,"updated":"2016-11-29 16:59:36.000000000","message":"As long as this is being changed. What about using $(...)","commit_id":"772313d0ceba030782f356dd3ff1272ea7c99aba"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"4d0d408d956e66f1407a4b4e4324aeff1974b05e","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        fi"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        MY_ENABLED_SERVICES\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r $test_matrix_role`"},{"line_number":263,"context_line":"        local original_enabled_services\u003d`cd $BASE/new/devstack-gate \u0026\u0026 ./test-matrix.py -b $branch_for_matrix -f $DEVSTACK_GATE_FEATURE_MATRIX -r primary`"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Allow optional injection of ENABLED_SERVICES from the calling context"},{"line_number":266,"context_line":"        if [[ ! -z $ENABLED_SERVICES ]] ; then"}],"source_content_type":"text/x-sh","patch_set":19,"id":"5a74a57a_8d3a55e6","line":263,"in_reply_to":"5a74a57a_699eed64","updated":"2016-11-30 09:11:50.000000000","message":"Done","commit_id":"772313d0ceba030782f356dd3ff1272ea7c99aba"}],"features.yaml":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e17d1ce143ebf2f050634493e8bc46730b83a1e9","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  # Normalized branch names only here, e.g. stable/icehouse \u003d\u003e icehouse"},{"line_number":58,"context_line":"  allowed: [master, ocata, newton, mitaka, liberty, kilo, juno, icehouse]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"controller:"},{"line_number":61,"context_line":"  default:"},{"line_number":62,"context_line":"    base:"},{"line_number":63,"context_line":"      services: [mysql, rabbit, dstat]"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"fa6399be_e980a5c1","line":60,"updated":"2016-10-13 20:15:49.000000000","message":"In order to facilitate arbitrary tags for feature sets in roles maybe we keep the \"features\" dict then keys in that dict can be arbitrary and you use what the key matches? Trying to think about the scenario where neutron is trying to test DVR HA on three nodes with different configs for the subnodes.","commit_id":"528b1b3ad291d265fc9f89cc1b0fe838c8a870d5"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"fb3600ed2be4c568ea5a162f66384642a4a37a88","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    newton:"},{"line_number":183,"context_line":"      rm-services: [tls-proxy]"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"worker:"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"  default:"},{"line_number":188,"context_line":"    base:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"ba5da102_a9e60db2","line":185,"range":{"start_line":185,"start_character":0,"end_line":185,"end_character":6},"updated":"2016-10-28 14:40:27.000000000","message":"Shouldn\u0027t we use \"primary\" and \"subnode\", as the rest of the code uses?","commit_id":"6f28b94d849bce7a77d84d41c10136115803a456"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea010a28bb78d9a19a38a137f26a83361c49be06","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    newton:"},{"line_number":183,"context_line":"      rm-services: [tls-proxy]"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"subnode:"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"  default:"},{"line_number":188,"context_line":"    base:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"5a74a57a_049f4d5f","line":185,"updated":"2016-11-28 22:53:34.000000000","message":"I also don\u0027t like subnode, subnode_nova, subnode_neutron, etc...","commit_id":"bdf5af97c4604d1bad7ac4c3358a8606f84b4665"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"9beff509e592f4f4873de597f3ab8ce08840546e","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"  ironic:"},{"line_number":213,"context_line":"    base:"},{"line_number":214,"context_line":"      rm-services: [c-vol, c-bak]"},{"line_number":215,"context_line":"      services: [ir-api, ir-cond]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  keystone:"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1a6eadb0_10441e19","line":214,"updated":"2016-12-15 11:56:15.000000000","message":"that\u0027s interesting, didn\u0027t realize it","commit_id":"196799429e289b68e913143e451acc5ef0d205b4"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"31fba8d86de3f3618e510ae8c8d3cf0efa4571eb","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":"  ironic:"},{"line_number":213,"context_line":"    base:"},{"line_number":214,"context_line":"      rm-services: [c-vol, c-bak]"},{"line_number":215,"context_line":"      services: [ir-api, ir-cond]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  keystone:"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1a6eadb0_50f7768a","line":214,"in_reply_to":"1a6eadb0_10441e19","updated":"2016-12-15 12:01:48.000000000","message":"Same is set on the primary - Ironic and Cinder are still not cooperating.","commit_id":"196799429e289b68e913143e451acc5ef0d205b4"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"9beff509e592f4f4873de597f3ab8ce08840546e","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    base:"},{"line_number":245,"context_line":"      services: []"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  tlsproxy:"},{"line_number":248,"context_line":"    base:"},{"line_number":249,"context_line":"      services: [tls-proxy]"},{"line_number":250,"context_line":"    # TLS proxy didn\u0027t work properly until ocata"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1a6eadb0_90b90e18","line":247,"updated":"2016-12-15 11:56:15.000000000","message":"I\u0027m not sure about this one, I thought this was only needed to set up the physical proxy.","commit_id":"196799429e289b68e913143e451acc5ef0d205b4"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"31fba8d86de3f3618e510ae8c8d3cf0efa4571eb","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    base:"},{"line_number":245,"context_line":"      services: []"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  tlsproxy:"},{"line_number":248,"context_line":"    base:"},{"line_number":249,"context_line":"      services: [tls-proxy]"},{"line_number":250,"context_line":"    # TLS proxy didn\u0027t work properly until ocata"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"1a6eadb0_50d056f6","line":247,"in_reply_to":"1a6eadb0_90b90e18","updated":"2016-12-15 12:01:48.000000000","message":"This mimics behavior of what was previously set through \"if-else clauses in the code.","commit_id":"196799429e289b68e913143e451acc5ef0d205b4"}],"test-matrix.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e17d1ce143ebf2f050634493e8bc46730b83a1e9","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                        default\u003d\"services\","},{"line_number":129,"context_line":"                        help\u003d\"What to return (services, compute-ext)\")"},{"line_number":130,"context_line":"    parser.add_argument(\u0027-r\u0027, \u0027--role\u0027,"},{"line_number":131,"context_line":"                        default\u003d\u0027controller\u0027,"},{"line_number":132,"context_line":"                        help\u003d\"What role this node will have \""},{"line_number":133,"context_line":"                             \"(controller or worker)\""},{"line_number":134,"context_line":"                        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_8c181777","line":131,"updated":"2016-10-13 20:15:49.000000000","message":"If we do go with arbitrary keys maybe we want to call the default \u0027default\u0027.","commit_id":"528b1b3ad291d265fc9f89cc1b0fe838c8a870d5"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea010a28bb78d9a19a38a137f26a83361c49be06","unresolved":false,"context_lines":[{"line_number":76,"context_line":"def calc_services(branch, features, role):"},{"line_number":77,"context_line":"    services \u003d set()"},{"line_number":78,"context_line":"    for feature in features:"},{"line_number":79,"context_line":"        services.update(GRID[role][feature][\u0027base\u0027].get(\u0027services\u0027, []))"},{"line_number":80,"context_line":"        if branch in GRID[role][feature]:"},{"line_number":81,"context_line":"            services.update("},{"line_number":82,"context_line":"                GRID[role][feature][branch].get(\u0027services\u0027, []))"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_044bcd59","line":79,"updated":"2016-11-28 22:53:34.000000000","message":"Maybe bikeshedding:\n\nSeems like it would be good to make a local variable to use.\n\n grid_feature \u003d GRID[role][feature]\n services.update(grid_feature[\u0027base\u0027].get(\u0027services\u0027, []))\n\nAnd use the local variable elsewhere.\n\nNot sure if \u0027grid_feature\u0027 is a good name though.","commit_id":"bdf5af97c4604d1bad7ac4c3358a8606f84b4665"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea010a28bb78d9a19a38a137f26a83361c49be06","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    parser.add_argument(\u0027-r\u0027, \u0027--role\u0027,"},{"line_number":131,"context_line":"                        default\u003d\u0027primary\u0027,"},{"line_number":132,"context_line":"                        help\u003d\"What role this node will have \""},{"line_number":133,"context_line":"                             \"(primary or subnode)\""},{"line_number":134,"context_line":"                        )"},{"line_number":135,"context_line":"    return parser.parse_args()"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_c416354b","line":133,"updated":"2016-11-28 22:53:34.000000000","message":"Add:\n choices\u003d[\u0027primary\u0027, \u0027subnode\u0027, ...],\n\n\nhttps://docs.python.org/2/library/argparse.html#choices","commit_id":"bdf5af97c4604d1bad7ac4c3358a8606f84b4665"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"ea010a28bb78d9a19a38a137f26a83361c49be06","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        default\u003d\u0027primary\u0027,"},{"line_number":132,"context_line":"                        help\u003d\"What role this node will have \""},{"line_number":133,"context_line":"                             \"(primary or subnode)\""},{"line_number":134,"context_line":"                        )"},{"line_number":135,"context_line":"    return parser.parse_args()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_64a721bd","line":134,"updated":"2016-11-28 22:53:34.000000000","message":"I think this would be cleaner if for the subnode case, the current primary services were passed in. Or in the subnode case it calculates the primary services and then using the result of those services determines what the subnode services should be.","commit_id":"bdf5af97c4604d1bad7ac4c3358a8606f84b4665"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"a6b9e6a849dfb0b8e4c63c8756ee914e27e30d4a","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    features \u003d calc_features(branch, configs_from_env())"},{"line_number":149,"context_line":"    LOG.debug(\"Features: %s \" % features)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    services \u003d calc_services(branch, features, role)"},{"line_number":152,"context_line":"    LOG.debug(\"Services: %s \" % services)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    if opts.mode \u003d\u003d \"services\":"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a74a57a_5238ba3d","line":151,"range":{"start_line":151,"start_character":47,"end_line":151,"end_character":51},"updated":"2016-11-30 19:50:32.000000000","message":"nit: Don\u0027t need a temporary variable, could just do\n\n args.role","commit_id":"1af335eec846426d37ac2d8fa477ca57ce6f2921"}]}
