)]}'
{"exercises/boot_from_volume.sh":[{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"ef84517596c0a5bfeee03a81012ecd5402191ffb","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    # Create a secgroup"},{"line_number":89,"context_line":"    if ! nova secgroup-list | grep -q $SECGROUP; then"},{"line_number":90,"context_line":"        nova secgroup-create $SECGROUP \"$SECGROUP description\""},{"line_number":91,"context_line":"        if ! timeout $ASSOCIATE_TIMEOUT sh -c \"while ! nova secgroup-list | grep -q $SECGROUP; do sleep 1; done\"; then"},{"line_number":92,"context_line":"            echo \"Security group not created\""},{"line_number":93,"context_line":"            exit 1"},{"line_number":94,"context_line":"        fi"}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQn%2F%2FlrA%3D","line":91,"updated":"2013-07-27 02:06:55.000000000","message":"This seems to be a common pattern and problem, is there some way you could compartmentalize this pattern to reuse it?","commit_id":"9e0db4bdc46132ef7a98b0f9a86e51e1be8647fd"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"dda16ccc8f98ad63437f5463695c434ad5d690be","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    # Create a secgroup"},{"line_number":89,"context_line":"    if ! nova secgroup-list | grep -q $SECGROUP; then"},{"line_number":90,"context_line":"        nova secgroup-create $SECGROUP \"$SECGROUP description\""},{"line_number":91,"context_line":"        if ! timeout $ASSOCIATE_TIMEOUT sh -c \"while ! nova secgroup-list | grep -q $SECGROUP; do sleep 1; done\"; then"},{"line_number":92,"context_line":"            echo \"Security group not created\""},{"line_number":93,"context_line":"            exit 1"},{"line_number":94,"context_line":"        fi"}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQn%2F%2FlCM%3D","line":91,"in_reply_to":"AAAAQn%2F%2FlRs%3D","updated":"2013-07-27 17:34:32.000000000","message":"I\u0027d rather not try to consolidate these things in this patch.  I am not quite sure where to put them.  lib/nova ?   I think it\u0027s something someone can clean up afterwards.\n\nAlso: I really am not sure we should be testing security groups within all of these files, anyway.  There\u0027s a separate exercise for testing security groups.","commit_id":"9e0db4bdc46132ef7a98b0f9a86e51e1be8647fd"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"87b67bfebe9f71b8823028b821892289dddeec98","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    # Create a secgroup"},{"line_number":89,"context_line":"    if ! nova secgroup-list | grep -q $SECGROUP; then"},{"line_number":90,"context_line":"        nova secgroup-create $SECGROUP \"$SECGROUP description\""},{"line_number":91,"context_line":"        if ! timeout $ASSOCIATE_TIMEOUT sh -c \"while ! nova secgroup-list | grep -q $SECGROUP; do sleep 1; done\"; then"},{"line_number":92,"context_line":"            echo \"Security group not created\""},{"line_number":93,"context_line":"            exit 1"},{"line_number":94,"context_line":"        fi"}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQn%2F%2FlRs%3D","line":91,"in_reply_to":"AAAAQn%2F%2FlrA%3D","updated":"2013-07-27 14:08:01.000000000","message":"If you come up with something I\u0027m all ears...changing the two lines below to \"die $LINENO ...\" is the only thing I\u0027d suggest...","commit_id":"9e0db4bdc46132ef7a98b0f9a86e51e1be8647fd"}],"exercises/euca.sh":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"8f0db3d1f221f7605f077fc0f1e827741d4779a5","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # Release floating address"},{"line_number":158,"context_line":"    euca-release-address $FLOATING_IP || \\"},{"line_number":159,"context_line":"        die $LINENO \"Failure releasing address $FLOATING_IP\""},{"line_number":160,"context_line":"    "},{"line_number":161,"context_line":"    # Wait just a tick for everything above to complete so terminate doesn\u0027t fail"},{"line_number":162,"context_line":"    if ! timeout $ASSOCIATE_TIMEOUT sh -c \"while euca-describe-addresses | grep -q $FLOATING_IP; do sleep 1; done\"; then"},{"line_number":163,"context_line":"        die $LINENO \"Floating ip $FLOATING_IP not released within $ASSOCIATE_TIMEOUT seconds\""}],"source_content_type":"text/x-sh","patch_set":2,"id":"AAAAQn%2F%2FlS4%3D","line":160,"updated":"2013-07-27 12:33:25.000000000","message":"hard tabs","commit_id":"9e0db4bdc46132ef7a98b0f9a86e51e1be8647fd"}],"functions":[{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"87b67bfebe9f71b8823028b821892289dddeec98","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"    USE_SCREEN\u003d$(trueorfalse True $USE_SCREEN)"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    if [[ $service \u003d~ \"n-cell\" ]] ; then"},{"line_number":1032,"context_line":"        # Normalize n-cell-region and n-cell-child to just n-cell"},{"line_number":1033,"context_line":"        service\u003d\"n-cell\""},{"line_number":1034,"context_line":"    fi"},{"line_number":1035,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAQn%2F%2FlRg%3D","line":1032,"updated":"2013-07-27 14:08:01.000000000","message":"There shouldn\u0027t be any service-specific bits in screen_it.","commit_id":"9e0db4bdc46132ef7a98b0f9a86e51e1be8647fd"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"ef988d5aa53459b9b5d03e64433074537d653d5e","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        [[ ${service} \u003d\u003d \"swift\" \u0026\u0026 ${ENABLED_SERVICES} \u003d~ \"s-\" ]] \u0026\u0026 return 0"},{"line_number":760,"context_line":"        [[ ${service} \u003d\u003d s-* \u0026\u0026 ${ENABLED_SERVICES} \u003d~ \"swift\" ]] \u0026\u0026 return 0"},{"line_number":761,"context_line":"        [[ ${service} \u003d\u003d \"n-cell-region\" \u0026\u0026 ${ENABLED_SERVICES} \u003d~ \"n-cell\" ]] \u0026\u0026 return 0"},{"line_number":762,"context_line":"        [[ ${service} \u003d\u003d \"n-cell-child\" \u0026\u0026 ${ENABLED_SERVICES} \u003d~ \"n-cell\" ]] \u0026\u0026 return 0"},{"line_number":763,"context_line":"    done"},{"line_number":764,"context_line":"    return 1"},{"line_number":765,"context_line":"}"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAAQn%2F%2FkiI%3D","line":762,"updated":"2013-07-28 15:10:06.000000000","message":"You could do this in one line (similar to the second swift line above) by checking for \"n-cell-*\".\n\nIt also looks like there is potential for a corner case false positive but it would be for n-cell to be enabled and no other nova services, i.e.multi-node with only cells running on a node.  Unlikely, but if anyone else follows this pattern they may not catch that.  Moving the n-cell check before nova fixes it.","commit_id":"6f4f1574e218b16d1e0ac4b10ba25f77fa883977"}]}
